pax_global_header00006660000000000000000000000064136211271270014514gustar00rootroot0000000000000052 comment=e44328e01ed82dd8a8dbfec952f5982e355b8416 rabbitvcs-0.18/000077500000000000000000000000001362112712700134235ustar00rootroot00000000000000rabbitvcs-0.18/.gitignore000066400000000000000000000000471362112712700154140ustar00rootroot00000000000000*.pyc *~ rabbitvcs/buildinfo.py build/ rabbitvcs-0.18/AUTHORS000066400000000000000000000002771362112712700145010ustar00rootroot00000000000000Jason Field Bruce van der Kooij Adam Plumb Jason Heeris Patrick Monnerat rabbitvcs-0.18/COPYING000066400000000000000000000431031362112712700144570ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, 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 Lesser 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 Street, 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 Lesser General Public License instead of this License. rabbitvcs-0.18/MAINTAINERS000066400000000000000000000002461362112712700151220ustar00rootroot00000000000000Adam Plumb E-mail: adamplumb@gmail.com Userid: adamplumb Andreas E-mail: electronics45@gmail.com Daniel O'Connor E-mail: daniel.oconnor@gmail.com Userid: clockwerx rabbitvcs-0.18/README.md000066400000000000000000000056701362112712700147120ustar00rootroot00000000000000RabbitVCS ========= RabbitVCS is a set of graphical tools written to provide simple and straightforward access to the version control systems you use. We currently support Subversion and Git on a variety of clients such as Nautilus, Thunar, Nemo, Caja, and on the command line. System Requirements ------------------- * gtk >= 3.0 * python-configobj >= 4.4.0 * python-gobject >= 2.14 For subversion: * python-svn >= 1.7.2 * subversion >= 1.4.6 For git: * dulwich >= 0.19.0 * git * tkinter (for now) For spell checking of commit messages (optional): * python-gtkspell * hunspell langpacks For syntax highlighting (optional): * python-pygments Recommends: * meld (graphical diff tool) For Debian-based distros you can run: ``` # apt-get install python-gtk3 python-configobj python-gobject python-gtkspell python-svn subversion python-dulwich python-pygments git meld tkinter ``` For Fedora-based distros you can run: ``` # dnf install python[23]-nautilus python[23]-pysvn python[23]-configobj python[23]-dbus python[23]-dulwich python[23]-tkinter python[23]-gtkspell3 python[23]-pygments subversion git meld ``` Manual Installation ------------------- Note that you will require superuser rights in order to install RabbitVCS. Execute the following as root or using sudo: ``` # python setup.py install ``` On Ubuntu or Debian-based distros, instead run: ``` # python setup.py install --install-layout=deb ``` Once this is run, make sure you install one or more client below. Note ---- Please note that if there is a `PYTHON` environment variable it will be used as a Runtime environtment for the rabbitvcs module. For example, if `PYTHON` points to Python3, then the code in the rabbitvcs module will should be located in the Python 3 module search path. Clients ------- RabbitVCS is the core library and set of dialogs, but you interact with them through our clients. Each client needs to be purposefully installed and has its own README. Here is a list of our currently working clients: * [Nautilus](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients/nautilus) * [Thunar](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients/thunar) * [Nemo](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients/nemo) * [Caja](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients/caja) * [Command Line](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients/cli) We have some others as well that are either incomplete, experimental or non-working. [Check them out!](https://github.com/rabbitvcs/rabbitvcs/tree/master/clients) Upgrade ------- To upgrade an existing version manually, copy the contents of the repository to the rabbitvcs lib folder. Most likely it is located at `/usr/lib/pymodules/python2.7/rabbitvcs`. In case of Debian-based distros this is will be `/usr/lib/python2.7/dist-packages/rabbitvcs`. For Fedora-based distros on 64-bit make sure to check `/usr/lib64`. References ---------- Homepage: http://www.rabbitvcs.org rabbitvcs-0.18/clients/000077500000000000000000000000001362112712700150645ustar00rootroot00000000000000rabbitvcs-0.18/clients/caja/000077500000000000000000000000001362112712700157625ustar00rootroot00000000000000rabbitvcs-0.18/clients/caja/README000066400000000000000000000013451362112712700166450ustar00rootroot00000000000000RabbitVCS Caja Extension This extension is meant to be used with the Caja (MATE) File Manager, Requirements: * caja * caja-python * python-dbus (> 0.80) * (all other RabbitVCS requirements) To install: To install for all users, copy RabbitVCS.py to: /usr/share/caja-python/extensions To install for a single user, copy RabbitVCS.py to: ~/.local/share/caja-python/extensions In both cases, you may need to create the caja-python/extensions folder. Restart caja with the following commands: $ caja -q $ nohup caja > /dev/null & Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/caja/RabbitVCS.py000066400000000000000000000571161362112712700201250ustar00rootroot00000000000000# # This is an extension to the Caja file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2008 by Adam Plumb # Copyright (C) 2012-2012 by Pavel Antonov # Copyright (C) 2014 by Francis Bisson # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Our module for everything related to the Caja extension. """ from __future__ import with_statement from __future__ import absolute_import from six.moves import range def log_all_exceptions(type, value, tb): import sys, traceback from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.extensions.Caja.RabbitVCS") log.exception_info("Error caught by master exception hook!", (type, value, tb)) text = ''.join(traceback.format_exception(type, value, tb, limit=None)) try: import rabbitvcs.ui.dialog rabbitvcs.ui.dialog.ErrorNotification(text) except Exception as ex: log.exception("Additional exception when attempting" " to display error dialog.") log.exception(ex) raise sys.__excepthook__(type, value, tb) # import sys # sys.excepthook = log_all_exceptions import copy import os import os.path from os.path import isdir, isfile, realpath, basename, dirname import datetime from rabbitvcs.util import helper sa = helper.SanitizeArgv() from gi.repository import Caja, GObject, Gtk, GdkPixbuf sa.restore() import pysvn from rabbitvcs.vcs import VCS import rabbitvcs.vcs.status from rabbitvcs.util.helper import launch_ui_window, launch_diff_tool from rabbitvcs.util.helper import get_file_extension, get_common_directory from rabbitvcs.util.helper import pretty_timedelta from rabbitvcs.util.decorators import timeit, disable from rabbitvcs.util.contextmenu import MenuBuilder, MainContextMenu, SEPARATOR, ContextMenuConditions from rabbitvcs.util.strings import S import rabbitvcs.ui import rabbitvcs.ui.property_page from rabbitvcs.util.log import Log, reload_log_settings log = Log("rabbitvcs.util.extensions.Caja.RabbitVCS") from rabbitvcs import gettext, get_icon_path _ = gettext.gettext from rabbitvcs import version as EXT_VERSION from rabbitvcs.util.settings import SettingsManager settings = SettingsManager() import rabbitvcs.services.service from rabbitvcs.services.checkerservice import StatusCheckerStub as StatusChecker class RabbitVCS(Caja.InfoProvider, Caja.MenuProvider, Caja.ColumnProvider, Caja.PropertyPageProvider, GObject.GObject): """ This is the main class that implements all of our awesome features. """ #: This is our lookup table for C{NautilusVFSFile}s which we need for attaching #: emblems. This is mostly a workaround for not being able to turn a path/uri #: into a C{VFSFile}. It looks like::: #: #: VFSFile_table = { #: "/foo/bar/baz": #: #: } #: #: Keeping track of C{NautilusVFSFile}s is a little bit complicated because #: when an item is moved (renamed) C{update_file_info} doesn't get called. So #: we also add C{NautilusVFSFile}s to this table from C{get_file_items} etc. # FIXME: this may be the source of the memory hogging seen in the extension # script itself. VFSFile_table = {} #: This is in case we want to permanently enable invalidation of the status #: checker info. always_invalidate = True #: When we get the statuses from the callback, put them here for further #: use. This is of the form: [("path/to", {...status dict...}), ...] statuses_from_callback = [] def get_local_path(self, item): if item.get_uri_scheme() != "file": return None return item.get_location().get_path() def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-cancel.svg", "scalable/actions/rabbitvcs-ok.svg", "scalable/actions/rabbitvcs-no.svg", "scalable/actions/rabbitvcs-yes.svg", "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.svg", "scalable/actions/rabbitvcs-editprops.svg", "scalable/actions/rabbitvcs-show_log.svg", "scalable/actions/rabbitvcs-delete.svg", "scalable/actions/rabbitvcs-run.svg", "scalable/actions/rabbitvcs-unlock.svg", "scalable/actions/rabbitvcs-dbus.svg", "scalable/actions/rabbitvcs-rename.svg", "scalable/actions/rabbitvcs-help.svg", "scalable/actions/rabbitvcs-update.svg", "scalable/actions/rabbitvcs-diff.svg", "scalable/actions/rabbitvcs-resolve.svg", "scalable/actions/rabbitvcs-about.svg", "scalable/actions/rabbitvcs-add.svg", "scalable/actions/rabbitvcs-changes.svg", "scalable/actions/rabbitvcs-createpatch.svg", "scalable/actions/rabbitvcs-merge.svg", "scalable/actions/rabbitvcs-drive.svg", "scalable/actions/rabbitvcs-stop.svg", "scalable/actions/rabbitvcs-checkout.svg", "scalable/actions/rabbitvcs-import.svg", "scalable/actions/rabbitvcs-branch.svg", "scalable/actions/rabbitvcs-refresh.svg", "scalable/actions/rabbitvcs-editconflicts.svg", "scalable/actions/rabbitvcs-monkey.svg", "scalable/actions/rabbitvcs-applypatch.svg", "scalable/actions/rabbitvcs-switch.svg", "scalable/actions/rabbitvcs-lock.svg", "scalable/actions/rabbitvcs-annotate.svg", "scalable/actions/rabbitvcs-compare.svg", "scalable/actions/rabbitvcs-revert.svg", "scalable/actions/rabbitvcs-bug.svg", "scalable/actions/rabbitvcs-cleanup.svg", "scalable/actions/rabbitvcs-clear.svg", "scalable/actions/rabbitvcs-unstage.svg", "scalable/actions/rabbitvcs-emblems.svg", "scalable/actions/rabbitvcs-relocate.svg", "scalable/actions/rabbitvcs-reset.svg", "scalable/actions/rabbitvcs-asynchronous.svg", "scalable/actions/rabbitvcs-commit.svg", "scalable/actions/rabbitvcs-checkmods.svg", "scalable/apps/rabbitvcs.svg", "scalable/apps/rabbitvcs-small.svg", "16x16/actions/rabbitvcs-push.png" ] rabbitvcs_icon_path = get_icon_path() for rel_icon_path in rabbitvcs_icons: icon_path = "%s/%s" % (rabbitvcs_icon_path, rel_icon_path) file = os.path.basename(rel_icon_path) (root, ext) = os.path.splitext(file) pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon_path) iconset = Gtk.IconSet.new_from_pixbuf(pixbuf) factory.add(root, iconset) factory.add_default() # Create a global client we can use to do VCS related stuff self.vcs_client = VCS() self.status_checker = StatusChecker() self.status_checker.assert_version(EXT_VERSION) self.items_cache = {} def get_columns(self): """ Return all the columns we support. """ return ( Caja.Column( name="RabbitVCS::status_column", attribute="status", label=_("RVCS Status"), description="" ), Caja.Column( name="RabbitVCS::revision_column", attribute="revision", label=_("RVCS Revision"), description="" ), Caja.Column( name="RabbitVCS::author_column", attribute="author", label=_("RVCS Author"), description="" ), Caja.Column( name="RabbitVCS::age_column", attribute="age", label=_("RVCS Age"), description="" ) ) def update_file_info(self, item): """ C{update_file_info} is called only when: - When you enter a directory (once for each item but only when the item was modified since the last time it was listed) - When you refresh (once for each item visible) - When an item viewable from the current window is created or modified This is insufficient for our purpose because: - You're not notified about items you don't see (which is needed to keep the emblem for the directories above the item up-to-date) @type item: NautilusVFSFile @param item: """ enable_emblems = bool(int(settings.get("general", "enable_emblems"))) enable_attrs = bool(int(settings.get("general", "enable_attributes"))) if not (enable_emblems or enable_attrs): return Caja.OperationResult.COMPLETE if not self.valid_uri(item.get_uri()): return Caja.OperationResult.FAILED path = self.get_local_path(item) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.VFSFile_table: invalidate = True # Always replace the item in the table with the one we receive, because # for example if an item is deleted and recreated the NautilusVFSFile # we had before will be invalid (think pointers and such). self.VFSFile_table[path] = item # This check should be pretty obvious :-) # TODO: how come the statuses for a few directories are incorrect # when we remove this line (detected as working copies, even though # they are not)? That shouldn't happen. is_in_a_or_a_working_copy = self.vcs_client.is_in_a_or_a_working_copy(path) if not is_in_a_or_a_working_copy: return Caja.OperationResult.COMPLETE # Do our magic... # I have added extra logic in cb_status, using a list # (paths_from_callback) that should allow us to work around this for # now. But it'd be good to have an actual status monitor. found = False status = None # Could replace with (st for st in self.... if st.path ...).next() # Need to catch exception for idx in range(len(self.statuses_from_callback)): found = (self.statuses_from_callback[idx].path) == path if found: break if found: # We're here because we were triggered by a callback status = self.statuses_from_callback[idx] del self.statuses_from_callback[idx] # Don't bother the checker if we already have the info from a callback if not found: status = \ self.status_checker.check_status(path, recurse=True, summary=True, callback=self.cb_status, invalidate=invalidate) # FIXME: when did this get disabled? if enable_attrs: self.update_columns(item, path, status) if enable_emblems: self.update_status(item, path, status) return Caja.OperationResult.COMPLETE def update_columns(self, item, path, status): """ Update the columns (attributes) for a given Caja item, filling them in with information from the version control server. """ revision = "" if status.revision: revision = str(status.revision) age = "" if status.date: age = pretty_timedelta( datetime.datetime.fromtimestamp(status.date), datetime.datetime.now() ) author = "" if status.author: author = str(status.author) values = { "status": status.simple_content_status(), "revision": revision, "author": author, "age": age } for key, value in list(values.items()): item.add_string_attribute(key, value if not value is None else "") def update_status(self, item, path, status): if status.summary in rabbitvcs.ui.STATUS_EMBLEMS: item.add_emblem(rabbitvcs.ui.STATUS_EMBLEMS[status.summary]) #~ @disable # @timeit # FIXME: this is a bottleneck. See generate_statuses() in # MainContextMenuConditions. def get_file_items_full(self, provider, window, items): """ Menu activated with items selected. Caja also calls this function when rendering submenus, even though this is not needed since the entire menu has already been returned. Note that calling C{nautilusVFSFile.invalidate_extension_info()} will also cause get_file_items to be called. @type window: NautilusNavigationWindow @param window: @type items: list of NautilusVFSFile @param items: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items_full() called") paths_str = "-".join(paths) base_dir = dirname(paths[0]) conditions_dict = None if paths_str in self.items_cache: conditions_dict = self.items_cache[paths_str] if conditions_dict and conditions_dict != "in-progress": conditions = CajaMenuConditions(conditions_dict) menu = CajaMainContextMenu(self, base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, base_dir, paths, self.update_file_items) self.items_cache[path] = "in-progress" return () def get_file_items(self, window, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") base_dir = dirname(paths[0]) return CajaMainContextMenu(self, base_dir, paths).get_menu() def update_file_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) self.items_cache[paths_str] = conditions_dict Caja.MenuProvider.emit_items_updated_signal(provider) #~ @disable # This is useful for profiling. Rename it to "get_background_items" and then # rename the real function "get_background_items_real". def get_background_items_profile(self, window, item): import cProfile path = S(gnomevfs.get_local_path_from_uri(item.get_uri())).replace("/", ":") profile_data_file = os.path.join( helper.get_home_folder(), "checkerservice_%s.stats" % path) prof = cProfile.Profile() retval = prof.runcall(self.get_background_items_real, window, item) prof.dump_stats(profile_data_file) log.debug("Dumped: %s" % profile_data_file) return retval def get_background_items_full(self, provider, window, item): """ Menu activated on entering a directory. Builds context menu for File menu and for window background. @type window: CajaNavigationWindow @param window: @type item: CajaVFSFile @param item: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ if not self.valid_uri(item.get_uri()): return path = self.get_local_path(item) self.VFSFile_table[path] = item # log.debug("get_background_items_full() called") conditions_dict = None if path in self.items_cache: conditions_dict = self.items_cache[path] if conditions_dict and conditions_dict != "in-progress": conditions = CajaMenuConditions(conditions_dict) menu = CajaMainContextMenu(self, path, [path], conditions).get_menu() return menu if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, path, [path], self.update_background_items) self.items_cache[path] = "in-progress" return () def get_background_items(self, window, item): if not self.valid_uri(item.get_uri()): return path = self.get_local_path(item) self.VFSFile_table[path] = item # log.debug("get_background_items() called") return CajaMainContextMenu(self, path, [path]).get_menu() def update_background_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) conditions = CajaMenuConditions(conditions_dict) self.items_cache[paths_str] = conditions_dict Caja.MenuProvider.emit_items_updated_signal(provider) # # Helper functions # def valid_uri(self, uri): """ Check whether or not it's a good idea to have RabbitVCS do its magic for this URI. Some examples of URI schemes: x-nautilus-desktop:/// # e.g. mounted devices on the desktop """ if not uri.startswith("file://"): return False return True # # Some methods to help with keeping emblems up-to-date # def rescan_after_process_exit(self, proc, paths): def do_check(): # We'll check the paths first (these were the paths that # were originally passed along to the context menu). # # This is needed among other things for: # # - When a directory is normal and you add files inside it # for path in paths: # We're not interested in the result now, just the callback self.status_checker.check_status(path, recurse=True, invalidate=True, callback=self.cb_status, summary=True) self.execute_after_process_exit(proc, do_check) def execute_after_process_exit(self, proc, func=None): def is_process_still_alive(): log.debug("is_process_still_alive() for pid: %i" % proc.pid) # First we need to see if the commit process is still running retval = proc.poll() log.debug("%s" % retval) still_going = (retval is None) if not still_going and callable(func): func() return still_going # Add our callback function on a 1 second timeout GObject.timeout_add_seconds(1, is_process_still_alive) # # Some other methods # def reload_settings(self, proc): """ Used to re-load settings after the settings dialog has been closed. FIXME: This probably doesn't belong here, ideally the settings manager does this itself and make sure everything is reloaded properly after the settings dialogs saves. """ def do_reload_settings(): globals()["settings"] = SettingsManager() globals()["log"] = reload_log_settings()("rabbitvcs.util.extensions.caja") log.debug("Re-scanning settings") self.execute_after_process_exit(proc, do_reload_settings) # # Callbacks # def cb_status(self, status): """ This is the callback that C{StatusMonitor} calls. @type path: string @param path: The path of the item something interesting happened to. @type statuses: list of status objects @param statuses: The statuses """ if status.path in self.VFSFile_table: item = self.VFSFile_table[status.path] # We need to invalidate the extension info for only one reason: # # - Invalidating the extension info will cause Caja to remove all # temporary emblems we applied so we don't have overlay problems # (with ourselves, we'd still have some with other extensions). # # After invalidating C{update_file_info} applies the correct emblem. # Since invalidation triggers an "update_file_info" call, we can # tell it NOT to invalidate the status checker path. self.statuses_from_callback.append(status) # NOTE! There is a call to "update_file_info" WITHIN the call to # invalidate_extension_info() - beware recursion! item.invalidate_extension_info() if status.path in self.items_cache: del self.items_cache[status.path] else: log.debug("Path [%s] not found in file table" % status.path) def get_property_pages(self, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] label = rabbitvcs.ui.property_page.PropertyPageLabel(claim_domain=False).get_widget() page = rabbitvcs.ui.property_page.PropertyPage(paths, claim_domain=False).get_widget() ppage = Caja.PropertyPage(name='RabbitVCS::PropertyPage', label=label, page=page) return [ppage] from rabbitvcs.util.contextmenuitems import * class CajaContextMenu(MenuBuilder): """ Provides a standard Caja context menu (ie. a list of "Caja.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): identifier = item.make_magic_id(id_magic) menuitem = Caja.MenuItem( name=identifier, label=item.make_label(), tip=item.tooltip, icon=item.icon ) if type(item) is MenuSeparator: item.make_insensitive(menuitem) return menuitem def attach_submenu(self, menu_node, submenu_list): submenu = Caja.Menu() menu_node.set_submenu(submenu) [submenu.append_item(item) for item in submenu_list] def top_level_menu(self, items): return items class CajaMenuConditions(ContextMenuConditions): def __init__(self, path_dict): self.path_dict = path_dict class CajaMainContextMenu(MainContextMenu): def get_menu(self): return CajaContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/clients/cli/000077500000000000000000000000001362112712700156335ustar00rootroot00000000000000rabbitvcs-0.18/clients/cli/README000066400000000000000000000007411362112712700165150ustar00rootroot00000000000000RabbitVCS Command Line Plugin This script is meant to be used from the command line. It simply wraps around various RabbitVCS commands and opens dialogs and windows as if launched from a graphical user interface. Requirements: * (all other RabbitVCS requirements) To install: To install, copy the rabbitvcs shell script to: /usr/bin Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/cli/rabbitvcs000077500000000000000000000041311362112712700175370ustar00rootroot00000000000000#!/usr/bin/env python3 # # This is a command line tool to allow better # integration with the Subversion source control system. # # Copyright (C) 2008-2008 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path import sys from optparse import OptionParser from rabbitvcs.util.helper import launch_ui_window from rabbitvcs.util._locale import initialize_locale from rabbitvcs import gettext _ = gettext.gettext initialize_locale() usage = _("""Usage: rabbitvcs [path1] [path2] ... Available Modules ------------------ SVN: about, add, annotate, applypatch, branch, browser, changes, checkmods, checkout, cleanup, commit, createpatch, create, delete, diff, editconflicts, export, ignore, import, lock, log, merge, properties, open, relocate, rename, markresolved, revert, settings, switch, unlock, update, updateto Git: about, add, annotate, applybranch, branches, changes, checkout, clean, clone, commit, createpatch, create, delete, diff, editconflicts, export, ignore, log, merge, open, push, rename, remotes, reset, revert, settings, tags, update For module specific help type: rabbitvcs -h """) args = sys.argv if len(args) < 2 or args[1] == "-h": raise SystemExit(usage) args.pop(0) # remove this file's path module = args.pop(0) # If a filename/path is given, try to expand it to and absolute path i = 0 for arg in args: if os.path.exists(arg): args[i] = os.path.abspath(arg) i += 1 launch_ui_window(module, args) rabbitvcs-0.18/clients/dolphin/000077500000000000000000000000001362112712700165215ustar00rootroot00000000000000rabbitvcs-0.18/clients/dolphin/README000066400000000000000000000014121362112712700173770ustar00rootroot00000000000000RabbitVCS Dolphin/KDE4 Extension (EXPERIMENTAL!) This extension is meant to be used with the Dolphin File Manager which comes with KDE 4.x Requirements: * KDE 4 * (all other RabbitVCS requirements) To install: Copy all supplied .desktop files to: /usr/share/kde4/services/ServiceMenus/ Alternatively you can copy the files to the kde4-directory inside your $HOME, i.e. on Ubuntu 14.04: /home/your-username/.kde/share/kde4/services/ServiceMenus/ In the second case, you may need to create the ServiceMenus folder. Please note that the name (i.e. .kde or .kde4) depends on your OS distribution. Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/dolphin/rabbitvcs_svn_submenu_directory.desktop000066400000000000000000000122611362112712700266050ustar00rootroot00000000000000[Desktop Entry] Type=Service ServiceTypes=KonqPopupMenu/Plugin,inode/directory Actions=Update;Commit;Checkout;_SEPARATOR_;Log;Browser;CheckMods;_SEPARATOR_;Resolve;UpdateToRev;Rename;Delete;Revert;CleanUp;GetLock;ReleaseLock;_SEPARATOR_;BranchTag;Switch;Merge;Export;Relocate;_SEPARATOR_;CreatePatch;ApplyPatch;Properties;_SEPARATOR_;CreateRepo;Add;Import;Ignore;_SEPARATOR_;Settings;About; Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs.svg X-KDE-Priority=TopLevel X-KDE-Submenu=RabbitVCS (SVN) [Desktop Action Update] Name=Update Name[de]=Aktualisieren Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-update.svg Exec=rabbitvcs update %U [Desktop Action Commit] Name=Commit... Name[de]=Committen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-commit.svg Exec=rabbitvcs commit %U [Desktop Action Checkout] Name=Checkout... Name[de]=Auschecken … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-checkout.svg Exec=rabbitvcs checkout # SEPARATOR [Desktop Action Log] Name=Show log Name[de]=Historie anzeigen Name[pl]=Pokaz Log Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-show_log.svg Exec=rabbitvcs log %U [Desktop Action Browser] Name=Repo-browser Name[de]=Repository-Browser Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-drive.svg Exec=rabbitvcs browser %U [Desktop Action CheckMods] Name=Check for modifications Name[de]=Auf Änderungen prüfen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-checkmods.svg Exec=rabbitvcs checkmods %U # SEPARATOR [Desktop Action Resolve] Name=Resolve... Name[de]=Konflikte lösen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-resolve.svg Exec=rabbitvcs editconflicts %U [Desktop Action UpdateToRev] Name=Update to revision... Name[de]=Auf Revision aktualisieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-update.svg Exec=rabbitvcs updateto %U [Desktop Action Rename] Name=Rename... Name[de]=Umbenennen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-rename.svg Exec=rabbitvcs rename %U [Desktop Action Delete] Name=Delete Name[de]=Löschen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-delete.svg Exec=rabbitvcs delete %U [Desktop Action Revert] Name=Revert... Name[de]=Rückgängig machen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-revert.svg Exec=rabbitvcs revert %U [Desktop Action CleanUp] Name=Clean up... Name[de]=Aufräumen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-cleanup.svg Exec=rabbitvcs cleanup %U [Desktop Action GetLock] Name=Get lock... Name[de]=Sperren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-lock.svg Exec=rabbitvcs lock %U [Desktop Action ReleaseLock] Name=Release lock... Name[de]=Sperrung aufheben … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-unlock.svg Exec=rabbitvcs unlock %U # SEPARATOR [Desktop Action BranchTag] Name=Branch/tag... Name[de]=Verzweigen/markieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-branch.svg Exec=rabbitvcs branch %U [Desktop Action Switch] Name=Switch... Name[de]=Wechseln … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-switch.svg Exec=rabbitvcs switch %U [Desktop Action Merge] Name=Merge... Name[de]=Zusammenführen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-merge.svg Exec=rabbitvcs merge %U [Desktop Action Export] Name=Export... Name[de]=Exportieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-export.svg Exec=rabbitvcs export %U [Desktop Action Relocate] Name=Relocate... Name[de]=Verschieben … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-relocate.svg Exec=rabbitvcs relocate %U # SEPARATOR [Desktop Action CreatePatch] Name=Create patch... Name[de]=Patch erstellen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-createpatch.svg Exec=rabbitvcs createpatch %U [Desktop Action ApplyPatch] Name=Apply patch... Name[de]=Patch anwenden … Name[pl]=Zastosuj Patch... Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-applypatch.svg Exec=rabbitvcs applypatch %U [Desktop Action Properties] Name=Properties Name[de]=Eigenschaften Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-properties.svg Exec=rabbitvcs properties %U # SEPARATOR [Desktop Action CreateRepo] Name=Create repository here Name[de]=Hier ein Repository erstellen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-drive.svg Exec=rabbitvcs properties %U [Desktop Action Add] Name=Add... Name[de]=Hinzufuegen … Name[pl]=Dodaj... Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-add.svg Exec=rabbitvcs add %U [Desktop Action Import] Name=Import... Name[de]=Importieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-import.svg Exec=rabbitvcs import %U [Desktop Action Ignore] Name=Add to ignore list Name[de]=Zur Ignorierliste hinzufügen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-ignore.svg Exec=rabbitvcs ignore %U # SEPARATOR [Desktop Action Settings] Name=Settings Name[de]=Einstellungen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-settings.svg Exec=rabbitvcs settings [Desktop Action About] Name=About Name[de]=Über Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-about.svg Exec=rabbitvcs about rabbitvcs-0.18/clients/dolphin/rabbitvcs_svn_submenu_file.desktop000066400000000000000000000077021362112712700255240ustar00rootroot00000000000000[Desktop Entry] Type=Service ServiceTypes=KonqPopupMenu/Plugin,application/octet-stream Actions=Update;Commit;_SEPARATOR_;Log;Browser;CheckMods;_SEPARATOR_;Resolve;UpdateToRev;Rename;Delete;Revert;GetLock;ReleaseLock;_SEPARATOR_;BranchTag;Switch;Merge;_SEPARATOR_;CreatePatch;Properties;_SEPARATOR_;Add;Ignore;_SEPARATOR_;Settings;About; Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs.svg X-KDE-Priority=TopLevel X-KDE-Submenu=RabbitVCS (SVN) [Desktop Action Update] Name=Update Name[de]=Aktualisieren Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-update.svg Exec=rabbitvcs update %U [Desktop Action Commit] Name=Commit... Name[de]=Committen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-commit.svg Exec=rabbitvcs commit %U # SEPARATOR [Desktop Action Log] Name=Show log Name[de]=Historie anzeigen Name[pl]=Pokaz Log Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-show_log.svg Exec=rabbitvcs log %U [Desktop Action Browser] Name=Repo-browser Name[de]=Repository-Browser Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-drive.svg Exec=rabbitvcs browser %U [Desktop Action CheckMods] Name=Check for modifications Name[de]=Auf Änderungen prüfen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-checkmods.svg Exec=rabbitvcs checkmods %U # SEPARATOR [Desktop Action Resolve] Name=Resolve... Name[de]=Konflikte lösen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-resolve.svg Exec=rabbitvcs editconflicts %U [Desktop Action UpdateToRev] Name=Update to revision... Name[de]=Auf Revision aktualisieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-update.svg Exec=rabbitvcs updateto %U [Desktop Action Rename] Name=Rename... Name[de]=Umbenennen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-rename.svg Exec=rabbitvcs rename %U [Desktop Action Delete] Name=Delete Name[de]=Löschen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-delete.svg Exec=rabbitvcs delete %U [Desktop Action Revert] Name=Revert... Name[de]=Rückgängig machen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-revert.svg Exec=rabbitvcs revert %U [Desktop Action GetLock] Name=Get lock... Name[de]=Sperren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-lock.svg Exec=rabbitvcs lock %U [Desktop Action ReleaseLock] Name=Release lock... Name[de]=Sperrung aufheben … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-unlock.svg Exec=rabbitvcs unlock %U # SEPARATOR [Desktop Action BranchTag] Name=Branch/tag... Name[de]=Verzweigen/markieren … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-branch.svg Exec=rabbitvcs branch %U [Desktop Action Switch] Name=Switch... Name[de]=Wechseln … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-switch.svg Exec=rabbitvcs switch %U [Desktop Action Merge] Name=Merge... Name[de]=Zusammenführen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-merge.svg Exec=rabbitvcs merge %U # SEPARATOR [Desktop Action CreatePatch] Name=Create patch... Name[de]=Patch erstellen … Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-createpatch.svg Exec=rabbitvcs createpatch %U [Desktop Action Properties] Name=Properties Name[de]=Eigenschaften Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-properties.svg Exec=rabbitvcs properties %U # SEPARATOR [Desktop Action Add] Name=Add... Name[de]=Hinzufuegen … Name[pl]=Dodaj... Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-add.svg Exec=rabbitvcs add %U [Desktop Action Ignore] Name=Add to ignore list Name[de]=Zur Ignorierliste hinzufügen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-ignore.svg Exec=rabbitvcs ignore %U # SEPARATOR [Desktop Action Settings] Name=Settings Name[de]=Einstellungen Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-settings.svg Exec=rabbitvcs settings [Desktop Action About] Name=About Name[de]=Über Icon=/usr/share/icons/hicolor/scalable/actions/rabbitvcs-about.svg Exec=rabbitvcs about rabbitvcs-0.18/clients/gedit/000077500000000000000000000000001362112712700161605ustar00rootroot00000000000000rabbitvcs-0.18/clients/gedit/README000066400000000000000000000017741362112712700170510ustar00rootroot00000000000000RabbitVCS Gedit Plugin This plugin is meant to be used with the Gedit Text Editor. It provides the familiar RabbitVCS Context menu in the Tools menu as well as in various context menus. Note: This is broken for recent versions of Gedit. Requirements: * gedit * (all other RabbitVCS requirements) To install for Gedit 3: To install for all users, copy rabbitvcs-plugin.py and rabbitvcs-gedit3.plugin to: /usr/lib/gedit/plugins To install for a single user, copy rabbitvcs-plugin.py and rabbitvcs-gedit3.plugin to: ~/.local/share/gedit/plugins To install for Gedit 2: To install for all users, copy rabbitvcs-plugin.py and rabbitvcs-gedit2.gedit-plugin to: /usr/lib/gedit-2/plugins To install for a single user, copy rabbitvcs-plugin.py and rabbitvcs-gedit2.gedit-plugin to: ~/.gnome2/gedit/plugins Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/gedit/rabbitvcs-gedit2.gedit-plugin000066400000000000000000000003441362112712700236260ustar00rootroot00000000000000[Gedit Plugin] Loader=python Module=rabbitvcs-plugin IAge=2 Name=RabbitVCS Description=RabbitVCS plugin for Gedit Authors=Adam Plumb Copyright=Copyright © 2011 Adam Plumb Website=http://www.rabbitvcs.org rabbitvcs-0.18/clients/gedit/rabbitvcs-gedit3.plugin000066400000000000000000000003361362112712700225360ustar00rootroot00000000000000[Plugin] Loader=python3 Module=rabbitvcs-plugin IAge=3 Name=RabbitVCS Description=RabbitVCS plugin for Gedit Authors=Adam Plumb Copyright=Copyright © 2011 Adam Plumb Website=http://www.rabbitvcs.org rabbitvcs-0.18/clients/gedit/rabbitvcs-plugin.py000066400000000000000000001031431362112712700220070ustar00rootroot00000000000000from __future__ import absolute_import # # This is a Gedit plugin to allow for RabbitVCS integration in the Gedit # text editor. # # Copyright (C) 2008-2011 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from gettext import gettext as _ import os from gi.repository import Gedit, GObject from gi.repository import Gtk as gtk import rabbitvcs.util.helper from rabbitvcs.vcs import create_vcs_instance from rabbitvcs.util.contextmenu import GtkFilesContextMenuConditions, \ GtkFilesContextMenuCallbacks, MainContextMenu, MainContextMenuCallbacks, \ MenuBuilder, GtkContextMenuCaller from rabbitvcs.util.contextmenuitems import * # Menu item example, insert a new item in the Tools menu ui_str = """ """ class RabbitVCSWindowHelper(GtkContextMenuCaller): _menu_paths = [ # "/MenuBar/RabbitVCSMenu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Commit", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Update", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Checkout", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Show_Changes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Show_Log", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Repo_Browser", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Check_For_Modifications", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_Filename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_File_Extension", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Update_To_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Rename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Delete", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Revert", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Edit_Conflicts", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Mark_Resolved", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Get_Lock", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Unlock", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Cleanup", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Annotate", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Export", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Create_Repository", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Import", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Branch_Tag", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Switch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Merge", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Apply_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Create_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Properties", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Update", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Commit", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Push", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Clone", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Initialize_Repository", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Show_Changes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Show_Log", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Stage", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Unstage", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_Filename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_File_Extension", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Rename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Delete", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Revert", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Edit_Conflicts", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Clean", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Reset", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Checkout", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Branches", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Tags", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Remotes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Export", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Merge", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Annotate", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Apply_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Create_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::Settings", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::About" ] _default_base_dir = os.path.expanduser("~") def __init__(self, plugin, window): self._window = window self._plugin = plugin self.base_dir = self._default_base_dir self._menubar_menu = None self._menu_action = None self.vcs_client = create_vcs_instance() # Insert menu items self._insert_menu() def deactivate(self): # Remove any installed menu items self._remove_menu() self._window = None self.base_dir = None self._plugin = None self._menubar_menu = None self._action_group = None def _insert_menu(self): # Get the GtkUIManager manager = self._window.get_ui_manager() self._menubar_menu = GeditMenu(self, self.vcs_client, self.base_dir, [self._get_document_path()]) self._menu_action = gtk.Action( name="RabbitVCSMenu", label="RabbitVCS", tooltip="Excellent Version Control for Linux", stock_id=None ) self._action_group = gtk.ActionGroup("RabbitVCSActions") self._action_group = self._menubar_menu.get_action_group(self._action_group) self._action_group.add_action( self._menu_action ) # Insert the action group manager.insert_action_group(self._action_group, 0) # Merge the UI self._ui_id = manager.add_ui_from_string(ui_str) def _remove_menu(self): # Get the GtkUIManager manager = self._window.get_ui_manager() # Remove the ui manager.remove_ui(self._ui_id) # Remove the action group manager.remove_action_group(self._action_group) # Make sure the manager updates manager.ensure_update() def update_ui(self): self.update_base_dir() document = self._window.get_active_document() self._action_group.set_sensitive(document != None) if document != None: manager = self._window.get_ui_manager() manager.get_widget("/MenuBar/ExtraMenu_1/RabbitVCSMenu").set_sensitive(True) self._menubar_menu.set_paths([self._get_document_path()]) self._determine_menu_sensitivity([self._get_document_path()]) def connect_view(self, view, id_name): handler_id = view.connect("populate-popup", self.on_view_populate_popup) view.set_data(id_name, [handler_id]) def disconnect_view(self, view, id_name): view.disconnect(view.get_data(id_name)[0]) def on_view_populate_popup(self, view, menu): separator = gtk.SeparatorMenuItem() menu.append(separator) separator.show() context_menu = GeditMainContextMenu(self, self.vcs_client, self.base_dir, [self._get_document_path()]).get_menu() for context_menu_item in context_menu: menu.append(context_menu_item) def _get_document_path(self): document = self._window.get_active_document() path = self.base_dir if document: tmp_path = document.get_uri_for_display() if os.path.exists(tmp_path): path = tmp_path return path def update_base_dir(self): document = self._window.get_active_document() if document: path = document.get_uri_for_display() if os.path.exists(path): self.base_dir = os.path.dirname(path) else: self.base_dir = self._default_base_dir self._menubar_menu.set_base_dir(self.base_dir) def _determine_menu_sensitivity(self, paths): self._menubar_menu.update_conditions(paths) manager = self._window.get_ui_manager() for menu_path in self._menu_paths: # Gtk3 changes how we access a widget's action. Get it from the # UI Manager instead of the widget directly if hasattr(manager, "get_action"): action = manager.get_action(menu_path) else: widget = manager.get_widget(menu_path) action = widget.get_action() self._menubar_menu.update_action(action) # Menu activate handlers def reload_settings(self, proc): self.update_ui() def on_context_menu_command_finished(self): self.update_ui() class RabbitVCSGedit3Plugin(GObject.Object, Gedit.WindowActivatable): __gtype_name__ = "RabbitVCSGedit3Plugin" window = GObject.property(type=Gedit.Window) def __init__(self): GObject.Object.__init__(self) self._instances = {} self.id_name = "RabbitVCSContextMenuID" def do_activate(self): self._instances[self.window] = RabbitVCSWindowHelper(self, self.window) handler_ids = [] for signal in ('tab-added', 'tab-removed'): method = getattr(self, 'on_window_' + signal.replace('-', '_')) handler_ids.append(self.window.connect(signal, method)) self.window.set_data(self.id_name, handler_ids) if self.window in self._instances: for view in self.window.get_views(): self._instances[self.window].connect_view(view, self.id_name) def do_deactivate(self): widgets = [self.window] + self.window.get_views() for widget in widgets: handler_ids = widget.get_data(self.id_name) if handler_ids is not None: for handler_id in handler_ids: widget.disconnect(handler_id) widget.set_data(self.id_name, None) if self.window in self._instances: self._instances[self.window].deactivate() del self._instances[self.window] def do_update_state(self): self.update_ui() def update_ui(self): if self.window in self._instances: self._instances[self.window].update_ui() def on_window_tab_added(self, window, tab): if self.window in self._instances: self._instances[self.window].connect_view(tab.get_view(), self.id_name) def on_window_tab_removed(self, window, tab): if window in self._instances: self._instances[self.window].disconnect_view(tab.get_view(), self.id_name) class MenuIgnoreByFilename(MenuItem): identifier = "RabbitVCS::Ignore_By_Filename" label = _("Ignore by File Name") tooltip = _("Ignore item by filename") class MenuIgnoreByFileExtension(MenuItem): identifier = "RabbitVCS::Ignore_By_File_Extension" label = _("Ignore by File Extension") tooltip = _("Ignore item by extension") class GeditMenuBuilder(object): """ Generalised menu builder class. Subclasses must provide: make_menu_item(self, item, id_magic) - create the menu item for whatever toolkit (usually this should be just call a convenience method on the MenuItem instance). attach_submenu(self, menu_node, submenu_list) - given a list of whatever make_menu_item(...) returns, create a submenu and attach it to the given node. top_level_menu(self, items) - in some circumstances we need to treat the top level menu differently (eg. Nautilus, because Xenu said so). This processes a list of menu items returned by make_menu_item(...) to create the overall menu. """ def __init__(self, structure, conditions, callbacks, action_group): """ @param structure: Menu structure @type structure: list Note on "structure". The menu structure is defined in a list of tuples of two elements each. The first element is a class - the MenuItem subclass that defines the menu interface (see below). The second element is either None (if there is no submenu) or a list of tuples if there is a submenu. The submenus are generated recursively. FYI, this is a list of tuples so that we retain the desired menu item order (dicts do not retain order) Example: [ (MenuClassOne, [ (MenuClassOneSubA, (MenuClassOneSubB ]), (MenuClassTwo, (MenuClassThree ] """ self.action_group = action_group for item_class in structure: item = item_class(conditions, callbacks) default_name = MenuItem.make_default_name(item.identifier) action = RabbitVCSAction(item.identifier, item.label, item.tooltip, item.icon) if item.icon and hasattr(action, "set_icon_name"): action.set_icon_name(item.icon) if item.callback: if item.callback_args: action.connect("activate", item.callback, item.callback_args) else: action.connect("activate", item.callback) action.set_property("visible", item.show()) action.set_data("item", item) self.action_group.add_action(action) def _get_function(self, object, name): function = None if hasattr(object, name): attr = getattr(object, name) if callable(attr): function = attr return function class GeditMenu(object): def __init__(self, caller, vcs_client, base_dir, paths): """ @param caller: The calling object @type caller: RabbitVCS extension @param vcs_client: The vcs client @type vcs_client: rabbitvcs.vcs @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.paths = paths self.base_dir = base_dir self.vcs_client = vcs_client self.conditions = GtkFilesContextMenuConditions(self.vcs_client, self.paths) self.callbacks = GtkFilesContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, self.paths ) self.structure = [ MenuRabbitVCSSvn, MenuRabbitVCSGit, MenuCheckout, MenuUpdate, MenuCommit, MenuPush, MenuInitializeRepository, MenuClone, MenuRabbitVCS, MenuDiffMenu, MenuDiff, MenuDiffPrevRev, MenuDiffMultiple, MenuCompareTool, MenuCompareToolPrevRev, MenuCompareToolMultiple, MenuShowChanges, MenuShowLog, MenuRepoBrowser, MenuCheckForModifications, MenuAdd, MenuStage, MenuUnstage, MenuAddToIgnoreList, MenuUpdateToRevision, MenuRename, MenuDelete, MenuRevert, MenuEditConflicts, MenuMarkResolved, MenuRelocate, MenuGetLock, MenuUnlock, MenuClean, MenuReset, MenuCleanup, MenuExport, MenuCreateRepository, MenuImport, MenuBranches, MenuTags, MenuRemotes, MenuBranchTag, MenuSwitch, MenuMerge, MenuAnnotate, MenuCreatePatch, MenuApplyPatch, MenuProperties, MenuHelp, MenuSettings, MenuAbout, MenuIgnoreByFilename, MenuIgnoreByFileExtension ] def set_paths(self, paths): self.paths = paths self.conditions.paths = paths self.callbacks.paths = paths def set_base_dir(self, base_dir): self.base_dir = base_dir self.callbacks.base_dir = base_dir self.conditions.base_dir = base_dir def get_action_group(self, action_group): return GeditMenuBuilder(self.structure, self.conditions, self.callbacks, action_group).action_group def update_conditions(self, paths): self.conditions.generate_statuses(paths) self.conditions.generate_path_dict(paths) def update_action(self, action): action.set_property("visible", action.get_data("item").show()) class GeditContextMenu(MenuBuilder): """ Provides a standard gtk context menu (ie. a list of "gtk.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): return item.make_gtk3_menu_item(id_magic) def attach_submenu(self, menu_node, submenu_list): submenu = gtk.Menu() menu_node.set_submenu(submenu) [submenu.append(item) for item in submenu_list] def top_level_menu(self, items): return items class GeditMainContextMenu(MainContextMenu): def __init__(self, caller, vcs_client, base_dir, paths=[], conditions=None, callbacks=None): """ @param caller: The calling object @type caller: RabbitVCS extension @param vcs_client: The vcs client @type vcs_client: rabbitvcs.vcs @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.paths = paths self.base_dir = base_dir self.vcs_client = vcs_client self.conditions = conditions if self.conditions is None: self.conditions = GtkFilesContextMenuConditions(self.vcs_client, paths) self.callbacks = callbacks if self.callbacks is None: self.callbacks = MainContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, paths ) ignore_items = get_ignore_list_items(paths) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuUpdate, None), (MenuCommit, None), (MenuPush, None), (MenuRabbitVCSSvn, [ (MenuCheckout, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuRepoBrowser, None), (MenuCheckForModifications, None), (MenuSeparator, None), (MenuAdd, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuUpdateToRevision, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuEditConflicts, None), (MenuMarkResolved, None), (MenuRelocate, None), (MenuGetLock, None), (MenuUnlock, None), (MenuCleanup, None), (MenuSeparator, None), (MenuExport, None), (MenuCreateRepository, None), (MenuImport, None), (MenuSeparator, None), (MenuBranchTag, None), (MenuSwitch, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuProperties, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]), (MenuRabbitVCSGit, [ (MenuClone, None), (MenuInitializeRepository, None), (MenuSeparator, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuStage, None), (MenuUnstage, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuEditConflicts, None), (MenuClean, None), (MenuReset, None), (MenuCheckout, None), (MenuSeparator, None), (MenuBranches, None), (MenuTags, None), (MenuRemotes, None), (MenuSeparator, None), (MenuExport, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]) ] def get_menu(self): return GeditContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/clients/nautilus/000077500000000000000000000000001362112712700167305ustar00rootroot00000000000000rabbitvcs-0.18/clients/nautilus/README000066400000000000000000000015071362112712700176130ustar00rootroot00000000000000RabbitVCS Nautilus3 Extension This extension is meant to be used with the Nautilus File Manager v3, Requirements: * nautilus (>= v3.0) * nautilus-python (>= 1.0) * python-dbus (> 0.80) * (all other RabbitVCS requirements) To install: To install for all users, copy RabbitVCS.py to: /usr/share/nautilus-python/extensions To install for a single user, copy RabbitVCS.py to: ~/.local/share/nautilus-python/extensions In both cases, you may need to create the nautilus-python/extensions folder. Restart nautilus with the following commands: $ nautilus -q $ pgrep -f service.py | xargs kill $ nohup nautilus > /dev/null & Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/nautilus/RabbitVCS.py000066400000000000000000000556701362112712700210760ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2008 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Our module for everything related to the Nautilus extension. """ from __future__ import with_statement from __future__ import absolute_import from six.moves import range def log_all_exceptions(type, value, tb): import sys, traceback from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.extensions.Nautilus.RabbitVCS") log.exception_info("Error caught by master exception hook!", (type, value, tb)) text = ''.join(traceback.format_exception(type, value, tb, limit=None)) try: import rabbitvcs.ui.dialog rabbitvcs.ui.dialog.ErrorNotification(text) except Exception as ex: log.exception("Additional exception when attempting" " to display error dialog.") log.exception(ex) raise sys.__excepthook__(type, value, tb) # import sys # sys.excepthook = log_all_exceptions import copy import os import os.path from os.path import isdir, isfile, realpath, basename, dirname import datetime from rabbitvcs.util import helper sa = helper.SanitizeArgv() from gi.repository import Nautilus, GObject, Gtk, GdkPixbuf sa.restore() import pysvn from rabbitvcs.vcs import VCS import rabbitvcs.vcs.status from rabbitvcs.util.helper import launch_ui_window, launch_diff_tool from rabbitvcs.util.helper import get_file_extension, get_common_directory from rabbitvcs.util.helper import pretty_timedelta from rabbitvcs.util.decorators import timeit, disable from rabbitvcs.util.contextmenu import MenuBuilder, MainContextMenu, SEPARATOR, ContextMenuConditions from rabbitvcs.util.strings import S import rabbitvcs.ui import rabbitvcs.ui.property_page from rabbitvcs.util.log import Log, reload_log_settings log = Log("rabbitvcs.util.extensions.Nautilus.RabbitVCS") from rabbitvcs import gettext, get_icon_path _ = gettext.gettext from rabbitvcs import version as EXT_VERSION from rabbitvcs.util.settings import SettingsManager settings = SettingsManager() import rabbitvcs.services.service from rabbitvcs.services.checkerservice import StatusCheckerStub as StatusChecker class RabbitVCS(Nautilus.InfoProvider, Nautilus.MenuProvider, Nautilus.ColumnProvider, Nautilus.PropertyPageProvider, GObject.GObject): """ This is the main class that implements all of our awesome features. """ #: This is our lookup table for C{NautilusVFSFile}s which we need for attaching #: emblems. This is mostly a workaround for not being able to turn a path/uri #: into a C{VFSFile}. It looks like::: #: #: VFSFile_table = { #: "/foo/bar/baz": #: #: } #: #: Keeping track of C{NautilusVFSFile}s is a little bit complicated because #: when an item is moved (renamed) C{update_file_info} doesn't get called. So #: we also add C{NautilusVFSFile}s to this table from C{get_file_items} etc. # FIXME: this may be the source of the memory hogging seen in the extension # script itself. VFSFile_table = {} #: This is in case we want to permanently enable invalidation of the status #: checker info. always_invalidate = True #: When we get the statuses from the callback, put them here for further #: use. This is of the form: [("path/to", {...status dict...}), ...] statuses_from_callback = [] def get_local_path(self, item): if item.get_uri_scheme() != "file": return None return item.get_location().get_path() def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-cancel.svg", "scalable/actions/rabbitvcs-ok.svg", "scalable/actions/rabbitvcs-no.svg", "scalable/actions/rabbitvcs-yes.svg", "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.svg", "scalable/actions/rabbitvcs-editprops.svg", "scalable/actions/rabbitvcs-show_log.svg", "scalable/actions/rabbitvcs-delete.svg", "scalable/actions/rabbitvcs-run.svg", "scalable/actions/rabbitvcs-unlock.svg", "scalable/actions/rabbitvcs-dbus.svg", "scalable/actions/rabbitvcs-rename.svg", "scalable/actions/rabbitvcs-help.svg", "scalable/actions/rabbitvcs-update.svg", "scalable/actions/rabbitvcs-diff.svg", "scalable/actions/rabbitvcs-resolve.svg", "scalable/actions/rabbitvcs-about.svg", "scalable/actions/rabbitvcs-add.svg", "scalable/actions/rabbitvcs-changes.svg", "scalable/actions/rabbitvcs-createpatch.svg", "scalable/actions/rabbitvcs-merge.svg", "scalable/actions/rabbitvcs-drive.svg", "scalable/actions/rabbitvcs-stop.svg", "scalable/actions/rabbitvcs-checkout.svg", "scalable/actions/rabbitvcs-import.svg", "scalable/actions/rabbitvcs-branch.svg", "scalable/actions/rabbitvcs-refresh.svg", "scalable/actions/rabbitvcs-editconflicts.svg", "scalable/actions/rabbitvcs-monkey.svg", "scalable/actions/rabbitvcs-applypatch.svg", "scalable/actions/rabbitvcs-switch.svg", "scalable/actions/rabbitvcs-lock.svg", "scalable/actions/rabbitvcs-annotate.svg", "scalable/actions/rabbitvcs-compare.svg", "scalable/actions/rabbitvcs-revert.svg", "scalable/actions/rabbitvcs-bug.svg", "scalable/actions/rabbitvcs-cleanup.svg", "scalable/actions/rabbitvcs-clear.svg", "scalable/actions/rabbitvcs-unstage.svg", "scalable/actions/rabbitvcs-emblems.svg", "scalable/actions/rabbitvcs-relocate.svg", "scalable/actions/rabbitvcs-reset.svg", "scalable/actions/rabbitvcs-asynchronous.svg", "scalable/actions/rabbitvcs-commit.svg", "scalable/actions/rabbitvcs-checkmods.svg", "scalable/apps/rabbitvcs.svg", "scalable/apps/rabbitvcs-small.svg", "16x16/actions/rabbitvcs-push.png" ] rabbitvcs_icon_path = get_icon_path() for rel_icon_path in rabbitvcs_icons: icon_path = "%s/%s" % (rabbitvcs_icon_path, rel_icon_path) file = os.path.basename(rel_icon_path) (root, ext) = os.path.splitext(file) pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon_path) iconset = Gtk.IconSet.new_from_pixbuf(pixbuf) factory.add(root, iconset) factory.add_default() # Create a global client we can use to do VCS related stuff self.vcs_client = VCS() self.status_checker = StatusChecker() self.status_checker.assert_version(EXT_VERSION) self.items_cache = {} def get_columns(self): """ Return all the columns we support. """ return ( Nautilus.Column( name="RabbitVCS::status_column", attribute="status", label=_("RVCS Status"), description="" ), Nautilus.Column( name="RabbitVCS::revision_column", attribute="revision", label=_("RVCS Revision"), description="" ), Nautilus.Column( name="RabbitVCS::author_column", attribute="author", label=_("RVCS Author"), description="" ), Nautilus.Column( name="RabbitVCS::age_column", attribute="age", label=_("RVCS Age"), description="" ) ) def update_file_info(self, item): """ C{update_file_info} is called only when: - When you enter a directory (once for each item but only when the item was modified since the last time it was listed) - When you refresh (once for each item visible) - When an item viewable from the current window is created or modified This is insufficient for our purpose because: - You're not notified about items you don't see (which is needed to keep the emblem for the directories above the item up-to-date) @type item: NautilusVFSFile @param item: """ enable_emblems = bool(int(settings.get("general", "enable_emblems"))) enable_attrs = bool(int(settings.get("general", "enable_attributes"))) if not (enable_emblems or enable_attrs): return Nautilus.OperationResult.COMPLETE if not self.valid_uri(item.get_uri()): return Nautilus.OperationResult.FAILED path = self.get_local_path(item) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.VFSFile_table: invalidate = True # Always replace the item in the table with the one we receive, because # for example if an item is deleted and recreated the NautilusVFSFile # we had before will be invalid (think pointers and such). self.VFSFile_table[path] = item # This check should be pretty obvious :-) # TODO: how come the statuses for a few directories are incorrect # when we remove this line (detected as working copies, even though # they are not)? That shouldn't happen. is_in_a_or_a_working_copy = self.vcs_client.is_in_a_or_a_working_copy(path) if not is_in_a_or_a_working_copy: return Nautilus.OperationResult.COMPLETE # Do our magic... # I have added extra logic in cb_status, using a list # (paths_from_callback) that should allow us to work around this for # now. But it'd be good to have an actual status monitor. found = False status = None # Could replace with (st for st in self.... if st.path ...).next() # Need to catch exception for idx in range(len(self.statuses_from_callback)): found = (self.statuses_from_callback[idx].path) == path if found: break if found: # We're here because we were triggered by a callback status = self.statuses_from_callback[idx] del self.statuses_from_callback[idx] # Don't bother the checker if we already have the info from a callback if not found: status = \ self.status_checker.check_status(path, recurse=True, summary=True, callback=self.cb_status, invalidate=invalidate) # FIXME: when did this get disabled? if enable_attrs: self.update_columns(item, path, status) if enable_emblems: self.update_status(item, path, status) return Nautilus.OperationResult.COMPLETE def update_columns(self, item, path, status): """ Update the columns (attributes) for a given Nautilus item, filling them in with information from the version control server. """ revision = "" if status.revision: revision = str(status.revision) age = "" if status.date: age = pretty_timedelta( datetime.datetime.fromtimestamp(status.date), datetime.datetime.now() ) author = "" if status.author: author = str(status.author) values = { "status": status.simple_content_status(), "revision": revision, "author": author, "age": age } for key, value in list(values.items()): item.add_string_attribute(key, value) def update_status(self, item, path, status): if status.summary in rabbitvcs.ui.STATUS_EMBLEMS: item.add_emblem(rabbitvcs.ui.STATUS_EMBLEMS[status.summary]) #~ @disable # @timeit # FIXME: this is a bottleneck. See generate_statuses() in # MainContextMenuConditions. def get_file_items_full(self, provider, window, items): """ Menu activated with items selected. Nautilus also calls this function when rendering submenus, even though this is not needed since the entire menu has already been returned. Note that calling C{nautilusVFSFile.invalidate_extension_info()} will also cause get_file_items to be called. @type window: NautilusNavigationWindow @param window: @type items: list of NautilusVFSFile @param items: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items_full() called") paths_str = "-".join(paths) base_dir = dirname(paths[0]) conditions_dict = None if paths_str in self.items_cache: conditions_dict = self.items_cache[paths_str] if conditions_dict and conditions_dict != "in-progress": conditions = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, base_dir, paths, self.update_file_items) self.items_cache[path] = "in-progress" return () def update_file_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) self.items_cache[paths_str] = conditions_dict Nautilus.MenuProvider.emit_items_updated_signal(provider) #~ @disable # This is useful for profiling. Rename it to "get_background_items" and then # rename the real function "get_background_items_real". def get_background_items_profile(self, window, item): import cProfile path = S(gnomevfs.get_local_path_from_uri(item.get_uri())).replace("/", ":") profile_data_file = os.path.join( helper.get_home_folder(), "checkerservice_%s.stats" % path) prof = cProfile.Profile() retval = prof.runcall(self.get_background_items_real, window, item) prof.dump_stats(profile_data_file) log.debug("Dumped: %s" % profile_data_file) return retval def get_background_items_full(self, provider, window, item): """ Menu activated on entering a directory. Builds context menu for File menu and for window background. @type window: NautilusNavigationWindow @param window: @type item: NautilusVFSFile @param item: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ if not self.valid_uri(item.get_uri()): return path = self.get_local_path(item) self.VFSFile_table[path] = item # log.debug("get_background_items_full() called") # Schedule menu conditions computation for directory contents. for file in os.listdir(path): subpath = os.path.join(path, file) if not subpath in self.items_cache: self.items_cache[subpath] = "in-progress" self.status_checker.generate_menu_conditions_async(provider, path, [subpath], self.update_background_items) conditions_dict = None if path in self.items_cache: conditions_dict = self.items_cache[path] if conditions_dict and conditions_dict != "in-progress": conditions = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, path, [path], conditions).get_menu() return menu if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, path, [path], self.update_background_items) self.items_cache[path] = "in-progress" return () def update_background_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) conditions = NautilusMenuConditions(conditions_dict) self.items_cache[paths_str] = conditions_dict Nautilus.MenuProvider.emit_items_updated_signal(provider) # # Helper functions # def valid_uri(self, uri): """ Check whether or not it's a good idea to have RabbitVCS do its magic for this URI. Some examples of URI schemes: x-nautilus-desktop:/// # e.g. mounted devices on the desktop """ if not uri.startswith("file://"): return False return True # # Some methods to help with keeping emblems up-to-date # def rescan_after_process_exit(self, proc, paths): def do_check(): # We'll check the paths first (these were the paths that # were originally passed along to the context menu). # # This is needed among other things for: # # - When a directory is normal and you add files inside it # for path in paths: # We're not interested in the result now, just the callback self.status_checker.check_status(path, recurse=True, invalidate=True, callback=self.cb_status, summary=True) self.execute_after_process_exit(proc, do_check) def execute_after_process_exit(self, proc, func=None): def is_process_still_alive(): log.debug("is_process_still_alive() for pid: %i" % proc.pid) # First we need to see if the commit process is still running retval = proc.poll() log.debug("%s" % retval) still_going = (retval is None) if not still_going and callable(func): func() return still_going # Add our callback function on a 1 second timeout GObject.timeout_add_seconds(1, is_process_still_alive) # # Some other methods # def reload_settings(self, proc): """ Used to re-load settings after the settings dialog has been closed. FIXME: This probably doesn't belong here, ideally the settings manager does this itself and make sure everything is reloaded properly after the settings dialogs saves. """ def do_reload_settings(): globals()["settings"] = SettingsManager() globals()["log"] = reload_log_settings()("rabbitvcs.util.extensions.nautilus") log.debug("Re-scanning settings") self.execute_after_process_exit(proc, do_reload_settings) # # Callbacks # def cb_status(self, status): """ This is the callback that C{StatusMonitor} calls. @type path: string @param path: The path of the item something interesting happened to. @type statuses: list of status objects @param statuses: The statuses """ if status.path in self.VFSFile_table: item = self.VFSFile_table[status.path] # We need to invalidate the extension info for only one reason: # # - Invalidating the extension info will cause Nautilus to remove all # temporary emblems we applied so we don't have overlay problems # (with ourselves, we'd still have some with other extensions). # # After invalidating C{update_file_info} applies the correct emblem. # Since invalidation triggers an "update_file_info" call, we can # tell it NOT to invalidate the status checker path. self.statuses_from_callback.append(status) # NOTE! There is a call to "update_file_info" WITHIN the call to # invalidate_extension_info() - beware recursion! item.invalidate_extension_info() if status.path in self.items_cache: del self.items_cache[status.path] else: log.debug("Path [%s] not found in file table" % status.path) def get_property_pages(self, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] label = rabbitvcs.ui.property_page.PropertyPageLabel(claim_domain=False).get_widget() page = rabbitvcs.ui.property_page.PropertyPage(paths, claim_domain=False).get_widget() ppage = Nautilus.PropertyPage(name='RabbitVCS::PropertyPage', label=label, page=page) return [ppage] from rabbitvcs.util.contextmenuitems import * class NautilusContextMenu(MenuBuilder): """ Provides a standard Nautilus context menu (ie. a list of "Nautilus.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): return item.make_nautilus_menu_item(id_magic) def attach_submenu(self, menu_node, submenu_list): submenu = Nautilus.Menu() menu_node.set_submenu(submenu) [submenu.append_item(item) for item in submenu_list] def top_level_menu(self, items): return items class NautilusMenuConditions(ContextMenuConditions): def __init__(self, path_dict): self.path_dict = path_dict class NautilusMainContextMenu(MainContextMenu): def get_menu(self): return NautilusContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/clients/nemo/000077500000000000000000000000001362112712700160225ustar00rootroot00000000000000rabbitvcs-0.18/clients/nemo/README000066400000000000000000000014401362112712700167010ustar00rootroot00000000000000RabbitVCS Nemo Extension This extension is meant to be used with the Nemo File Manager (fork of Nautilus v3) Requirements: * nemo * nemo-python * python-dbus (> 0.80) * (all other RabbitVCS requirements) To install: To install for all users, copy RabbitVCS.py to: /usr/share/nemo-python/extensions To install for a single user, copy RabbitVCS.py to: ~/.local/share/nemo-python-extensions In both cases, you may need to create the python/python-extensions folder. Restart nemo with the following commands: $ nemo -q $ pgrep -f service.py | xargs kill $ nohup nemo > /dev/null & Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/nemo/RabbitVCS.py000066400000000000000000000573201362112712700201620ustar00rootroot00000000000000# # This is an extension to the Nemo file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2008 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Our module for everything related to the Nemo extension. """ from __future__ import with_statement from __future__ import absolute_import from six.moves import range import signal signal.signal(signal.SIGINT, signal.SIG_DFL) def log_all_exceptions(type, value, tb): import sys, traceback from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.extensions.Nemo.RabbitVCS") log.exception_info("Error caught by master exception hook!", (type, value, tb)) text = ''.join(traceback.format_exception(type, value, tb, limit=None)) try: import rabbitvcs.ui.dialog rabbitvcs.ui.dialog.ErrorNotification(text) except Exception as ex: log.exception("Additional exception when attempting" " to display error dialog.") log.exception(ex) raise sys.__excepthook__(type, value, tb) # import sys # sys.excepthook = log_all_exceptions import copy import os import os.path from os.path import isdir, isfile, realpath, basename import datetime from rabbitvcs.util import helper import gi gi.require_version('Nemo', '3.0') sa = helper.SanitizeArgv() from gi.repository import Nemo, GObject, Gtk, GdkPixbuf sa.restore() import pysvn from rabbitvcs.vcs import VCS import rabbitvcs.vcs.status from rabbitvcs.util.helper import launch_ui_window, launch_diff_tool from rabbitvcs.util.helper import get_file_extension, get_common_directory from rabbitvcs.util.helper import get_home_folder from rabbitvcs.util.helper import pretty_timedelta from rabbitvcs.util.strings import S from rabbitvcs.util.decorators import timeit, disable from rabbitvcs.util.contextmenu import MenuBuilder, MainContextMenu, SEPARATOR, ContextMenuConditions import rabbitvcs.ui import rabbitvcs.ui.property_page from rabbitvcs.util.log import Log, reload_log_settings log = Log("rabbitvcs.util.extensions.Nemo.RabbitVCS") from rabbitvcs import gettext, get_icon_path _ = gettext.gettext from rabbitvcs import version as EXT_VERSION from rabbitvcs.util.settings import SettingsManager settings = SettingsManager() import rabbitvcs.services.service from rabbitvcs.services.checkerservice import StatusCheckerStub as StatusChecker class RabbitVCS(Nemo.InfoProvider, Nemo.MenuProvider, Nemo.ColumnProvider, Nemo.PropertyPageProvider, Nemo.NameAndDescProvider, GObject.GObject): """ This is the main class that implements all of our awesome features. """ #: This is our lookup table for C{NemoVFSFile}s which we need for attaching #: emblems. This is mostly a workaround for not being able to turn a path/uri #: into a C{VFSFile}. It looks like::: #: #: VFSFile_table = { #: "/foo/bar/baz": #: #: } #: #: Keeping track of C{NemoVFSFile}s is a little bit complicated because #: when an item is moved (renamed) C{update_file_info} doesn't get called. So #: we also add C{NemoVFSFile}s to this table from C{get_file_items} etc. # FIXME: this may be the source of the memory hogging seen in the extension # script itself. VFSFile_table = {} #: This is in case we want to permanently enable invalidation of the status #: checker info. always_invalidate = True #: When we get the statuses from the callback, put them here for further #: use. This is of the form: [("path/to", {...status dict...}), ...] statuses_from_callback = [] def get_local_path(self, item): if item.get_uri_scheme() != "file": return None return item.get_location().get_path() def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-cancel.svg", "scalable/actions/rabbitvcs-ok.svg", "scalable/actions/rabbitvcs-no.svg", "scalable/actions/rabbitvcs-yes.svg", "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.svg", "scalable/actions/rabbitvcs-editprops.svg", "scalable/actions/rabbitvcs-show_log.svg", "scalable/actions/rabbitvcs-delete.svg", "scalable/actions/rabbitvcs-run.svg", "scalable/actions/rabbitvcs-unlock.svg", "scalable/actions/rabbitvcs-dbus.svg", "scalable/actions/rabbitvcs-rename.svg", "scalable/actions/rabbitvcs-help.svg", "scalable/actions/rabbitvcs-update.svg", "scalable/actions/rabbitvcs-diff.svg", "scalable/actions/rabbitvcs-resolve.svg", "scalable/actions/rabbitvcs-about.svg", "scalable/actions/rabbitvcs-add.svg", "scalable/actions/rabbitvcs-changes.svg", "scalable/actions/rabbitvcs-createpatch.svg", "scalable/actions/rabbitvcs-merge.svg", "scalable/actions/rabbitvcs-drive.svg", "scalable/actions/rabbitvcs-stop.svg", "scalable/actions/rabbitvcs-checkout.svg", "scalable/actions/rabbitvcs-import.svg", "scalable/actions/rabbitvcs-branch.svg", "scalable/actions/rabbitvcs-refresh.svg", "scalable/actions/rabbitvcs-editconflicts.svg", "scalable/actions/rabbitvcs-monkey.svg", "scalable/actions/rabbitvcs-applypatch.svg", "scalable/actions/rabbitvcs-switch.svg", "scalable/actions/rabbitvcs-lock.svg", "scalable/actions/rabbitvcs-annotate.svg", "scalable/actions/rabbitvcs-compare.svg", "scalable/actions/rabbitvcs-revert.svg", "scalable/actions/rabbitvcs-bug.svg", "scalable/actions/rabbitvcs-cleanup.svg", "scalable/actions/rabbitvcs-clear.svg", "scalable/actions/rabbitvcs-unstage.svg", "scalable/actions/rabbitvcs-emblems.svg", "scalable/actions/rabbitvcs-relocate.svg", "scalable/actions/rabbitvcs-reset.svg", "scalable/actions/rabbitvcs-asynchronous.svg", "scalable/actions/rabbitvcs-commit.svg", "scalable/actions/rabbitvcs-checkmods.svg", "scalable/apps/rabbitvcs.svg", "scalable/apps/rabbitvcs-small.svg", "16x16/actions/rabbitvcs-push.png" ] rabbitvcs_icon_path = get_icon_path() for rel_icon_path in rabbitvcs_icons: icon_path = "%s/%s" % (rabbitvcs_icon_path, rel_icon_path) file = os.path.basename(rel_icon_path) (root, ext) = os.path.splitext(file) pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon_path) iconset = Gtk.IconSet.new_from_pixbuf(pixbuf) factory.add(root, iconset) factory.add_default() # Create a global client we can use to do VCS related stuff self.vcs_client = VCS() self.status_checker = StatusChecker() self.status_checker.assert_version(EXT_VERSION) self.items_cache = {} def get_columns(self): """ Return all the columns we support. """ return ( Nemo.Column( name="RabbitVCS::status_column", attribute="status", label=_("RVCS Status"), description="" ), Nemo.Column( name="RabbitVCS::revision_column", attribute="revision", label=_("RVCS Revision"), description="" ), Nemo.Column( name="RabbitVCS::author_column", attribute="author", label=_("RVCS Author"), description="" ), Nemo.Column( name="RabbitVCS::age_column", attribute="age", label=_("RVCS Age"), description="" ) ) def update_file_info(self, item): """ C{update_file_info} is called only when: - When you enter a directory (once for each item but only when the item was modified since the last time it was listed) - When you refresh (once for each item visible) - When an item viewable from the current window is created or modified This is insufficient for our purpose because: - You're not notified about items you don't see (which is needed to keep the emblem for the directories above the item up-to-date) @type item: NemoVFSFile @param item: """ enable_emblems = bool(int(settings.get("general", "enable_emblems"))) enable_attrs = bool(int(settings.get("general", "enable_attributes"))) if not (enable_emblems or enable_attrs): return Nemo.OperationResult.COMPLETE if not self.valid_uri(item.get_uri()): return Nemo.OperationResult.FAILED path = self.get_local_path(item) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.VFSFile_table: invalidate = True # Always replace the item in the table with the one we receive, because # for example if an item is deleted and recreated the NemoVFSFile # we had before will be invalid (think pointers and such). self.VFSFile_table[path] = item # This check should be pretty obvious :-) # TODO: how come the statuses for a few directories are incorrect # when we remove this line (detected as working copies, even though # they are not)? That shouldn't happen. is_in_a_or_a_working_copy = self.vcs_client.is_in_a_or_a_working_copy(path) if not is_in_a_or_a_working_copy: return Nemo.OperationResult.COMPLETE # Do our magic... # I have added extra logic in cb_status, using a list # (paths_from_callback) that should allow us to work around this for # now. But it'd be good to have an actual status monitor. found = False status = None # Could replace with (st for st in self.... if st.path ...).next() # Need to catch exception for idx in range(len(self.statuses_from_callback)): found = (self.statuses_from_callback[idx].path) == path if found: break if found: # We're here because we were triggered by a callback status = self.statuses_from_callback[idx] del self.statuses_from_callback[idx] # Don't bother the checker if we already have the info from a callback if not found: status = \ self.status_checker.check_status(path, recurse=True, summary=True, callback=self.cb_status, invalidate=invalidate) # FIXME: when did this get disabled? if enable_attrs: self.update_columns(item, path, status) if enable_emblems: self.update_status(item, path, status) return Nemo.OperationResult.COMPLETE def update_columns(self, item, path, status): """ Update the columns (attributes) for a given Nemo item, filling them in with information from the version control server. """ revision = "" if status.revision: revision = str(status.revision) age = "" if status.date: age = pretty_timedelta( datetime.datetime.fromtimestamp(status.date), datetime.datetime.now() ) author = "" if status.author: author = str(status.author) values = { "status": status.simple_content_status(), "revision": revision, "author": author, "age": age } for key, value in values.items(): item.add_string_attribute(key, value) def update_status(self, item, path, status): if status.summary in rabbitvcs.ui.STATUS_EMBLEMS: item.add_emblem(rabbitvcs.ui.STATUS_EMBLEMS[status.summary]) #~ @disable # @timeit # FIXME: this is a bottleneck. See generate_statuses() in # MainContextMenuConditions. def get_file_items_full(self, provider, window, items): """ Menu activated with items selected. Nemo also calls this function when rendering submenus, even though this is not needed since the entire menu has already been returned. Note that calling C{nemoVFSFile.invalidate_extension_info()} will also cause get_file_items to be called. @type window: NemoNavigationWindow @param window: @type items: list of NemoVFSFile @param items: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items_full() called") paths_str = "-".join(paths) conditions_dict = None if paths_str in self.items_cache: conditions_dict = self.items_cache[paths_str] if conditions_dict and conditions_dict != "in-progress" and hasattr(window, 'base_dir'): conditions = NemoMenuConditions(conditions_dict) menu = NemoMainContextMenu(self, window.base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress" and hasattr(window, 'base_dir'): self.status_checker.generate_menu_conditions_async(provider, window.base_dir, paths, self.update_file_items) self.items_cache[path] = "in-progress" return () def get_file_items(self, window, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") return NemoMainContextMenu(self, window.base_dir, paths).get_menu() def update_file_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) self.items_cache[paths_str] = conditions_dict Nemo.MenuProvider.emit_items_updated_signal(provider) #~ @disable # This is useful for profiling. Rename it to "get_background_items" and then # rename the real function "get_background_items_real". def get_background_items_profile(self, window, item): import cProfile path = S(gnomevfs.get_local_path_from_uri(item.get_uri())).replace("/", ":") profile_data_file = os.path.join( get_home_folder(), "checkerservice_%s.stats" % path) prof = cProfile.Profile() retval = prof.runcall(self.get_background_items_real, window, item) prof.dump_stats(profile_data_file) log.debug("Dumped: %s" % profile_data_file) return retval def get_background_items_full(self, provider, window, item): """ Menu activated on entering a directory. Builds context menu for File menu and for window background. @type window: NemoNavigationWindow @param window: @type item: NemoVFSFile @param item: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ if not self.valid_uri(item.get_uri()): return path = self.get_local_path(item) self.VFSFile_table[path] = item # log.debug("get_background_items_full() called") conditions_dict = None if path in self.items_cache: conditions_dict = self.items_cache[path] if conditions_dict and conditions_dict != "in-progress": conditions = NemoMenuConditions(conditions_dict) menu = NemoMainContextMenu(self, path, [path], conditions).get_menu() return menu window.base_dir = path if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, path, [path], self.update_background_items) self.items_cache[path] = "in-progress" return () def get_background_items(self, window, item): if not self.valid_uri(item.get_uri()): return path = self.get_local_path(item) self.VFSFile_table[path] = item # log.debug("get_background_items() called") window.base_dir = path return NemoMainContextMenu(self, path, [path]).get_menu() def update_background_items(self, provider, base_dir, paths, conditions_dict): paths_str = "-".join(paths) conditions = NemoMenuConditions(conditions_dict) self.items_cache[paths_str] = conditions_dict Nemo.MenuProvider.emit_items_updated_signal(provider) # # Helper functions # def valid_uri(self, uri): """ Check whether or not it's a good idea to have RabbitVCS do its magic for this URI. Some examples of URI schemes: x-nemo-desktop:/// # e.g. mounted devices on the desktop """ if not uri.startswith("file://"): return False return True # # Some methods to help with keeping emblems up-to-date # def rescan_after_process_exit(self, proc, paths): def do_check(): # We'll check the paths first (these were the paths that # were originally passed along to the context menu). # # This is needed among other things for: # # - When a directory is normal and you add files inside it # for path in paths: # We're not interested in the result now, just the callback self.status_checker.check_status(path, recurse=True, invalidate=True, callback=self.cb_status, summary=True) self.execute_after_process_exit(proc, do_check) def execute_after_process_exit(self, proc, func=None): def is_process_still_alive(): log.debug("is_process_still_alive() for pid: %i" % proc.pid) # First we need to see if the commit process is still running retval = proc.poll() log.debug("%s" % retval) still_going = (retval is None) if not still_going and callable(func): func() return still_going # Add our callback function on a 1 second timeout GObject.timeout_add_seconds(1, is_process_still_alive) # # Some other methods # def reload_settings(self, proc): """ Used to re-load settings after the settings dialog has been closed. FIXME: This probably doesn't belong here, ideally the settings manager does this itself and make sure everything is reloaded properly after the settings dialogs saves. """ def do_reload_settings(): globals()["settings"] = SettingsManager() globals()["log"] = reload_log_settings()("rabbitvcs.util.extensions.nemo") log.debug("Re-scanning settings") self.execute_after_process_exit(proc, do_reload_settings) # # Callbacks # def cb_status(self, status): """ This is the callback that C{StatusMonitor} calls. @type path: string @param path: The path of the item something interesting happened to. @type statuses: list of status objects @param statuses: The statuses """ if status.path in self.VFSFile_table: item = self.VFSFile_table[status.path] # We need to invalidate the extension info for only one reason: # # - Invalidating the extension info will cause Nemo to remove all # temporary emblems we applied so we don't have overlay problems # (with ourselves, we'd still have some with other extensions). # # After invalidating C{update_file_info} applies the correct emblem. # Since invalidation triggers an "update_file_info" call, we can # tell it NOT to invalidate the status checker path. self.statuses_from_callback.append(status) # NOTE! There is a call to "update_file_info" WITHIN the call to # invalidate_extension_info() - beware recursion! item.invalidate_extension_info() if status.path in self.items_cache: del self.items_cache[status.path] else: log.debug("Path [%s] not found in file table" % status.path) def get_property_pages(self, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = self.get_local_path(item) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] label = rabbitvcs.ui.property_page.PropertyPageLabel(claim_domain=False).get_widget("rabbitvcs-title") page = rabbitvcs.ui.property_page.PropertyPage(paths, claim_domain=False).get_widget() ppage = Nemo.PropertyPage(name='RabbitVCS::PropertyPage', label=label, page=page) return [ppage] def get_name_and_desc(self): return [("Nemo RabbitVCS:::Access RabbitVCS from the context menu")] from rabbitvcs.util.contextmenuitems import * class NemoContextMenu(MenuBuilder): """ Provides a standard Nemo context menu (ie. a list of "Nemo.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): identifier = item.make_magic_id(id_magic) menuitem = Nemo.MenuItem(name=identifier, label=item.make_label(), tip=item.tooltip, icon=item.icon) return menuitem def attach_submenu(self, menu_node, submenu_list): submenu = Nemo.Menu() menu_node.set_submenu(submenu) [submenu.append_item(item) for item in submenu_list] def top_level_menu(self, items): return items class NemoMenuConditions(ContextMenuConditions): def __init__(self, path_dict): self.path_dict = path_dict class NemoMainContextMenu(MainContextMenu): def get_menu(self): return NemoContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/clients/osx_finder/000077500000000000000000000000001362112712700172245ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/000077500000000000000000000000001362112712700210475ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Add.workflow/000077500000000000000000000000001362112712700240375ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Add.workflow/Contents/000077500000000000000000000000001362112712700256345ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Add.workflow/Contents/Info.plist000066400000000000000000000011641362112712700276060ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Add NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Add.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700275355ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Add.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001103751362112712700321750ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxU;";(b(ލ%F%X'ؒX5ƒb{EĆ A@]<.vcY~sg̙ߝ{wW2z ! B@4KJeT)! B@Ț:B@! 1"kjB@! YSB@! @3F@d_UM! "kB@! h5㋣ ! B@dM}@! f|qT5! B@B@4Ljjj믿&Ol[69p%%%Wx+ʬl{KBS{jo[ \8kzMOQۂ>oBSYZhث/m۶N;Y6m"I+++koMD[Wg+ G1Å\!YuWU?Lbj\I#>j^B+t=|yh!(E j;锔XH>؆-kK֢ƀY; r bQ̵7ˬlFu826#pTAx~HҐ^jbMƼJK4y̶rm^xY;d8P<ޘNsҥit5T*zV]]8"Ã\Я/uMQe%ԄkZK\ag{6;C ֵ`a ~ye߱=~vQ}UVO4?Rnee}?`nk5T8!+ӧ39ʓL'rQ VpsVflƬ`Z e¼wl8-#NA2f]{vK>84?j:)S/m~+،rkպU*v:؋/n8뮻ɴld' ^tpӧs/UU* @)[n?0^sֶu*+%뮋j.9'9~F/1d}z&G[sulۻ  aEIoN닮%X^kha^n>^{XVG|;SO=ezY{!}zqem>z;Z҆,o' q'ϻ \ǂɶgΝjK 3bw})DnYfi8؄peO|Up}WC~Ÿ_~?*czU[^NXd? 3߫~̮u $58|d9EFBCk:pMhjc$Lk֔)0y;l֦mv=D p̨ʚ}k9sf$,3w{΃'=)?Wb"PW GtAvf9͚>~ukO~ۯeg}>|0XnᆶV[ٛo<5)\Omo~ctPh%LsUWr_G}-'hJč!׿MpM7ŶҞ_~93Y|2$lvyxlBaβ~vyg{Gb;t,7l[ռ̘1Q Af  kZ#,Q]xFnlP8dW|οXmf]vYvp!~C˳^ɻ{ۀl77;/3=~XǷ_umC|%O 㵉e٧~:(zI;Snv?G' .I&e.?,Se-0k?]7%ڦiA~RE؜0FM |k_*Ǽ(Kt_Dǁo}ѯm@Z٦;lgX͌gumYض;msm/poQ~D<30܋O믷uEgS^7C;Fn3z8a?m=0N8!oMuH :w_;rH:vh7x}qJT|ڂNϞ=tYn$>Ã΋$ @vuiXSLx < |T`;bٷo_曉eƓ/ZB@艫kp}'v]wĉРUxpF:"Y%Quͷiϗ9`V%(otI[oǗ*^~5^c]tpMt4}] wZhT;}FnnDƣ@nvm&:[?y<>,\cK 7~H8:Ńsύb^i,AHOB׉ @Ȝ0ĄGֺx>⒫It'BX[#?V`֢RKٵ^3/*s衇F$2KZ 2%2Dm/f(O\6C-p!g`5 ᪕Q_|lF@ʹ}믿M9OX /3jU]uяt#fdHeJ@$żX߿r-Ku?nA|fQҏ:([nb}װ &DB#>ٶyPZ1HMaԆkVv{:^#?2 .)eai(q7w\pu 20q#{t"V̊W݁t- acD v\?jR[=zN^ MZ+ K>+ȕ˱_>vVca=4O2v05gI&<<]v2o}ؿ$wđGAۇg>_exTϵ\%ٞ(žS k&5yM>AuldP҅$!0BZaZkCkGӏ۷ϖaZmbH!OY<´:$?HOt$ y߅bq _k׮쵊6g=z9\cb^Psϸ8g#}Q5T 9O(tb,ne]6Z\`A*!J JK/t8Љ;XXD>'F99x&s|rPu#.l $T;CQopk"ˠ}c]?C&Z ~^G:)wtQ_O`םq\|NaU倔'ŵc]!9{)ÎӡuY kcNR{ؤQ_ q_}l ׺.m[!vlSRk֬y%yr>J9>ulLi +fi> \Lvm9me|ޛ@ւE+\\}:>as^dXady9®tG<9<!k< su⥎0 dg8ʧkvmm/zb̓,k@R7+7=kjuP/H(2YWET?g7 y3L?t c}b?'b \,F_ +Dkk輜tD2lB;e^Ιga!p]ma`q;dzl.i `EJ+.hLnA^W\q(tX3]C6&?ӅLPBz>)(Oכi8S+첞 YNH~F#FD;/I<(ur: 5 ^L>#?ߝ-C_w6.B}dK,sh/琴a]4Xp Gu<2OG>']^ ӟאE!PVVefΝmЙ#?sp0]$&t$,~Gt5+[ S+?*~a~eƏ'Xw¹QX'XŽؙ3c^˝_3r0!Fܧ@ܐ#Y\RY*küe0/ncܱut9OXA9I9oOK#Λ m@zp^ ^Is|ʠ^.C,(QA>b:Fēi#}끣.Ls6aHYG\ryȱq9>GcQ7';O_2˭VYZSNVm<Gs ܸGF#ʦׇsG"!?Gcu^+ݣɤ%?8aQC{ yo^gۢ.fk*^Zϛzc䭟0yɄߨsr.ir=Ɉ˹,'07wek iIݞ=y 'aǑĈ?d<=:|/˱Ix/lt5w${VP F? s^a?r`KI8Ιy=񑡽 >^ :y~tyЁKd|#dG G]wjʰ_7Cwd_Bt`ԠqΙZ&Мp ,`*oemI 6mu?NMy8_Z]>MpڷV<|훸`V>7Ѫ;r=ax!/KzFsטqЏ#^IQc|v GG\~ {sdy:LZH?}C#qϹǻv9ɼ/> KAt=-7{{<~2.HʦĄ4Ferǃ;#)2|9\K:.Y<qs﫞Ӓe{~|we%d-_7Op`A=#?j\fZM 9er'O;&4q9OX3 5ZX賤Y@Pg ߶ $6/ {YÝmD&vo't?HKdM?6&}z=>qIikIt-Pú~Grah^%} \}|`AOp.tI#x~Ny\tOaq.pF8KƓB|1R;V U 5 ՙM+9 1F>|q<\$WZBuA5 M ~gtn*QOBiv%=8kadp;n>c0{>eҰ@ G~p2u/Yoz>q㺼.KMKI\Kİ]X}>>vaU} M/?B*e=S25XY3ɚO>M2Mt"H%bD$Yi~u|^I#mw<锓ē{p,REYK#X@xA Ƃ|7d5~\?}sׅ\>UwݓsO9xMkǢE5ku4!|0`2c;?mPր,AXk$3>x;Y^{pa;י?O돹HIv\lWsRۻ/>"k6ʀ;\dQ?auk5띯5ɼC')\} 4p.hWsљnsWc#gXnNz4 ڜ"B@M*DA! B@! 0ܔK! EA@d(0! B@4 m0hn1h$×_~.UꫯŨu4! B`+J'wIۏ|sWλU~m:묓-)H>? wl#xB=`W_}eZ9}b@xM! @YֲP &²%jQFMĊn-QCni8i. :4Z kV6PdariBd]/er*PCG>݊B@Yk5g@ s$UqId!9nwC9$~o =\'ҽ~Rd9y{'c:\}/K/t{ёO⅀B`F@Lobف_o?|<'qPK6I/ {Zǎ Ç~ 6 >`J 2$~Ts+f~WQOXGM4)jBez2]o?g8*/ uq!mw}ƏQ?[o%Oԇ6{m~zwoFܫWXS/=ztlۙnM]ȳ&D]//ʧux9 ! h"k @rŗǙ.Sd Y3& [oe!Tw_駟wޱ]w5f:ujk"ɀas^O#YӧO()7 Hǘsу yq ~"@, [wu#.CoJ+ ֫Ikۃm7i 4(b0lذlA$w喳^(t?s[IGOt CTp#G'FУG% ~;cǎâ8ġsܸqqi 2{!#FSS3U1*SOfm%'v')Idasan| 裏F?|"!OqnWoHe'MÇG>h'.]ozv3<%ޮ\yo}L ~Lۗ,Y;2X Yl$%uKݽ]vkӐG ^gM6N~H2~Pϗu7~\kO~ׁ~O<9!  E@ 2=H=yx<{ ЪגA 8X:wLI8'LD]X }&E2 +`LQʃrBe ]^oo]%SH^Ήz ȐF sDa]cCyXq} hC6YopzSOV!ı<u7B@! @w0dud$'bHY Zp.y׶j4B1UZ8 Ag}WA`Xn'|]Xu-Akܐ+Hr^ (O[š7|{AjXkDBFݙ*Pa,|LBaE/SUސQĔAúyc]?ׅiXN^Zz):P&82q5ѭk'_! @裸"s d tV&ɖ[n dpptzH  C6I>rXB(eN9$uxd,c2ͭ^SH;IO!2,x|R.hx!KݽI>ǘvSGS^~w}۷L/B`~КA+% k-\?iAyΝhpڑ*.iڒ. ywL2.YI֋d:ud]:#]RqI=./B!58MLҼtuzp]{dwҡ8! Ț#1>=P"E85J! BB`η RTB@! @~Dc! B@,tD%PB@!(E!  ~ T! B@G@d-?6JB@! BG7߼+ ! !/~ 8VYe(߯o}/W⅀ ?8o#?vTB*++mȐ!u !-|O?__K̢! s4im6YDW_}5ꂨSqgjFsf9sf#rB@*y`aꫯN;d&/Dmƌ3DֻwhQ> g6B@~% #Z|>|x)PV5 &! FI<5j(9rֳgXź?Əo> ǷV-VN!g'BKF!*:!"ɟS6nOl-UW]5>iz.,jo暜rX|W˅h.<_(nj5?KeU! OYQ`t6fLk]Vc%UχY~,||#Ak[U'.ezniPpE\|! @1H>"Y0aBƧbTFe! !g5jPao}1:Nmk[jkc/>nݺe7> &Nh} mm26ԦUڦkte{S < }1/X8aϦɓ'G0+)ЉSf-M%U֭}t-ѡv-doXֱcG>}z\\IiR8>M*/L+;fD6Ѳ5k℀XD6eʔ9 F*_!0_O Ү>VQ#,06@H&eYfMz#&)e2}ZDhhSs*dg[_Uٔ0}[W&9{'>}ؓO>}'jI9ɏ8U0fxQT%! j\4 ɔv}粂Xm63|2Ѓ>89! @sE@OzeT/!#&Oa߇)π&TYv\$̉is|'h&5 j!0/o /0ON-uN Z]鮣V_iO9rB@@Z1K\#WFڔe¦+- *l8AI˘9f#}U]!/y䄀 Y5a` 9FTiS×Ƶ]_G,dl䄪Xnæ< 儍Dq\d-Mšk;~ZI}Ohi'XPCf.֫K+յ6.vUv_XV>KA+@vs?kr6HY q,Y˄֊i/ݤR۬s+:7'ޟf7=;y.ƬRͺ 7]A! @# eciUI [:-N5Weֺާ`ZB@`q In8rۮv]J#l%}ڥM>%vhf}1kF,q/B@$M+_Yl#u:9g G2KivK?<=[ADDB@! 5ϙTvm;ԗ$k>Nft5^%AzB@! 23yq_r'wϟ>v\fTj6EdhYҮ]ͱ'B@f<ꘁM'5N#l9ɚ?Wٛ+bSbKwۍl>tɸ3gڬYm]~L?w:cǎ1:Wt]2?Q9J߼}lz y50q i߼}̱˅S9{ȑ#m̘16a6muzxV'-[bXc~o dۖ#dN|Uvڶk$eyip.-b?ai+++VZe88?%XŽ9,˥p2 _YYi~muczg{wR]V&qu]7ء:|{^u`V .l(=z}ד_H~ϐK6W\>\┿460R℟7r\q??J>d-ԩS1b5jqKp>oi k5m'|V#K B|S :|m%T4Hom񑴑n9?u=~_ڛooW]w~_ز.o^jjdӦM{"ꫯ{rg}\>sW_ q@ˋ/:ׅk?w_+GB@4?hX>X7`y[0.oϴGs:ڸ){U̧J6$ +k&Md-Rt!ZxHs~Bּӧۇ~h7pCOZ{.F8O^ɼd8gXt9眸vg$8_d|ky䑶Wx+K.v)Sx! ECE@kmÆ |GyJL֮->P~No9Ÿ0u6Y0<-CqL2she01@rql挑z*wm /رk,HL?_OOz뭷?Oqs=7[fsHV2/}喳k^ziٳgv(6yx0?'zIciX{p3f̈eGٻ첋~Q3<3N~G12>erرlF bCW|{y҈wy!{1I\>_߶j+˳?w?Ys :k= ,(ι;K/eƁ ώf_HUW]ՙ;`/r ._l~ԭt ɓQtB΅KޫOs?vx'ČT8|'-n䛧]NfGgy,kRKff5OKXX4>td\VpT2:ƎPen)8!e:s5i|-˜jűs`aAꈣ|¬7կ~76`CY{-L>TQWo'niP,llnmVZi%:B5:y /0/r1;/e!d\pN01keA!,L6IB@b"ӟ^&5'hCԒ6dcZ;C񩓜dYVSv+$S:[nҕv {9N7lC .Tn摠1r ! XyK\D yߚڬ9ߙЅ9JsCkE{k1"ǿ_>NI&X5L!F@&p%'h>ӀzՒ=8Z?UϧDcjp1Y[uU(+HgH-TgZ+O,Jb2s i )ʖN!  .wnIK6%y\~iB$ 9g@rͻ&/d O{rI֟+̂|,GP1cW+V$v;:˥c~X@9>g1nܸL-8pNJ!N rl`n NQ>5Mzj vK9jbQùf3@^,ƴB@_øndpayD BA̒V3G/ Ϗ5,k,ֱaAȝqq܇ IDAT3!CGuNYkI- !AQ ua0rBG2 ~ 믏1~`n׳:+N{wlbi:=ub筜B@kޙ <9!K' @r0ػ{&٧kwj;u7RX}2v=bMt-sND3Z'/UP:V&v66Ԣ:qD7`\qLOY Rac o ٧=sKӓ&w}׮dMV4Y&+$eJO\! @1^41fs|SWξ_f- /鱮-k*\H<KֵtE X$q O21مMЇ5 kW}q4|k B@!\aa|a8   5ok"kRS2F! V(hJ׬ZS6TL ! #gB@! @1Y+*C!  D@d)B@! @Ak&L>R12B@!X 0| qpjB@! iwIͬ(M B@!Y[xثd! B@ԋZI@!  JB@! @ B@!Y[xثd! B@ԋZI@!  JB@! @ B@!( ^䚚mOfn2L<\RR Nᖁ헗ZYs6hǕ'mڵAƥ?6qŒ5n~JKKmm6='}7o+/JZ f@i736]C_h>({kB@KEA6qdL j'̙3m]w6mJ`Ik`7ˬlV/vQG%9%tAF0?4̔1r;bf<3i;cWLS~[=zt̟od\~6 9@.X{v_~z DaozE]]W*RQQHxm$RgXfomnV vXm,0/]}vڍ7dǏiSN';=]7X枰s9 7w? xP ;c'\s;aaŇʖYzi_bGk~UoڴiQ?m+Eng}Ʈ˯m/s[r?L qևW\sf[o儀8śn)Dr)qz#ħ.KƁYѰa"y5[ Iw}H.8>UTTݤI2,7θeь]Bƥ#~uqifU̬dW^K,W5aiP|*]cF]C^1+C[Ν#q6m=chq9.|@ڸq8!Z0,mQ8~ꩧRk:u z&7wa'tb 'f޴뮽.c=l.O<OЊ%/^{\kHYg>`1`ް[dƒo߾.n;/.ꇽsXc :[}7}|vp&g={}v믿& wg[ǎ$HcۇG~-ֻwH 00]~Yw{ZnoS}#D-n6YWVD0pN\U-ėZ0pTYېDŭRhX $Ado>>F&/O#v" ~l 6Ȇ!/:\8C s?4(K/5ky+tLJ~Łn໣=[}Զh=w}2p Q}&{4<,ϬmBB@4"|`VjҘ3<3> K?hpGDų7fZ}Ǡ0%9-at5.AV ΟbZٛ38#̐y>uR6/呎{f&|pr80AkE|O9^"LĞz|)x}c¿7q;oD\VZ)2c53δ7IK:=Wi@=EOv2T81/r1EGXɈ ayFJvd%tw9oMbqdz|N7;)]< Y׏>@78oYZnڇcmM:9XЀ2l. KKkcp f-M3 X0%ɳ_s_:Xd#/<7G !kځ#GF?]"L5bL}gűaufFWo\bY֓4݌+>KEG]>G<4L3S]簟10?SVKc5mCuò#ooSsqi4?q $Y`|+8qb|ijuto ީ9p~9ADMX)A3r>tG~H-7G}-Zao,ʤYI>9眓eۖ,+*] ul[,km"fkC=/ts >jתVVVefΝXCd!P4x+XuU)vx&23 g ꘵Az表z@d l>`r\9ᶰ؞5tl@`A}q 5TٲeѹOGWG_Kʰ14o~l?}]~j! 6030EױcX rHD1p#mA$6`9BUVBǬ\`\Xp^8x`_f' )8gJ럟0c+m}iWK^õW5$iwʹ~˖evIm5*M!!YP]琩B;}]zHұYurӳ_la_Tt|:%_,tI}1/N^OeeӽsaG k+٤kq9g YKžb΃kֶ ']}Z~/ !d@.pDx^v~|/xF:.O8@xώ qz7s`c',bLSd8_y/W nj!哿KoH57;74XwZ^vtzC|+-k>ץ @Ʌnas`UKGs2-Ajx K[g\/_DſVV:.z%,.,a)_,9C_5qE5:kظX-ƖL:o9vsҜ`-ER6y\YiY6vHl!aL5;}<Օ^}>HFmÂ7OrDr4k:3b6mO-Y+-0/uzeK-TVdС{ۨQ#74 0 .OB@(*Y 駟C9$[wy6|sٳZ7]{k=c[mmv4E]dX.x<#Y~.o֬Y:ؚk1 Sl`PyGB.]}OMyJC`*A}c5 -qgGҸZE3H֟}'bX57l3С;^xi rAkb|}]u_f̘aX^X_qzd瞶ۭjm۶i]izuE=k׮Y[nŶzk{g_s9'vڠAlvGۦnM$ιB@9L2%<~L3ƍuM,sd`Gx`Mu0 eeƎ S"+3s? o@"Lx2O,c2`etMx嗳z$]ezr-3a@Ҕ VeȐ!?0SSS3o]U&X2mQ'J+e JC`ԩ@2_~eV߂!QpF 7!@JE3 +|W>~uW~}&ɼQ9}mvu֥ד&Mʀy睗 ⺊iu@b)~pg~ǘz #GL>}G3;w~B@,|q]r 9fb>D: B/<,8tDS`EB\U._fmɪ ӟ;fƌTldDGj9A|73j믿$B@EI֊6 zw`:uʚ\r%aN' uǺs⮮|cafoq_ה%gJ 8ihZ^vZjcƔ[zZi>cr3 O8uxA2mu˥3w٣Gkr[W [ ;){ue34$Xí[nvYgY7ߜҮ];'#Tet"@Qn ӊs0X?>>䓃W^wAnF .QcM u9,z+/&}7J SX" Y@uxxAА\~KlI$_0,Kq{aN9oZi2g B.W_ߥ|:Y?ZK>z_W`U^]ZPABnGWWZ]՗|ؐ ?IDAT 6:@B@45[2, N X 5A0]loBpOcQ3 TK9䘔<k61@ׯ_8L,mvjYXO60~qO% ӷo |iݔbt6-pcqShh ^=h) x D}6x` Vf#B]O?MXn7`dI'TWquO,\^zi$f.l_a+Icy!,'M@I\͛9Vfξg}:֮:rζx2~DvtBZز1x%w!ǎŰf-͗B˧K]XrɄń1>JK& mCCK-3o 3|1=6 d ӡrՙ' AKҲi;`amZY$'Xd?3~]?73 u5;fZeKCǙƠ2Ozu58=z1v.őtOHו2CKەoN6ĥncW'˗^WZtB@4-E!k i }jo b"#<2osqz>b{urB@!д4[ƚ09!0'g<F*S! \e\%* B@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0"kC%A! B@cB@!P0 ,@^*@J"B@! "hdmM6)L ! B@A JbB@! X- UB@!  D@d@$&B@@]e ! B@D JbB@! X{cU: "E#YAnVaEcUbL$Qc,ĊK]QcȮ;4*Ea>ޜ7S`7|{~>{_[PW" " " "P! AMD@D@D@ڂZ[PW" " " "P!^;e;+lRn" " " " Lݹe@97HF0:uT-jd[ʡ~}|sXN}|sX׈or]?~m>rXG׏_#GutWz۴_|Zuuٳq` _^6 '~ G٬]?~F}YTX޽{EyyF[|7gS%|#-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX'櫫-*kUUֽ{4Y|z=U_׈󑗾?}t-n3bVja} 8&SEb|6|[l/Sʯ]bq_Έd/si6_砭@'0{lѣ2 t1>{lذaFԈs7vmgW]uUZoMnA%G̸:.Y?zq{WkMo뭷N?m Q4icH"SO%ѣ >|xZkK;/S"쳏u]OCQ<.Ɯ_xf̾n+HsǧZyÇ1JF"ZY'q~v: 6\z9[o:8hjYJ#ֈ ,DĈƐ^zy'Rk /W_4B)!_]vm?^Qcxwm,E|\h{aGuTZqԤ[}AqD\sM{ュK.FꫯiLER_~IE-5fx`#q_$6Y#\ $"?cQ/n&¸$FL:43&>DvuW߿OykM?" " >5˚VF"א!p$*ƒL~ 1Gt[|MG ô+"/?5#ID^{%ӭL"P&NDq\D(+N=քb[^”cRc~9L?I~iކnh[lEr1ջۦ!Ft7.\jf4R"}Z@#('.œnnm^ jmŭ5޺nRgMOvZ :|M$dJD7w9 s=#=z X/F8H},oq'N;͘ze\N:i.\ DWacQ4'f; r+Q|=-5f8?tCd- qT&B)oƶ&t'5U7{3+_|eMzlñpDxɇj18.X9c$sNYF\<~8.;nO9[k8D@D@JW?&K X9Xs;[.smN}@녏絙XH[Cq}AJO@|ZFY ^+\D &M*1{9bpV5+9Iʍ{Mm7rMnIeZӼJVt&Dk" "f-Wk#bֿwxxYPëkBgkmؠ-K qk;V۱ηF+" E8V.0;Zֶ݆֯.ܰX') =AzA [eG[oaQxlLy<f( |4{ߦ{1c?\p)+p@Eq/̷.nK6>.*/" " " Nvޢ&kYRi6vT$x5RY5Ak.ƿ3K_vy?Hߞ+>$" " " 艹:}oҲ}:FmڹA^+uE0"|*>@!76yjΗ6)4&еzX դQQCyTԺϊR#:fg^k6MsRSgYdz-/!Zn\& 4֨H+QsR%Q!ԢmGMԋb{yr AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx add "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID AFE7E851-18EF-4A7D-8B08-8F9C64823033 Keywords Shell Script Command Run Unix OutputUUID 8D14C1FA-264D-4E60-99AF-82B291989742 UUID 7477CE01-28C1-4749-9A53-8D6F445B5ECD UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Annotate.workflow/000077500000000000000000000000001362112712700251205ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Annotate.workflow/Contents/000077500000000000000000000000001362112712700267155ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Annotate.workflow/Contents/Info.plist000066400000000000000000000011711362112712700306650ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Annotate NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Annotate.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700306165ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Annotate.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110341362112712700332470ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATxE3"(& AE9g0zzzfpxs3 sDD@@9˦ifvewgY^^uuկ_UM<9!GpGp%V^)GpGpEɚwGpGp1N9#8#d#8#8'kxGpGp}pGpzz|qj#8#8Y>8#8@=FZ=8^5GpGp9#P{$ )//_~E~7;w4nXUo){ MЩگuFWi֬2}Ao+;ެJn^pFDmҴiSg}I&J pvӸv}-]:@D. D¿ҲL@{lmpT<;dZf[}&tU UZgW{NK95сmԨQjYo5&̊bRgR,V<\""‘ȗŁ(5‹Cڢ|iv9e~f#kN,ϗQi zyGd8 0ix*&˗A4JKKV[IYYLee:"@Ю/uY\*yJn5 .Ұ}+i(\@,l/,ɓ{wL;4jHDMVLrKJJ3SaBV -~W:8>}fǘC{ʥ]a9b׫b74dydҹs*V&iӦ / gufgMGSN_|1eSNQ+.)V&:)3.X@~i6l~[$p7m& & WU?,/O}oʔ)W;<'-N/(I`Z %ºu,W_xpo{.STT,qKB޶52F'?|=P赾,.*FKIq4kBpҷ2Q,)*-[Ȉ#h31c|ᴲ=g*4 ZIsϕ;N'~%I_Qg:ŭڒo2qdktz.O>]{챤h4-Y o6.I#^&:LfѢEz(`( ɞr~M6RTX;S_J( p8] VGQY~Axd}M_T0C KRrYWQHJV|]X(C<2K$%$Y6e…ɾ֟*;CRl寪?`1~V2=OFM._}Y~X>vΝ*=7B|iڬyZ5 OZc5d6W s>}N6|s-KQ/oJau_=>:ʸemztꫯdȑaYmRXX6dy:{,2+Gێ.֭['֗:fgrbFOn&b]&,*gy8{V&uFNtR(T{6=S-\/R9sK/i;x,wqGݬjVfԁ=H%KAÚ∷KW_~)^{7/A s>fn)9 mЧn椼A~zҷo_y|,}E|"V/+zյ[k@_L8/e`mL= 2`}BO\QcP/r9u…מA8,mؖ,)R= .R"ׇz&N?M? ֩&DȻљzTX wnmx@x0!J>L/|3hՏɉƠk @P]d"/Vޣ{yy}pamCl,'Oo 9wǰW_ uE,>VGzծT<a( DT&-l$mgkQ^#)ź}IGu F:(\B\~qG%#'|Ry!oT$k}x|5\#۷nݺ)!B&&#Ut럦7B!bhL3B;g/FbW{.5С>pP_ۤ2fi7yǂ\~Uf5F[o$!7r?5a9S4C:ڴm2}=JX~|^BL_"5x㍓eGF"qػ _#¿'ryʹpj#U-&}V~Y] }kH;꪿+oD{ ,LXܸ묳Z\`AX*`NA(^[m)#4t3{Ǣ1{l㜃'lY^;G/u|V7Q,pr aѶPN8Z}!,uyKy-**6@%u49?ʠXxvV A:22!COWo,<ճdC>ؘ֟8ʵ砞6qnam7ѣu9KM~\nvZ{,UkҤIjMd-mu lK袾,џ9;K`32ԝ<ê)COkǾBs/k9~m +E@I *Rɜ1?6!MA-#_=kg?[G8;ǙH|H8+,Z"C?yD~N5]LfM9m$ F7 Y pR!NO-[{Xbևҭ1GsNyXs;C 8c:PG}u23IO*C-kA9@X5C>($ K˃+"p .aOlgp*f __ׯjY9Qh>,.^x֕Ns%h9l-Lln, q%dҥN]wr`݂n*rX3^C6'B( !d?4*eCIlヷ9&rp!s@0"L<E&: K|.0.ɐh^ GH0~xŁ:ģr9L'㡯;aer?{89ڂ>5p7k%W,uu +9$EoV4Ñ/[tϻIjƒܺa3I$ JUq#i݊]0 9-lE1|#q`?pqqطB7}/sMY3&EMW9cZpnu F֚~E2g̮+>2v\≮=Ĉrı*}YUez(BT#}N桍q=aG7D= 6ҏ86o631˞tdXn0นS9OƓ7ᰂQiԁx, 6hD97]vN>MC?8oܛ9GK G{!seO&}-z?E y5䭭VV[nZ.]SG`in>&LYL؍J<&O\*g2.ፌr33+?][Ha,sqVO|dh/9aN]V/tatZ|*{ڃl^ Ngefخ~[m¯G|!:_jP^~IBhNAt6&٬BNo',.H]͛I Fo \FM CK[ qmI5BaE^ԏ~d:[DzAn!P,pLhaiϒg= A]2!|.e3=l6mh9kEۈL4l2VO8Z-/>vɞ8Uˣ?^j%2|Eݪ:Ub:8 "``[=]|@mUtN ַ@dG&t B4$oě>-E}IYh:gOaa䉣θh<-ץ\ʷy˒\qf:!Ry20d٩$UZDuVcI|oEJԓ`:Yqv]QyK'[\,kzM:X\VѷKM#/?XT.{ƛ{jRW#`tXbo ^WX6n6عaiM0[¶daҰa6s oz^LV?K8g7yctd-81]V,FjKI\KİDQ?@&>f,ZVgm|T~,ia#e\;(k@{g=|0e"\_s>D򑎋iDg$Zkivt|^Q#m7<œ{p,PU7pGÎJ"@@$Ɔ|&7&d&5xPU6T%c2[|;s-p62?F8Z&&oQuuΤ>DH$kj$->E[8#[!DA5ה˦H IDAT?ԍ򙤍3s>9B.$c{4=zn)x8Ox~X<ݿQtXW*c]U}ZUx#P l2`2cs{ϖU* >Ktҭ5d7rENMtSL1)INKVoj{W^EMZM!z4ʄn9ɚb~.'G:sصNךh^!kU.Slkt >}ʇ2wa8iِ. :T-y5KFykY](0ql|62^UNts5#nwGX=kռL|ܾ9ù}~">8,2䵃9r [,™|7?|ҭ~gSd9y'|2c:L|+|Dxɥ-HGpVoܲןM,;ᇏ$jIIF>8iZ:aKkٲZ0|\om{?j2d~To߾$裏w'V,ɣO?T̙wuW>K,O˃@;VBivJ*J:x`]jHDk|7\/&M/"I;0Շ_v*~mz+ ԩ$uA'Om<zo6ZoB^u 4HzqVGp d1s@8KeeUj!K-)S(ـ8n* "|̙3嫯_.X@9%2,si߾%,?ݺuSHIxG*ABcNUD2tj+#e 'H9˟YrKd(>:HtE $gϞ,^{Mh;.]IOdaÒu]W^{m9rGH"?o}|pGpV'kDHcUj!kl' QM0AfϞdC% /RiӦ)9=q>}@B6c xu~j<2FyX|Mq$DeQ:IQ>?l5ڍO!{?|SN|"!OqfLWoHe'MQFHq7j:_~m%LX~adaGpAڊeR0s0)'fdpd-LML8(!XȰ@ 7,bem:%^!KzKkASPoEZ=S?S²K=z K!^{)B+$ 7D geZ?Rwk'~۶muoAl… É4I`u1FYkM~|o:oipG.A5cRƱ0G#Ys cxu/թu֚gBpFq>k,rtq`AiX 믿G9ħ+2Ba %LvY7'<,{,>|#y9';|m3#CuNƺu|ÊACz՛z y%=l[az@8#T /j]m$ Y`Ɉ!za6CA4̡Im&^( G$rA駟tWp >\]XkN=ncmb$9E/Uy_]j!X֐GvW_UpԱ'gKr/3H wﮄT CX0Fɋ^ux!')كuƾ4Q ˰ԝT @Kqtlf]3<GplfTD,/)HәrX &첋LA,s=/l|PLj`2I%)BGYhY $s: OCd5Z<]>ʱg!KݭI>ØvSGSV~7}͛7_LupGX|ڊezt*ؤmq8È0S[:噜#8@upZ5P[a F*=|QwǓfQbE97=vNqyK3;7?/znvnQg#eX]Wd,s\ThzqGp $Sܫy3'890l'ga!8Y<{po&%g2+ʎ#l2f-2Mɐ',|D<[hHSGKŮ:yLGc[Gp d: ƃ*+J6"'C#!شV[ȑ#eΜ9XZfDҏ?XuAѳ]o#5{“ebɒ%jUG9#P\E,lcƌƫ}GM^\6DˈŋVֵkW%v#8JF4}5jT%PV5&GprIO6FM8Q&L {キtQXa1mƌ;/뭷>2rXw#lLb|b)4o Aۯf[}pV_ kO6N3ed]v7XAJElmVrĬ[nooD-*9у>{8'kxGӟ. DV,Nڷo/;OĹsG"#T}2^/G`5F^vL<oT*-UXR0#bYz4у>rpV#8'kBx5G`yU,`ćZjUx)MG|O9G4z9V3J&RAr^8A찗1K3B*>i9%;Gp&kaXM( 3KdAaҸWZ߮XHȄYZvK< eDqTd-Nšm;ca|0HL6M#,aYMtjH:-6 j]a6mn<6?l;;pVV͖kR6HY 1f %YKŠgi;#PSrd.MV22v1ړ.{ߙ Ic`"mAGpj (ЏUE-lx8NHߤH㌣`\GȌs G",= I*D2}ڍ/̒A?+V쾩H"͛8K3\wGpG ")4آ\~xpDyFӟ,?y:+کBҜ;#8# r"S*(\p`{ٯOL٤JYEVs[;$OZ%-#.8#8@a__H̰_/ ؖ<ᴻ5l/5`|iٴ,j sQQQ&f͚6k#8#8xrk/m[]MGR5#j3磊;w˓.}ڍl:xѸ%KHqq4mZ񖄥-ͧoٲFk\T2)qao>ǚTx}̰KeU&L SLYf… UVҡC__7oN٠\Mh%͛,'gdJf_)J~;m)IYY^xZaVj{˦n*׿%[_/sL5_"~r-Gpsw}Ս|뭷^Z#Xy2F6|47M_AڇUt duҰlΜ9rYgZkEj!,jQ YvO-Z$} 8$d7ސ޽{ˉ'w}WduG+Zhy4o+m۶/\;JOw޽{w9e-\6TK6mOS:8#/,j6|s6lr[shY+;#tISN9%^+9O}UC{M_a?Xl B3th2zJVpX2:X %{oqB85bgjd?; K8`C<{ XX1q:(0~ XbV*wAŐ%QFr#oxbdM@H(["ac)SB{i-Z,!8@Aru-h;ץK:B5:ykV]w]7oClq_~>[ ĐZqQv9#8#P򧕉E Yhy8E~d|$%Y jK"ˏ1Ү];=t-$k5)H n#WUY ?Xo +.g-x!r?,҄e.\Q>(?ZX~zSO=&S.>䍗EB 4ODObduG.6pC#]t+CiRN)k 6Зl2cSm}H!8By ;4^vtL;=#8@q%lϿ۬YЅ)JsC˃E{kz뭧K$a " DM4^dsK#OMẁ8V< ||ԉ8|) 8tZxyqkM7ݤֻ;O-c|҂)z򆅊07b!9UVn\ME}Yl ۣ> .H 2ykc*d r-P) +Y/Î#8@]"y>5[[ʛ5_Y^;Og+Z2X % XA8h H7f%xtG[bs.5w]~im{뭷.y+裏^f0&uұ2kFN6œge%kTkQ׮]gC jXp0+H,j5xrn`8Hȹ+X\') 'cÂe!CꔲZ86C0fac>or@x Q%Ð IDATgr^zI_T (/O3^8,wug%j5vKuٛf*: \'޼u8#  Xy2BO=e Xgdo˞##&K׎er~_0ȦL2zĚ[挈҉gNlR_s53U:V&lE+to+X@j~Ah-{<'!t,ke׷[i]h\_*=*玀#8@] XibL!j@o{Q ɗNh\W㖵t&₥ Zt&tK+K~嘅'W缅Q 5k֮LqԄtk s8# `t nx0x0HEZl2FUK2o#8؆Y͆ˠGpG 3)?ݑ9K8#8#Ne/pGpj"dy6GpGp͚5+|8#8j=B;3SVdW ༑#8#</y># qC[/z4mڴ9WtZm$?qxLTx1HHYWZis O}_nh@/ ֨;@#RC^(Ղu-+/OZ$OzM 9a9AO8G;|^Zu88Y;w,^XYg L">Y<sΑmfD:u$LY$j,:u[1In5]$!up\,W_xpo{.z ʃhy`m%e"KB޶ةr'ktw#P#̼D|0,ŨM<sjH 2D6lj> 늺HCӵb^e&WC HYo)a-Z%7%O; '&o&ӧ~w%ӝ}1 kŁ,7$XSG2'N;a{b뮻d7N:I~'oXw?.}O&2 ݿ4ip2L}GvqG+cP80;-7ߜ믥_~|leiyiېӋurwr[c 6\/( d͝#|BgϞ2zh-3ΐw]DZ'x"Y(+3?0N?te]w2o޼#<҂kc(y 8}˜K9ݺuc=VH/]آs 7ȠAcƌ?XN= +"4j(_Sн{%[־-$`WqIYM;sJ՗/'KQW MC<(nj!U Jti 5͛72yg1B&~ߩ15s bDۦb26mme3/uU )023ws!6W~7ƾvڪ~[:@Z ma~xtC*?H7oZ^4+Q{^+ |M꫍ j#\#kȧ5x"wEYgY{QOOf.|tcrѣ4:u{L뮻& V2!HX`ѡ-aI0l}M)rǎz04őUhOvSo2Aj!}ہnq>ڳ[4nA'OCΚ*Zc.4 * /˥ep }Ϛ6,`ZÒ$c+2SOk@ye?~.eCҵ}&LPȮ1&~gK,xaufEeXbddl B7ROAx"c`@elGRaS =s̤>$3{چ*[mGڜ[_!hyBa$m\_.dI p0IF$]CC%^D8\a.NԈawe7ʷI_91:yq8nvnh̵v׭ TL珰J*<0ζ d Z\ɐY+)thYc2#4 *hURq-ZHg{M_|䘫 UWIxmƾ4l'hg@mNe2%e͋w /ɴQd䇃dѤr|/*8 VWKX-rryA5f[A[]:0q+چ.oeږ.ʶ!^wkm:G9YsΩ~#9KJJ"ԧ5Q޳>+s,ZhBJ owE|E۰-W j MLRfϞ-ݺuQF-'|)ȯ\|UtVGsv뭷矿-[gS~2lذdh宾jhQmX)@CyRd{U7_\C`֓KNdJf:tz2qD8pHŬo߾pB i;@"PdzK?d++icǎf?M;{Oʮ*;S<Ӛq 5\K/i'򊋋e-={&ćAfa%w_1bƷiF7o.oDA}y晌i ~u-h>I|*u DzN_;nU:)~=gΜx_y啉`8MVumӥUՆL3]]HZ",k{E~Fo=kb^U]ȘUݖo~q%TK[>ȘpF`ܸq:EpC4`88Q&D: B/ceq^cD/*a%oXٰrtIǓޱV+ {׫ )SO>ugF-aȅUY OZj%*gT )]IDATʫȕH.Zɉd09$.U u {<,|xmirUi_~,Z|uP[W^yŊNM Y] {Вmc~fKU@ Dkä͒)\[NORkʴ VumӥejO?3%]>aرcZ>D =u'UםTu!>5"1ap"X!z\]Upal#2Y /$[ʋ6'/6/ R6'6dD=7t "O)XɔXپt1YK+/,4|ukK`PH'DX*=va$qꩧj]JCo吇vPf0h[_|`QI\r%_oѐhm{Ϣ..\|͕CPq\g7toaXrfM{^UM3,&K"t 7$²|"XӖc gU׶4Vtu!.]{N1f$Ybъ\.Dn-KUL&vD& + \rXc9.\]l{g?6ԻNG`BmXl!ؓ]4NtB{ݿߦT'd-SeSѲ5X=jC8Gp"<_OոsC d]Q@i6K'-2|nC_FI+ @=@7ߝՃ UpVzKž2pV ߡE^#8# ueJ#8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\pGp d-7{#8#d`r!GpGpr:#8#NֲɅGpG Nr8#8@V8Y &rGpG 78Y ^#8#8Y!d-+\;u CGADx#OP,&>{1آF}cUc/D^1jyO 0P>άs ΜJ쵿}>" " " "9$:zHUIN" " " "9$:zUUɓ+@%M?#" " " "m,@ HU6Xk,@ HU6Xk,@ HU6Xk,@ HU6襸ӦMmhV" " " " Lkةxh9TVX4hM~c,Y¶Cӎ6l6l\ϯ#g~t5x}l\׏F|-g Zׯ_RɅ[dUuZ0g*\fu|0/MpGߟ*I0`@j/^-m|s6_7ȱblN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gubVSEb铦<\Qz[O磿_S yx>Gߟx=5?o=ߍ}qFl;K,n}P6U$hh̷:JUy(foȣT^][QR.T_׃x=eUȣT^VǯR[E@D@D@D`% Vt{=۬z7^2o޼?ngƌ\~H.\ao xtn*#m 6va;#m홙:u=uzhݻw{vmk֬Yv/luuuh[okd/$}vgώ;XRz7Zkecǎ#<l /`sw}꫷ͪƷAD@D`'JDjjjlo_}tAvWtH_ō^tEoإ^j?]}6e;mb!O\rI9fc=fmV-ljv<L_|qzggqB#G_mJb "~-!{>O?M{m6g[[mU.>#lwu|_$ѫ6_砭@'0w\۷oJDo{}6zh#jDȹmm+27&} 7Ó#f}Ӭ?SvDrDHOv$rO?tO8 1c$.:I`?8%B>؝wiO=T:txCp):j̩8 o.$Z9Ǭ{GS-?l?ØIL%#p?D8;]wfG.ND@D@<C,jkZeK/""O>d*cM$"qܼ_|EꪫB!|2?W^7?p oz&Kf+$W)G&{QGֶqC}aVd'bhQ^{oٳkhS_RQG-"H_=MqH?f0nᆉSFJ]vņ S^mGD@DK`ƽikD9!B| iL"Hk6h#b-玩m&E1N}9pvLW6S1iSmޯ" " ]뾣PCxZNŶ{̹K[kQnRKOvZ :|M$dJD7v) s=#=z X/F8H},oq'N;͘ze\N:i.\ DWacQ4'f; r+Q|=5f8?tCd- qT&B)oƶ馛t'53F}.^4[dp,&9Fqa1AqLa$ D;-Sֳ>OSLLw$#;7Yqr܌-sb0`|vu_CID@Dk(j>.]=VcUO;},MRPzL[h6\tt>\鋛pL.VA_ Ϡay#O܎"H^b '4>;cañQ@c^G_.N%̏rh}P7֧|9%CMdH8+iN$+y԰:sk h&`P8/ihRgE@D`׊y-QS }^cJNrS_cێ,\hS[jnA`_)RՎIgMN)" @aVPa"{ bm_͆ h9/+j{L+Dy}o *߱r{.|k" "^#h:Y˦ڶPs~q}X?Zg>h^uG_ˠ¢ؘ" " " " yPiVsb>iƌp-Xkq#خB{@ݴdGۈ5%"PE@D@D@D 4,Xd?K<&M虄бFjUDd'yb G[d3_Ϧvy?Ƞ~=+>$" " " ݝ艹>soҲ}mM[]P- Wj 5괈aDT(5^}`Cou6uzϦΗ6)$Ыv]vh O"PZuk% Gom4t{uۜ6fϫYN9 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx annotate --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 7B0D7627-FCF6-4B19-8E80-E78B97E72B6C Keywords Shell Script Command Run Unix OutputUUID 89C40097-B2EF-40B4-AF00-209D547885FE UUID D9F8C5A0-2CF6-44AD-BB94-8F63EDF48639 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/000077500000000000000000000000001362112712700245445ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/Contents/000077500000000000000000000000001362112712700263415ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/Contents/Info.plist000066400000000000000000000011671362112712700303160ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Branch NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700302425ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001107041362112712700326760ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGETP 7l}vkka;" J= i?IcI^g;3gܙ=3ӧĜ!`!`@D F*e!`!0f0 C0 |qj!`!`Y>`!`@ FZ 8V5C0 C0Y0 C0 C#`d_!`!`F֬!`!P0V/U0 C0 :!`TXLJJJ?K.\(u9pYYY޷ډǓHN=fjPvVQ4R_*g5o֦^PTfMe {+# 6l0_R^=OrrrjqkwӸz}񇍙/4lG'R.3E15mY])}vɴ4WU>YG 'kk\kkC_N8N2imܸq޲-jL{$gX-xp DJDr˖\Gܑ\|y%.=[mL,n@?5n 2oǜl2/fO?'k!XImcmy$] Zե VTT$mF^\\'Bd_p_EM[v>xKsK^YלyYsNc_qt:u>Q77U"k\g/%T\!ˑe˖|$9NfϞ1CמiѢ[.[=ǵY+h"͕mV6S0͚5K^{59묳|v&t9sLyIzaaib?C ,Y"/5JN?tѣG r߼y8vXvOX߰~3f̐W^yE?|/OZN/)In3ulGbnS߯? k/>Snzn7$Y▻[7ɳ>8TKԩ%<}ϓ:uJaA4hH> ҠIWJ G@Ddg#,tERl|;+^gɑ{m) sEƎ"Η:op(9-Ker-./(;v,駟 {E?8@zXZPEX 4U0ڪo Kc9dĈ%]w[HÓ'k̤&Nv}wo|?X$r ^xA]9rJ-;x/ˁx9qls=4ozȷ|gqaݓɨNbK4?瞫`k_.sΕOx -#Zo&˝wV5-g $厠aMsq%o믿^^\90ac٭܇oSv[\^ ?y;0ݻ.>E|,RozLkme~0/{'Ɨd ny]p{-7|{B\`A} oB e0G! /{8YҊeY仗7G|[q 8}c=8M,[' 9RTGv|_+%SSeάv>އ||]GS֏~r#Ͻj{wZOo־c.N˿oY>h}F:HJn$YUt,Gݖq.y}IgdaW~N1"N?L't|Dvg}&M7~!1K>)SVWh ua`2 $(/8`#ÇK$kYщlĉ+Շ=RM:]\ m%\+ 9tMrG ޤ]qˮ]#֕gnۍ6jGo_VjV2]DI PxL[ZGw֢:Ru[srzòF|wqqGqXܧ<=~iAjq &ꏅabsxQ`#7wmsU4m,fϔM6Mo$KpΜҰWtհ |Iwt'i b#/V90wurD1,Gs˲Oͷ0+ǟÿs=WH`!}r <NG?ߵGFU{Ϙ[#k+v.w[gx{ꩧ,\cK 7?O8:@tUWyCꇴ@ $'Pubi92% >鑽.e".O㰸$*Ia[{pǪaf/J.]d 6{'a^ځUfޢpr`UA&q@CEy=8ʣ͐8teDN^Bq`5r{GJ彄+MOY6b?ꫯ#:S|%b1cO:9E; Z\wY^>/"Օ$~O몍={v?401Qׇ~ėGI?S]v>_׮]d޼yB _+=)@s׷MҮpͲ۞wi9aBr~{}W Rx|Mu]'-[N:yBL"LTG?U7oBr+rdgy9a^C:5oe?~_t ?>ᅲk2j(M 8uQ^+))^iJ/X S@V%M0VX}u7L2o^w&xKIKq21m,=:~ $Bêo߾&\},",l8, 2!R8 #ϡaѺ40?V&Mx} DkF"qػ GUOGzipF5Vhowܮ>oa+q.gz$u0aG顋GҐ׷P]^,nEp 4m6z=ϑ/9OCNp˟%H#g-r˾Yβ&ˡXuS{?~DkH;{PJW@:0XpӉq7h#oqybAL;=>3G6pComcOq;XD>{99x&s|rPͧu#-rBtk!SțAS QL3A';Dx-V A:22!COVo,<ճdC>ب OapsPO80 :a9un|~9KN~\n2hXD״iӼ5Ԓb:j>ց.,G,KPw* }Z>a/ ѿ}zUV|FusY#/4);:Kٶ{, ~&'*?Bf:ٺ6lioO:TG#m./){eȏ'g4iܽl#^|ȽȚhkQtj'z^܋lK?>,nj/189aͥpYc7CaAȸpO'/~ۋ磌l fY[ܬª AA8 LXXd_ zo6dt c}b?V1&.6q\lvGo߾N }#|X\.b_W^B;eZe]a#pyma`s;dyl.Q `E|d| 7 -릛neX tFþuF62\r!Cb1Xh~ /a:C8k୎Ƀ\HϤy 'dx遽  ~2di;} ̫u! &Oql'\9x+.@2qhY袯^@&<8|wC} UF{}$K]z:bE{95rb*햆;ir Ͻ=ȵs˟WM.S$M H&6r ő98h_*O\#=K] ܾ5iρh,X4U͙"I؟2w,ga,p>/ѥN^W|dPhq{)7cU"Uʥ,,UsӇyhce0j%">/c{B1{ sOXA96FUk^Um@V=|"7ybٓ# 7s"ziadISRo,F48دIx$ԩ >eF-Y!z]T8 㚃NJ=<^,U3҈xS6mpp=pEq&,\I<{ -'/'mTGMZ>u:rZ̓+ViTV5]TC09چh*p-!BگIژ^pdM|. Ys3UDiLPf)Zq !O8p+sCm'e*>)>GcQ=gpҶ]{#MܒusWzR_dԙ\rՒqn2zO;׈~DSpw]3~pojh~X+Z.qZ'텼y{=~_5א׶jYuֺmzM_֫YL 0y r3+x9TDNe4 ]'ᕌa9Q]ԩ^Z-5z4^aǑG2DhPe)6 k͏֛A<\8 LLF9WZ-aU]ab%N' |¤i,㴞^&uQ/&ðN]Z/tatj|"}@ۃlX/QBQWUӲ2׍PMKf@>/5(uSJx 5]qYH=w`wۮyՏrqNV^O.\ ߦcݷ& %J\:)#WKs7xڰϑq5BbE^ԏ~a5Nۃ\8&:ȭ>di~BSΑG/VP>5u_k9ik{XauwWY荈hx a: 9WoFSw`A=s#?j\fZ#99GI }U'M0MeTNNk>pG K}4>둓)vnn{>`h:h|BikX!fv!]êcrah֣ 'pbоB*>r: k8_'Id\|='^q4.9't59N5CGqa<-W\ףaB\qf:e!XVJʸzP6׀b=f${>7aD6\_u>D |$4|=ȧ:ZP?h!O:xr<_{m=#kQD,l! LL`lgrcBfRcg'։<\']GhѼ4a :Iɛ}6H8TIZt֋pGBЃ%k,nT̩zLi IDAT3I+!>zT?}sՅ\2J%{k~<Ɠ7<o(ksf˫Y+K3*NLxX&p,03qO钵 Tg 'j^Ðd%UH׾+w*-3Y$zꏉHIv\lWMU[ۻ/*>F* Ic(N^L's#k)̡גk;Yk¼C'*\HA|h8LU茶ԫٵWVk[IWb!`@ybAC0 C0 !`dbY.C0 C0#kb!`@ *&Z>0~xtM:w_ӯQ C0 C` V//%o?A:$}&M俳գGxUAڴn?qTQc'L ={Zl2*X6C0 C YP &²'%jSʇ2wi'q!1.9[ kVӺPdaRitdU/er+3]J*CG2o!!`{*x͙b~ssIaQi~pYdȫso[lt U^TJN=m8P9LŸ~'rGU.yDG2o!n#`5,obف_ov?|'qPKN6I-V kZƍH ? m J1Tw޲馛ƉQOXG_},X}YBey2Zrĉ've{ee@P 旁~Qۧ_%HV[m/ӦMÇa%{ׅ;ʏ?|7iT$uAOxAvn| yvqGkСҽ{w/ա o0 CF*0/tYS\& \3(I1c'=Bq2w\Y,Y=PO2 eXԡӲeKOtɋ@M£:$d1DA C{ϣe~TFq;e뭷8 erG'۷/$[n=X(!v\z_J=FK$:@r۵k'nPqz;VzH"?o}|0 C0#kDOIcyj!t' QM2EϟBV|<,d[Ϛ5˓C{ٳgHSX̙#A6yk pSZ,GI~~sܸq^8ڀ֛zl6:O>O,! 7 C0V#kVDI"AD0q:3X`!Bɂܰ, uJ>̓aQjC4,sC h#SPoEZ򴌽e?\vJCndP,^$%uKݵ͛7{ӐGV Zg.] N~H2zPE*֛u?5'@Q9C0 C DI$RG:8ͫdVM4>SҀ%y: Q@)Hz "&K{C| #PYdo[A~xbC/mR,:sⱸ9açj9C?2Q'-D8Qo{Xx!,j}W>4!ܵԓU+qa#oߪ !`@ȹ⋯`u6NAA҅]L|m-ibpA ~﯂ ѣG{kq!V-Zy76 lǢ<ʻj!X֐Gv2cOϖ ^,g6w2R) cQc"'/z!`ԝz@B gE҈WG.,RwB՛2e#/U@!nYպ8iy!`"`M@N-/)HәsX &':y :ҙ!8 hޗ_~ٿl@! ʡb @:d4,K R% aZ $u: MCNe5,Wh|(O}hzqr4tSZ$bL)i_U_Æ W*Se7 C0V۳:hEd^a$13ԑ\:GJ4!+yN*-t%*/ԩu@#L: qrq( ex-_R=[G>8|bD)M]A5ay*g!`!P̲VԢV6dzHUR)zL#ˡ)G]OɀeSZo4աyC<̣*'MIE 9W=zNQyMS=W?k:~pYI2#G+6g0 C+L2ɽI=SXx- M'pq20M˅4|=WThʨ:-;hDT}*Ci*ʄqa=4'ia:u.zͣ?G\Ge<!`AZEPsyDáJIӃ8u?J4!zH Սi|+|ɒN~xaSC_|uAѳ]k!`T7{ѲܓelުƏp3 C& ,l&Lƫ}WM^\:DKZnn|u[aكkMh0 ~% #7n\%PV5 &C02IO:FM:UL"쳏nW<¦cڜ9s?M6D6xc`A~b!P1Ьɓ'ul5VCXw`,q0>8UXX,̕~vM6|sR"¦/ 6L:u&mZ,jO.9[ C xƁe?PΘ1Ó55=jJe!n"c>DeЅKˌy˥nNd-cGI%n%:M8[ڶ/-ˠ :8&"}|C0pW/KҡUQ(,pnK xm۶+-o2MWG'sd ׏[ՌY3 T0< E-_n^Lh?mrĬSN{y_Z(9у>g{< 0j FjE*@)Z*E%,שx%+XlRvyg'-!#=C/3g@MEFze^:pY-y:,vܬH7(%"aJH0Nу>rpZ?C0jFjȅj ,`ĻjUx))UGlr!PSSS+f2 u\zK%ȕ{!C_F-cg*G[P!/y!P0Y+(q2jJL[(KܗҚv}>Z@L+oнTPƣ ZJH`JD֢ Y;sfɧe̹hi0 5E 27˖6H9C.S!Mf-,܆OFJ^ n C`h`&aEZ%j靳Tܞ;Jxf!`ti(GDzW[IJOTpJ$U 4knD C6]/6*EӢ(Q#}6"uSQM6 C 56.Y7E珓l.hWe([^'Cu%m6Yk[).!`!"缘|Dˌ{4+h0$kRyE>OkgE;uwH4|C0 C0R!0sQLHdF)j)j*K0^"6ފm.fI# C0 C"뵘ueY|6r't\"-WEdϯٿҠA;0 C0 <1/m@s%$kJ,*o&)K6lem7ɔGӢatq˗/_- MS?,SէoܸN/ZרÏEÉd, xEÆߪ}lz~50Q iѰUb͟+'00M2Ef̘!͓KJ&MUV7diذ*|FYk/_8iX?g9'5MnB~i{vNHʢOGӢD2G}TΝ+XrrrN:*Nϋd֓O?=NN|_T>NTF eҤIRw?o-lvaL8Οy8q 8u26mHݺά\"Dq^8>}vUN~͐H6Q\2D,)Qla~_$cgm?3gΔ~͓5K,ɓeԩҭ[7?2Zu-g;trH⒒5Tup~2 ^{y6l03g'ms7kzy'(|ÿ: {lF:}r-_xN9Փ/ &?/yyyrWog~sΒ;_9Xxr1T.\rG^a=0 C 0OްT^}1o08.o/Gsrť䨥[ULJV$ +{,X gul4j[xHS~!kڎ}ʲexjYygϞr 'xG}ۤuխW7zC|ǢyrW~'wEN>dzWM<<ҬY3 xC0 C|aQcV[ɨQV)_CKkOf(I6׮B֔[RFNKA(T0.ya~-8=lGu_"H n͚1ZDk3ϔvA*gq@J Ndr4=k^5\:ꪫeȿP&ić*aXi;/vG%eO9唄z,Cs(zu?ͧ~4Xz)c=4[|'ʯ eTƩoW?p1JP|Էc'`O'^zI/_r-}"JB}iX{p,({'xː~e_~Q&˧,UΚ5˓^ aXp芖C?J*9DC2g٫W/}n[Bz~Xst,j!XP&sO?bW\;`%;33{-}6m\wu"W_}ϯuRsmS:yB˿rI3{5>XS1_=Z fl&>o)*)]Jʢ*5M)%le2i%M#G W:޽{+%D1Z)y衇RƁ;U%kGɻԊ6ijWN# o  PJ>`o1duܸq~FlCjQDRضmx~!`@u"˟Z&5%hCBK9PJqIBVJV+)vo+ˏҢE `:&ZHPy5%ku! RAHGA~@xp |ZuQ]Ok&,s2qyWWg8- dŇRrXB2?iݑ ]K.ē+CO:$SgtMKdtj1ڪkVY>!J]v4^vtL;b C0 9.$lο%~Y)cS sy5-8R|Do_ ا5L:F@&p%%h:Ӏz5/oѶ!C] 8,W:AGyM[aDvǭt9L%O\p|OTE0 CX0:BAàMe4[8LBLx% |fC pEBCZ7|%-kXFN6ƓgMJ%kTkQǎ㟁ЊC jXp0+II,ior@x !FS9Zp IDATo_T (/O3^8,wK&kzeo/[,dN/ px֜!`!) _`I Y>?A^<*N8}bk.Zx~^"[˅ R@xk +jS"7M'?:I}OUTZXx )"cy yZͺ왨~XXU^wѿJer}BRVP C0 @{Ĝ1CԒ-I0'Go-l /ѹ-k*N<KֵhELX֔娅'sB KЇ5 kW*8*qq2ǵș3 C0j 0 :O7 < ` Cll^nMGj-Y2ddgga&ׯ{@: 1!څe1YW쯫/1eg%}9՜u+)9뚳9?0KzI^}brNOS'k!`T6/=mMG*-\Prsse6w3dr}WD|r9HMQXX(mڴ"&wL5UgΜ)/\9%В*]ydv+)]6%Ov%. /pd}s-[yD ^u׋7s!P9۲馛K~QhaÃ=}g?t]E%ս?|'WC HY_y5‹;nJv/SNzҫW/9#䧟~';9bA Y*p#H"XY/]vŇ[m%'xo^x{(˗9Y X -~#`}:C2^-;p;,uֵ%2{IL]옞#k CjJݺu8 ӧǞ{xd8c:ev={ʢEz§:( ʎ;(C!1\ԩ{>ov%[tn&:tÄ /N8l)]:9n{ ^x!>3'kx$OWw]N9%pc9F ?;#[)c%LO:2||O/Wg?1.^_',wL>O6o2/7{F V9:vk{u^h&#fYa3ϔ=C.rg3轐?Cw䂽g/{% MS7Uy=n+OOv`sm?6o) ^4yl8bEeO䮻믿^|!3gO[d̟@s2\yU򼻱\< w O@q|9|'֭'i6&\N:ov ?vک^xҥK~#,~}һWo_/m/+[R{Ӗ:B\#Y"ØiXomI^wyVm C &qŇzOD_p~y'//OnFYѨQ){NgV澑{c}..kWʞjn|^&-^0u)iب 0@+WO^R(}9䮸 iܸ2Qt,yȏv6;zR6l0Nxi~0g;]~M#v<tdm!/:T86Ǡ4(ÒMz-˵<C@7yўu-ܰ^4_Hx4ܿ_>,Yv/:?8V\uŲŒӨBh!`T"|`-k֘.̏sw%쩧/  򄋱;7fZ*sP8F0^2sTfM.o^25bY՛K/ԯ̐8)Sy&|6Zȕ,>DY (]\Fn)]v>EG7AF#vÒa:~SN8$GWYgp}<ٱN9`̪~qihϺnT J5Ƕ{,_Y:o4hB~i,h@T^.(roggHzڞ5o!PU k K}螣SO=OX9.ɓ\:d-Y;7eo1R#.|v%Z/1?άARTKAf^U* c"q^oj^qȳHX*ٟGYުU+-o!_>9}8qqf:ĭrzOXT,wϝ;7-Iı̞#Gnۑ*繚8TYcs?O ,or&se>o͟?DT2yϾ:CyT83P@9D'76bix팜]:*z0đRM/x"G{2i#j6~vWi׶eyKe]wphڨ}5s(ݫ"iRPG6Ya ^!&Ն~7 ]7Qc" 񌉼pU ^D"U02K^Nxmg/ A*j^ V7=fmY8oQn&?}4 oI#c=旡i+i1s 뼣#aK,2^y&eGȞF^̵f eVHYj~)C _3Dz/wAJtc' %Q'itI&T̶8-OzOb.X' 9Pt.]lԦM z+|:.vOw)as[+(n^ALP#^Wd CJ&t7na,Dy,lk&r#1GwWr;gμ,2*xP7ӺF dK2C2y,X 00@NA=X֋/0ܪ:5=* t ]?GtjlgRV>-_!hy8B)a+#m\AW^.d)Isw|7I:Rϝ4_C[0 C]5կaœ:sct?yyo˫_8T*Y5qsC?}gjՋunMho%rէ,(8‘55jj7'CVSq뢕& |C=@TmѪtDZXHg{M?_|䨫 mWZIxmƾ4l[ؙ а{8k̓Yl 2kPY6m˄WYv C!|wӪմy Z.Yn48Jǔ |/T[g\lU2p }'4j1 C }l^JU*ZIָЀ9+|Y׮֎`DٴU ΦXyGj-YK/2ݴX{lMI[-!`K頴vT?g8p|ϵW_}UնeJӔ!`!Pd}וۊڪDՁi[6TwykҶdy״ Z!P(**R2꨺ԯ 0j'ks9”z*1#˖-[BΝ;O?FmÚJD4kJWG#;0`3:[g'ϟ/:uqƭSN9EUˋHf5j'kwy\xkVm6(oQF%$k奅ke6 aM[rrV&{ݫq[oi)STGqLolRڴi#lA#G;LN* 4[.]*Vd:5|CX;VS!C㏏S."[-R{Gt"?뮻ʋ/ N7p`ouIѣt?228> K(@~-͚5 {_>/S^Æ O7//_EPW\q'm$ZZ][1袋<·~8jҨQ#l>2vX6tPw} q衇T]%u_Srssk 믿ʻשD2ׯ/-Zˎ;(~m_ĪXU?W5+.LI7,͛7?裲{ȇ~(|\y38C/ .N;Mvix't$dC,^8- ;6{)wbg71= ^(߹ )7.4k֬3Ǟycnʘ#^W^1w}7Oڵkbn VC=>,WO&Xǎc[ 1Gbg1bDy睧b~}W^y%&}zyi,Y$^lq}k҆G5#11w$^=Y[1n&1!;t}3oڑ{'_xY[^<П/U-O'ӯ,X﫯:,ʻD*N?X߾}cӧO=㱣>:e+*PֽƑ}5]BdxV}=cc7ߌ5m%.s!P5L4ϟ#oxmgc8㸳n88Q*D: B/c/<,eWڧ;RRJX~ᇸ(V6\'x cV+ {7z+3f̐{DZxmI$*n^7BRdz>ۿZsgaȳ>+<JkҤx95mHycH9|B'}mƌJ_x^#8BޑkK/fzqXp8#޲Frny:ܹ[AJTӓd} $fTm۶zvIN_/n]I"zm~mi7V֨U|\W^?#_2)X/uϗK.[ݸe0jն @æd&Ou 믿O8$I,c/9QWDi>1&N8Avayw=eah]@Օ2'p_ &ivX9:7/Q?;C 'O<^!,  n*Z)j}F ,Lu+үD 1:eQ0Or4V7oᇥ}x]du+.1Y߭U1ve9+d @#eP^ 巄Ⱦ1~rW)qc[lEk׮[oկ "OY<}kc޽߯>>9m1s?c1sK ~[>zꩾ.奡m 吇vPfHV -o=&.,lb׿|kf4}5ڷgs/k^.mVCPq\g7BfMz^^M-馛ne&-{Eu> 3cɽDܦ{{6ibu^dOې.ԼG~_6 C =2Iֲ kU/Lx~^"=ח;O^*y( ԧO5dYVz 9X|B8tK/Q%qOԕ mCE ڀeĉ T7gΜ>@>y59s_/TD}wMu&+\T:Yy0K&_umӹ~RP[曪Po: C ܊Cgؓ],rQ:ݦT-d-Ue<eìzTڇteq!`d W3 C 3dU۠ -ݞ0o36|It/$C v#j22j,Ys{ʄÜ! Lme!`+!PmXT !`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!`d--L0 C0 `d-3[!`!``2!C0 C02n!`!F҂Ʉ C0 C F2j!`@ZYK &2 C0 C 3Y V!`!`i!P'-4>4%M0 C0 C *{cU >P4'`S,|OM|c"Ec%O}˳{GO 0Pwsg'w>kٿs.;nܸJ@+h*" " " & VmOD@D@D@ZA@b*" " " & VmOD@D@D@ZA@b*" " " & VmOD@D@D@ZA@b*" " " & VmOD@D@D@ZAN:Y#0~!\RYEbm6a ֭[e\xq32;XrXr?F|-׈or]?~m>rXk\?ߦZ|W$jkko߾kK%^poUo3h ~WpyGϲ4A}$U(jxQz޷8x޷V*T)"*gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։v[LZݻw,>zpEel=Q/~zkDO@K}׈? 7(RSBTXo{2ۋ+eW硘Ee3"Ry[zmEFK|,S}]\P*V "Ry[KmRddZIx[oΛ7x]ܹsT1ӧv:s~!1Z`A)F " " AihM0n55tP~oefʔ)>6W^mM3gu]g/ul;V[mlb#"/8a]WSN9>cYc5l̘1vG؀y{V]uY8 9VZMMv 7غkw}W⺀<.v髸 /x K瞳&Olw-Z"/N"ǽ6tS{Gmmu Aove{nz0= UVYnVF-J" " +<>lz)oڬYRkyׯuQQ$7bLr-IuY)tgگj'|Izlov1c[vǦ~BD}ᇩ>YFyK}mvfhFmƂxymرIY6mZrǏ7zD:^pƱ"&N~vg}Xv颋.JpZguO7^^cv6X"5bW^IaAso%6Dx'|bv}isα 7fϞm7|sATt-LŇ~{1;蠃;ﴓN:ɾdz"z̙c}i@W#{FeDH|97tm6vWfܤz6lXAyČb~ʮQo`ZW_}ծ$ƍb-hDDJ &13zZ+ 7ϟ{nD({o;'Lx?1]R{95"6͘}e]D+5xO~ٳFGwߵ!CZMd,b*HDv}w;#6.}O4ߊD #jk^{e=z0V_}Mc*zK*j1{[s'z>?Z iSԌrq3_?1buȑɟ1!;ʫ7tj Ըw64b(#D!C0IT; Abʏ "&>..letTrӮ4/Ҧ6Lf:ӝ11Kr O/a7&?hBq>(o1{[17c})*Hc9& 5?ޞy46qˆs({5}E&ﻕXk0%9CZ$ kvif B?OkE|wi8N>U5&8 6qc'sz6iJ )"3—cX\cf"8NŗuN@[[ڎq(t.B @DžU3q5>[> yb*Y/Gn6vH{͕ bt 6OwA8ؼ.Be. xbJc] *3X6 8fڎ瘋9\"X ǁv9ouc}٪͗P<*j_X"M+bDb͝Gnz̳>ab+m ʼn›)=m{jQD@fxGr5<70Y9ք$)7u5͈{6廥*y"Ut&]Dk" "f/ lpSb 柽FZ(5y#>Aۗ@.־=vŷkoVD@ڊ@qxAG]4kٸZvUj/npbX+ ncXXS^D@D@D@D OJ_?,?F/fXo bʊ5k,f7[_Z%SYg5Ά.*/" " " N~&kYRi6q|$x5Rb '"k<9D\=Bd/U|= vKtuvڌE/K<I&[x{*jiYÈXPkƇޤO۔i=;_*ڨ$" " " "М@E6fed5.Bͣj֭|V (<Q6>M6`|zo5f0eApV6B[oB1d@cR5'URB-֨mh|ta+ ''.N#eE- Ƈ?TPUV8+5}3ִŨ>mPPK\;!P+kA`0I#վ@W'fr ڦ g)ǒbB*Fҙ4_ˆjPSLA N˥bp ӡ-בD@D@D@D+pݔ:~-5({r6/VD@D@D@:#L>6mm+k@qG-ٽ\[J騖JƖ؆" " " "  ~JE@D@D@D@:ZW" " " "P J(GD@D@D@:ZW" " " "P J(GD@D@D@:ZW" " " "P J(GD@D@D@:ZW" " " "P !@uq@IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Branch.workflow/Contents/document.wflow000066400000000000000000000160701362112712700312430ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx branch --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{148, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/000077500000000000000000000000001362112712700267505ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/000077500000000000000000000000001362112712700305455ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/Info.plist000066400000000000000000000012021362112712700325100ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Browse Repository NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700324465ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001106401362112712700350220ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/QuickLookPNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGņ(+*w]{_`^PzIH{<.GH!f̜93sg~r&Mw#8#8u:Y+#8#8"d;#8#8u'kuxGpGp}pGp::|qj#8#8Y>8#8@FZ8^5GpGpypGpG#d_#8#8 G=.̙3G6l(srrrʉI^޲=愦TvQ?4ipZoV^ S?7°1F j ƍ˞{)5RW[_Ƶ?h,ԡ '9@p!W'R&dӃe{ }&\5i4tg<.ǯ\p? }B8.`f:]Xl#GT{1aO:cuZN+)(/ G"WY+Ga`kC\if+9e^&“#kN͕Qa }yꩧd8 0x,&˗AJJJ[HiiL%:"@ʅЮ/u„/%7eᚖli>yg5.y x`] H=țR>4h@DMVߪ#ȟf+pc)Zs ,O.\ ~2mڌЏ1I6rpuWN?oZ \ѹsJ~~tرeEhԩ+駟ٙ,jQ)SW_MY&jyСC n:CԊN ϗ{N*rlf6tMuIg 6Õ Sh}8Դ?6h0yQYu%@4l*EҤY3hr_N޽6y eQa4oLDYɪG{}_X &8 ~ej\O:g}}:7O:Ӊ?`,nYuՖ7 &$\[eku!}ڴiO'EiJN|3qQL2a2 .s/%%GEi oL裏O?לmZ‚B{RBY\ Ѕ0Wi>ڎ+Yߨ~u5L{빨L* >q7_[9 $?#_,A.!Ȃj* ,Hh_4dn2g,esq3si92rR猆`f2_oK&M0"IȷEj&nZ{%=㏲馛jYڏ~w4モwyGpmlL(㖵eo#FeTKAAڐ:=NwytmGg˖-jJ33n89Ctdj7OQQ.kda 0gɱ#=zиFɏbM/ yK Jcʮ0K_}wLECq )1g#/4ԏ>WWå kBhOaI#) 9aY,7,ϻ/0YnV;W_}y>Cǒq'?to#<|Z yZ_矓@pX~<3O?U([,ozHJ{>䓤hɘNŖ X~u]n^*3f̐K^{5m7oUԌ:0 rhQ hXBv`okF~8dW|Gu0曓V }[nI['A${wAw y_'b~XW][nQÄh}~m-oP\d}] /QvC< ᄏx㍪w~9{d V. ̂ZX,kq=TQroűKZ, 2 rb0/Ț%?NHq1{챇b=8?Y8@.l9R0_KE6}dYi /\GGL?i^|뭷:\{kӛob"Yd`m<#~<&ݻKApi-߼y_Լ;I !7Dr>V-)dH 1U^py_K$kEՋD6f̘%)&./.RuC=B7pz57i]vb٭[7yG2$S@=qaA(XPc R\c[P,XP_&g`N>d$Ȗ[n%LX_ä{ПyT<:Sr+n뭷=XIgAsaW^֚{m19Q?3tm6=Ϫ^|Jܻu&?=w< /<w l`C4i|&O]k} |oF+eQ?+ve Cq %2qAi=+XrH ֵo-N:ꭣGe05ҩr5mÏ;ⰼO-<=쳺4 yEabAsxQ`A 7E/ m Ul.SM:6:%,prg^y+^:jXqOnI-G!@?_v[OM,\cK 7\DsS DW\qzM?!!?i +ʁaЄGX>⒪&ItGB[#?V0{Qv*ks=)2{Z \2XUI-i!o#xQg^a!?ypĥk3$@Ya* >|BH:x,Fa`WJ\?6x1Ql~V/')m>5aIXӠAZhD뎣jZ|!Z?*R^0]@{4o6f{Q;>401Qׇ~D˃p裤tIkknݺ̙3B-zO˞A [&Ќ@mf9mOrcW?\z@pP!9y8/A>k}x|5\#m۶.](!B&&#Ut럦7B!bypL=\ ;'g3}#+ٽP^kN8y(֯mrVV_tٸX~|^BL_"5p eGF"qػ _#¿'riʹpj#U-&?xA z]/;I-lea?VP](l!fGz#i[I!/E&MZHHg#eoGDžْӥYeߜ`Y0},r ٽh?"8G#0yGUy@B=cr,_4s#G>kH;TG%=  tb&,nܵZK-.X O,r0YoҚk6G:ؿeOcј5kq6,㣗X>?x9h[('JN:xcR^9L&9m &s7 Y pR!NO-[{Xbևҭ1GsNyXs;C 8c:PG}u23Iϥ_~7[]vWRem)Hfg/V P `R Jl@s6~1'K1q;opj`P߾}Qʉ,GDaq wʬK.Da#pema`s;dyl.q `E|Nt2uS{o2=ql ,Fa!秠t ?^oS9,Cx`g+1y0s i3aT /2I^z`o/uAvO,mDZ]G?Eq)m$}a:9g}H&+ ]u ȄGǑtX? //B}dK̦3h/琴fa]"7XpX Gl^8fyrYׅg5c|qHҲ Ha8s|; [䉋bbHGGDᢢo-,X);Nfϝ 33U1}jpnu FEKK|tkf;L.f\ab}C 9XM/2=KYXf!>8ʞa&BKD|^rӅbArr֞[GfxVAYxieO:2t,7Xldp̩鍧E˛pX(4A< I4霛.;' f|!r87y>mt[~ Y4[-&+A,c:w&OEx]';#Zq&%=^,U3҈xS6mpp=pŜiq&,\I<{ZN 3+9^\Oh)[|du\'ґ7Џ: }ͬjə,axaµ6ipO@ k*| -\gZ8a,"7HKd92e9ck5<~ ́3 igdُEgrUKǵ;i[4A3E^)/ mHhM;F#ʦՇsG"{Ґ5G#߰r:Ah/`ۣɤE_~E!ϽJUme g5ui?Z/1U DŽS?7` +7 QKLez73?ZN\a7scek iQݖ=oy GaǑhD2XN+2l2 oCb,?~ޔ欜~ d@L` Hsou2A[E& &[l'Lq2=>ꉏ e1b2\ԯmҲU5Ph/DK ݀/ 4^B @B?(4mhɶ[^xӥUӴ ׬iވ1a V>7kנ|7~?ai}x!M$=\#VkL8GvY{IG,eY?!ȣ+pT>5sg[9Y+{خa6ab̋,FD4z=3Xoh,9x-&g7ce\ܜA~s23nqVF|+|ǏEuZyQxMcoyM&Uq Xx3"cRa,+gsm.KC鰼ZQ[}M<[:gR珆籼hƷEϭZ~K拖mtmW_|ތA4{,#?j\fZY 9yӆMh' hɘ'\U4Y?㌃u6,i|#//E÷>ɝv>ѳ`cX߶:Xr6 g[8&Id\|;'qn,.sN:GӉ08xv #OuEom!>r)ߎ͋ra`^ąTHr*>瑗$Jewޔ9~֏gO TiV$4%ND??#|K/jU\A8'҈ke[:qoeNwX^krʵ]j--Hyq6 ԣoYqH]᪎ai1lHf {]X^aɒ/$f>Db熥M6oyےYCH2fρAz19[,/h"_%9ґ8|,>tYL:,ϖX,a9eKo9c~x hA ZU?L#䋥Rc4H)A\ڋ=#܄)h!/t\TN#?'ѺX^K÷|}k9m#9I(ㄣeYlo8"vzpr&q&0631!313G'ʊ2۹'ݜox34297|;967!mpDm`$oF_S.hS7g~9 IDAT6C|:~< t.*Gӣ疟r8'K׎9~e+3֕U9@&&<,8Q8LZ5RD'l5֮amdzn},Wd[LgH}lLuV&?XtK[ёN;#em9?˛Xv gכ/IԒf8}pҊt–ּysa駟tr-*5x`f޽eK 駟QOXG_|̞=[e}PY3f;cUV/ uРA Ր6;>O#n^"j'N(_u|+٫*,-wY~ᇔ?䫯RܡCI O4I۸~i;jԅ_ԩ>LIfݵ=X(!ov\zKC&% E kB9=bիD~D$ 9#,N֪ C$N?~̚5KBv4K2|SNUraa{9m4}4Ӎld=qҫ yReJ;'I`E,t|~kzC~gL DXхCbސ8O#GT>h'.^o[uׯ{J,!k?;#8˂eA+&ˤ ``RO "Z8ԙq,QBadAnXʄ[?uJ>˃a1fC4,sV[h>ަTY~e?\uFCnwW2 V(H/Poʴ:SʥN֭[45ƹ ,i̹Ebz:ךēt(ϝ#8#P]j"Ǥcy)`BG:8k^2S˖-5τ4`|̙Z :4Q/ҰA$]w]airOWd<*Kz[;o2O,y XX}VGrN<7;' v,gG4% 'u/$%^>dw7diJ{۷jpG&y^x̻fI>21B$lta-hC@o2cOϖ ^,g6wU ugBŇ(1a0N= VzCF!OS "}iě\a;y!hKԁ2* 7X?Xͺf8Yy;#8"Y^ S(63qW2ALvi'%6y 9ҙ!8 X_|Q_6 ( ɡb @:ed4,K R% 4zAL!IL'u@>k\cQyCЋ}c52#0B[)|1VhK3o6mD&#8#,eA+& k-&T ?jͱIy΍hpܑn*2vn~4_#FʐtX縨>xa|9#8A`I:W<6)g O*Dqr`N:œCqMxr, M&J*,d7VGd,|A[e>!OY&Eay̷P92(D j#8+l0a?^ci߾V2fcߗu]WYg}je0 ?OG ؘRhθq _PY#0A8l*..igȨN;$nxƋ .wW'V{r.9{G xƁeM('OdA͎RY#XQ`t΂E2y"iW&9% dԈңGx@>s"AnJA ).͕KuTt8@6GJfΜx#C [5&,'-IeҦY4"ҦMNjf͒nݺ2'?O,ʕŹ]VV&`hy-#H4g%k+B^#8%YfJÜiӴTY,5+c 3fx>͛… usY&'Ӱ0+?WFLi( 8@Nٽ֪Z|Z+q#P6o޼+F^#8Wg URq߮$B8CxƋDбc%7l G6yyQ&r'jNؼ9@]D_W8JaȟE/Y-!uH(ҧ͊8Y.uE~mE8'?zЇ^|G"d^##zR>Yȑ~]JʼnX۶me|2Ѓ>8w#U|WNs?Ògb Jyr X*fD4K9>zЇ^SՀsG d\#,# S@ʝ/#eqVY(ח)ǝ#8uub^/GX5nz(/^*(ܜ@ 82B2fiF4S?Їޢ-q8@]Cd,,E2~F/_J8+1 ?DߦixGA" 8z/ȑ)3ЦipE / 2ʕHyM&!W-L֦)Æ܏KAjG`hdɱ&aZ#j2蝾@žD8ʭx#85;tm*lB68::n%#c'U5@{2}s iRUSpc=8@ jy۸-ljuiX(aGpF9"QF# 8qr.J"l9U}M̔+X[G.;#8#E 7/GVoL.?R[8Js/'>y+_w9A3wGpG*ML.Tr~me^ͪ&5r.z"[߁9-iU#8#JBfL>rZ} ݭa맯~פ{JƵgQ 5q4iDY+GpGCN雐,wxi}Zrh:–Q>DYMܱKznd)-ZHq$,hvn>u /~5:Ux]2?;~K--=֤0c]*l?>.i4~xpW6/Joח}G:(Yku馛>SN95?\ ѣg9]?Pٯ_?x%S?7ߔ? t?8#v]C[oz<#8#P`.հTY}1oKkc+ \(^$[/iQ۰NAeNV2͞=[N?tYc54kL-.-[>SvEeLř?pq0|'O'.m&!5Vjr?is>iQrmAҊ'=PBG}?~Ɋor /?aoךk)۷O% ͙3Gևy^Ts-<# k.??_"{oyUK.DKgLOY:uZ aXp芗CT&9D2g٫W/y[nIZ:ha/fб;h0O`AtνK>c&\.L;`%;33* Yw]>8q\s5X/H:O29)+.g-xrO䍗EB 4WDObduG._}y墋.RrraH9u[O_B%ctdV[OUB!A-TJx1r9#8+>wQ–!O[]țL?a9,Xʿ):$Mb,28ANUNF84pqqg /`ųz8G3"ҊC勗O'6|j;s2: -8H,oXpÇZekzd,_ǚŦnA=Sz-?d)p;+7n6VNMI,7l3%kR25]2=8#d PQْhܲF\VZ$aϒEy=kXՒN -O_ VAc`FO5M/ě:,뮻[b>.5>}s=@mn r0`qK׌nJǞ34ĵ pVNm:GpA 3#J hT ~<_4V:^Bq0r䃪 \Ш-l~@ְٲg!aF%pqlrQ` Kp8jŊێFRX86гGYL6M~LaIR"Ē6L/rp ߄MQ>5 ;< wKosVaĢƇs78a{<Gp_øfd0aYD BA̢V3G/ /}قe|r>6,H/X_C&{T]l>L:/UA&U%YG)eΈY,x&W_2Jě5hΚ5KM1X6qy˓tTMX/meTÒ$:w}'w}lv+mk-RGepG|ދ&tyn yc\ضjxa.u5nYKWL!.X+OgBǺ'ZYxq5q[5x>Qfa7p\7>|q!rGp  Q鐵屨Y[YM(_`>RZqGXU`[?|6]"kP]`ԝ#8#T@OwT%GpGple8#8#PMU88#8@6h̙3[?F} GpGpV fY=eDOx8#8@682EUˠUB#8#88dGpGpDZ#8#8+'k+{/pGp*pV%D.8#8CڊKvGpGJU 8#8#pGpG'kUB#8#82W+LF!#G~2aÆH$@sNN@ߒ+yy .5K=:_T4i9#PTݺ8[ JnntAҸq㚾\_D`k@2Q ({ "_IiBN//>=XGrCF9pKYZydLj4l0Yh>ҨQ#Ib,>ӊD _#05!ma rCz4[~2Yy_VLRG^#1y^JKKeȐ!f ̙KG0Ąx&dvA^p/1'OZWVֵ`a ~Aqܣrҙ=rj^8q#=|^Zyۺ88Y3gZkwɓ^;/"o3G!êd(08x*HT?sa4lOLwlE~W),R_d;`g޽{{-BiׯkyHN8Qw_m d=^d r-$;۷l'CYZ^`+(b)L@8v(Ӄ%4%dA.,ie¼Ys8P޽5J 8SO>:NJ8ƮSN9Evi'ٳ̝;7)o'|loJ1|0RN.]䨣8Ҿ%tvm*nAu=z|grqǑJɼtfނ1?Or\gN"~H55fH^vyg[抏B^p;餓tKk Gy@0EwqGRa943=5?./>:1Λ7Os>[&M͛̋yjJV0R+I6oj\܋.H/7OAOozu]W*RXXH"=WZJlDƎ+k@ 8X`>u]rʃ>$ӧO״ɬYОo,so_!φųz-yt>;] 裏Nؽ{7%ivxؘ : q5oOj[`Ow-{V~y{\G XƦZRէ5aY#̾e20iZcs z!̉>suyħ@z}_}uGb4tP%VKa5#j?t|ה0V? {/J® bfnMcǎ:u,kfe2/ 8aluc}Iϗ}W *Ϥj,l *W !o׍C_y yIǐ駟+*ZT`|yweJhi;-|tF Yeڴi:~'98[&N SwyGKrR=h"|>0w> O}.othEm5=y,kt/ Cmݺu N<{ᮼJ{&uUZV k7Wss Jn8`[2 k߾}x:R6k*~|Pr!]veҼy }2Qt,yȏ^G:wlРANx⤉:PiӂP?,. 6Ŕ:tMI$VoU 7 b\\~ aiӎE᜸%J0ɢpI??[@*i`%^:8 HVӦMu|<3O!ZqS3qX+A817 "Id>m*&SߪU+ L]:+!FuNVpNN`H/[ne2 ya2ı8%AyVo4nқnIXEɃojᦍrEr@B~6pUIV[iix{4  J^F#Pe6([c. KؓO>/  Pzwj٣V9(:0^2F]ټYe.k8Ų(7_|̐n`:+HQ Eos>8ShxY x`P>'M+ f% bϋz|)X}Q_m,>JZ,څOnqtL.zFn)|0yJF< 4:TE;,i^0P1cTf~&8Z>Ɏv-X3H-ds;ЍaS =cƌ>$3{چ "mGڜ`2\rca={xrUKA[Y4FػǾ0^4` t?E-M=g@sFy፲ ia׿д49smޱ0ۃ%yyأ idO#ꫯ6sBDpuq >/Za˞-'INר#Ie-CaC'NfuM"nOIԉq/SF?vX݄gU}XIy$a;'&i}V%-:5AoOG[e/pȘsdƈrqeة"8/03D׼ys-uLca[5 >~[R(9kY%d)0_%s8Xڗchr>♣%̜b[U~Vpտ*}I=Xj/0j:-=.t ]4Tu닦fp<2i2 A۰# [iZ p!IZxg$:Nip8@9V+dm#qs|řW]];0iw/eˁ@CsGpGpC:#8#9N2%GpG:Nֲ8#8@ ?p楺#8#8N;ZWcdCu]kbpGpq[|ors|?\KÏN5Zm_Q8]#8#85 !k_~eͶ m./Uu`㖵 .oyږ.!^h̯.kBpG drgHS rG… *o,?c4Jϗ [RHQ0KѬ:*R72T5ktEFTsN:$?,*4GpY'kwywyv.[nezj[UW_-lA4J׵ SWUҼ2)R6.RuYGڶm+:t5X#2d9蠃d„ 2`L3Y޽ebaHwG#U+sLoVvai߾l&Wڵ<쳲;ˎ;(=A:t5k%uI"lͤ{tpkyQIbÇk|ViӦoK矯2 AhU ʳ.LIV[m%VWV?|94>ho/͚57\c1b 8PsOax_տt}|tr={|Rkʮ{U:U=)z--[nڀ\k=/ꨪ.*Tɿ{Wo֭['%}Qe]ߗ>H.dک*9s',m]2t:#8uy%ܹsaNL6-qҝ%ĩI%J0 *waBJL M:5(O?tbѢE?0DL^a2I$N&DΝ;S"LF@] (O?%w_6U`Kl֚祗^Jt)ȜW%FԷLeaiMkW[Nʧ_Ϟ=;W^ye"X++N*ue7to$@~<]#IKY7b5_hb5z >U'ZlxrsG;vΟ#ox%lgұq%u^+K3}]_6TW0,Z%&Toԭ]K.DDߺ _Trm+;D9 D:&hnU:|J"uezO6i$W_%$^y->]|M;v[Ž`)Lr-jK2'\/ƀ`Vmj:,Z 70[#+em'?\Zh44,'Ü.ӵ}Z˓\vm%pIH3wٮ];N=Vʳ{_WVObC=T(|ү_?-.]F?b,CqVMuY"q.mڴK/T^y䑤@4gOxK#85^x$,+.Y6k{Ont Ov$ :{T8p/c2.]yߔ)SC9D %~܅%\,,d Zz,`^mVd",wkS{ %R9se̘1```ӽUw)3Nϱג& IDATNPYYy׽z4,JX>@ K0?~d݉'(%aYY~XV28^:w}p@VćXԱњ'38C_2`38֐:OXx6c1& b6Y+ɚM?C7+cǎjQh$}ɓ ]t`fmb;GF? z\s+,.KwWgeW'ɓp͜9Sq`YI+婬˛F}v}w {WwG`c?3e~e?7e :2Ec\ض2ߦc=jZI& <ɧ.OQIyQ9օ\*f򕥙L*mnyP0v"jmqF}q[:+Gu{z2 `ñ.2%.6αv|pU $`K| ͝#M^t=^,ϻmpU :KXcNJ(tGp@ +/,QGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGƎbK3q6 ^l&끽v%'!$,KB=@ KawM0pqԝi_ҝ>uߧ&PWسĉ xED@D@D@D(6kcǎ-ڧD@D@D@D@ 4hAPrjXu)" " "  H%7jPW" " " "PZAPrjXu)" " "  H%7jPW" " " "P@N2lRn" " " " 2gFY!6`x֭2 .^mm,b9ym,bꋟ_#Gukķb]?~6^9[,5^g~-? ZӧOR Ͳߺm-O3.V~tY6&8ϊ~WERAVcKŋ󾍶JoΦKF9V9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN6j*$jjjW^iʳ D{>]?%#/}׃_#6[#݈gĶZfQc 9S!F >@Fe-שWɮKC9/~NgDڊ"Luq=xC<^[/<*oտ~zի;*]D@D@D@Vke'޳n̙SVq3^2w?ngڴi\~H,XF " " +@4 &UG}ݛ2dvG423yd{m}MhԳg϶&֌3믷_~ꬡzk;m5)7"2Y_H/3Lwܱu?S?n:ZFmGy߿^^xlWoUoJO`^{e7xvW_}.p+ 8蠃+h袋7ްK/ԞymҤIvۢE,Bl9]r%Ifmf=mvnZ8p=vM7ٮj;E:,_SN/ BwaӧOzˎ;S_?0u!4('Goooym&i,~ƌũS&!7n8CpPG4^h+o„ ~k]w}gnfx!.O[8 5fgC%"[Ç^yD9[bC4}'vۧ~=\xm֬Yv-$DEj]|G>.;/H6)!|" " ٳw5U"ƈ{{﶑#GQ#7_D7ln]yi7n|h1븘f駟k$#Ez'W_k&c&@r˦(4{$c}駓}Ǎ5*qAp`uI y睗)}N{ꩧҡÃ(HLi^cN/y`Mx3f_w'9f ޣ>j!~g{ Lb*he!Bva6RMX#z@T#Cz饗RD'Le)"D$/hW]u2\>O~ѣFGwߵ[Md,bHDc;ꨣ6>}O4ߊD #jk{mݻw7\sMc*zK*j1{[s'z>?Z iSԌrq3 701buĈɟ1!.ؠA;o:8Aq^޴ʈ5D! 4&Q<` O7D)?+Do8ZQ;L"Ҙ:˚3aÆLw.s,<袆ߘX F\rX#hӣL^o]@"ƈr܌s|1Ǥ u=$ԸN8{g8~ #Z>cΡɷ틀t.z( x-:Z=mI (ɡ"1MHDWX;5KByZ("K!Ĵ*k^-%Dq.hn)˶HLA1I"k(QneJ2q$*"DYyB&H[K5fs￟|mF[$7SlMbdLws5옮mJc$ܧzڊt>B }iђ|Z2Yf0۳֦^Zk&+5{d(kxפIBDdq#i=3-^kA8ңWѰn5PbmkcHO}=<ӌWƅ9餓1]pIMd}K`=Lsz"jF"Gs_n^cxO=1D&RRp.Le"flnqH'xbZCSESG-z\X@a5ZYG6m1vf,(1D r3}L{ilwNojc7P>$2A!aCD9?͜6 I} ?n1fWa5vyʧR'+c841kx c %q\ rIl)眲xx}gB=gJȼ=L%9V?)YȺ4fllxs=c疶Z|9%E\pcu kh\V툿O:{Zm#L7iHMlJ_܄cr :y 'ϻ @yvl^F2؆\<1.[,ddrR3mv؏swyp.g~,u@\7>ml͗P<~n L,&YHs"Y#Ylnc@_ϯXJ[Cy}AJmO@|۞ZFY ^+\D &O*1{9zXV58IʍW}m;rMnie:ӼJt&]Dk" "fEKWkj6_xxYPޣjG])ssslּؠK qkV۵ηF+" mEJtW ›iMڽ󥢍zJ" " " "  ]do]G4:먈!:mV76fέYF96?LYD@D@D@Dk ջ~ 6І^d}zr$X"RDIUk8DPj5](J?ID@D@D@DHkjkK@C! *+h> kb 6((tU%RMhh\Tsˊ5\Ng$ʑj_D@D@D@3nee[mqPcEF!`NEeOQ5)tuh& ?^'-Ś7CgqRG*DuSnZj*ph#)[y" " " " foҶX;jڊ@W'PIGeZllE;m(/" " " "2үR*Xxu+" " " EH$*W" " " "PZJ*Xxu+" " " EH$*W" " " "P9Ǝ"FNIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/document.wflow000066400000000000000000000160571362112712700334540ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx browser "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/000077500000000000000000000000001362112712700277445ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/000077500000000000000000000000001362112712700315415ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/Info.plist000066400000000000000000000012101362112712700335030ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Check for modifications NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700334425ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001112121362112712700360120ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/QuickLookPNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATx|UEOzGņ(;}k_߾uUܵ {EDD@@'!{\K^BL>7sg̙ߝ;gޗ3y䄸sGpGZyGpGp'kGpG8Yǫ8#85#8#cUsGpGɚGpGp1N9#8#d#8#8'kxGpGh8@!H$L~7?dܹҸqc!WN<9OܛڡSsٹ_gpZWi֬R}Auo;ެLn2nja7`xAԆ "M6[4i$-//a7kkȈҥSk +OspBO4+)MȴI 'ʜ?wnHMj7hJ'=^x8]^_Z[_ʅpf`f:]XlFRھ1aO:`uZN/)(/ G"WY+Ga`kCڢ\ifp2M3&ڼjrs%7zTX6Wx$Y#y|;?/L+K{>et5. mRZZ{iiN0r5u(!sK$GMY[vyUv@ K^"Xׂ-9{nC'uFic`n*eTXk.ɢE wޓG-ӧ ahOik6,[_7ze本7oKΝkA.LDӦM_|Q8 dQ2N*/R2I/..VKNq+ VT\lMtRf \`<2|p9Se6KnPm۶M%#+9aE2iD,ZHϱW%R,1SC=$?^siF w]wK er|Bœ_Zʳh;*ʏ7Z??oT\C|ZAIB \\R&| nuM܅/ ', qym… }'? 6Ln 8_Y4c\mz\,o1|x);Uzn 'ҴY`! i-v}ѵjɦl>}#<"lZ_Mo䭷ޒx}-\Wê?=>*ʸeW=:@~2rȰ,j)((XJy4i,A~ǜ%A"ְt2). {7ŋ+aI^{TR@e6Ysx-#_ L|ћ=6"#GMysgop(seruVh瞕](\sEnx Ε?z??04;C<횹,nY[b80cY_tk֬N~.q'CM_vqG4RÓﯓW^3i|rwY <X3=Q?/y䑕J/nr?ˏ?,Yg%Fͧ~Z,o_J{>裤hɘNŖ X~mݖ{%\"3gΔ}G^~em7oUԌ:0 rxq hXBv`k.A s>fo19mЧn馤A~r!ҷo_q|,}逸E|"V*z7յ[j)ƀm p0A pyL@_/RH ׊*lرKՇ=RM:]_ k7%\7#t˟'՛K/Tѣ9L{waţ3(bAzH C} ;W_|`)mgc? A6l#,zyE]ĽGc*W+ 8\Z˾뮡6ɓȷa۵{Sk_jW#jWa*Q0"^"6(`] \:zXcq\^#V.WF!?#[ԒʑC3eπY-(_~JتpA/wy\{5r'_hFQOvШwp4?|vm:S?udrEB,%Xp\p5αN1]~J: v51NX8+BfA?B^&Bb,Kr$m uboXu < E޽rwK;{jQDPFtr`UA&q@CEy=8ʣ͐8teDM(\!8yk#\*rtTDͲپk>SkӮ@NiY Kb^FE; Z\wMZ/ Qr o\PݓyC6߻woi I>ZćkF%N^[]f͚G|ms͐zX $\0Ifj5 o{;#?2 )ɓy Q\3HEo殾ji߾tM 201#[4ݼ  D$Ņ dT 9yMd]>Gx1"pn u)i􁓇h&-a`;HɓO=r#<70~' 4e ω'VѦm/dQڿ$7ā:>Gh2M 8\e?pJڮm 6wdu'k5U;ogyz~4[L*Xpq6ψ+VM6d9dY~tؼyd6HD:yb-o 6в)do dD+稣󂃵R 9k(ġo9a;TlT_gu2IFڊO\zLL[)9G':e4@6s;aArѯ_?a?X.  )e~,CAL$sXX~h~&ZR} Dk&ˎꡍؘ֟8ʵ砞6qnam7ѣu9KM~\Z{,UkҤIjM(d-mu lK袾,џ9;K`32ԝ<ê)COkǾBs/k9~] +E@I *Rnʜ1?ɖ6!MA-#W=kg?[G8;ǙH|U{QWPX}|]2j{əf͚rH>/< go.,ZᚥC֟ [۵0>"%ϭ#1 o[?b w81^Aqu⡎0 dg8ʧ駟l/zelw-[֖nVnza` ^ &P,e,T;g7y2> oV׺뮫꬜rD4 /PK|ʹ⋵6W&6N82VwE'kvLnA^[o=a,v!CG[r!ily~ M`AA;<2t'q99 &I"tF Zddv@4Յ|#^$?~@YVOGsW]dⰲE_gLxqmA] +ԇIDl:ÊrIk%rU:, pJsnG( vX |l/iUHZAk3 Gvo`a| C({y0 /y;LKc|nʉY{omq^!UWm631˞tdXn0นS9OƓ7ᰂQiԁx, 6hD97]vN>MC$1ozGM=Q_8a!zE:!k?Gaagu^+GٓI_?>aQC{ ykVgfk,y^6c@ ~nAVnf#v9ʙDox##&g~. nL/a+OҢ-z,D#ш?d,=QVeDe-ŇX~h)sY9QA ɀr9HA0`e8,ʲq1&m4tmeX:dȃy&xhxˋka|+A\巴hhٖ\m[٦h,h@r=2êe7}|x] |,0Y~UGÚ%3vɞ8Uˣ?^j%2|E:gG1sZLk~|0T˭?؇.>[*:D'[ d2#g rvXSKmDŷsM>,4x s3y'l0Qg\4(h޲8,E\jYNAT,syAT& M~xu;Gxv0IQiU1zMBS_@>ͷV%u0Ts,8V֮gv- .^t5&G,\ۥyЂđmz?@ހ`Z>Ædׅ,"Mb惛M$vnXo-Y54,cv ہƙ.EM^#Y'zLd#˲Ѻl`5kɒS3(Gʁ}yUU3Mϴ?BX*e?K25X3ɞO>M2x"HE4"~4|;g:V~Α6Ctʉ=N8Zi( v8Y#aG`9`gg `gcC>2<tRhH*I -[~ٹoy̏[8|qˋO#-sl3i3y IOzHVzad 2폆9u#c IDAT|&i#0ܮsaK確1٪{4=zn)x8Ox~X<ݿQtXW2c]Y}Zex#Pl2`2cs{ϔՠ* >KtVcFɌMFV7rENmtSc*R&*6Ut5lڪB8i &/&Esٓ5Cz)aגkl;]kyO8GW]#e[?kqT2uѮ3RڪGϮ ]2h}^GpGpbc\:#8# 'k5s9#8#ef/pGp!/ 7&Z>0zhmT&o7V9#8@ JGߒ 믟M.ޮ7n~gk6KXݦ('وPO>;fݻjzRE#*x6GpG [֒PToaY[gu5ӊĉ{F&3b#o#n^"j'M$_~ez衪+K/$,-wU/PܩS'I O?ҥO>DIfϞ==X(!v\z駟JÇ'% E kB9=rHӧD~D$ 9#,Nj C$N0a̞=[B4K2_}ӦMSraa{9}t}4Ӎlƌd=ҫ yReJ['I`E,t|~kzC~GN DXхCbސ8O󛜣FR>h'.^o[u}wQb $7_+FvpGN֪VLI"AD0q63X`!Bɂܰ, ~x|bzz,iX~m%G*O}CMiʳ2cL ~,у,Iܞ{dP,^$%iuKݭm۶սi#ks .\'h?$s;כgu?5'@Q;GpG 5DI$R=,tdq-h 7ԽdV֭[k iYAŁu i^a)H<y(%T0evd XKKx,nvNYЏ i rK8N5^H /KV_ + }F Vo*8oM#8#PC.«jwf0d}d$#bH Z0.&y׶Fi{Xc/q _~U_? 8vi yM챂!A:*oR-k*.:Al {YraC~ݕQwJ!T|h"Ah?y b7d1%?{а.BؗF9ua޼A(y2q5Ѭk#8#)QLș2bs:we+dvRa7 #39Ȁ}e␍:  11SF6ID E Y( M3dtRiș >F5=> 8G9_#? #d՟2gnhuʱ4oyKi;#8AU,?+=XS9&p&5&u97qGhsV'C@ŷiu@#fu@҉'҉0[Vޖ8!gnÇFqVx%-wGpj[jZ x7ajY*eYIxd9"E32`yTo֛h鰼VQy4#\<4K'+/*Ϲsʈ[ع|sKǷsӏ:)C"cqGi s8#%&^ؤ̞),<Ɂf88 s0y4˅4|;7(81tX9Vv\a4MmiLRɒN+pG G~d 6P~}CoܸqG+GXO ~xm[Gb:tn߾}ԄEǷ^F!}%&QG0󳒍$ɤPy#z06m2rH3g:VAC،P'.?W=;@`0,/V?p*z`a3f0^o2!ZFwQֵkW%Êv#8JF4}5jT%PV5&GpV46&1>5qD0a^ұcGbeƴ3fȻ+뮻:`A~b9#P1М'm l^GXu`,q0>8U\\*g̔ѣ~vI6pC)a "6):,jO]rXu;@}A˚>PN2E^GX52܅eʬ8LrJåW^|En=6DVR\+;4v2(! Hrpl ͚5+aK .2GHc5jLU(_:_Z5.VMˤ]Ri"E#]vL fϞ-=zMen~,\+ semdt6Z~GXaӱiܹJVdlGpR!`KC͒9%Үy\XVkQ27vX}}l-[E46LOaIav~XIqgYMTWG`E#dmK Vt|Gp*0?M/͔ߦJf"YCI(,paK xsK-o2荟Hj" dCWOZ՜ysTpdð?1%2?,_ZB6PrOoq\1֭QqN~^59@=DZ=(^%G(Grg $|,#w+] 'b۷^ICȈCЋ~9#P_^# #`/;]T*Km7(-`H1,=gAzO98+Wpzzr!#,_*0ON*wF Ze馣\_w#W׊yG`F+ BDxLrs / dvQ˘LCzJsǝ#8 |P$'ɄŲ |i+o$d¬᥂ 2F"8V*'`6蝱0G>PL6M#,/yaYMtjH:͓m6 6Y6D r?/Ejgrj!ЪcM*)x!F,u;c=kp[,}Gpjw\۶l֥iRutJFN$k dw w.EX5XH<ƴ{pZ@`cqUQ [<-57$ҸQ0Î#TsE愣vOGqnm]$TEr(^% %V-ucE7qf8#8@g%_E>#RXaY l*~Pph' Isf 8#8@UL;RN˾}ZTM*%k~ /I6ފtn+H U 8#8#G ?Nj ˲2r'vU\"+-֝Ed.,,ٿҬY3fsGpG!:_BnxLskˡ[JfDmƼbT6qn9f%/XM<#xb)**Mߒ4eڹԁ-[Tu˘>xZ~]yӼeLI,1o37%)_<ˋOS@z!9s`i˓F%88;/))V[MN=$K;Uqſ|D84iD>S%cƌgyF Cq5}m.od]wy5 var7XgtGp*V7-rkm`eŋetR6}~99jV)5IJ޳9sg!k-Z4G]&dѯ_?Yhr*v7|Sz-wZ{=mՍ:p W^Ѽh8wQ,ڶm+]v|w͟{r'o^6TSOI6msMGp!¢ nM7Ç/S#OvڜOZԥ\D>2F0(Cy9. 4H^}Uaoךk);vL% ͝;Wևy^Ts-<# k.??_"w_yGU/XKGLOY6mZ aXp芗Cܷ~L&9D2g٧Oy妛nJZ:ha/fб;h0O`At}G>C&\K/T;`%n-3* Y=S>#4i\}X>K:O29)O?;Ԋ6ijW΀# NTT!KFF;ڷF ˁ8@Zn-W'T?DR>SNYJu6XB+.g-xrc=&rZ̥r+|G^P˯XpV6u&S.>䍗EB 4ODObduG._}yo+C?x Cʩ3ez-V&{̰|M)G"owvPi'pGXyTD y2mV،,CBޔd d 9 ˡeT5Hou%h԰`d&vP^r2¹stا&;ӏOf@x+Y>DN>qV:-_|¼8oT9眣1>iA=fyBE1b*+7^_ &c>,6_'kq'˅HCYq˵rRmObf)Y銗aGpG `bE͖D5ҲfA {|,SY Vvie02u-5D~⍨Doz d,-׿Unv}ݧKd"~]wg}VF~팋A B1p@9#"+ r瞤=gik]ᬜ(u:#8˃fLGA0a3xht&%YK'>a U \Ш-l~@ְٲg!aF%pqlrQ` Kp8jŊێFRN#,O{bnqΛ,%B,iojaT"j+o/_M8*Xy0{6gMVM,j|8~޼L:f#pGXQ0>kFN6œgyZ%kTkQ׮]gC jXp0+H,j5xrn`yu$,klaA]tE2СC:,ă` ̨:ArؘrL4) IDAT_2w߭x bxԘ%\^0S1Y4_@:;GpG`E!wV+OFx qL93K^ 9Ru3sd2ڱT۽ 2)*o=bMt-sFDfij^'6UQ:V&lE+toX@j~Ah-{<'!t5,;dmշ[i]h\_*=*玀#8@6^41gstKLȓ^kʍǶW sy|uZ gq҄u-^xx::֥%?rsB KЇ5 kWUqԆtk s8# `t nx0x0H-EZl2FUK2o#8uYˆˠGpGjR~l.8#8# ee/pGp"dy6GpGp@F{f͚>a6e8#8#J 0`Ϊ)#\tEpHGpGpM9/(_"pGpG`!dma%;#8#P%N֪GpGXq8Y[q{Ɏ#8#T*!rGpGpVNV^#8#8U"dJ\pGp8#8@8Y"pGpG`!/-_eee2rH5jY7D"srr<0x\˫3HNl)">gSi֬8@m#Rw<`7o-r!HӦMks}!FrZD'3\쁴% 6i(--aÆfm&2gn.%WoX8^9z]V|Ǥ#ׁk_YY"Xׂ-9{n#_Ig˩y z9@yioy%%U0&oʞ{6rWVlJ>K7'_%. d}s۷*?^:1Ο?_s>[&O͛̋7yniJV0R+I6oj՚h={P6acr'H5ה_r)'{V ~d ,qҷO_o嗷%-diI elzq{,a,\}Z5[[PP& Cv[;G@Iqɜs=WGyX?1^@| ӇW_]'zd!FÇWjV3]ɗ_~Y c%}wrO?$ꫯP f̙L:w̲hL\&7֗?|pq?D:Z֠y%:Οv8iwt )KҦuk%n .z[v÷Hg@Oh~œ3iҤ<~뭷t+WN 瞕VZg{J3<#}!wyc^7^Q:"lg ڞ= +.4j(_Sн{%[־U-$`Wqqi%M;sJԗ+'Q'MC(nU;5B{l@. j #Y͛7od08cVZ ŢťעA#"|`6Jj֘/XǹdB8㏫ Cp1vm~cUl<9.atW6/AV ut,E]+38OC=4XKyި"d巹  Ωy4L|{Q(ytkHE=ڨ.q5|Z'". ~.]qwE>%-Ta§J8:&=HSqXkk88LX69a;'ls*agΜǖ$XbfO۰ad[\}Gj91l}`cg֟J'O<W@g` gs u 8hFUL< os+UGEf_w-8Cj~G(Bhq~.Tx͛mH#{!W]uk"̆HNYn~@ _1Lzwi*FN:.Sl!xug:~[R(9:\̫A/9, `a49EQq 3qV&p=\tJ_Mҳ94bVxl{%FjVi*O т*;Le+C~bE+ ,N|K,]bBGt,/ |ڷB>d-trVAڸ/8\r &8nvnh̵v׭5 TL珰J*<0ζ d Z\ɐY+)thYcR#4 *l*y)ո_mf_|䘫 eWIxmƾ4l'hg@mNe2%e͋wr/ʴQdGeѤrL/*8 -W%fd< LS*//7PqIGe}t39<py)sVVɺG$YB3`f[^Y;׻n`e#xvV78VG`UG祆zid.x\7lb*޲A$my# >/e)SH&kv@+}GpG S|^)?x9#8#d'kY tGpG seK:#8#uer/pGp xKuIGpGp0~z?nZ\#8#88$,~﹖jھ Zp2GpGpjB>mEڲ]^U .oyږ.!^oxh̯.kCpG&drYgդ)..^&.Q 4H@.di&s)"m]2t:#8@`1o޼DӧOOtۯ.%qca # %]BӦMKēO>XxqO'D *ox'kv_~IeD X@}QR#>D׮];S"L@[I-&DYYYN}٦*,`Z󄥡Da]"ѣ 5)kĉ@zʠRq]]w믿g7߬:D #O>DeaLk￿W[Nʧ_ϙ3'W\qE"X++Npꩧ&JL<9#$8HW",kL"*uD z*lbܸq3D ?DxIw}`=NT \@|"qS0S AG}tr\yW[}pt02EpIW`88QUt< ^+(/\uEւ!u4 `;s8H[oLub#p[odZ$Uy&%~W &}&&J)˿DxJLi_6ԴW0@~neK\|$\?h[!`aIK⃥%*򼪾[N%WU kcaUVI!˂,Dr!ˣ؏wNU9?Uy?,\9dm[oUEO?%+KK 8ijZ^"h-F-?YVvXbC|i>3iKq':< H^^<裲{h|eRݪtvAòs|TrSmyڲ8fy;X27_\gBˁTaǷ(3U= "!Vg",'jKė\r˽<͚5`5OMxK#8 qIDAT5^{%,+.v0ޡ3f,5@򂤅 Ɂ&8°/>iG2+cr~beAtib {/XO?!*88+r4G7EhdjbigȈeһKS%GēM徲Bl }Z+Wn1u'hHTf2奪CCڕ 'jܹ3jxELWtmH's/Ψy*\TY]aZXvv8ʊ@VZMab5+Bsd6+ ЗQҥ{|Arw9#"PoZS&oNxLGpG`)6R%zpGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/pGpp1T.8#8@p}̽DGpGp2FZP#8#8GZ1GpG'kC傎#8#d'kKtGpG ce :#8#}es/po<`(4|rXG׏_#GutW_|Bbzݼv{.|A Lˣլ]?~ F UTPY߾}S{oqoR>盳REU|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[m5kuuֳg4Y~z=U_׈󑗾?}t-n3b[+RWBXo{2ߖTdW硜Ee3"Jy[zmEFKKXcYklԨQvGZ~y{V_}VY: 9VZ]]^v7o}W⺀:Ȯv髼ы.x K矷&Nh-Z"Ė%\D{mfcvm禕n <`7t39`J{4FZݬ|[D@D@Vz+}d ` R7ߴ3f"^{;֧O;ͣHnL)[;S鬳β_N9o q6m4{뭷K0S[rHzyK}m曧h&lƂxymIY2eJrcǎ5zD:^xƱ"Ə~vug}Xnv/NpZo30^^cv6X"5l0W^IaAso%6Dx'|b~}isϵ7fΜirKATtJGyq;O>پdz"zf͚ezZ5F۽kw}1ˆ"rnfvm+L͸Ip 6dȐ@7}_4O?]'Q/OvwSO=D/p@bJsj|El›1/_ս{Cu8w} j7B#}Mc=쨣Jk8>0+1H4km{キu͈RzZs5S4H/ol$믿&8okDLQ3D7pĈ)Ç'ć.blv)6tp#" "С 0P޽ikD9!B| iL"h>-,tsmQRkf-iYJ{.=5^k5iD`x).*Ywi$hc=LbZUn4[c kXZ("Ex-SDO;4cq!FN:e`L\pA$DY_Eb!XE9Ӝ>kx(D\۶ט/8y"zC<@D IsK)Smۦnj+҉' -άKce%hAnOa35۝YφڄX LDPxEP>6Dvt3B{y*Ï=eǕ/|gj2]Fi X8"MsZ5^c`xI,1v[9g}.dߙPϙR/2o1/|I>F5v9n+.[|9^D9\Xa8h_CID@Dc(j>.]=7wnv%=XL-F6KI8ypi&6xs/n1Xy<Ǔ] %qV.ҜHV]G61Lv- ' mT-@g#,Z.'f54+ǚU$ճζVR{o&}4Ԃ2U%4Rwķh SD@ځ¬PaB{Jbm_m>/+j{duZ\l9y'6|Eڷպvъ@[({?訋f-Wkn#JBumnXbk`ܿ?z_Ɣ`OK#[L3f7 n1e5_v[_Z%S`>)*/" " " N`!M! lnIkVNDxr'`{?YܾTukl%J" " " " ),-ؿumjJrFf55 %ƫl|MMҭ󥢍zJ" " " "  t_d֟oo hH"PZuk Gom4hlo3u6cN2ʱa"" " " ^ mP6l"݃7$5i"jNX! 6ZU?QӅ"^GD@D@D@:9+:4bPAKb_Qш0-Fh@g%^"E Eռ^9X[IbE@D@D@:;4&_VV7=L?+ 58VkR1 6\Z6U@g'fep"RjQy.ؼa:tq-u2L\7Ρ5_b 'o(6b%i+" " " k&-m 5o^tvtTk\KV؆" " " " -(:{>*W" " " "PZJXxu+" " " EH$W" " " "PZJXxu+" " " E?_{IIENDB`document.wflow000066400000000000000000000160611362112712700343640ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Check for modifications.workflow/Contents AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx checkmods "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 7B0D7627-FCF6-4B19-8E80-E78B97E72B6C Keywords Shell Script Command Run Unix OutputUUID 89C40097-B2EF-40B4-AF00-209D547885FE UUID D9F8C5A0-2CF6-44AD-BB94-8F63EDF48639 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/000077500000000000000000000000001362112712700253265ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/Contents/000077500000000000000000000000001362112712700271235ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/Contents/Info.plist000066400000000000000000000011761362112712700311000ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Checkout... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.folder rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700310245ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001100671362112712700334620ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATxUv{/ػ^55kFM4Kb]DTDEAH [eٷ,ݹ3sΝ3sk5f̘ ! B@4KJeT)! B@Ț:B@! 1"kjB@! YSB@! @3F@d_UM! "kB@! h5㋣ ! B@dM}@! f|qT5! B@B@,<2UWW_mM2ڴicsZj}M*c~fM~]z&<;dZq{} .tLU- m ))!X#؆-kk֢ƄY3LLr bQ̵?۬lfU82%63pAx&~H꒐^bjMy&ƼKKJ$y̱rm^|9;d8P<ޘNsҥet5T[eeA[o={UUea h5u4#cgVZHn5!.ҰlpZ ة=q˛vuֱO4?RnEE}?`ngT8!+3۳>otSǘC{{na9b~rEӏ[Yk+?̙3meimRQ_ƍg?p 1;t9vX{GrIzEEE;8CfWVqRf 6mw}6tP;cmu։UDz1'DoM0klZ2Hk&Aƹ*26sv0u@2aӻߧ N;. pxd$A7+֫_AvF߭?n&?Nf}Uf_fY6bv^z9;숣l6:uhÆ Dco#74N _sb>ג|-6jy~grHdvl(^nݺXA.R[餑޳gy&F2 kAp Uf<=fU|(^q^V7\yM^f3C<23+,e,Үlپޟ bniVB篭?:Kl {)cm͵ױo~jk!XC-Zjk1sKk-믿~~ڱktO?+~o^H^edYUO}aY٨lmȦ%#qr:O] ]tɪm.u,soȑ#m3&w2{츬'l zֿ_*`8%ɋ ~/r0sW{:籟"<8N{Ϗ,kcRP TX>8ȵo>N]s5[nq6~РAqk-[n%)zwfnh[mU\"^0y,}zko~ctPɗヒVt9W_}u,#O>$[ǓN:^}ՈeC4(y8x㍱W^L=>Il种m|@vah|}YgO?d첋=裱^FLmYݭj^f̘ { gf!u]g]tE/ږ[nil>_x&Rʪ2]y啶ڠ~;kU#slh~Lb_#*Oy9U87?f9,,@889v,iU6#L *lRY(1~_e8ŝvO}ǵ?~یl@Zۦ;l3fZQoum¸ٶv;csm/ĕ~Iz <2y^|'}Q^ @L }9|ϹW2!rHo> }g{7[s5,X]nqBHME>)ƀl p0A py̕@/%uNo>_~y,t886O?=WrKqMpMg\c5즛n"jGKV=qaA}vLZ;S`)d{G$3.B+L:&uuٮ[qc[HGwJ!+]] ž3CE mRjmT}k}x_-DòFu!nn|卥pq<s=qiA2YSBoX&1r3;mZ.l2l>ڴs-\q9&/~K+oˡ=I~7ȃ.v[n1o~[Ͽ sy=D>f .6ih4h`QN r还=]veB%,f]~YH?>ø߲ɓV;/[iNy(8`vꩧ&l3<qKr!,o?:@tFC뇴@ C'ub!O CLxzd yVTy<>@{as9ב?in"Vάi6v0۬Ui[j݃^Į"?^KM z*%+K.Έ﫯~gaIƮX"*\Ɵ::{y\/tt5ʼ[Wmĉsj#:2σp9φ~64ޓkm} עj*D/&-;oglcc-[.ZPI!pCZaZkCkGˏ:tȖaZuUcH!OY Vʱla0wYtB9t|'O=Xۗ vH-D e˷A"A?h/|l7&٢}A[qWo i+uyщ1y' O"ᜣ㺱KRgOz;m7jj@ >ylc!wA6pC_r3f"ׁ^>\LkNȧ#qV׾}g{ek;${}xMzv>[2qu%p=:`B8\KJ_{s"1^|teqPu#/Y$,IGtR'H'KF<%Ry!$A;`Iq%(-Ntc%[ow>%FƻwFn9s22Y!zcAzŒ ua]W=g` SK.,w~%Xh3,9!PG7Kp‰v{~|/lҊ52uA/$>wlSZk~Kmݞ6yW'mOmAYߵ] :NmKCس}޷ܧp~s.#uGCߕϲ!{:>ər^ /vn+h>1"C'~${0sf~|֌MCx@'+uW!d(_=iCmo_Kv`|Ȳ6$uGMW؀ⷲ 0b)cy}%|<]X$U &+ +Dgan-jr>|l=b]y }^Ιga#pmmaBC;YK MӧO$_||`݂ BrX3]C6'α62𳗍}gl y~ M`AAN9(r{ow$rp!x0"LұxvGھ8<-? $_yvkҙe{} %.y<Hכ.³g}ka)tY#mϣmQ6sD~0.Q/Xf,ļL.w~E\%y2̸§:rsɱ~s=^&K!>g/m+f*e/;\i쥃1>a@9I9d[6ҏvo)-vA끪z D n X#HrņbĜ7y2X\Qiԁ%\2l2sFݼޔI^)d[u {=yIw I`G>8 +$C$ڹ >eF/%-X2kOSA>b9AFēO;I:&ӐIt0$g:{Hyh[ 9{\f\K_w>K{2+ / XsUU1gu#*Q6;t2]k<a\:5{0׬~,ʠ='d-\׮cn>mu7uDk=^;lf3gmk#Gm7}'8q>1Qo7.OOs@@~Ozyn|0Qp=N~i|yniB^gۢnre-7.r 7`@7 Q\|%ᝌrҺ3#2󵅴nσ.@qq=1"OODxN/rl2 C =?~ޔ~ d@L^12!NNX~8\?I޴,&8a񑥝8&'k#er[>y'Xɺt ʊ_Q#̜qGsfBw =XZ[p~⻡O씽6}Ǟ_t<#}v:vhoۯE7\mQ-n( VEkm~%=%9V/nj::%$ғrYr?ԇsGR/P=cr|xE=Я]Sy "k ~#=y<3Xoh<9x=.7e\ܝA~w2sq^&}/}O%uzyItЕ(7L4ȱ>~I<xmaI~E}: ȓt[رt \4 i8q)c q!kՁ䔎juKK/?}}Ӓ~:o]NQZQÿ3l-DP^$n^V^6&m$=~Nփs\Rq"-ܫ'f 1/ޤO; N[6oSSw/O~ "k ~ӹJh*VX&!q<>߼yzZDe#]~t/PGE_*,~#،B9!՜yU6jOؔďcO\i 7A5?L_C|{X*}ӈ~J{:qjXCA_|&i'0WܧnO\?}sU[ɹudzSp:x|rڱ(/j}Qƺ7[m(M,Fdǁe2 ;4\]rRkulz5Lԅ7rENcuSc.R.+1t.jƪZc!)=B ?2Ť82odN>~ 3_K_|yO8GpuG6x}#%0\t\XHE7V-6! B yKB@! @Ykn%B@&A@dI`V!B@! hza\l _}UmT&Z|MoF  ! C@/(|K~䃘+R7xoZgu%. uݦQN <|0vĈ6`eaד2g̘?RTe6eB@!E@,?DX^Gf{F&sb_M74~EBHLRy -y5O+DyPdariBd]/erj+PCG>݊B@Yk5gB s$5qId!Ш IDAT9n]vC=4~o =\%_tY~{Xs$/G"y:gAtӭx! Xem?˛Xv gV?كZ|NzN:u-@N>裸\om衇U?8pY_}}+{poa'Oje}PYLoO(m=%A82~Zq;/mu׍8 e曶{Gk}^$s5׌B Y|'՛_ 1:th\ QrK/mC\_|񅭿$#':G4PB@A@d9}M 8d=O!*QF٤I"Yٳgǒ;qEraa{9~i ل  2{!#GKS3U1*Ofm%'v')Idasan| OF7vؘB5]8?- l$?9|GmĥM=[ox~{{g#`+9F/B>,2DII9=1# a|RgDZD !BaY+n)<>YҰ=3-DGyCHU;ϔǒkACnwdP,^$%uKݽݺu{ӐG ^gO>N~H2~Pϗu7~\kO~ׁ~O<9!  E@/49&e{ Hz8ґy^?0>UVY%%@p:u%,qO8198NA Mԋ4,eVXXڣ!射&{ Kzi=biב >v!:An ‰zcú ecdM=YZ6pp@B@!@JO; w0d}d$'bH Zp.&y׶ꪫ4BT^8 AWA`ng}]Xu=A{ܐ+Hr^ (O>d\bYC}8ځ<ʀ =q.>[ž7|{AjؐGBFY*Pa,|LBaE/SUސQĔAúyc_?ׅeXN^ZzRuLp 8č~:V D9N^|! "TB-/)HәksX &[ne$>y ;ҙ!8 x|0l@IACB'&.u&iX=#KeAinBܹN|: 9dԇvG(8YL9ƴ:zr<{<Сz\}#_! @CYkj!qx8'l ΝO'=%׍tIKti{\2sD>Y^|yY4uu=&=.: ϥCqB@! 5G>=䛝P"E85J! @"U@ ! B@G@d-?6JB@! @Y+%PB@!(E! EG@d@B@! @~Dc! B@7tS+ ! !/~l+G~CoW^y%n/(6> ?͏d>b*_!8p`ڰalD8?+ٚ>hJBLjWX`lZo/ɓ'6l*W}5J_{ OGwb! =h“ef֬YѪƏp ! 䁅mĈx;ɋ+h9Q9s=쳑7ZԲvA!$aDÇϰ Qê惚`B@|=z5vi'իWbmǴ &s=g+-< ! >&1>jȑA߯[s cdǩ*?'j[*AE|Yie &b=z6IKCȈCЋ~䄀Pʨ^B`1F_v2ʆ~<\iXr0'byz2у>rp^n B L.!=,X?9<Ԫ9rR&h}%Q? ! +kT/! orPAh[ /T[I@ 82B2iNb9CzgW吗:wl={W +XmeXm}olڕ'dN(~;m5Krt8 o~ɰZ֭UWVVK,a{l]HQit8W毨o6^P?{mֳ}'.+|8No?jOo}]Ľw֦M0K6W\Nȏ3ƾqXc O~!=C.\qsSؤH~/WWrũ,*gرGڴi9r=\s8%e8v@jkl9۸_FAMJK6/SA ;C$k &DFq>p6q[oE=[ilv>ؖ]vl:}_~kEN9m۶_=#F=ceee6/Blooo=\rtA ~vUW5X2 ! h0ѰT[}1oa\(e/SkQOAmlHV2MF8O[dy2F,ufsN;sE/O2W_ݎ:([wu&J.ڵϧ^B@!  5Vqk :t=91*$cػtok-p|s|d isZyi)u e2I[xQkV? c$w7fyG {ol/wq)IJk!~;?R'r{nxI>sdy}(_".)Geԙ>bQ|5m֞-{>sv%e\ǹ| ZW d<~jZk9ٿJn_>OvOZ\DjΏ} dL(! ab 綾^?}Jr?coK/mzʾ% M2%r\4=3gƲ]wn(CgK?G,T9nܸHn6h#aá+]>q|iĻ<ɽXʤNupHo[m]yY XR,9 :{= ,(ι./eƁ ώf_HW_ՙݎ;hJ /xl~ԭt ɓQytB΅KޫOs?v|gČT8|'-n䛯sU]NDg,kRC5OKX4>dȐdaW/6`CYܞ{-,><.7Hځ'־UW]X֥K :C l,tMs1󨢮OH=~wˠXx:wrJӧad!q#Bzvgy9uy>ǽ;.~?9Zr+ʼ[3_lvF)K aC!L^DObuG.VZi%׿e~z$W,򗿌aH9uW\1K@36lC [|#AeLǴˉ''ByK\D y۬9ߙЅ9JsCE{k1"ǿ_>.I&ا5L!F@&p%'h>ӀzՐ=5_M[ȗ˪5앟Y^?ϹgplHK,Ulq&D'zK<.iv5op q1ˆfm@m}@ְg!Nț$pilrQ` Kp8jŊێNrO#,Ə~B7.yD%mMM'̅s9^`n7|7E @^*8SbsXx!&5>Ko^&q܋XVB@!P, u#^'Dɳ W5*o߾@x !Z5,8| byΰOR@Ndž "wgė>) `/?c=$3j=l6(ĨP}.zG a ~ 믏x b?d]:문Me 7cLo ! (yg/@,] {+$*|bk![ξg Sm}{U)A!%YG)eΉ[Jsf><Q˷zKmĄRl]qXhxa.OunYWB!.X+ΟNgBǺ'Y[xqq[x?fa7p\7>|q!rrB@!  0 :O7 <eLB@汕7J9kVdma6T, ! u#ugB@! @S ( ! B@4lB@! h  ڳ6q֗>*C! ˶ מ "kGXF ! B)8q6Yue:!B@! ZWB@! #@ IDAT:!B@! ZWB@! :!B@! ZWB@! :!B@! ZWB@! :!B@! @A`P-X_ÍjӦe2xUVnxveUdvcGo&B@46Kָ!y+))}ڵk5CVlTW+ D.Zfj<eݬ*ظكw~l%mBiF /@#y!oPq A.N>f͚em6VKZ$D^s(<feYfV8i3_V]K]퀓7I[۝8V !Тмh̻qi惪*2d:ƹ/sQJbbBä\Vkѯ1WmӞk_uu&Xׂ-elN޶OSK[ġ !th^Zt84:Y2e͜9Ӗ]vx)R]seI'dݺu+H7EEE*+2y7dxر'ɵ#_[z뭗%ɓ˥LN<ĈIt'ikwk Pviۥ7nAulVۭWWf,$Zd#'@ 8_cX0hH.s1^{١jnatܸqv7;<^{M6A!#UU`IuUu'L:W^y?c~MG O=N8{KYGφ~V뮻 s?WZZʌ GyeOQn؇n\2, mf@?=];،3 oBnwVytM>;S$>c[k,uHK󵧲f^.flwmG(.;lm{1(b-+s{Fmd/r=ޖ>;XfZ@889v,iUA.cӃumryVaȚ >kW_} 8lmwߝ- q]{m6`石~§&lbOojՆ5oG~kK-T$u"2l`yŗ욿_c]tpÍ6a„6mT4i3`ueI;spcѹx@O>1A0!;kI6&X\~_2K/m_c~m;SM>=wsw˯i/s[r?LևG\sfڴjWth儀87'sQ֏ 2KK.'zd!FC!j 2f$ }]'}HH+yF>;>H.8?ɓ2,7θe]B#uj%SO=vmw+U̫f=X"WakPͼZ#n!/R^}U{Gk.M>͞~yo")i6~8~'98[~a1OA~鸕cGkxYΝ糞 s?oZOz!ܜlG0>2&?m3H]HC}` adȋ!M1(a z3q^~r-O/8M|wgq wh:$"'?` ~&n8qt|^ĭ*=c[P_XuU53ό\6!` -_89Sdxy {wP>'M/ f% bϋz|)x}c¿nH5x<qaYgYn%+2_\G';it*—[n#ϛXɈ ayFJvd%t]v%o-ƘQgV zu%Yea?[ͼT E3޴+#gۑT?X #gϞ[{1C}s*pH 23u`ϩY駟ؒDKi2dy{<F#klN`A`EM|>I&ş'O<W@g s w 8hFUL< s+WGEf_w=8Cj>hQhx`S&mTOA9眬>/޶dYQbS`Yk1 '\pte|vo\QW7|!lyvky%x1PMMW]uU7 ]UVY%Qc" 񌉼pU D"U02K^N5lg/ A]y /f5[()\sGZ 59ZalTۀ>꣖#I-CaC'Nu›*Eݟ<_oP1< ?y:o`$O $wl]-heMЛU1gpͮo~b?}1̮<|8x9vQ !P&t:ua,D$7XaM,GcO^\`*tΪϼ,2*xP7 dK2C>y,X 00@NA=_!yB aCڸGsf5$-3LyøfZ[pm'" ]5ラaœ^91yqʾxE0;4I^sB!|wӚ5y [.Yn@sGZ$YcJvD͏XCB蘭ϡ! @h^*EUra#-qs|řW]/A^80iw<tz|! &%k<=3v衇f[U`7^zZkecڵ^ks=V[[law_L8]|ņ /ǣ>'fϞm묳I #fa%vek׮֡C{ꩧKyjKC`\l̙E]TWq2 ڵݻ@>}"zw>x-첱z(6"OL6-֗z'1oV8rƍʰ(;lda {| /kVB|p\wu:]ve֭[7l[o=sK/9眓M;lРA6e;clM7ͦqO(S]]3\U&X2mQ2aR̄;ז@2eշ mhHy^#қ O0f'*f\VX!5āJ+}3ꪫ:L #^{-r]2Q<utR>z>2T[q񞬭 {lfm͌3&s뭷f<9LX>eO3tթ3<(eu]@f3~mYW̌1"UVY%p#[}" Ɵ{Յܛ$XEc?CcjRc=ҥK샌yrB@Ԏc ' ^w [;81NTo"~ςoq;8oOwE/*a%{Xٰrq1'>8Z *%\\vw8J\塃m&O;O&-aȄն~(0OuuJKKÚ64<1m 7|&}QƌJ_{}W3ΠC \ NNunm:44Z3Xj "ugXnjk 2aa_cJDEեÔ}־}':+ϻlҧ_ra47_Z 'ΦH\^[$_]&2uX?S iOV7 x !<heP 6,'o%\rd'IˣؓwNնQ9Wy?78.wkyua tW[چc5<ēnQnjHXq'pBl^~^{=>pO>Ho6a<ϥ3wٳgszPslyڲ, 8#φq?X x￴`=3n; ÿ\uI9r\qQ8?j#h$gťG.죉ˡ5,\3L`KU.C]^h x5`%+ɺql܃“oKg’A&X?-d“h&,=va$_:֥4 L۱=,#3<3^2ӟb[f4$|5:gI^.\ o:F2Aqޜ{ òZ2kn>aY1^}L^zi&,g0o9 a3`9e_xxIDAT7c|0`9{5I̧3lWdG='\mm>̜ yOol)DmUM[_矏3R_$k kI_?.aξg SmJxRy,Mhm1^炕a7ŧ~:)/_#ZHyvTD%\2YjJҲpCeyKH9߰48a„y>o@ cǎK=W6?W]P׆|xR=љe%X/'>o>QuWn3ώ;hoP/B`B Fdf Ue)9pΡ)$N} n_Į8Gަ$dJgc4ekz4ڇts8! @KD")|FNCd/Dl{b6&'6uQy ۈ/Ph/ . fKž2@7'wQB@!0MyJU@! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B D IBB@! ("k] ! B Z$U/\ĄB@!  A&lRHyB@! ZXB@! @S# ԈnRY&'M*Ieq8T7,n&m|RݤMOTIu6q>nRY&'M*Ieq8T7,n&m|RݤMOTIu6q>?*SNb-//ߚ5k\`W~'j/~c^O|?= znĿ/Έ}]闼KB֔X_2>@@b-"̙3^x+..N;S{[n5>e˖tƍz֮]W4˖- o߾F" " {@ g7]-M#uY}uN>d1bDEYuf,X`o 6,7iӦ9Lb_ׯcڧ~jVRRbk>6酈L I-o=lrJz}oW̥]v֧O˭e˖5裏W^^{<*o|\*e-//=\{_/^\#p+ G;}/zȦNjGyٽkee!fO>`9^裏I&ى'EޭZ7xÞy4hM<뮊Sjr\_pUSV(U 5'eK.W_ن )cƌٳg[-+4"!xxR2!vwwatMvyAmݺu6sLk8Q~m/.#<֥N:$;c5Ga-YfY~òbŊ h#au"F/O?X <.C05*g afvAZa|nݺْ%K> akf͚kmܸqpp|wGa6m{.*ڷo`]0a;vEK/d7xOki6_砽@'yfk޼n-^XXѯj֫W/jDygmcx3O=u)AŌqf]rebÃ-ՋnO|7BCAc4iRѾS s믭m۪We,bT}vW6QTT6c ":Xr!6d+,,4ڴii"izpl$3$FHXZ/_f7caڵk`gϞ>kbwgZ֭+]609h xvn7b +#Dǐ!ppcb\xz!:H`!½?WqqTZZh;]i~>&ӹswgpð6:aZC9OymM_" "  B B-~ʬb$K. HyuO?=,!B05!& ("dҥa=Xpʖe\'e݈)Huk#IX`%ݭD(ӦM 1/,LKO=b°TǞOr*Ԛ}\-o&߹sؽݻ۱qpp rH!qzÅ{z]M߸JIyj/" " 5􉧲iЋ+`ТiJۼJk,Ԙ2eJx35>k4,0I W%"i}s9AlY ̑nJZ qk@ElPp"ޯļx-b^Ybnet}A5*K^ 9=a5bx)Dx.5Xqex "k)׀)S\m\ެ#41dA}^ZkmKD@D@ (Y50x.X?Fha} mĩ-s,NY-k=M)=tui;|pe,qr:Y4l6OwA8DSmj$?b VO4xD->O9l ȘeG kv5q;=q 3 u>H@\7q{H*mCID@DE-^Un!MZHtDŚW١n-o3mL{Cz}AJO@|zF/s ZE &S祼}x/tNc2:Iyp5+ʳRjo֢`N TE*ܼIZ &Bk" "PfekKmSbϟZ3^XC6w5)HYyL)M[+[|YIq.zk" "P]-h>:jԤkYm{._0ES M[luʳzP*(ؠ%־UQ5[2ŭe|W(<V66Qͺf7ؚM<۰%oXy*AsV?mRҺԺ-q ЈQsɢ25*Ă /)մ\ĥ CD@D@D@9+:41 DF爯Xщ1[ݨ#%JDuk'*ɪҹ%5 ]ŃaXKGcNR bg&njb4`.@:'" " " 릤sJQJF%(m=le~N{h\3~mXk/" " " @&Ukqg{:`܇" " " "  :{::+" " " "PG$\HBIuD@D@D@DHx +" " " X˅ꈀ@X#VD@D@D@r! %:" VG5BBãRJIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Checkout....workflow/Contents/document.wflow000066400000000000000000000161011362112712700320200ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx checkout --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2A9C48DC-3E17-49D6-9924-6FD98175AB1E Keywords Shell Script Command Run Unix OutputUUID 190C7D90-6230-47FD-8502-890175C77BC2 UUID 3AFBA913-B332-4E21-8226-03E51F39CDDF UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject.folder serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/000077500000000000000000000000001362112712700250115ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/Contents/000077500000000000000000000000001362112712700266065ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/Contents/Info.plist000066400000000000000000000011721362112712700305570ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Commit... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700305075ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001104321362112712700331410ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxU;";wcQc%n%%55Kb{^a"E.lyr{e,ݹ3sνgf+;vl䄀B@! %ͲVB@! @D@dMA! f|qT5! B@! B# ֌/&B@5! B@4cD֚QՄB@! > B@fZ38B@! Z ! L&c555W_ٷ~kSN֭[+dqeVVp%=zm`ڵk=__&mQ7KRo[h,M-6Up FDmȐ!ֶm[u]M6ַqmdJwgj9Ap!WgVUUglw큻ڔo7׷HUPXs fΜaO?|a6ac> nݺZu˹N?niNd?hfͲVXI"@4~xk'tR`є2Ǎg=P2I^zVxڜ9&<On{ >܎?x[m+]f Ħ U?,/O}M￷viEyҒD.)a .qʌ͚Lka4LѻC쒳OlM)HFT쐷k.6jbivVZg6mEUQnZ9֮C{g숟c7ZߦͬUֱcO"QС}A^_t6qDg}iQ+-g$m_;84(O:׉GVWS{}Zk-3fLMUf>^'L`wuWV4ˠ..3sxrQeUrQ=vmkڶ.]XEyEp qSBM\ Ѕ0~#y}b;斟o~o&u6읷Zv탅0Ԣ]7E2,c뭻^0oFvo뭷^,+_Lw't}=TҬ>4ȲW=|> OG-iC/q]]cQdŃsYͥb5jpqj7Ϝ9sVlB8q'* l8+v[c܈/Q1* d/['RQCvcr}P֏:Tw^> HM!Yi}5\rM&TT9JV5kJiu 蓞/1?# ;C`̜bo=^f'{'ֵ>1~:V_kӀCM<ۖ^Z.3hvy^ӧOm5_|_؛-y$tOꏵ ]] ~/,k bRP X>k׮]|8vvmgGy :4?x8[GKf{A7M|0',7dvm7ވy{9Úǔq'_2tC=||M˹kb?O?̖aSN_~9FQq[b[iK/ՙ{>I}R6;@_~e+2;?JO]uUYy/olV[xvAwTޚ[?cW_E]oq,󅐇}>mBxmbAy0=^N?t妛lwQɡ rʔ)A,8+<'O3ThŜ`Y cA'؍O}a7=v8`IAfFR6'L1nŶ'g?q1/KĒ{0q[_3r:d[X_-ԅ.@b ?o)un믿>lqW|x9H\nȱFwx57i\pAIJ_~v뭷ˌ'_ :xWx [k5vGR;9ahm슨gƌ Ѷk`;I7~A{?ΘL=jXM74 H^y]_k̏=6x뙮6l@ndè{[q(x{vo`k;{{7 `+~}=裡GU&#}ծ T&a DʾʺN֢VVu-[ }YG#òFt|E\[Zӎ8,oSKQt?^85 y%ꏕebFxp?Q`F 7s_zOgVM1;jbӁWÂ;ý=|]{B sᅈ7#N;7$?y5{q{GO>K.$R&OC5 )C([o[~f5~\oةjoV|I`>]wuvM7ݒAGصFgG@dm~< vgo3Ò9 `yÝuYquE]IY4+ˁ9a ou!/!u|%W9 N: G~:EY{m喳믿>g^ځU#%He$ VdaKd:^ԙ 1Q'|mġ [8>FEׇBIϮks?U+%\،ċi#ֳ^{-ZDrJձ$@^,fiժ,ZhD뎣w5+F Qʰ9u݁54IyC6?`6ė4=׿˃p裤{챶J+|m&MG|mb32Dp}+  ׬$įuFpåH d.V]RfmQ\3H%o.R޽7"dra:rG@ + D*mܗ݁tm3 acD v\?jR[=zN^ MZ+ k+ȕK_>vVca=O2vW05gI&<9]v2}ňؿ$w1G;\l?_e:xTϷ\%ٞ(žS k&5yM>AuldP҅$!0BZaZwuCkGӏ۷ϖaZs5cH!OY<´:$?HOt$ y߅bq _k׮쵺p:"X&`{sd -4:hU- E1\ǔ-دPOߛ1G>g=z9\cb^Psϸ8g#}I5TyO(tb,nW\1Z\`A*!z J/|8Љ;XXD>ɓ'G99x&s|rPu#.l $T;CQop"ˠ}c]}]&Z ~^G:)wtQ_O`םq\|NaU倔'ŵc]!9{)ÎӡuY kcNsR{۔1_ط _~d>.m[!vlSRk֬y%yr>J9>ulLi +f۰Wnas^dXady9®tG<9<!k< su⥎0 dg8ʧꫯڎ;m/zb-,k @R7+7=kjuP/H(2YWET?g7 y3L?t c}b?'b \,Fӟ*Dkk 輜tD2>;֕M|9b9,- ,nL q%dݻw/0y]uU =`t}XȚ86FL2Ba!秠Xt ?]o3ΈrXw,^>>xcA.qϠyI:Ȱ遵>`  z2di;} B> Fql'\9x+.@2pxY袯3Z@<8|wï} ]R|ºD a.zαC:v`Sa~0ֹCO;+mzyx[)L\C>W@YYu:wAgf8vy⒘x>8ExΜn-L:qMqM8f͜d]2 a [` ;bg XtyW.w~#˥s5üLMD|^rׅbAx>aG7$=-6ҏ8oj6AY ƛ?o[L{ґqs`bC͜˹tZ2 F9QLF2súAݼޔO9S.g-ɺna!Kzc1|z%H{}\'e)6z1ux$ ;9XDݓjlvO~ʦ2=}ڄ˧"g-qIˉce 𤍮򨿷˧N^G]~y=y 8ܪ渻R>&qN!] ;&\K?j) m, Yp5նqu#,bAZe_7 fg nZq !O8p+sCo'e:>9>GcQ0;7_ ++,LYw ici'Y sξf~/XԐ^Ce媿붤_y )0yLdfv27*sa@Xƾ.^k̒+5~#?O=%I'_<ey?!ȣ+pR:5wߟr2_bw^<=FD4yqIy?Izs_WR?h!O:$',I-t;D҈(,%2{|?s=󸟎p!2?F8Y&' IDAT.I:gff" 5u-"sF N`ùϹ_Ou!%u']dzSp:x|rڱ$/i}IƺkZ](M4 8LFÏs/5*->Kr-Vc&ɌNV7rENcuSc.R.+1t.iƪZc!)=B 2Š83YsT_#esp9ZrzkM2/5 j W_lo| >}:K)\t\XH%7VM6! B @Ӽƥ QP! Ba5 7B@! @QY+ *D!  C@ ["Z>_ߦK?oZkm-}1j]8(M! X8`]R#\mbwȑ#w_lMAڼn~qdcK0`@̙3gƏ£lB@! ȲbO6W^9/QsȌ3&~ψm8'V~*b-WI+$ugذaђYB)ׅ2 k 'O+"z)UWDW>:VB@,}hZ92_,op_0#N" yxq~{K-w|w>ŕsz s=Y r{_|H8O\>,|/K7-gz,zsy?Z|NzN:v-@N>8]omUjСUW]5K4\/zbbd=1ܧO{ro7x#^zŚz.Pرcckd7dXoB7A^N! @CYkj +h'.]o;O?%ޮ\y;SL ~L׏,Y;2X Yl$%uKݽ]vkӐG ^gg̘N~H2~Pϗu7~\kO~ׁ~O<9!  E@ 2=H=yx<{ kגA 8X:wLI8'MD]X }&E2*bLQʃrBe ]^oo]%SH^Ήz ȐF sDa]cCyXq} hC6YopzSOV!ı<u7B@! @g}I.|, D <0!]X  \s͘Z(X G$rAO* ㏣ 8nݺ4E s@ l腀QwJ2 y5hX!oK#0 K AUo6ePG6U@!nױZ&uq ! (}PrnyLAX]1fm"] ݑ@d>qq&y\Kz )'q`YN"p,qaL b Ir:4\\OSڅ^#?#dן2nuJ4}B@, Z0hd^a 13'9>#Ϲ-tN;ҝP%ӐK:Lҝ,N242N8,W.>NL2\đ9o%u{>1"zԦ#ŞNdy.'_! @Ce0,g x'R9G-RO>'EnIK'x>⨻˥ItҨ?m|?̗(f O.DirN:ÜCqLxr< ]&I*!Oy.I%yŏAꫯEu #GK/7_B@,nJ> ?͏d[SB@C8p`߷O>6h#}/1Nh|Eg%[MII͡K<6pClʔ)gka5^J_y啨 O- B@{J›efѪƏp ! 䁅/4W񛼸BYfO? Z>}E-0ڮ:! $hrĈ@!jX&&|gԘ1clѶ.XϞ=c"lL8q=3*+ZyrX9! @s@I< -5jTW[s ҋ"'NUVVۄ?#>mXcR.36 2lվkraE\-B Z|#YGs!҉?!jLN1۾4ZXI ֿKo< ;Hзzi*Kmm[q!?s>%_!P ϣH&MQB@|<لEc'U؛ONkS֡Ϭ[nٍFɓ'[~d[:f.]lC_ ! 'Niԩ- l! @.| t9v۳uIuk_m,_it]c ֱufΜק0if&*Ƶ)eVieÖ&Zִf-PH֦M6o`qH ! "ºkͱzTe7DaK:66`VozިImlZEB;;eV56u?! #$@$Y09U6-L_L앉*mtĬo߾OD߉ZRs}E?Nk" '@3D@d^UIZ W6ê' k2%c`i"ֽ{wr- t:8'NN!\^K,f3ma3`Uֱ], s"F'=C/)ƀ !  "kBB@,#ʃS+Cj/'eiVWWSB"ЪVLB`F+ר6eJK p2?|3B2iNbCzTrK9! @sCd|NM>cGϱ?Tq+mnWK0=*ֿ[`.h9a#Ed+YK0dqNQb/~\a_m1M@Yx,ۥzuief}څpY.4Y? r_>爝5ueB`ngM.)Kt!Nz@3}v3S#i,٬K{pSB@4.S?vV4Q#}^f} 5),f2f~VcvjGl%>VRGq]IGĹnUͶ_ˬ fۈ9.B@!DI{s׿4k~ ,Hz:|ǘg|[H(_! !0nj]ܫQYd Ga9wlf޷:ȒV/B@! @Ya7c?Lzb ]׮ٙZǶMgQ+**5q֯k.hs ! B!:~PƮx&`i{tӡ[NDmUƈĭ]m6v#Oy:-FG2n6gk۶v,ݧرcΕ/]״Oùdia`ނiogM.LtZ:`sra#4~o4zhmҤI6c ԩ#^*b۷_O_6Z>5ڷ-[@ɜd")I\2n~VVVfZ~W p8p~^UUe,YKw!Gs\eF/(uw=裶~TIFzdwu}vGΧ7_o&ޫW/k:U%+. 'ǎky3O>l8E M:T8'r\}%Wϒƍg~i$koOQF٘1clu։_RAJYly\^jn-[_A2viHֆ b'N4u}fOӟx㍨V\ql|S {W"6mث _~isjZ:8/E A(9c2<'hm=v ' ӮW/Ӻ|ͨ7MD.ʖOR<'>yr {_?o<8LS~Rg7FCiIsnA?O$1y0)^x!9$+sro]/3KBi:uj<fs\4=YfŲw(CyK?GL2U9~Hn6tSaá+]> qiĻ<}ǘʤNypHFmdn]uUY XR,9|cyIm_X}D/X`I$kLBVnw^z)|wv饗RtĊZ6}VyMI(}:M!O%BLRFG9ac br*>a7-Pj.'ls5O%lsCsɚ%},Q,6lX2zg+8_B*@ncG(2H-ܒe2dع4Y|>?c[omLx9b uQ>a֛g?\nC\G5vo54!{u¯ND!Szk$w|as=4(667PG⎶CNp{6/P 0J+]BuǯN>dCjQDR +d{ ! (&>ebQs>D-iiC|>z^3NQ?:Ijڼ`5aBb1úu,]i@ +d.A 9Ur8ֵ/<ˡ.~8q;?҄e.\Qn>`1 eS_dŇ)9,~\t! BÆ?q'zu#;rIj_W;s"b:aH9uUW]5nB)ctdVUB!Ad*yjHvz9DB@,qbV< ||ԉ8|) 8tzt8+ֻN;-Z\)S a:O>1Zze<_ǚŢwGgyf\8Ɏ[l٦~{@mO=T r8C0%u_ұ2Oqpr䃪 \Ф=%qWbXBL=qn!M4E)BX厵ؾ-iIFd>+; Z$LPyפ|aUi4C7IsY*pjŊnG'pt,L Y#,&L~B.IT"Ē6S s\;dM|7)'T3Έaac7gCVM,j|8~l&q3݋ܘVB@!`+|׍ { l5'Ϣ_J֨$֢>}d?/ćhA԰aV2Yjq_e|r:6,Hs=4C IDAT7n:t¨) `-?c=$3j5lcQNbT>x=qqXF1og` b>=`PHa@5ҕ9qkXWTAXXS^ɓes1=IgH5-fU?,yLOB,yl7[i_d\_+=)s! @{1Ę1CM^B;rb_Ԯ<{40ǺFp!,MXMO3c]ZT,-<ɸ8g*Gc86'2C,]9Ƈ95DNN! @sAA ↁ(tڢXԼ͊&;J[L5SZV! XZ`[-|)]"kMPn^0 *'B@ԏ@OwԟMB@! @@d( ! B@4lB@! (Y4iRxŨB@! RB;?s1.B@! (g9ަ|3ޢ4 Z/DB@! C@dmaB@!P/"kB$! B@,>D*Y! " V/DB@! C@dmaB@!P/"kB$! B@,>D*Y! " V/DB@! C_0X|[kjj>#F?պukd2@sIII,8[w\Ujee R.;]zOO[ڵk ! KmH%kO=~gm۶m{N!km9V["c-3ApnVUUglw큻?cp/-֨@(:y l™ œ?ٳg{amڴV;3 â%3aYyfՔ,@QY!mfkJCzuX|ږ6C+-NRhh\Z28HAuu 6_}ܧ9KK(1 1!^~ǎM)5\>1KO϶e`W ֵ&kK_{7SԲ=pqB@KKxǑF'kSNYfي+~;3 +y~)b]v-H7Eee˪k2x7dxܸqiu#_W{ۆn%uɓ˥LN>It'kwk P!v'nn6&^ ZX[e`lCޮ=!q5"kt9! EMGsGu㎳}?pdM"Ǐn-OmE樮o&XOjkb_=a:p4.xVyYd$yj'̞x yB@jjM.1WNO2źݻ<@.$Z_:\M]uN_j3&0&mmڶ {mO@kBUYca[iۛ>jjkG(Nha˛oiӻ˞{9/5d\rKs{^xv0XoHYXF:t:nJvlcƌ_y啶F`~6>!bdmΜ9, o HoEW_}նj7o_o=Oj~iw^{wmwƄ2χzw@$;s=cpnvuWr-.֏^ڮꪬ<7{c M7^|l{(+-9}Na*&q :/솹d3+\fڔ0L L/59! >:_| 8lϱB gol 0~Ǭ𩦃:ȃc=xӷo_O~H{뭷?!ʱDw=_~+vG^WȸtJXނgs1-B{#s1$82V۱p衇DX?)0SƘK˙ d;/Τ.q|c\6mZNXPO/mر1qq01 a70j058řPsjCqi4fmf'xmvvg?A}WN =/\s9'^n"ނ0]׿7U]=/ϮKOv`(mv<6h) ^39j-r  Ӱm_k.2[lĉ1mi6y{;gv=Ƣs.H.8>UTTݔ)S +7θeь]BƥvZqܙgi{U̮d_,W5aiP|,]{aF=B^1>d]:wmƌOٸqbdM &qCh?aYwcq OƥDt;o;N=:͓O>)̽a7\CǞ}x]qҡa9K_>7ǑFQ|xca8k[~'5\p_|q\{&˭9tooX9pi)R+ L~vʆ!x={ oYZ^{-ԓM @ .;73HN͑/[iO> 2$nwaB]'LBx_j*"aE[mvs1.~ajӏ᜸[/`.)!>[t! AIMgkrQ9j߾}|>L^yxB&:hZRijc bD_2]t1P+d\ӷO$sc9>A\JߗƺnݺF}O?>Pu4[mVA8q4*{z`x?&OC/ma oܤ|{{YiǷVx}}nH [㦀|7 x`Lt77܌.'j^(rsXyxΈ>O#v" ~wm7Ά!/:\8C s?4(+0ky+tLJ~Łn໣=K[}Զh>{} KhpGGųk7fZ}Ǡ0%9-at5.AV ΟbZٛs=7̐yuj6/呎{f&|pr80AwE|O9^"LĞz|)x}c¿7q;oD\޽{Gf젦}ߙ#iI 3 >W1NFǼ=VZ)ȳ+$,ot0PΖ찤yNne@_uԃI,L2Éf\; 2ǹF=K[CmWPq1xlYb *悪+: Pkb?!0U k S<5G?`5@x>ssԨQqJ=zt 3eT#n|v)ZQgf z%ea=K͸T Ey f+#g}ˑT> #G[yC}c*pH 43u`x9>aS 3?d$8Y6l0 ,;68ǑF#k,Nկ~`A`EM|>ɓ'ǟ'O< YW@g s!@q͍ry$;#CW̾Lz:qr}Ѣ6Lڈ䃼]xY}^6mɲҥ_Ƕ5&b.OF8t9J7Gqv;|!leeUiN+i%x)PMECګ:.5X#b(g" <pY oTG= 2I60Vw.ٜp{Xl:6 >W߸7=օlW,9nQn&?}35ʆ7ʂEo[1Ɛk<㎏Y>.1UfMb65K.$k",kHIXYk~+)л]srb ;P\BQ"qɼNxeةQy-:>GbyynD;tv`$O $Uba~aYatնqp2l G}bWZ|x9v_@ Lu1ót ca[5Xdz>}{r1ka%d)<WV?5=0^%c8Xchr>&̘Jb[_~fpտ>} I/8rm7v#!uRwJSykHGHT9dN_ҸtlFD},zX<700:==-3u ]2RuLKfpn_ċB@4 c4Q#E%j}/'}a,хK{y'vxX/|x.OM+knVK\2(78HǔuD-X܇>CI .C1B@иT8VKdS#-qs|ř-|算Ԏz7 uUB#Ptv5gȸ׫1}m9Z]i]r%'¶aQʛ:-:D`QnV^ye޽˖[nȰal1cGm/in18p͘1<tz|! @QoO=~Y~mjgϞvkmsm[۽ N_~aKguI9so묳N|s0h/Yjdnf|Iҥoޞx≸w}!0dȐhA1چ|y\I&lbVT<̈ vA{X5rKСm.g}Ӟyu] "@w}c|}]u_0f͚eX0]ve-ڐ.[ e]f˗Fe4k 7u5+vmvmg< vfN8=^/[64< ۈ3f"bHI>~bu]eU2\Cjѧ?ӯدτ]zʔ)3R\Wq׆H\&Ә?L ^o9eҼ2w]G{a}$>#Ν;G̸G儀D`ȑq]r 91NTo"~ςo e[:Z"dE!. tvZ)y'W^ye؈UW]5>U˄58?܃Y?̜{`*Xī7^W+ mCC k3R&ݒoyD:묳<Q \d-&)󼾾[NQGS:6UPEu /9#2u%oHM_s ynGryU:|72kF櫯$B@ 8ZѦAN;SNY#$ӂL$t!ӣXwNյ8?Wy?~,\i;#m6ӝӟ⚲dt]>lr]iY' mCC X SRR2_t̘ VO V#'tRl_~>5Sp wa;| ҙѣGNWm.I}m۶+--KK`anݺonzk6Kvӟ\MӉB#Pfn´|x^8qb| '?q$-LX":W8p/c2._y11Ͽq p@$ ipDd=JK𢴡!yk 7|H a;6uZ{wc8L駟n_u6=X+-X,XZH֓뻔O'XkGY{,̺ʫ ե. M\IDAT6TgC9|AcK#\[k )_N! Pa2t,mOY 5;,`X pƅdjih s1)_y lbq!3VXaqm5״)l`8so?8Z2 + rXΦ}Q[64z+njQQQ_ױ-3 E]-ea_X_!@¢{HL Yg2r|:zHBri&UN=Ժ u%L"esJX#}yӸWwlH^{a-d("a9! 0+ H0 b5bϞBožȎNl;ÐcbXwOj!Ӈcǎq*LXLӮl264d~0`1SXo@OAp!P00.W]TUOk ?W]rmw6mQ(B?3>V|?7uU;۰of[K#YƠ2%u5 ;v15v.őtOf.|]i.ohZ^:̼]iPiF} q:#_\>W]<)\}wQB@C(dm^qާA(&,?c> (A@FB@Cْ5քq Ł?_>8VB@! C( +Q! B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@Y+* ! Bs(B@hUd/bRB@! (F#koyeJN! B@4 Z PB@! @@dmq2B@!P "k%1! B@,D*S! ƪ*30tD, F4ݬŠƲ&ŘHlQ=Xb5ػtޑ]5v,hTC7|9o$o9}?9>Z&" " " mA@b-OZ&" " " mA@b-O@E/ŝ2e]vٝ6)7r\2U$kwm:uZE5-P>9[,'>9[,W}kķb]?~6^9[,ǯ#g~:+mگg~EbzٸvTrFY//|A LˣlV׏]?K#~i?,}UIPUY޽S{oqoT>盳EU|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[uMj޽{,>zpEel=Q/~zkDO@K}׈? 7m+RUB"F >@Fe-)WʮKC1/~KOgDڊ"Luq=xC<^[/#al7OѼ78oȑ##8u$Fe#u cE;6o믷>,m4_galDdkȐ!_+ÂH#~Kl޿O>nvOkm͚5năV[m>=cvwm'|}94DZsVD@D={cRDows=6l0#jDȹm*7&} 7ؠA#f}Ӭ?SvDrDH?v&['@rˆ(4{$c}ꩧ}цA >RM4m=:*m8jjj҇D>N 8Fk֥K#JiWO4"/[E8z1E(7a` #X"p߿vMYeM+X#Ak8LcN?tCt#Bo ʿJa_ <8Ug3&wI^NcE5Lm0B2Ge-5fox1Ffc9&Es&5p '3<3N1vcoMk_D@D}@=InlRVzi-StYDt5OKZ!矧5YL"B4"OL TB1ˆ61ƚ2lĴ.ӑ$"HZVD('NL8."L'kˆTΏ-aʱ\j1{[$~?vo 7-"qvmS#gs `t5m3US)>VD@D`wjO B776An6}Uo]7Y^Ϧ'CYk-& O2T%";mIlZ ‘ʍukbkX tS>7GxifL2.I'T .Hh"HL_0(gQ3gE9(rۖC~x:ODx聇!2rxs8e*͔7cdMsE:D 46JK~" " +(Fk<5kHfU^MάS}e)%hAnOiSgU}{MۄX LDPxEP>6Dvt3B{y*Ï=eǕ/|gj2]FirX8"MsZ5^c`xI,1v[9g}.dߙPϙR/2o1/|I>F5v9n+.[|9^D9\Xa8hk+@"P, }\1]3WcU;o}},&#k]Pz&Mo#7Xt>\鋛pL.VA_ Ϡay#O܎"H^b '4>;cañQ@c^K_.N%̏rh}P7֧rJ" " @%BI^qV,ҜHVЁ[6>Lv-8q^x> ' T-@G#,Z.&f18+Е$սʶRP{o9&$Ђ2Ji^HvA:r5LhJK+1߻gk6 xKo/ZB:"kk>JtW ›igPe#Xߧa:cM[#%JDɵ ybnY ة Z1R틀tth&Manx Njp,)(bl)Hl)5%NDYDԤX\yt,nHe" " " "БnmC9_Y7EyO1ߔ˴H5}[l5orv/VD@D@D@::R:ek0@ ޴JE@D@D@D@ڈZW" " " "P J(GD@D@D@ڈZW" " " "P J(GD@D@D@ڈZW" " " "P J(GD@D@D@ڈZW" " " "P /uJ.IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Commit....workflow/Contents/document.wflow000066400000000000000000000160561362112712700315140ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx commit "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{105, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/000077500000000000000000000000001362112712700245515ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/Contents/000077500000000000000000000000001362112712700263465ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/Contents/Info.plist000066400000000000000000000011671362112712700303230ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Delete NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700302475ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106461362112712700327100ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATx|UEOzGEP ^aAײk]Utmk {ED@@齅$|'9^Gg;3g;{f澌3gĜ!`!`@D F*e!`!0f0 C0 |qj!`!`Y>`!`@ FZ 8V5C0 C0Y0 C0 C#`d_!`!`F֬!`!P0V/U0 C0 :!`TXL?K/^,u9p޷ӷgIVV{3\S[i(o+O, ]/@5hۚ>o֥^ ZSa?7ְk1J j#G>#$-++v7k丅ұMSt{+1ù\.HWX93ύE-wgLKrUoQ哕Nzpn!.u j[t!^#>&L-k_ܢƀY2 r^źיk97_$X$Lqd-yqwi˝[3dy;f d3VL̔(rmF|ȇ%w/k܂ wySH:u|A[^܂Bk|g/T\!˒˳?G+swkOQhMX_מz]挬U]dH۶m@( Ds̑^{M Y{' P0Cr cbq+-]'zVv,ΕLN89w$e5k(EOGv).C|*No0瘺 S!f;o)ͯ+_8Urϖ[_*7J7h, \S/6`j˭O>OO?$[m/#_{Ia}֟J^e̲V> ;?~xk]ET=~]]cMٴiӸښRT1L:U?p?hcRѡ'??Okƅ(x #g.C;Nz&L? |z[^NXd? 3~Ǖ֏:8uZ> HM!qQ}55\r&֓|g%pӚřnM:x{ZΜ&7pty{ؓqgpM#X ݚueŊį?>C zP~ PV GtAvV9zbg^"ɷ# >}W,?a,YP6뺽áH-\!,Yk\/tܹF'|R/\Mk:cIaC_aRS#]#`1I)f~,K5h?H{d=?^F8pu]t@ryx> 53i|rw]k磏>yL 0zB?}e?0Zw=_~aϖ>F^NFqxG|[iϧ~=>!T@͞{6Ay ׇ/\ϟ/ZF ;S]jZԁ5H+AÚKw~+_7  A bs>i$_~[o5>pmЧnA~zҷo_u]|4}X~ߖ+2^׶naG_Xw}חSO=寍/>W(zI;呇Knf,w~hѢx Zߵw\7,kq?ty`DsΒV$˝L_6',+Kn'tI>N?EqXrF"4|z}/ɕŋr)#;}-ϑiҥ2oNlC?sCecny#)GAT?/<#Ͻ;j{wGQOo־c.Nw!;;kQG%?رrʿ/ѣ: St<0xrA YgmL2|_ĠK/ӦMdq! L @eM-xnO5rF=jOҰnwm[t>.nf@c"HTU8B]xA y $(/8`;oS$kiсlɫԇ5RM:]Xm%\+ 9tMrGޤ]qݻc=F/ӟ2}BO\[㡞,([k2d~ '曆Vz{"7zSO;dmon鏹٥ԣĊ~ “p!ؙe^u>? ڠcp~ga{ґ_^G{饗z޽[wytհ ~iwt'i /bB Ƚӷo2Od#zZOX9uyw7ޔʵ^v>' .V8HwurD12,ǞpӲOͷ0+ǟoZ9oKK>Wn^zxsp:];5*>cnUG!<.Bqugy=@KW.R wEy9)DW]u';~H d BB~xNX8-B'=օ EiD0H;l ubmXu < !$G<K{~DKx5Fg<_~6sDrJ;0U$@^,fS'[hD뎣7kG~TmP]nw Ktk|^WmGnA>c<׌>J)"ڵw& ,G|ضgH?t Q]7Hf8j5p=K\}wsNedI,}W Rx|Mu]'-[.]xBL"LTG?U7;B!bY:"o̞4Nw;#3|vs^(KIM[j_8y) WD 7l%]ve:_>vVca vm>e ϟO>kyCGͼW_}-'N AqCOrmZƌ_Gz#% sXrڦcÆ e@b _'qS+Kݢ6l3_60WYtDB9T|,ѿs1E󂃶R 93k(ġo9a;ӽ zY޾}{nt)a}E-LVyщ1x' Ѱ"\0 X./, 7 )BJP`-"0&oOC] c5iҤׇ͏f,%\7<^v6{-dpW>0x(<sLs6⨹ˇd7=}Cvx [[υݣW!QZ>´:iq.IC^wuX 4h"l&z-_Lp?gK̓F:Z}3eQ_L(C1e5>2xԧ,'T/>kEc…^sްɧyEiGEˁm8j}!Luc66ޢEH-gt2zA *oLِ56G\S35<y`0~G"8qҨ{cz =*5c oM(dOu S袾Lџ9;S`32ԝ<ê)COkǺBs/m9~u-Q,GHc MJRɢ_FIʶf.YN4re#S5kg<`?[G8=ǩA|y{[BF|2a3 w䴎|6<-q;sYs-w!NO5^k{Xbڇ ҵ sNyXs;Cx^A7KaAȸpO'/ۋt?w*/݃mVC,kAR~7+7=kjuP/H(2YWET=g7 y3>t c}b?'b \,F뮻76tSo`PQ띖LG\|žlB;eZe]a!pYma`q;dzl.Q `E|ǎ`| 7 -k =`h}XȚ86FL2Ba!秠Xt ?Zo .rX98Z>>xcA.qϠy dW_}e=>պ~FSz:-[I<(Cur: 5 ZL>#?ߝ-C_wѶ6.B}dKXOt)VsHZ#.nj#S6j-Gwң8E8?߭[sSz%Seђ`4Y@8 n [gs;bW8,+G:fz]Ca+LCOy)!Giذa^\2 Qe09}6eB-tl"";w.2 ?9('_H?:{m` Zdσom1IGƑ΁ 7s"ziau:rZ̓+ViTV5]TC09چh+p-!t Kb1mpdM|S/ Ys3YDP&X,nj k'9p2T#(̝7_iۮ[&nʺO=/]@\rՒqNrzO;׈~DSpw]4d>HW,\N> yE7>{5~_5א׶jYuֺktw毎W,0y r3+x9TDNe4 ]'ᕌa9Q]yS-?Y[H ukh%@#?d4=N-_RlBCb4?~XoF\suZN_㰂g`0\0!Hsկu2A[E [t'Lq4=>N뉏 eQb0 ѥB.F'эdz:2ԏ:5UanԇlD6s uh~Aze&w gʭ#I߹6oU?Nʍi8YZY>Mp6ƻoM as#VuF[oڰq5BbE^ԏ~a5Nۃ\L"=t[}<8>#^ }uj(O1>;#Gea+Xd^gg) 7"y4LZxiQ=skUNo2-GT\A~uaĩNM8|-_Ӣyx=W_V_øPF@Wh0UDi DzH~AeiyKru4m;Nr=}b{Q|ok4E8i4.l#2aXepX5/>zdM?6L~xߨ^͇O\ֵ0m 뜮bfb0vXTuXzԵW@ ڷ@HeGNt 'B4 ī>5ƅ>4N9ǩCuhy3.'t:ʥ|=6.pӅyjSJe~#+Iɴ1-?y$J TtZ^ k# S_G^hU\A8'Nӈk 58kadpѲ';4U9q%Z.Uϋ$8 jѿtZ[7֬U9p}G@05$.L0euSt sR|`Չ>z9GGȯy)'ē{pX-k vY"baC` A98 xց,\']GhSѼ4a :uΠ:DH$k$-:GE[8X#[!DA5WK?*E IDATԍSs>9B. u']0=K8覫z C2E \־SmQ#Ի$j%Jv4]Zicd4=@2Š8}37T_#esp9Zrz'kMystU+?RAcv>N$S):)z}v]UǦAkհ!`!Az^"X0 C0 CrYn0 C0 `d--0[!!`!`T`P9|.I'ߦ+K?oҵkWM/F- K3 C0 !` *wIۏ|SNIwrjʔ);[zXMO?MQN<|0vҤIһwoI˗/MWDz!`q̲'|Z5Պ&SbO>_̝vETHLYK\LU'БL!`ؚJ^sdXߜ\`?GRPXDAw_9 [4]*~yk+]~*@y8C2 'qMWdYt[!`Y3er~ʟA-i:C'XM'i7 % ?.v[{ȿ*5j(Q;}JDCugw'V,ɣ/R-ZL2=-9ydJKGd #GX iS$t򿗈3f7|'LJvׇ_;w,?cz_{ܦM_S-ʟ9so{.q#FHϞ=|T9C0 C2Yj +Q (R2W_At?ܓ=z`,BqM_|!3&^.i(m׮lB9E=~xӧ? 7'H(3 CXU=%eAA0D7m4Yp' ZXo?gO!~8,:cM:Ν7<͛7O ,'8uT??5CDaٳ}>@tᐧ8X&7$& Hq_7fmu0`XB0ɣt# o!`T#kA+"ˠ ``P "j8qLQBadAnʄvOCXTZ% =9` ԇ<[u<-cРA3%L1ڽ{wr{'C`dzCpZ֙S.uv7oܯMCY%hk^ 'h?$s= zF:ךē_u_(Ϝ!`!PYlA%cP10Ƒ,N깆m~-թiӦ>τ4`|AŁu i^a)Hl<y()T0Yۥv_e XK1Kx,nzNZЏ i rK8N56$)^>dz֛z2 y%5l`P@g!`T/J]o Y`I!<0!]X  ڶb Z(X G$rA* ;vvGbբE }qCkk qq΢,zʃ;~be yhz-/.:Al kraA~n&!~Fݩ*Zo( bJ~֠a].xuԟ4,u'/-QٔA(TTG'gMTo!`}7U9@ Q,Ng.aen@.HHgDT2y_~eـ8dCACB%&*uJ&iX=#KeA4zAL!IT'u@>kXP.hh~!KݵI>ŘvSGSXo-GT㫾 Rʚo!`T[V" X`bNCksD t%TauѼZ'C@: it8aRyt8h2ae#r~ uk>N1"zG󔤮$ŚN<30 C fYjQ+ $^egfi=qP.ԧd@^7aмZ\x|QwƓQڢ|= 5_U?r8ꬤ M늌q ӣi3g!`T&^̚),<EɁ¦88 sPyiLH*4NeWZGXe4M}A[e>!O4]} e¸G}֋0:jzXQy#.ԣk C0 `d2< QbPؤA:Ճ%=4>C>tdI'h:%*3Ns-CeEWh^֛ZR_k\"_u*H!`5E>=pggTJQťV6e!`%V~`-U5 C0 CHX!`!`k#kkX C0 CHX!`!`k#kkX C0 CHX!`!`k:=ZU0 d6̋TzSLO?n-0 @Ưㇷl~ZbkbV!` PPP F۷o8(!m~qI>}{qT0jɋKh)QɑΝ;{ZaXZnu0 C_Iˆ_('Lc UMj!`k}&|geڴi{K֭}"lL7o|馛J[+Ck0 >x>11uA]PY!`,q|TAA̝7_&NMvm7|=H>H0rHҵik8"n-7 3,kr֬YPӣTa',‡q0 8{ZBfKFaL?Fz)эS tJbuHAQmU_Z4Ayr1S]!'k ,TCKGe C0!g5j\'T-&E"'EF Jݝd}Y%+2% SvL6iO10ż|C0&JiŞ Yن!`$B@@.͗?\ u3 E"qlШd-dn~7n,˗/X43uS s2e캲(7K bu䴽Zy˚YKt,06-]t|ڮo@)jǿǬzЇ^SNg@ AZ V CXo&: 'CJ/%eQVV(їS9C0j*ujjŬ^!~#kBTP,\ 8!i:qCo~Q/1g@MCd-7M˘i2m~,u_}5Z} uL[PߢTPʣ ZJH`JD֢ Y;3䓱y2i|4g"26˔6HYC.U)&ksKnAcr$7YPL!P!4XYAʢd-Z5of-+o@U" .;6^Uϭxd\PL1[`*$Y4knD C:l?vUZآipE>,l@0۸8Gd;Jv|1>'\,<–QGq+mA_WmE3o!`@ b"_M+5HҸ~YA漼JM+ 4?+m C0 CAN[.{شyth2–)QP相k ٸnd)EVX!R~. MS?,SէoܸN/ZרÏEÉd,JxEÆ}l%z~?kaFӢa1.6??W5VqO``6m̚5K,X ҤIiժM7T6lIP,?% l" g&dBMʋ;m IYi^hZ4HK[VVԩS']%yaalriʼn^"ݩGÉH5AAL2_PꮺGy뭷dmC=4T #5_s=''O!CN7Y?ަM[יUK$( 3gΔwݻkSɯ&K&H6Q/A M4T8K7Dq+goyٲe:uL>]zǿP3Y+l.I\Rjn6L/SA  dmȑ2om:\ Ѝt,j!XP&s}O>bW\;`%;3^{%~1c\wu"_~ϯuRrmS*yB˿jI3{5>XS1^;V f,&>o**.]JJj5M)!lRi%EGW9ٳg$D1vb-<#q )@V5O#'T+,g +&RGfI'76`CYA-LN0O7k$k[l!LB<@iڴ_!B6r{1OhO=UTQWm&DiP,llnEm:v(X'Y_F'o`rv%Kxȝ28rYg R5 ¶mk7 C0҉NjXԔQ -mȒO@+%v)J#' Z Q[V#:Eu k9J4NB \Ye!``]ꢺ4x! ~i; \"'|R^}Uo=cN˦nɔycSrXB ODz!FZwBשS'yGK.O<ч!ԙ:t7!1:Щe k'*[e!Bp 첋'hlvtL;b C0 爺%"jȓ/:f%MjMHPJ&S7Z,J%[ oOIISE&G# 84i@IJFѡ .T?;>qbV< ||ԉ8|) 8tjh8[oֻ;[\)S a:nܸqB^uXh}U/ }Y,馛 ۳>Ņ^/"Qek$*[eDzW^AJB@VuE˴!`!N0@1·.hԲFXVTaϒz<5M,j`Y'/cz+U10P%M'^xUFӒss=[b?jL&[_| >#Xñ+%Q8гFY̝;ׯ"?SwvR2 Tœ>c#n;_7_M8v l* |sXYUΥ߀7 p\Lby7!`k !qȠ QxUdJb-ܹs3ZT|D f ))V3G/ WAB=\z>I9a$ܥ^75"B]{T]"7X:.  ʓ,k +jS"7M'?:H} 7,ұ2Ѕ  )"cz y[:홨~X򘞄U6Y|rʎ;wa\_(=sC0 C y/f39yZ){>n eIM2!-ᅱ<:Ue-YS`iºh44ҚqUq.Tpl2OdT>YXs|*׍'s\k9C0 C àqq@:dmM,jE`ZQkL5SjWˬ5!` c7J9(V 55 A!`@$tGL0 C0 C YKV!`!`DZ%l!`!`֬-X}t0 C0 C`@`ASJdK ଑!`!` #\QnQ6 Z.D&`!`CJ6 C0 C\ !`!0 C0 C(#kBd!`!`==dC0 C0EZ!`!`k#kk{+0 C0 r0V.D&`!`C _0X{[e2a'֭+XhgځSeJVVA2oqcwG9ἭA??C0j[ǑZKָ!.r衇J3}5;ϓN5LGeQvGEܿ¢̙L^~n\ާRko!`y HLj4vXYbR^=_ ,i%8yaX|2%8CrYuGcks]rgLiq3|βQy_NR CV#`Һ1qVdҫW/\933(> 1!څ1Y[䯫/ycRːO gWs58k܂ wyo䔳{ԬZ=pX C }ظ5qrxbɑM6f͒aÆ\]s7g-͛7OI7EAAiF 2xWJTY={ryir ҳgOfm,ypYg1I5Yښ &˝uLwc/_)^|HKn;b c[6oL&ρY3 *A`M%*`Â^ģ&#U: zꩧ,wlv9s?Gw}lٲ"Yps7'E>0?S袋|xYas3\-04,}3B@'ն1qG^w3/]'zCv,9_l'լ,_-Z/N?F-ܲ9S󵢮R8Զt2^k5q2_-ƍa:p4.x:uydZ^%c"^n#w%ӦtzɎ{EӣELne˖>'N?S QGFEpH LjgeiR~O=)w8 _2|NAn Ưoo Cjx뭷C~{g}jZX71U{sG}$ʌK{}y O> 8Te='lܨQ#mg2}x*}?\~x|:J 9Z~~#Knu "VzV+ .1=kN~˿G/2|K߾}e6wC01cp2T}Gvygꪫp+g]wo-.KeO>$%iomNwֱ|BG#OOK=) \LumQ^]V ӗ:Ț9CR=dĉO?]c2A<AϮN;Mvm7ݻ,Y$.'|#Ԡog(y 8g.tE9Gڷ~;˱D禛n#F:L4I>s9VKe\:-ox3?OΘDN=9Ҙ:v)%9%}Fa7u]qCLc.i,gzڑ)kzJ^~%?{quҥ:aA=se̙>qq671 sO70j05Ѝ$W_۫je5q2; gqr_?A#={]K._n"ނ0]7UY=n+KOv`um?6o) ^2ulF;bEi{믿^~7oO[l,\Hs2\yU򂻱\ w Oǃ⮻<9c}'ѣ'i&xIv;SO egg{9GY>}{o>_^$W䕥gd;\+Y"ØmXnmYnsyVm Cq<̉>(/' Onnx 7=1cxhf3B韓o'$<+yF!CȯIu]ǧ<[hbi۶X:5F3vR4Tv7]xrHފsiyU+s$[WB]^1|gkKM=q^&7\fv3ܷH;LΝAѢ9ggiӌӅq {D//(M4qzߍO?-svYgf澖ߏc~.Oi /lU=q,ktW_}0o-2ֽ{wg 7W_޹Irݺux{́KÙ3%0A֭[a2x`/]=٤P9䮸 iܸ3Qt,yȏvKΝ=)9rO':.;cF^rA;BX(SNn|+x8u!k馛쎾^ x7p}[C7)ڞ=zٟwy~|ʪoGW8T r5n .L_8#|2k)U>ft)QrG/DGF tFi ɠK? nm< yѡ2ı8J٠AyZohܤr0][:>.t_Y eH%8Ga2v%aySZ#nEEn{X,_Q$Y)@"bF,>,s.N=3!`СpllYV1(|F>2kFwYd0Κ.EK 'a,XR87aul'Łs@8<ēO>CJ?H6nj^43Q{6r#\Ǒ*#kxqa;v虱gZ%(4^DG䢇4:y{Lڵa.:JF< 4:TKdossԩ~J.6m 3 T#.|v)ZQgf z%ea=K͸T Ey fռ+#g}ˑT> #UV[|MC}ѥc*pH 43u`[x9>aS 3=>$3kF-[eGj8Redʼn?,H(əV8=pBQg!? e9Sss΃"8!PS.okg}JQуٗ]M'Zn_~[!8z?&XI1U|+2OF-,+]5_,k` EDX=I硓i8r۩Qi-:>NLbiyjD;}tv`$CS$wI~nYw|v9|K[Z6ݣ2yb?~v|'RJ4CxX]ƍ}1]땨@Y\`\XpZ8x`_fH& )8gH1b[^~fpտ<}IO8rsd+&r됖* ]TaAeCRe! Jfq?oDIMzǢKzQuӭ_ӣ0SЅC}1/L'ͦhy.aeӲn#k+RƵzeB4gĽsϭ#I_\2/E!Pm@.pDx^vה~| ,Y*iAAAzaÆG-˗/_B]O?FaM[ "jf U.R'ms='NY>TJ S9秽.\(]t &SN?s"YV^K3 C#vvw\Ƹ`uvmS~2f̘dr^{lfa׮h֤U /#P0+y"߼7nB9;6aNHX۷o/-[6mFm=zz2}t:tŬo߾Vd:5|C0eJx>|wqq̾;e]uֲ[_v}In^w]vuWy}n,@]w?x㍸N=/z=z7wƃ>0F }$4kL6l(DA}^z%4F-777_ePW\q'm$Z]W1`9UswF[o-{キ?ާ1Bg? 7d}tr׽{Dr|ҧOy'~35jO6dW_k޼M+&Nv~z|B={| \y啚$~ 8P/^,zN4N\E!`,]4K,;6w)wb?09b?s8=\Uso+;JC`ٲe1Gb'N[6T< vۈcƜcHI>zbutMc\Cwg#1'{Yv8[Nʧ_/Z(W_}uY*Χ9RgOgNl1YGbnGb*:AQoue+OuWu:cπPϛokڴnj{Ԝ!`D`ʔ)~]r9>NTo"~ςogl8hBA֜!, ~Tp!`Нwy1ދ'z~`#p:tO$*OeŜƓ+7uѺy1J__6TꨣNRɗ/QyűEr嗋c=ҠAy'ؽ0 ڎ@Z z!qӊMk͛`,~$7Eu!:֯pXe\|bn:/>Bɀun K YVZTפ )OMXk;zyqݾ">Hϗɓ'ӝReNίd=YYKt~|4W'f IDATt'ed'kxx'}?$m6m_OO>YI,K?+[^qnL۱%mű3 C`}A -d ॖ ּMuY~,`X pG,f`*S#_Ϟ=BfmV  [lO~d%\Fva>tA3Yzi7M [$yW6Tooj3 UW]-ea[_!@†3l>`slD(˕w|= q U9眲[no0`}~J{<* sk1t6um1DtCyțuso@ 3 C $xk/,q3wr+S7aMdG'W3 9v,5k~h|WS)/>,un-J$h++-*+ۆʖ3m 3|1=6\2Lq!P0ZﮩdL&r"ӆqeK?UwYT">^֦U$!P`џR+ـ*vsd+&r됖~ր1(L)-s C )>-J̙3o>@-ZH*lO6\"J$+ۆ꒨jfھDD4n(Q#^>ʸh߭ AZd:ŗ/QTeSX4"6g!ť~ | ͜!NXگd}nO'K!x C0V"Pck8kvUxLC0 C`Ҳ`-`!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[!`!`2AC0 C0ҏcn%!`!2FR C0 CH?Fҏh!`@YK*4 C0 C YK?V!`!`)#`d-eL0 C0 #`d-[w0v[>x ab6Y% H,9 !aX""EX2#@l lA8Wg||L̵gtSU]_u>UWD@D@D0ž'NXK." " " " E X;vl>'" " " "PA TZ5O(H@b (@5HU$ TZ5O(H@b (@5HU wʔ)`rh9;5 n [nݖipl84ocyɻocyU_m>rXG׏_#Gukķbq|J?ko_HZ>}"^poUօo3h ~WpyGϲV4A}V* ׯ_j/^-mU|s6_7ȱblN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gubVS!VSSkzJSA('|_/^~)<<yOGAߒF8#/55{_! 5Z6ڼ/mN%Jv_zY}[v:#VdeS*2ߪ~@Q)/~{^Q" " " "X+; vm6gΜ۝7o񺔹sNwc<ӦMSt?Cb`.72UXAW6<֐!Clv#8֖ɓ'ۃ>hoZGۈ={e7ٶf̘a_VWWg [okFNBҗ_~igyf+jqӱZ6zh;#Mʼ v=}gzݬj|[D@D@VzDdk/m׷߾vK_q]AdW\qEUE]do]zW_m&M?-bbK.I"ǽ6l3{lsJnvuW{gsiz0= V[nVEJ" " +=>lm)o̙3Sky۷}Q$7bLzI})tYgٯjr~Izl>}[vqǥ~BD}ᇩC9YF<ѥ>ȶ~{|S4oM6IcA6f̘$ƈ,N:5 q=qD/BX~&LHu[>Kvm7; t'@8zvg/Dn1;G,>|}+$ư ȹqO>o>ӴolfͲ[n% *V[#vwSO=D/p@bJsj|El›1/d*cM$"qܼ_|EꪫB!|2?GM6?p oz&+f+$W%G&{QGֶqC}aVd'bhQ^{o޽khS_RQ{-"H_=MqH?f0nᆉS#FH]v S|@&B{UF b5d1Sx~!:HL]!B7|…Jae] 6,Ug3&wI^NcE5Lm0B2Ge5fo|1Ffc9&Es&5p 'س>3N1vcHk_D@Ds@=CInQ(i+MbpDI=д@nG"šw9YBjӚ,@!}]'UYj)!ʘsaDؘvcMO\EbZbH^{-Et+S'&Qe&b5aDXǖW0Zj1{[$~?vo6-"qfmR#gs `t5m3US%>VD@D`wjOӒB77۶Aߞ%6}֚UX7Y^sϥ'CYk-& O2T%"N;mIlZ ‘ʍukbkX tS>ExifL2.I'L .Hh"HL_0(gQ3gE9(rC~x:ODx聇!2rxs8e*͔7ctMsE:D /:o㒟E |<ҴY%}5o3eYF!hg#4XMfsBU_P딸! p'†nܴYhO"Seq1#pŗLQFߴ{W>͖:Y? Aw}p|XkLpl/3NbK9lӔ;9SE9f/ȱN9zE֥q7cc/(ǟ끶+ ?mq(t.B @DžgXCj}nGbdmaISؘ Fjb#흏7W&n3hn|` uBb3̱^uCGoˀҢؘ" " " " yPiFs"^iƌp-Xkq#خ{@ٸd#G۰5%"PE@D@D@D ̙8=y3tM= 5c=:bԪXÉO 5lgۗ*~}W|P_ID@D@D@:S;u"ƒe<&[x{*jiYÈXPkƇOl/mShNG"~:X^GED QJ*>+JJ(5h|9?oٴ956sn2ʱa"" " " ]mp߅6|"ӓ'5i"jNX! 6ZUFWAl/ON#" " " ]GXV[[B1%TYF㈯(hiXnHAAID@D@D@/nr@CCj^[Vy-v?$VT" " " ]u/++Ej&ӟ+5 wJg.|-~AMID@D@D@3QV28o)(ּl08ۖ:Rt%r[КPïU7EyO1ߒ˴H5}[nĚ7PQkv/VD@D@D@:J:5.%bc+alCy ~eTZ[(B@b%@HU "$֊PTZ[(B@b%@HU "KalIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Delete.workflow/Contents/document.wflow000066400000000000000000000160551362112712700312530ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx delete "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{10, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/000077500000000000000000000000001362112712700274405ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/000077500000000000000000000000001362112712700312355ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/Info.plist000066400000000000000000000012111362112712700332000ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Diff (Side by side view) NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/QuickLook/000077500000000000000000000000001362112712700331365ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001110641362112712700355130ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/QuickLookPNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGņ(;]쫮m_Zv]{Yˮl+" J= i?ߓ^s3wfΜݹ3{f}9SNM;GpGp@nWpGpG@ppGp|qj#8#8Y>8#8@FZ8^5GpGpypGpG#d_#8#8Nּ8#8#Ѐpր/WpGp&#DB_~~Mϟ/M69p999{x㑛$/zϽ9]t#O.-Z4]/hymeǛU-59sSY n :T7o.쳏4kLIZ^^^#n}n֮/Qs[H7;W(1Å\!HiWRSs y->ggLsoӕNzpj!*U j[t#Z#ƌ/iQc,'u&9/bU̵Y$RP&_DV8ㇴ%/( jvr;v-YnB&1/7WrGk3wGM5Ƿ2,1౪ڼw._mHWh``+))V[m%z0D \C\׹K2/DrܔkZN\agWdP%u-X؂_P#}!=sriҤھUG-..ߦVRFY,YX~]9cd١c> )-ڇrs_~؜Z ,|ڵk-hsEhƌ /șgٙ,Q_LY&jyҥK n:CԊN -~ZF!vl6p }Ig .Õ Sh}6ms=WIi+@ƹƋ_Lka"7DX7C ϐ(}Eq J%ni۾s;83WAv]UII.\$_--/ҤiK).*ZCޑN8IB.)%Һu+5jVZ&DEg}&f͒>xVV/'3ڎ&o򴷡i/VPp=I~ _'nB+[{2qxd%%$Yv-eɾ֟.;CRL寬?`1qN23GL-_}Y~T>v̟.7B~|0iޢeZOZc5d6W s~䡇N6|s-KQ/oJau_=>:ʸeW=:@~W2z,j)((XN<}ݺ.ӱ~bl۶mRmCc[{&N(~N ֘LtXTf)**e-lB8̲:_&6y?c9cO>7f0U%!oq {:aRLٵfQCu($=8|d9EFBCgj4pMh),i&Ea]3',k%ҰyGdIҬyOמ}H?l pIqYԲ,]T K:wߵGK*돴.?, hd6Ȯ*ykK,ǙSO ?QGUi_UrnV-N~!Ydz>[>#ō!O}7]B~a6Zf}뭷4/?GKy's^]./͛lĂꛭpQ,g¢`Y c]o;+=<3XJeIY@ִ-I縆}~̃{Xr",|v},( )j";}.ɗIң2kFl^ܴ#MT#`i\4s/z_m!C9-R}1⬿|科#_һwo)na<=#,oGφ- 9)Y-E_ ?P_~nnY[Eg z80xrA Yg6&L7;Cty;i$%[Ld[{W~g]R(4-[0tYZ}#: +Tuk@ m￿~B pBy4NafBME>)ƀm p0A pyL@/BH ׊*lՇ=RM:]/YkE]ĕ{z~'\\zve)z￟(-SO? :XWԋe~kL;xp!{g+ E[>K UK_wua, NOl6„u)I{?.xtV,ݶn {?` /<,5? `cr~g!n{(TW9Y/c⋕K~a{jEg}&me@v}ԩ0y:t ]1{WC]/˵UF^a0(K@/)HZDJ}k}_.wQo=?,k8. ( eW~-|jIH'ԥAnqț-7U,Ø) ~ah[Ҥmk1slеlmYxK;6^ҁWÂ{G½1|.AtXx ?^x !~2a¯:vUJ9qy^FUW]R}LΝVApu D1rTueه7=`Vt _|.ӟ/ԇ*|!~w.^{s}t}Ӯ];?4;}8Y[C n\plj?O@^9 `yV9)+BIY4BӉ g@Ȍ0hB#{]DH],aqIU$mN‘(={ZK㎔yiV;N-JʈN.q*ȤÖ4u3/Gyԟ<8|ҵ^,!IPV> !$G4aIXӤIZhD뎣k^|!Z?*R^0]@{4o6fQ첋>401Q~-5~'˺뮫z)sQB#>ڶfzX ,\0Ifj5 o{;#?2 )ɓy Q\3HEo殾jرC 201#[4ݼ  D$dQx 9yd>Gx1"pn u)iN􁓇h&-a`5;IM{c?rC<70z' 4e I'VѮ};e1ڿ$7:>gh˕2b}Gyqz.]%lcoIV7IWado 2`a@H>#LsX6lfc˖-e@6d8)Rx6H˦sEG-NB/֞>Z vH-D3]F(^OWQ}v0']![q21m,;;} $B툆MŀM`kj,",l8,a 2!R8 #aaFcu7iT0iF2bao,;6{-dp7u,{sߗ>>,ϖ̙%u$,ˢ=P.cɖkl|d'M EęO?b,'L/>[sz9峺c r d7CEY2>J9>tFFꏴ ܋¥2)ciѢy M {rA kY>Di ۹]{ s/]K,0<3V#h~)k.}sgQ'B}|;i| 80^W~W_wW emHfg/V P `R Jl@s6~1'K1q[nopj`ЀPʉ,GDaq wʬK.Da#pema`s;dyl.q `E|nt2kWu 6P{o2=ql ,Fa!秠t ?^oW9,CrHg+1y0s i3aT /2I^z`o?uAvO,mDZ]G?E'*m$}a:9g}H&+ ]u ȄGǑtX? //B}dKOgX^!i~DnJ>\i۪ tmx[7,\C>6@^^)j"m۠K#;Ƿsp0M(&x$,~Gt.* R}eނ2g$_2G%~ٳf a[` o.Xռ+G9fv]a!Fܧ<@ܐ#UϪ*Ceas0ma,tDE wl0](f/d ?9('*gi ~y]ƀW]ڠ@Ɠ?O[,{ґqs`b fNLo<-O^ބ F9QL0HڠMt9nP77SùmK[|ȒEX(mi6q_ dVI3|ʠV.C,bAFēi#}끣.L36aᲥHًG\rbY xFOydS'#&oX??8oܛ9GK G{!seO&}-z?E y5䭭VV[nZ>]SWD`٣iS|L$GM knʉ8 LLF 97V+a5]ab%& |¤Y,㬞^&sQ/&h,?^T2"hG G]7ʪ˰]7C:m-mۅ_Bt`Ԡ L9I%Мp $`*h"I9_6l5?NʍY8]Ze>MpZ~`s#NMדɫ+7xr%I}yS?GlqcQ,CYOx9 oOY?Ʒ9V>z~VkXݰwFeq~v#"=It,74rgyL[naʱ2M.sn hęNK8|+yvnmG:<|l<&Ft1淼&*8r,KO10Q36QmtXh{-(&C-3)GX^|\\ [yVW-EE˶j;6k^PoFp`A=sV5.3d,#dݖjefI4dL?,uaG K}4>둗Iva.{hf{1|o[,E8Y,.Fda~zpnyINqZR /ިoL'.V0mֹ{3?סaL}Xh{MtbB&c>r6 g[8&Id\|;'qn,.sN:GӉ08xv #OuEom!>R-[ U 5 թ T|#/7Hʤo&'N5&"3:?FIhJ ~P_G^ԪD= qNgt,ޮ"䨃ŕk}[>Z8m@GhD곿7"j)g!u;O!ư!}0uay%Knf69c!lKf ! ˘&k0>v9lq|zKtҭ5TU/ҭo劰lLUT$U;M.UZmj]{CU'kq"(M^L戳's'kJlNuk5띮5ѼC'.\U ӵ8p*hWCoCWm#gW^[nHz|!] #8#811.VGpGpjGpG ^#8#85C_0nM|aرtM6tS}MoF OsGp!/T/%o?A 70\]5a[l,.HMuQN5<|0vܸqҷo_R%KGjGp$nYKBQMemKKL+2'O<Έ=QC;찃~ELHLTy<Țeu.Yg8YZD>YK\T'ҹБN;#~^s&dXnߜܾ`n?GR\RgDAw_9c{K-sn|7*l[Ϥr6O>dLuV&>@tK[ёN;#em%?˛Xv gכ/IԒf8}pҊt–ֺukauz*5l0fe 6H GQOXG~̛7Oe}PY?~N;cUV/ uС Ր6;>7#o^"jL"_|Eva+ً/(,-w]۔_?WܥKI O:Uxj;fmԅ?֭?XIf޽=X(!v\z'ȠA#F$% E 뮻B9=zhׯD~D$ 9# Nj C$N4i̝;WBN4K2_~3fPraa{9sL}4Ӎl֬Yd=lj'ҫ yReJ曲;&I`E,t|~kzC~O DXхCbސ8OcƌQ>h'.^oV[u8pJ,!k?;#8AZuЊ2)C9328&&u&zK,dXh YE26 oCXLY% [oh5 Zy"-UyVƞ{)aُ%^z%k ! ŋ2ԟr}7 ydqnu6+D$snu|Ѻ^#zsǵ&?>74s8#1)Xރdp@ Уő,ڹmƺ BԶm[M3!8# X83g98NA Mԋ4,e__Xڣӕ!射&{ Kzi=biՑ >6!:An ‰zcú ekahM=YZ6p0ZsGpj@ޅ^xU l, dD =0!]X $6dMc/Ku#9 O +tCF.C:ty76 lǢ<믿KC,kȣG;ꫯ @%yg ={TBFY*Pa,|LBaE/SUސQĔAúyc_?ׅeXN^ZzRuLp 8č~`:6 DNV#8@Gq3E*"g$Lܕ9L]vE Mdppnt&zH ӗ C6J>crXB(cdN$uxd,c4ͬ^SH9I!g2-X|T.hX~ 3V$aL)Zo+L㛾-[.Wɺ8#T߳VbLX`bNԑ܈:FiCVZL&^FMC_ThK's+7xK'ÈVT&o[Yz[~ȇ⢺-gYySbK'zL|#8#P8NL,Ui6ivg yہҢƏY|TW<K%K:-.Ut"-/zneX>Ҭxkuz0][h7ʧq#8!d͐Dc)-fg5T4JQåQ68#d e.RXGpGp8YK8#8#uexGpGHx#8#8YGZ/WpGp8YK8#8#uYWpt 6HEju &ȇ~|wG  ~xmvż|Gp@X ۿ$(5!mモQFI~{ITpoP3&(D j#8F$'&O,&M[:wU٘6k,ywdח[OZ 9S;Gp6&1>3qW!T8/E5'Ke2vO.o "l6"СCǦK5E՞\K/rGh(0q`YiӦ)YcPT8'6C8XxLTINb;zG/ϜHУhFKskҡMs]e013];#PD#%ksIRCtx#C [5)/~^(mIeҡU4"ҡCNjsΕ^z2??O/͕ŹCvN`hy-#d#l:6͟?_Z6+e;# [Hxw4)-KŲF=ckݺ,YD1eR}2 K sse2 OM䴽:횩e8F@… dF^#8g/ ]Rilة$B8CxƋDеk7&i"C4yIrak&jNؼ9@CD_jW8JaoEŸY/[#!tI(ҧ͊8Y.Cx E8'?zЇ^|G"d^##zR>Yȑ=JʼnXǎew|2Ѓ>8w#4T|jWNʈ’gbJur X*fD4K9>zЇ^SՀsG d\#c SAʝ/#eqVY(ח)ǝ#8 & b^/GX5qV,/^*(ܜ@ 82B2fiF4S?Їޢ-q8@CCd,,ɈIE2iv,*_J80 4DߡexGA" 8zg-ΑFʸѦipE / 2k˕.Hy]!W#&k33aC#YPL#P-ڴX~IE eq/Ĉŷ zg-g-r+8@m"N=[۷-5O[IdОL_vHkiג'ܘv:#P lF~6*jaqF&]DV9 5yp`q~ȼp.=Nڣ[[NU5v sdȏ "o*ҫHf GpG"뜄|gD +h%i-|v^%YCO#,<]!iN DGpG r")\p`Gٯ_Id ܏%cH"wHrKZ#8#8q~a,+E_@-gqyiwk_mh*r>ҺyYAM+-ZmJ?GpGp$^gA|5NFZ6[AɔdWvsSųx8 ٳg l8_@xTq㗪o+xYU姟~RfѢEzL8Q&O,{/*^[r]Y4.-YM5\ ׬_A2sO%kCYf)i# G87s~+N8U6pC裏uY'_W'nA>ceӬY3Op7N|I)((;xM7T2K^{5@뮻N:ׅkE?pk3:#8 N Ka.Fe⥲mhn:R)Yu TVɚa%cټy3ϔZKMVCY.f0`,YD{{pHT];o!}?^-NF8[hy4o+۷/\;JOw޳gO9餓d-Vx*yǥ]vryS#8@!¢ n7#FP#z,:AXygjfma_c ~y6gu)6(O~"%!L,J|琬h^-,g>+ޮ^[:w|KBi?rTZxG\~~Ee~ \r.G,T9c %7n@°/of4Ms,,eR'Ӈ:8$_~뮻M7ݔEuع2,^̠cw-a2|*5Lޗ]v}K"zkRgT v{|*3e)Z"~ou2eroS&y2>&sޫ? ȑ#bv*>a7P Ee[Et[f)儭"TA,-cbã˝'Yb4ob-w}I )@ֈ5O#Oh;,,x 3`aAꈣ|7/6`CYAC\njˍ5woM6!xmV¯N~_ *jmx8] ԑS:\n$ !iL=_wu5~MBu_~E:,CjQDRصkd~#8@}"`˟V&5#hCԢ6dgsr;C񱓔d-VVV,?tHwL[9F,B \ee!``]kb,x!˅<PKTrE=!JޝvI /;`:V?GpG yTD y2mV،@Bޔd d 9 ˡeT5Ho%h԰`d&vP^r2¹stا&;ӏOf@x+Y>DN>qV:-_|¼8oTݹ瞫1>iA=fyBE5j*+7^_ &c>,6_Gkq$˅HCYq˵rRm Jb[(Y銗aGpG><uQ--kee-/,YTܳf\-`,oe [4jQAXZ:Ovm-{WE.O?~[<c~9˜ NZsFFuʩ2\#8#2atD 6狦JaRt)N3F`|P_ 갺i!–͓}WsZꪤUϖxo&ֶ±WDzgn7VQ,V6Sq9gT$nF*.mdgL]:GpL`{9bfI6EY\~eLD 9g@RF/d -{ƉroQן*̆|,GPVHh.ı=r|b̙,-fKo^&q܋XVw8#d !q` QxUdJb-޽{3VL|D f )Ef^ 8s9e|r>6,H/X_6lXuTx±5S6HycQbmH IDAT>xKqXFyya9뮻t?/p@ ?ט륗^^0S1Y4_@:;GpG [.ʓx},~y\.pN IJ>C&{T]<5Lw.VA&U%YG)eΈY,x&5\2JěhΝ;WM1X6qe˓tTmX/meTÒ$&_-~lv+mk-RGepG+M̙q[8# ~ k( lp>~H[ܐ+n'GmD^#4j|^Z5݆84JAii >\b ܖ9ss(~a+(.?&Wd v`] ,l/(Α{BN>oXNk7pV!#Nϟ/:]0m4yg.g}o>#ҥK))a. G_Q3e瞓s=ג+G(O?-}*I +' J?uYIt#7E Ykwk~ P3:JmvkPDk+.YNOĕ9YsZA`e%*|a.F]Z]=Sc=VftƌtMWZ~@8yZʒ%K2o.8U#СC}XA~vL56llf5șyKySR|]>/g q5.F>L03oҤ煗 $W˜o!{Wh]Y),tR |exz<) Ҵ1XAKe1宷ʝG,iA.!um^a\T,Ț;GR޽eرZ駟.ᄏcO5k-ZPΝ'_r`{]. y2Xt.+&1Pr?P9턽{RvG ˉ'ASO=Eso-^XQfy睷ok~+H.ko#K OY,c3C d cfڢ2Q򴬵9@L⌋wNDwy:# 11bT%Ȱ5:NKJH+yFo;N~G%aW_}O137o޼ҵkW:c5F3we2alsS}I .?@ *裏k,l *WBޞ?!壏>^xQڵmmEo3xF@̙3u4-Osq6M2Y on%z>ҦMy<#?]yYg;ywk3JV,~<^ZCGjͲFG_*?0o-2֫W/ij+Mwn\Ϟ=mlU9ްqsyE87p&{&Ν;erGʧ~K /'2e]&['3HNɑ+[w{Jʆ鄧L u93 +"4i$_Sгg/%[־-,`Wqqi%M;sJԗ+'KQ'C(nU;5B{l@. j #Y-[od08c־7yM qS@`tPsћwnJ]FԬ\ Qd>0i}F:) od뭷N!/:L86Ǡ4(̀Mz 7˵<C@7yў-ܲYi^H(>+#\ݷ$o͝;W"*д49smޱ0ۃ%yyأ idO#󪫮6sBD<6|_*a=9OFM-ݚ˭'U%FŅ[,ze N:9's›*Eݞ,_~„ -3 ٓ IvNx=L>NU*ti'aE3,k2oND_NJ>[PT"̗٣GMoa# x\]֭rHD1q#me$^.r>nJUVLKR.sx0u~8k|`Kp/3ǂ}3GW'̜b[U~Vpտ*}5IyGf_Jur:*!5RwJSyjGT9d*N_Ҹtl6DDl|,zX,l^``t[z\>f/h>M'fxy.geӱmaG k+ Ƶ|%BHx0 4/h"I?>Y_E#Pg@.pDxvW~| .YљKc[o伐n܏#3ռW?ρ7ayI%ƨ<ӕJ?R?}Y~|jR>+_8*Y qsC?}gfmunOior5g<uPRqC kfصXբjNEZO zK0 G QG2RkF:k7,%\m7]84JFco/.}7ae>E;7ZosҜ`-))h^<'|~Tf$?"Kc~U=GhD0ݴr m^jiK-C!#1} uD?[, DŽ>C߉? cG2jUyQ5.48 6_`U#xQ6~1m'jukuVw|^j=FK|6-6ޮ-[+NVA8 R&(2u94jf.2wGp2ELr9ch#8#8@#d!GpG'kc咎#8#;Nr/pGp g^K:#8#Ј83juF1=أ*GpGh(L8Q'&'>?g8p|ϵ4~ZeZӕ9#8#Pd}gۊ*wy^W6wy+ӶtyW 6xǬq^ݒmJe~mt#P7;YϮW6{g娣%KP^eiQM7ThW +[ H0KѬFuk\xrJz7|rL)Okk,@W_}/RR+**-BzO[ȋ N$kNZl)oDA}ySYCէa[PPyW6ԴvMyy/O~2h ?zꩲ;$8Is9!8@@`…`D3gL|ω.)q]a # %]׿B3fHS|K,]4DxrL2aRJpG}4&~DXHD+q}&I<aKt=.$@)N5˰a},q]w%9SĶny&uWE%ƎԷ2mIy^#NқK`y %ɪuOp q`O_|گOxr]8=_U}2O)W^ye"X++N68aIL>=/U?#{K'|y*KK I]\v믿ZՅ+Յ%]]'*j>cf4_NmV;G9&L~ /L:3 MïY-2_âZtGUVo&) + 'q<}j «]wZ6m<ǒM7$c*cu/sYguts4x:T_WսLU mOW?<#jU }P."wqA=9@-20ˡFxs,c91WTY>1&?^n;][tOY4O. *K3T~MPSV ru:f,@‚AH3KTDk}*~e=Uԩ>8K`Uii,۵r4WhΜ9cҤI Ge!]] G7սb2QWV꜇U ]ҾK?E@'lLGXb`؏`(6puIDATžD֭uxL,7Uf" ̏,#kIaRS$#GL.+2.Zԩԩ0&FLvj >]N44?`A-&miy-+bE'ycˬ.ɶTF?1| g_~Eeu"5afte[NORkj;[.ӇIYAVtoץ0Ej뼾:.Wv^WU]jq ao"L qMxGl.J}9RBrt ޗ) |lI",$nF]6EaR)}kcӧWB_X=h/^;~̝OfXv?6j9%LmCM/=BK.$z_3bYԅBڅ oq*V- K|Ѭi+tDxID!DXO+`r,!X ?: E M,NT (*K3֦Tu^Ku!&–D&*2jRqrIr kQc`.L.{rZ&}5[OZxTο˴?7w]xUGg͚ܧ/a.t~:ӕE=|3\CkuHW0ԤL^&=#d۰M'*w#3dK:rqu,sP|R**-bգ>,sG`UE~5>Gplz{aM {4Bs'l?餓>/Gv'jd K;G S<U(tGpC>ݱ\pGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#d'kKuGpG #e 9#8#ew/pGppL.8#8@vpܽTGpGp2BZF0#8#8AZvpRGpG'kB#8#{cUa(o *s%go1&[Ԩc,j%X+F#况cARʛ:|ǙuΜ30_ə^ϷާsHuw*" " " XD@D@D@DsHuw*" " " XD@D@D@DsHuw*" " " ȫBɓ'W)7JX?~|%GD@D@D@D 4 XrjX6q'" " " m XrjX6q'" " " m XrjX6q'" " " m XrjX6q'" " " m PKqMf?Ь\E@D@D@D@ְSSr."6h Dѣr .Ym9m,b9ym,bꋟ_#Gukķb]?~6^9[,=^`3~->-+k֯_ /Ȫ~·`?+T盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|mm#ZMM'My=2(}Gx=5@ |?zkD} zĿv~Y"lHтз=xouJP"G-"ȥ\>?Oz(|G׏_略zuG)2J@@b${vmYCCCQIvϟo.e޼yό3T;]?-\6#S P4 .UG}ݛ6lvG433uT{m}MhԻw&֬Y믷_~ꬱѶzk;m5)6"2Y_H/3Lwܱu?S?n>ZƎkGy 8Q^xlWoUoJO`^{e7xvW_}!p+ 8蠃+萾袋7ްK/Ԟymʔ)v,B,.$rk6{̶n;7t[x<x馛l]wgy9S:90ZmZfU " "X#kNl"Mo͞=;kwޱGmEBp#fJԭޚgOguv)~;3g[oew\ꇩ/Dԇ~:CZԋmT'Goooym&i,~ƍӧ'!7aCpPG4^h+oҤI~k]w}gnfx!.O[8 5fgC%"[#G^yD9[bC4}'vۧ~=\xmΜ9v-$DEj]|G>.;/H6)!WmA[O`ַܹo6 t1^mFԈs7۶nkW^yeZoMnÇ'G̸:.Y?zx {WkIog P8-ܲ9F4}IX~d8q!@3cƌI\0Xgup)y%qJr};Ӟzt x9S%uԘSKp/bތ]~IrY裏Z~aÇ1JF"ZY'q~v6\z9ܫ7ty܇Xjִʈ5' D11^z)ED|Tƚ""HDyvUW-7ͅCd|W^o}]: M"VH>RM4m=:*m8ӇD>N 8FkֳgO#Ji5L4"/[E8z1E(7ap #XG"p첋 2|@&B{w[*#ֈr1B2ӘDEx)O?$!bzoihѢ_FG%G0Hc.kndF3ӻ$/'ϱcc6!DxpaǏM2y_u# q3F19cP8gMc'kxhq;WoqZj=Pj[(ˊ{JQC=4Eb*.둈iwNk!?&)PDw}CiUx>-,tsm .s֢zu dys= e@t4"06Dvt3B{y*Ï=eǕ/|gj2]Fi X8"MsZ5^c`xI,1v[9g}.dߙPϙR/21/|I>F5v9n+.[|9^D9\Xa8h,@"P, }\1z56wv&=XLe#kMm,R|7\p<@As.GE@2OLi"}l Dv˱ÆcsaL۱csq]8Kę >~8.;nO9[rJ" " ]@%BKɐqV,ҜHVauֻ| :Mv-8q^x> ' T-@w#,Z.f;"+ǚѕ$էƶYP{oЦ~,܂2U%4Rwķh SD@:¬ÌEؿ r3^V!ZUW\\͙2Tc "ncj]|hE@DGЊtŏMMm67, ~B|`| AE1E@D@D@D@$Ӭ}Ŷ}Ҍ[LYb,F]ֻiGۿkJEʋhX$=y7|M3 5c=:bԪXÉO 5lg ۗ)M~AzW|P_ID@D@D@;S;}bƒe|f[x{*jiYÈXPkƇOlM/mShIWb~:\^GED QRJ>+JJ(5h9=lFC͞Wrly@ @8om0dIFEZ*)p mk66=jI~˓@7'2֢~EPC@*(*+h> kb 6((tW%RMhh\Tsˊ5XNg$֊j_D@D@D@3nee[mqPcIF!`NEeOQ5)twh& ʊ?^'RY `YܖHe" " " "НnmCkB VNPm=|9i+" " " ]k&5o^twtTk\$bc+alCy ^G" " " " D@b[Z%#" " " D@b[Z%#" " " D@b[Z%#" " " D@b[Ea3OvIENDB`document.wflow000066400000000000000000000160711362112712700340610ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx diff --vcs=svn -s "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{148, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Diff.workflow/000077500000000000000000000000001362112712700242175ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff.workflow/Contents/000077500000000000000000000000001362112712700260145ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff.workflow/Contents/Info.plist000066400000000000000000000011651362112712700277670ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Diff NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Diff.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700277155ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Diff.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110071362112712700323460ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGņ(;]쫮m_Zv]{Yˮl+" J= i?ߓ^s3wfΜݹ3{f}9SNM;GpGp@nWpGpG@ppGp|qj#8#8Y>8#8@FZ8^5GpGpypGpG#d_#8#8Nּ8#8#Ѐpր/WpGp&#DB_~~Mϟ/M69p999{x㑛$/zϽ9]t#O.-Z4]/hymeǛU-59sSY n :T7o.쳏4kLIZ^^^#n}n֮/Qs[H7;W(1Å\!HiWRSs y->ggLsoӕNzpj!*U j[t#Z#ƌ/iQc,'u&9/bU̵Y$RP&_DV8ㇴ%/( jvr;v-YnB&1/7WrGk3wGM5Ƿ2,1౪ڼw._mHWh``+))V[m%z0D \C\׹K2/DrܔkZN\agWdP%u-X؂_P#}!=sriҤھUG-..ߦVRFY,YX~]9cd١c> )-ڇrs_~؜Z ,|ڵk-hsEhƌ /șgٙ,Q_LY&jyҥK n:CԊN -~ZF!vl6p }Ig .Õ Sh}6ms=WIi+@ƹƋ_Lka"7DX7C ϐ(}Eq J%ni۾s;83WAv]UII.\$_--/ҤiK).*ZCޑN8IB.)%Һu+5jVZ&DEg}&f͒>xVV/'3ڎ&o򴷡i/VPp=I~ _'nB+[{2qxd%%$Yv-eɾ֟.;CRL寬?`1qN23GL-_}Y~T>v̟.7B~|0iޢeZOZc5d6W s~䡇N6|s-KQ/oJau_=>:ʸeW=:@~W2z,j)((XN<}ݺ.ӱ~bl۶mRmCc[{&N(~N ֘LtXTf)**e-lB8̲:_&6y?c9cO>7f0U%!oq {:aRLٵfQCu($=8|d9EFBCgj4pMh),i&Ea]3',k%ҰyGdIҬyOמ}H?l pIqYԲ,]T K:wߵGK*돴.?, hd6Ȯ*ykK,ǙSO ?QGUi_UrnV-N~!Ydz>[>#ō!O}7]B~a6Zf}뭷4/?GKy's^]./͛lĂꛭpQ,g¢`Y c]o;+=<3XJeIY@ִ-I縆}~̃{Xr",|v},( )j";}.ɗIң2kFl^ܴ#MT#`i\4s/z_m!C9-R}1⬿|科#_һwo)na<=#,oGφ- 9)Y-E_ ?P_~nnY[Eg z80xrA Yg6&L7;Cty;i$%[Ld[{W~g]R(4-[0tYZ}#: +Tuk@ m￿~B pBy4NafBME>)ƀm p0A pyL@/BH ׊*lՇ=RM:]/YkE]ĕ{z~'\\zve)z￟(-SO? :XWԋe~kL;xp!{g+ E[>K UK_wua, NOl6„u)I{?.xtV,ݶn {?` /<,5? `cr~g!n{(TW9Y/c⋕K~a{jEg}&me@v}ԩ0y:t ]1{WC]/˵UF^a0(K@/)HZDJ}k}_.wQo=?,k8. ( eW~-|jIH'ԥAnqț-7U,Ø) ~ah[Ҥmk1slеlmYxK;6^ҁWÂ{G½1|.AtXx ?^x !~2a¯:vUJ9qy^FUW]R}LΝVApu D1rTueه7=`Vt _|.ӟ/ԇ*|!~w.^{s}t}Ӯ];?4;}8Y[C n\plj?O@^9 `yV9)+BIY4BӉ g@Ȍ0hB#{]DH],aqIU$mN‘(={ZK㎔yiV;N-JʈN.q*ȤÖ4u3/Gyԟ<8|ҵ^,!IPV> !$G4aIXӤIZhD뎣k^|!Z?*R^0]@{4o6fQ첋>401Q~-5~'˺뮫z)sQB#>ڶfzX ,\0Ifj5 o{;#?2 )ɓy Q\3HEo殾jرC 201#[4ݼ  D$dQx 9yd>Gx1"pn u)iN􁓇h&-a`5;IM{c?rC<70z' 4e I'VѮ};e1ڿ$7:>gh˕2b}Gyqz.]%lcoIV7IWado 2`a@H>#LsX6lfc˖-e@6d8)Rx6H˦sEG-NB/֞>Z vH-D3]F(^OWQ}v0']![q21m,;;} $B툆MŀM`kj,",l8,a 2!R8 #aaFcu7iT0iF2bao,;6{-dp7u,{sߗ>>,ϖ̙%u$,ˢ=P.cɖkl|d'M EęO?b,'L/>[sz9峺c r d7CEY2>J9>tFFꏴ ܋¥2)ciѢy M {rA kY>Di ۹]{ s/]K,0<3V#h~)k.}sgQ'B}|;i| 80^W~W_wW emHfg/V P `R Jl@s6~1'K1q[nopj`ЀPʉ,GDaq wʬK.Da#pema`s;dyl.q `E|nt2kWu 6P{o2=ql ,Fa!秠t ?^oW9,CrHg+1y0s i3aT /2I^z`o?uAvO,mDZ]G?E'*m$}a:9g}H&+ ]u ȄGǑtX? //B}dKOgX^!i~DnJ>\i۪ tmx[7,\C>6@^^)j"m۠K#;Ƿsp0M(&x$,~Gt.* R}eނ2g$_2G%~ٳf a[` o.Xռ+G9fv]a!Fܧ<@ܐ#UϪ*Ceas0ma,tDE wl0](f/d ?9('*gi ~y]ƀW]ڠ@Ɠ?O[,{ґqs`b fNLo<-O^ބ F9QL0HڠMt9nP77SùmK[|ȒEX(mi6q_ dVI3|ʠV.C,bAFēi#}끣.L36aᲥHًG\rbY xFOydS'#&oX??8oܛ9GK G{!seO&}-z?E y5䭭VV[nZ>]SWD`٣iS|L$GM knʉ8 LLF 97V+a5]ab%& |¤Y,㬞^&sQ/&h,?^T2"hG G]7ʪ˰]7C:m-mۅ_Bt`Ԡ L9I%Мp $`*h"I9_6l5?NʍY8]Ze>MpZ~`s#NMדɫ+7xr%I}yS?GlqcQ,CYOx9 oOY?Ʒ9V>z~VkXݰwFeq~v#"=It,74rgyL[naʱ2M.sn hęNK8|+yvnmG:<|l<&Ft1淼&*8r,KO10Q36QmtXh{-(&C-3)GX^|\\ [yVW-EE˶j;6k^PoFp`A=sV5.3d,#dݖjefI4dL?,uaG K}4>둗Iva.{hf{1|o[,E8Y,.Fda~zpnyINqZR /ިoL'.V0mֹ{3?סaL}Xh{MtbB&c>r6 g[8&Id\|;'qn,.sN:GӉ08xv #OuEom!>R-[ U 5 թ T|#/7Hʤo&'N5&"3:?FIhJ ~P_G^ԪD= qNgt,ޮ"䨃ŕk}[>Z8m@GhD곿7"j)g!u;O!ư!}0uay%Knf69c!lKf ! ˘&k0>v9lq|zKtҭ5TU/ҭo劰lLUT$U;M.UZmj]{CU'kq"(M^L戳's'kJlNuk5띮5ѼC'.\U ӵ8p*hWCoCWm#gW^[nHz|!] #8#811.VGpGpjGpG ^#8#85C_0nM|aرtM6tS}MoF OsGp!/T/%o?A 70\]5a[l,.HMuQN5<|0vܸqҷo_R%KGjGp$nYKBQMemKKL+2'O<Έ=QC;찃~ELHLTy<Țeu.Yg8YZD>YK\T'ҹБN;#~^s&dXnߜܾ`n?GR\RgDAw_9c{K-sn|7*l[Ϥr6O>dLuV&>@tK[ёN;#em%?˛Xv gכ/IԒf8}pҊt–ֺukauz*5l0fe 6H GQOXG~̛7Oe}PY?~N;cUV/ uС Ր6;>7#o^"jL"_|Eva+ً/(,-w]۔_?WܥKI O:Uxj;fmԅ?֭?XIf޽=X(!v\z'ȠA#F$% E 뮻B9=zhׯD~D$ 9# Nj C$N4i̝;WBN4K2_~3fPraa{9sL}4Ӎl֬Yd=lj'ҫ yReJ曲;&I`E,t|~kzC~O DXхCbސ8OcƌQ>h'.^oV[u8pJ,!k?;#8AZuЊ2)C9328&&u&zK,dXh YE26 oCXLY% [oh5 Zy"-UyVƞ{)aُ%^z%k ! ŋ2ԟr}7 ydqnu6+D$snu|Ѻ^#zsǵ&?>74s8#1)Xރdp@ Уő,ڹmƺ BԶm[M3!8# X83g98NA Mԋ4,e__Xڣӕ!射&{ Kzi=biՑ >6!:An ‰zcú ekahM=YZ6p0ZsGpj@ޅ^xU l, dD =0!]X $6dMc/Ku#9 O +tCF.C:ty76 lǢ<믿KC,kȣG;ꫯ @%yg ={TBFY*Pa,|LBaE/SUސQĔAúyc_?ׅeXN^ZzRuLp 8č~`:6 DNV#8@Gq3E*"g$Lܕ9L]vE Mdppnt&zH ӗ C6J>crXB(cdN$uxd,c4ͬ^SH9I!g2-X|T.hX~ 3V$aL)Zo+L㛾-[.Wɺ8#T߳VbLX`bNԑ܈:FiCVZL&^FMC_ThK's+7xK'ÈVT&o[Yz[~ȇ⢺-gYySbK'zL|#8#P8NL,Ui6ivg yہҢƏY|TW<K%K:-.Ut"-/zneX>Ҭxkuz0][h7ʧq#8!d͐Dc)-fg5T4JQåQ68#d e.RXGpGp8YK8#8#uexGpGHx#8#8YGZ/WpGp8YK8#8#uYWpt 6HEju &ȇ~|wG  ~xmvż|Gp@X ۿ$(5!mモQFI~{ITpoP3&(D j#8F$'&O,&M[:wU٘6k,ywdח[OZ 9S;Gp6&1>3qW!T8/E5'Ke2vO.o "l6"СCǦK5E՞\K/rGh(0q`YiӦ)YcPT8'6C8XxLTINb;zG/ϜHУhFKskҡMs]e013];#PD#%ksIRCtx#C [5)/~^(mIeҡU4"ҡCNjsΕ^z2??O/͕ŹCvN`hy-#d#l:6͟?_Z6+e;# [Hxw4)-KŲF=ckݺ,YD1eR}2 K sse2 OM䴽:횩e8F@… dF^#8g/ ]Rilة$B8CxƋDеk7&i"C4yIrak&jNؼ9@CD_jW8JaoEŸY/[#!tI(ҧ͊8Y.Cx E8'?zЇ^|G"d^##zR>Yȑ=JʼnXǎew|2Ѓ>8w#4T|jWNʈ’gbJur X*fD4K9>zЇ^SՀsG d\#c SAʝ/#eqVY(ח)ǝ#8 & b^/GX5qV,/^*(ܜ@ 82B2fiF4S?Їޢ-q8@CCd,,ɈIE2iv,*_J80 4DߡexGA" 8zg-ΑFʸѦipE / 2k˕.Hy]!W#&k33aC#YPL#P-ڴX~IE eq/Ĉŷ zg-g-r+8@m"N=[۷-5O[IdОL_vHkiג'ܘv:#P lF~6*jaqF&]DV9 5yp`q~ȼp.=Nڣ[[NU5v sdȏ "o*ҫHf GpG"뜄|gD +h%i-|v^%YCO#,<]!iN DGpG r")\p`Gٯ_Id ܏%cH"wHrKZ#8#8q~a,+E_@-gqyiwk_mh*r>ҺyYAM+-ZmJ?GpGp$^gA|5NFZ6[AɔdWvsSųx8 ٳg l8_@xTq㗪o+xYU姟~RfѢEzL8Q&O,{/*^[r]Y4.-YM5\ ׬_A2sO%kCYf)i# G87s~+N8U6pC裏uY'_W'nA>ceӬY3Op7N|I)((;xM7T2K^{5@뮻N:ׅkE?pk3:#8 N Ka.Fe⥲mhn:R)Yu TVɚa%cټy3ϔZKMVCY.f0`,YD{{pHT];o!}?^-NF8[hy4o+۷/\;JOw޳gO9餓d-Vx*yǥ]vryS#8@!¢ n7#FP#z,:AXygjfma_c ~y6gu)6(O~"%!L,J|琬h^-,g>+ޮ^[:w|KBi?rTZxG\~~Ee~ \r.G,T9c %7n@°/of4Ms,,eR'Ӈ:8$_~뮻M7ݔEuع2,^̠cw-a2|*5Lޗ]v}K"zkRgT v{|*3e)Z"~ou2eroS&y2>&sޫ? ȑ#bv*>a7P Ee[Et[f)儭"TA,-cbã˝'Yb4ob-w}I )@ֈ5O#Oh;,,x 3`aAꈣ|7/6`CYAC\njˍ5woM6!xmV¯N~_ *jmx8] ԑS:\n$ !iL=_wu5~MBu_~E:,CjQDRصkd~#8@}"`˟V&5#hCԢ6dgsr;C񱓔d-VVV,?tHwL[9F,B \ee!``]kb,x!˅<PKTrE=!JޝvI /;`:V?GpG yTD y2mV،@Bޔd d 9 ˡeT5Ho%h԰`d&vP^r2¹stا&;ӏOf@x+Y>DN>qV:-_|¼8oTݹ瞫1>iA=fyBE5j*+7^_ &c>,6_Gkq$˅HCYq˵rRm Jb[(Y銗aGpG><uQ--kee-/,YTܳf\-`,oe [4jQAXZ:Ovm-{WE.O?~[<c~9˜ NZsFFuʩ2\#8#2atD 6狦JaRt)N3F`|P_ 갺i!–͓}WsZꪤUϖxo&ֶ±WDzgn7VQ,V6Sq9gT$nF*.mdgL]:GpL`{9bfI6EY\~eLD 9g@RF/d -{ƉroQן*̆|,GPVHh.ı=r|b̙,-fKo^&q܋XVw8#d !q` QxUdJb-޽{3VL|D f )Ef^ 8s9e|r>6,H/X_6lXuTx±5S6HycQbmH IDAT>xKqXFyya9뮻t?/p@ ?ט륗^^0S1Y4_@:;GpG [.ʓx},~y\.pN IJ>C&{T]<5Lw.VA&U%YG)eΈY,x&5\2JěhΝ;WM1X6qe˓tTmX/meTÒ$&_-~lv+mk-RGepG+M̙q[8# ~ k( lp>~H[ܐ+n'GmD^#4j|^Z5݆84JAii >\b ܖ9ss(~a+(.?&Wd v`] ,l/(Α{BN>oXNk7pV!#Nϟ/:]0m4yg.g}o>#ҥK))a. G_Q3e瞓s=ג+G(O?-}*I +' J?uYIt#7E Ykwk~ P3:JmvkPDk+.YNOĕ9YsZA`e%*|a.F]Z]=Sc=VftƌtMWZ~@8yZʒ%K2o.8U#СC}XA~vL56llf5șyKySR|]>/g q5.F>L03oҤ煗 $W˜o!{Wh]Y),tR |exz<) Ҵ1XAKe1宷ʝG,iA.!um^a\T,Ț;GR޽eرZ駟.ᄏcO5k-ZPΝ'_r`{]. y2Xt.+&1Pr?P9턽{RvG ˉ'ASO=Eso-^XQfy睷ok~+H.ko#K OY,c3C d cfڢ2Q򴬵9@L⌋wNDwy:# 11bT%Ȱ5:NKJH+yFo;N~G%aW_}O137o޼ҵkW:c5F3we2alsS}I .?@ *裏k,l *WBޞ?!壏>^xQڵmmEo3xF@̙3u4-Osq6M2Y on%z>ҦMy<#?]yYg;ywk3JV,~<^ZCGjͲFG_*?0o-2֫W/ij+Mwn\Ϟ=mlU9ްqsyE87p&{&Ν;erGʧ~K /'2e]&['3HNɑ+[w{Jʆ鄧L u93 +"4i$_Sгg/%[־-,`Wqqi%M;sJԗ+'KQ'C(nU;5B{l@. j #Y-[od08c־7yM qS@`tPsћwnJ]FԬ\ Qd>0i}F:) od뭷N!/:L86Ǡ4(̀Mz 7˵<C@7yў-ܲYi^H(>+#\ݷ$o͝;W"*д49smޱ0ۃ%yyأ idO#󪫮6sBD<6|_*a=9OFM-ݚ˭'U%FŅ[,ze N:9's›*Eݞ,_~„ -3 ٓ IvNx=L>NU*ti'aE3,k2oND_NJ>[PT"̗٣GMoa# x\]֭rHD1q#me$^.r>nJUVLKR.sx0u~8k|`Kp/3ǂ}3GW'̜b[U~Vpտ*}5IyGf_Jur:*!5RwJSyjGT9d*N_Ҹtl6DDl|,zX,l^``t[z\>f/h>M'fxy.geӱmaG k+ Ƶ|%BHx0 4/h"I?>Y_E#Pg@.pDxvW~| .YљKc[o伐n܏#3ռW?ρ7ayI%ƨ<ӕJ?R?}Y~|jR>+_8*Y qsC?}gfmunOior5g<uPRqC kfصXբjNEZO zK0 G QG2RkF:k7,%\m7]84JFco/.}7ae>E;7ZosҜ`-))h^<'|~Tf$?"Kc~U=GhD0ݴr m^jiK-C!#1} uD?[, DŽ>C߉? cG2jUyQ5.48 6_`U#xQ6~1m'jukuVw|^j=FK|6-6ޮ-[+NVA8 R&(2u94jf.2wGp2ELr9ch#8#8@#d!GpG'kc咎#8#;Nr/pGp g^K:#8#Ј83juF1=أ*GpGh(L8Q'&'>?g8p|ϵ4~ZeZӕ9#8#Pd}gۊ*wy^W6wy+ӶtyW 6x,WD+a~mt_:]#:;YϮS=rQGɒ%KV(n*}]4Jϫۆ-o h hV⋵O.^xvgBSN9E&O\Җ@esΕ=zȘ1cV?_]!tVG`Gڭ*J#a뭷ROm~Ɉ#RҢꪫd6Fvu۰2-Wx%ƀY%kIQ$NR3wg}#6m$q,-)'#zIǎK.Zk% >\=P%ʃ?4_M NKwp7Jx|뭷cMW_N;$;w6Liw!={'|RvuWy駟4ӵ^+Xj=^z饤N;WTT$[l[l!> w}fa%`w_ Ih׮lRx }<34OԷ@miyV.LI6l#VWU /X2;0#a;jJrK{eњ6d%1LC9D/No߾/XY5\SUq>`ׯ<Ҽy3͙g)+:hyUYj 5^q+.u.eUJyz] ۷O=n;#\~ɴO?] $ϗSO=Uvad't.'Gh,\0=,Xvb̙o9?%Nk|",Vz'Q R_WRhƌ`O=>ä^;G| lݻ'veD4%f6lXO%9cvm5DnaXhQ"رcV 5)kĉ@za L1$Y;YU1㺮 !7pCoYu O?VYkXsVׁ<%+LKqeiZ uچ@<'xb"Jӧ'g$rϜwyO?C2OeiIZ:kұ z|Ztס1{|9/'ڶm}1ȝ#4,&L'^w ۙt gVqUśH_[eEy鎪,V%d|MR+VN8AxCuYgF-aȅUYsRUi,9i>5mIycH}'}UƌJ_xꩧr /}\kٯrF.N;MUne:)?ܤj=~%L jg~.\ԯ,-*W[uoeׁTu!{8@}W15QyG Kds^ZМo) K9:yMiMM6$r7x "O)XɔXپt1YG+/,4ukK`P?lN'DX 3,H]ei ʌ궡}V%\K=ƀ _v, !z7\8uf[xSO%hִt:l"$}S_}",'0m9t"&Wx Xm'*sLmy]kSTuXn"lH l"l򁠺]pl Qch.L.{rZ&}5[OZ zTο˴?7w]x~Gg͚/a.t~:ӕEXn95F\tu ^{{BtCmXlؓ\2ץg\񸎺_9(M^ZUM|QkMU9#P@ٯƧc9@6Z ZK5- l| ͝#PNJ[d܆V&x#T@%k|nÝ# yݫle:#8!PoXT8#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpGNֲ8#8@F8Y&rGpG ;8Y^#8#8!d-#\pGp d-;{#8#d`r!GpGp:#8#N2ɅGpo<`=13 ^P49[,'>9[,W}kķb]?~6^9[,ǯ#g~+lƯg~EbײvTrYo] '~ GY]?~t,hKgE?JRb ڋ}}m9ߜM,rrX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1bmdTX>})⃠W^eFtD'^~۠oAw#~_/55z_!M5Z6ڼ/mN)Rv_vY}[~:#(eVd2)^zoU@ (UV(EFvX H{n6khh(*ץ̛7Ou1cƟj+W yfd " "*]ۥ Ȼ{s[Æ v8f[{fNj>im#zݞdۚ5k]/[]]566[om:FD& I_~y;z}DzZkرc#6;* /=cwvmu@rX ko_~ꫯ:.}ut]qWq]tv饗?oW_}M2?|[E%\D{mfcvm禕n <`7t39`JG4FZݬ|[D@D@Vz+}d ` R7ߴٳg"^{;ֿ;ͣHnL)[;S鬳β_N9o q6sL{뭷K0S[rHzJD>#~m7OѼM6$o۸q#8}$&L`#u cEM4)o뮳>,m4_zgalDdkȑ_+ÂH#~Kl޿O>nvOko͙3năV[m<=v]we'|}94D9h+" " ̝;ۦ5F۽kw}=ڈ"rnfvm+L͸Ip 6|@7}_4O?]'Q/O Ƿ[6Gш#O?'N4bf̘1 묳Nn/X ;$NP>vwSO=D/p@bJsj|El›1/XSDH7_|Ѯ妹|H1 ᏯիWsM:ûkC^ɒY UʑvQGmG}}}Phlj$Gh׶ziD)=)T$~TQc~6_Ob|7µ@"?f"nabQ?cCn]v!C8Wo:8AqnkZeQ"F_Ca0wĔ"DLo}7|\-Z]iL^vem̈#Ru;cbz9^tQoL~#.x9,|Q&Qc. cDA9n9>cRT:{lj\'p=il?c-1nP?j-_" " ]BJB-w+eYtO[i#Jr衇HLre=5#ID^{%ӭL"P&ODq\D(+N=քb[^”ckrn~|ڽ6ȶbƹcwmICcn9\&մTiLDT@#('/nn-A6sZT,xғ]_F' bō|vJ6s$xH^Fú5@ƋQb:)RD#q\JtW ›iM޳ezJ" " " " - ]lco]G5:먈! 4֨H+QsR%Q!ԢmƦGM5b{yr AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx diff --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{148, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/000077500000000000000000000000001362112712700250425ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/Contents/000077500000000000000000000000001362112712700266375ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/Contents/Info.plist000066400000000000000000000011721362112712700306100ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Export... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700305405ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001107271362112712700332010ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATxEkw`朳wO===g`<9ݙs9"" ev1 ]6>33y9SNM;GpGp@nʕrGpGPyGpGpG#d78#85#8#4`5qGpGp}pGp8#8#8Nּ8#8#ЀpրUsGpGC8@"R_~KӦMp\NN~8x<˫soNj.-e]3KMW zQ ?Mcp ՛z bxAԆ*͛7}G5k$-///kUm}񇎚+ݺ@D. DJ¿⒄̘H{lmp=;dZfGKtzƯƅmm1ƅpfVq03XlcƌQ~헴1aMe:_/ǢA;Ӗ3 EKE#+KYGA`k\/qK_svZȳYaB:1/7WrG;裏&aǷr,$h,&$˗ARk.Y[qq@ֶj+)))уɽX'B0߸p }i׹K2oi() mZF\agWdҫ%u-X؂_#}!=wJiҤL#oSg+ps)Ea\!˓%Ko+Gs̜9;ċ>%ҡC\f1~=uclsNjE,X K.]ր4QUf̘!/uYɢ6eN>]^|Ŕe_TT.]VD7m4+w'.O`c%dia0u@aӺߏ /pZU`3hߗAўt^;=\9t0`@2:?x`,j+郿馛ɓu25]9sZF=I}M^4=mԗ6ć' RYWA [@JV|_/KC8iIHwdqڵŋ'N/Z>|4g,Essr嗙92fj%t2믆I-0h"[?}km~Ƀ>(}lZ_oJ\_au_=>:qZ[=:@~W2z,J_Aiy:{,2G,ζm&633qD9ud"7Oaa.kd,~EE:YQx.'_T|rĞ"LFnp(YsɚseruV3OK4 m~|AYڛ-GSDz&<f[V$X~'Zhqvnr'ʰaÒ %wY- d}$UWL|`fmd]w?\{5%LNꩧYc0߯Vx9z{I'?,9#}F'xBY8{֕|IQӥ1,?+as=BA|}饗ٳe}^zIaefqwY1 { g˖5-nRZo 8P s>n8qM7ݔ܇oS7|s2A~zҿy|,~ Ex"ߗaEF zk- yQ}x -oC=meo(rӟ$}^M./͛Ă?YKǀ#ϐ+w{uVȒfqH? H&/ u O:GOq1{キb=Ȳ0?Z,Y/RDv<)XTJN=Y3 ev=:Tu/Ў7SޏL>i\{_jC ) {K[nb"Y.;kG-~iH9_[S0uQZ}7xƣgÖqF˼뮻d`daWھ꪿o-G-k˱Ag&wrA g6&L7;Cty;i$%[Ld[{G~g]R(4-[0tYZ}#: +Tuk@ m￿~B *pBy4NafBME>)ƀ p] `< X _|K$kD6~aeC_VxE)qHnA8Mp&.S,{%wAZj:XV e~kTN8Dp!{gHW}l˖ŋ(d=X izm SO ^A~"]\eV,ݶn {?` /<,5? `19n n@ dUF_|^={C?x/XP(τ{n`S:u|&O]g߽+?|jB_2r]-^DiPxLYD ֢&Ru-[ I:zXָ(F: 4W&! ?# [Ԓ#'|Ryđ,nQcQxX^XMa BBo&m[ˌeenȢ-\ܙWvm/~5,~8IZr?AUR? "b'&c'{UW+cĉ^_zYF)W_}uxK1;wZ CCv D1r4-˲n[Tt _|./ԇ*|!A;n뮻Vd 2ji׮*U>nEGW n\pljG k:X2B,%Xp󟕨qu+PCɇ@ $'dbY92# ^20,.aDv.*@xًҳgOYk;Hz`9ԢOU4%2::2{ qΐ8deDM*(3}.x5XFa`/WYzM鰩ċe#}W~֦сR;L\{}4Skh8qvU/ ( QP(arہ/5L$iޠ6fA첋>401sğr)j^zʜ9sB-z˞A - tF6YNxA뇦 d.$"$'O7HGqϐ*,G3w5HǎGJH ?O@ĊYVH%ҝLv3}#+ ^(ӥLN:'Q&-K kv, _<ެˆ{-$[nk,kϜ&?'|[yCF4g}.cǎEBqOA{\)#Fht8#5͑GZii UфYON,Vdj 7L2^&xKIK<B1`r`JfX,?X~lٲe &l:#=e1XY^thla0ȈׅriiD/cR 93k(!o9a;34 r٨zieGIWGꊳOX:Y&e9G&2vcOƮm!vDMŀM`kj,",l8,aX[)H]înӨ,&`dEc5iӦCe,%iÍ78YvTu!K[k@Wh,|3-HjUKwC_VF Ұ +(o.YrjFIL!gF|#qPC^,np-Z]6f}ϑO倃O ˟%sfI`-˾9h&aX' zԋh?"0G#N:V x( 9#g< qE9g,>™|qoֆԣV@`B_d71 wuQ ,K b9k=eL|0`YcaX4Ν8 |ˁ.t#c օrtk!S4/呷@AS hs&MLdc%[wTב:$@f9t ed BȟNo,<ճdC>ؘOJsMf5m^Ρoԅ%cr&F\nvZԏ{,U"kʔ)jM(d-LGgz\ے;Зe9ؐtgi 8[b& yXU9 eȳWueް0;ǯki4/&:AmmA2oX퇡2s܏å]o׼iHTZ#W=kg?[G8;Ǚ K#u°.` ;ew3-Z4䴉|^6xO\d-XBCLO\[[5>"%ϭcJ~9aͥpYc7t⡎kAȸpO'O>&ܺꪼ [ Iܬª AA8 LXXd_  vo6dt&~'bL\lF?Z VYrwʬK.Da#pEua`s;dylC8A"[n:_wu+au h{q}طc4ԑ=ql ,Fa!HOA,\opk:,CrHg+1y0s q3ׄ3A^D'{#ye?i;} t! &N89+$ya29g}ܑH&+ Yu ȄGǑQdXX? //>Lu +9$Uo V4Ñ+m[uϻIjƒܺa3I(\K&Ҷ La8ravvoז(&x$ ,i?#., R}Oeނ2g$YdK*gmވ]4`Vү(Yͬ]Ic_3|1>F:XM>29KYXf!>8ʞa&BKD|^r`A#r>[Gfj۠U@=|"7ybٓ# 7s*grqp&V0!82 iF4seún7Sù3Z&۵%ˋLX(88دIpd?, >ePG+C,],=a,2o6k=zXfP'lH=pbʴ0.[$xE-'A:^\Oh)NV>:[zӃ~by-qUpt!`9^~umЖ'~ $u / fu5_-riB;C ca1AZ,̗#^+wkahLÇ0'~,ʠ>3g͖E-Hd>L ͑&3.R~tfu6Q6zZC_ӇssX}Cxg޴8Қ~aoXXN> yE6>({2kԇ?,j^#Jl5֦G<0ydf62a7*sXzR9Kcq29Ȉ3?ZN\ nL.V.Ee[X:Z=<&G"Hc`GeZVaMmV.>$GldNr- +(<r0g ל|°ܚ,01f>Y,LO|P_&sC/&èNY2pkdZx4"ՇQECWM峲j }ЯcҶ]5Ph/en`H/!6+4 '-|wx=)7f*ikղ `txݰ_ ujL4L^}_׾[ז$= +ZΣ:[Շt1C,'Y8pNzr`oOY?Ʒt\[91~mmXݰw9Ga~v#4z&.zD gФ0crͷxtvY9V2o.Za&- ʷxhoeoѰL+#6G##F[^K*0r,KO10Q3im2,og(M_|KC[Q=8A\T&{W-f xLnԏ7&u횺Fuuhq2E:(S9n@>,vMzWщ&:1X!Kc>lb!oש%6IŷsM¢>,4pg-k;L]0tEou!.R-[ ͂:!XNÆdׅ,"Mb惛M$vnXok[0kqX찴6sM?u4d/7ycxZ>acLK,Fu5u%$ڒ%1,l)-g,QǴ}yڪg!_,Aǵ2ʦ /cL瓏psM\n}|4 ~Z3_+*s͑xʉ=u,˓-~cق{N#033s03!ɍ I?:)TTM$I4[|;ěs-LX^x294vQWLLCAiS#i>u`$o!F֐_S.h3I$ IDAT! g>&>9"]:UYK[YG疟r8_O Ƿ7.]=sxct=kq@5ɀ ev?iKtҭZFɌMFV*ӋxfNMd도we1)IUOK*&dek}[ohqVSHG =2Ťh0{2wfTͯɑ9hgkK;]myIYppGʶ:XLWǯSz57jJhm ݐ2hCj pGp+/GpGpGpG ^#8#8C_0nM|aرtM6tS}M?7V9#8@ %o?A 70\]5a[l,6Hwݦ('Yj'7nWԶdHm]YMx<#8#D-kI(~·ziI%ɓ{F&3b>GTP;_'.EÇ%fq!om:Ӆ2 k 'TOgR&UQDV:W2pGp߳V6gB s$EeaIҒvP<}W?xd˜ue7om|$ʰt[\J8[tYd{#8ꍀ[VYIJ9 ~xO 8!l\'XZn # .[}[o yJ 6L?ٿ` DdG}s8~O?yi]wU*˓ ǏןPi?zJA:t.c5~MkHo)S_|$LJvJ/ Kݻwo6޿|Jt颚Z\.Sj<@gTmFFl*kȐ!ҧOMaޝ#8#PU5&`_g$BI5Ғ&p`$mڴiJ6 Pq}ٳ嫯_.ZH9%2,sر%,?=z$2~#TDZ~9Uy=бyOc8AEʁXϲ[*?39蠃Inݔ`}J2{B Y|ׄM'|" R F,8H:@r]w]Y{r=zhׯD~D$ 9# N֪ NJĐGZg8ܤIdܹJ:uXH_?c %?'3g3Xf͚%A6y8q.O͐'UyX(ԛo);cD끜hhL cc z7d~@ 7}t!,gtzC(Hz " K{Cx #PYdom xbC.uR,79XkGo!4ġT87=k@^xM_ +4E s@ lԟȅ;z@zCF!OS "}iCڅeXt'/-޼ TLƆh5spG(nHEҙ2bs:wE+d]vQa7 #ts6J>cP Lj:ed8,K)B% 8zAL!IL&:>G:KrMGӣB.Q0ÈnS& cꍎSTo+L㛼-[PupG g*h2cڃuI:cgZslR'=Fuo*GzȊx^!ŷi:#g: қOaD+&n[Y&-?a#¢- gq3ybb'ih۹']Ica6l'̝#8#Pd{5c2{"[@'MsȀ9Σq^.۹ 4 +ʎX&4y2y,ɏ#,*ҚoywGp0lj]GEڄM39q`<\ہ⢇Əx.UZ >oaL%V#ʊq]Y^cyMwӛV2F˷T4}*8#N *L8ҢovVADV&5\r^)GpGXzRuGpGHx#8#8zoWpGp8YK8#8#P8Y&pGpGHx#8#8@ޕpGH1`h4IM|ξ7awpӕᎀ#79?cGk[1/p(**aÆo? JuH[t|dԨQү_?^bU?q8?+ل>hJDLjʻ#!شV[ѣe޼yX a3C jT\U~-5vFq8ZNxL,[Lj;Gp聅mܸqx>ɋ˄hQ[tJкw`X:8#$aD1c$XaUAarG1ƨɓ'ˤIdΝ;6f͚%󎬿zS+!yu8@C@$'Bs&N`j65e]GX}`,q0>8UTT"3g͖c~]vE6xc)a *=6-]:,jeO]rX};@CA˚>PN6M EYpVOl,‡q :26g4+2vӧ_< 9{G%ѤJNͥC `ac*gwG.GJ̙Wx#C [5)/~^(mJҡU4BҡC&NjsΕ^zeaGhP[rVceKJdoa3`FҺE, 3"FG9C.)gsG d48+#Ř`#Yq"FA[h>;O,<]!iN DGpG r"(\p`Gٯ_ʲId ܏%cH"wHrKZzGpGp, BBfLwf}sve\"+מEd.((ٿҢE fU9#8#ЀG> !7Vyt-%Y36kA|>@sY ޤM'<FF4lٲeRXX(͛%aqG˴sс[TӘǚTa ϟ+'00M4IM&s̑ŋK6mSN{믿lr%>gA|5NFZ6[)ݓ)ɚE~5 =z$eƳu4_fϞ-XI&*΋e5֐O?=IRΤ|\/>~LɄ AdꫯV[m%zhT\2M4E8dr 'Z.wE6 fRM#N*?v^zY Ҧ K>UTa 86kR sT}#U_IOc?ӧO~Iɚ[E1qDQ9n8y'%??_;j{i=(nd*_ko_s1օ6_"~r-ՖGpsw}|[D4p~xl>THf.,#Gêb:)Y8d=7ouYZk)iժZx3~eB֬ %K/w}mYy7o߾r'w:nyzEϣQobѾ}{u;C$8]ht={O>Yr*Չ\ڵk'ӟ҉pGpG|aQcˈ#V*IGzJ,k>ƛZ &\Y3?gQ9Yk:-!Ca2 3/ qje;#u] Q6kƤ7=RoeX3OvڜO\ԥ\$!GI} d￯?~Ɋor+"Z{sɷD!t0/ыOua-]T"o?y衇4 \r.F,T9c %7n@°/of8-=Ƀ>XXD':8$_~뮻7ߜEeع2, ^̠cw-(6><y>} LF(2Hɽޛd231qf|?; K8`C<{ XX1a:(k!TR!KcƌF;ڷ&ˁDR}ݧN[AZ,"~mp.bat.;׭[7:B52ykV]w] _`ClK !_~>[ ĐZqQv5trpGKlĢf|ZFZhy8E~dx$%Y+#j"ˏ1ҡC=t-$k5 3]s7IWQYA~@x]wu|V,g-x!r?,҄e.\Q>(?ZX~zR)ya!& /dӷ?BLwE݆n(䢋.Rrr~;3em-#V&{̰|--DRDB%N;0SO+GO#8#PyTDϿ۬YЅ)BsCKE{kz뭧K(a " DMTL22¹ősdا&;Of@x+i,:f2EL/k^xM7S뀴 e`a⚎5j*+7WKc>,6p Gն B!L޸mTe[A%b-AJ Ɋ׎#8@]"y>5[[JJ[1_Y\;Og"˹ZHK,lqP&nD&zK8nos=Ԙ.mmO7Ш[oq1aq kc iI+{(m]ᬜ(e:#8fLFA0a4|8[8LJ. S\ #g0H>ZU/FenFZkIwξ;NYW_}uҪg{Dci7kpñ왩x5)+Hgux:gT$nF Wm8ۈɲ','(e:#8 .sŶ ̒%lě泰Lˠ 䰟 bJM?|A@ kXl3NHaF%pqِ*pՊQ06гGY̜9S~LQGaIR"Ē:LY:^`6l Ǜ|Bk /z9,qYUΥ߀7/hYn,sGp !q`aY8yVeQXw )тaì$#e‘˹Uqs=WOR@Ndž "wÆ i!'plaFԱ |@e*AA~ IDAT^z%}Q0,/9*!#U3ATiȑl2YfIXd>3 E4G8^?47JQ(s[5ctZ/pǼ瑬4e-m37..Iȼmꗍr÷_>(Ղu-+-MZ?(GC 9圾a95/'#>/5!#5Nϟ/K.uYGiӦɳ>+~wE<79s}(**.]Hq1wi8BV&oʉ ^O>]{99,$駟>}V[m$'J>}يIx#gk, 5;sC['_*?~3TLގw] JCڊJD;!qN<GFXy |/3,Xc& qeN;M>`9emQLg̘!ᛑswȢE2K""dX&Dj8sʟg6ut!=zuY+xf_|QFYEw)tO_/Np~~+s2q/ miqڵ%Kd<#T@avA3U#Űad6F̳0VUu^#6NOq1uټ\oHY>s5j|gڇ i4x&M;W\ԏAP;,|s2=7_- mV>d}(KKSl/ ֱBBK/cg]o;ˏ=:+XJB,ֵy2sQL^^ kGvJ{cjgq:=BY qu."} $ j:#R~{yt %Os)Grjq_~ 2k:p 2daܸqˉ'HJ]&9a{ z*93'Cxw$-s!/r)%c9F Ҥ'E?O+e̹ı@z!ygt%myu…NXPt2uT͟nd^9ocCF V9:]I :ؼV_W{mvrgn&^z\x z/_~`3q/"mn"0]T뮻.t|HAA~ m\m$j) ^0qZJ "2l`yrɵ^+s̚5K-Z(sΓB}ne̽._~<n,:sMc?!rqi'ݻ<*lL\~K׵זriʞ{Vŋ|X ,~ҿ_o՗[ȒS̢B#Y*X?,k\omQ~(yZmG&q{W's?(' O~~\kDOZш#v;~Xs*7>2yǝ:;.:tELpwjaLa)bĢ0܄,$Xv ue2/u] )023wsɃa6W~tc_vUo-tp T6p0}P<:m!6\rv7 6wy뮻VZټIȷG?fޟ-/I>կr!ܜl'=kS:#,xꅏS2o:yM"Ʀ[0 hܤ7x\S9>,dYݮ[6ˑ6p E#geЗˮCxmIO@JJۣaXDZ53wD/l&IX|s%8'Xy|aӬ5+ |g:{Xe/֕m'a,XL'9͛V"JĞJ_S0}R_m\7yo,s=JZYOoatL=ɈSqX5NzJF8 8:TE;,qvM'w}@ǏW9y*k Nԏ';)` Y<@6qV?곺]jec=O,3]Z \oi,h@T^.(oJf }Ϛ6,`ZÒ$c+2SOk@yeܜ8q.eBy&MR٤]#,5bLgX9tfEWl^bU5+JE8Dl`ƛ8 ҳHX*ٟGYߩS'Ŗ_~Y/sȲ9y8qqp23:mkSf{IylI"%f >\ ێ95y,H(əV8=6w\t g#? 9Ssଁ9gY"s&OnlTŔ 9GRuT`ey #?~P"G}2#j6~v'YȷERKeb'Q8m[uϻIjG=}U _[^^)l"m,z:C[nE H&b7S9cLd!1Vձj! *= 2I^>`2\rƒa={x*sKA]Y<c_/mF̢o3_ sFy፲ ia{tCr8gkwl~AfcKżWѼIYц4yWkikQf]8 er`xXeOΓQSKorkUmCp:>` EC"qȤL'q<T(N쏳|2 &&T̶8+ϬzgOb.X's:YK; +aYtst%2VQb?e=Jn>qC ;GV&tZn0C"XVaM,GcWre:gUe^"-2*xx`Ùy,Ҿ̐.=, 9*.*yWK^C[ӿ2yՉy䂇g_Iur:*!5Rw5JSyjGT9d*N_hP:6y"B'3=[cE+][ ,L|_t ]4T:Ekvu<.ceӱmaG k+rF[ Аe$-3Lyø&Hp~mڈpj \5oo '*sct?y뭷^r^H7GL5os`MX^`1}K%|D+rOK%kT!8nvnh̵ئcux|uVZ*W]y&GXW%g;f]ˁU-zdH[`׹x wp}.j鼔j\Wlް˒/s5!d7Fy qJFco/.}7ae>E;g-[9NAȔW/z>߁ `PX"3L%SFaLt*#d|7\CZFwhHV5fkQ./:0UqUC]*uKwUN; bUd_2]#=uN~79sjEEEʩ}Y9cdɒ%+WQ\4n*}]4HϫZU-o%Rdf)A5@&}jqܹsG2f̘z)ȯRxEɬ(9@Aڭ**#e뭷TNM~Ɉ#R]}ղFEt]uXV(lyT WE6"[o=رtEZkd.zL)o~~_uP.MW_veJfIX1 ; #_jҪU+r-eѣGkܐ!Cd}&hbuMOD+V{?LʵxyI(ѽ{.r"L>uq0҅UY; OŵiF4ÚR:T<1u Wq>ߘ1] O=Z^x9:_|TS-ga2#~Zw\e}"XMV^ƒHeũŔ591&Oj#<5JEqȨ鶝3gx4i\QZ=fi⇕С\z2}ݗޢE }hd$p6A1 h ].JnZ6 ,N5}-DXYx׈R)#G&ҕW+]kS&2đOT&2TIDATei%SdrmݦY jթCu o&^y+:6'ϳ3*,%ƒ̖%~M, I%SnE2Y Nuh_k5UۢwEG|*]#:- a?o"X! \1pVa2Y /$[J&D¦1Ʉ M6$ѫWM7ݤk&>S OJlZt O̺iNDT$l",1|8SU6k9%LUCu/>,*K.$l_ـ _z, !vod޸ӽa.5yE}7̰</h?d 7ܐ˔`L[EZd-j( *_'ɨҷ[s寒G_~ sP7|SM/Lx$sgi>oU .Q n޼Jŭ8P:THl*O)<:k֬>@iӧh|M껫*3]YSXerC&SLU7M]m&N֭|^{^Q2sZD#l!ؓ\2eg\鄎9(MNZeʦ5x>Dˆ`*lEhY4د'g9@ Pd*l{4Bs%l?>/M@">j jFUѳ;Kž2pq_UEh~(.pzA>Q/BGpGh8Yk ;#8@v#d-k8#8'k]}GpGnewzGpG#d78#8ٍn_#8#4r5tGpG psGpFFހ#8#d7Nֲ}v#8#pwGpFZvpGp9Ny#8#8Y9#8@#GZ#o@WpGp'kݾ^;GpGh8Yk ;#8@v#d-k8#8'k]}GpGnewzGpG#d78#8ٍn_#8#4r5tGpG psGpFFހ#8#d7Nֲ}v#8#pwGpFZvpGp9Ny#8#8Y9#8@#GZ#o@WpGp'kݾ^;GpGh8Yk ;#8@v#d-k8#8'k]}GpGnewzGpG#d78#8ٍn_#8#4r5tGpG psGpFFހ#8#d7Nֲ}v#8#pwGpFZvpGp9Ny#8#8Y9#8@#GZ#o@WpGp'kݾ^;GpGh8Yk ;#8@v#d-k8#8'k]}GpGnewzGpG#d78#8ٍn_#8#4rԤ|AMsY#8#Y~W{0GpGpj_iD]#UU?f`(XPhdYIJ&ŘHlQ=Xb{X^0jUcǂF( 0y|Ǜ= Oss"*TS" " " "Pmk&D@D@D@D$֪SM@ HU*X"L5%" " " & VmjOD@D@D@H@b0ՔT@E/ŝ4i]|[퉀@%0~Ʊ*;Zm6cK.5`fwǷ{M7߯HZ޽J.,o3h ~Wpyg`D/MpGߟ*I۷oj/^-m|s6_7ȱblN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gubݲ"VSSk={LSA('|_/^~)<<yOGA߂F8#_jj7>Ch1U$hh̷:JUy(foȣT^][QR>?Oz(|G-׏_略zuG)22@@b${v-X}}}QIΞ=x]ʬYT1)Sv:r~!1;wS|*,ATay]vijkڡdffĉ^{6G&ִik_~ٺvj [1c+RNBҗ_~ivZlvŮI'dqӱ*6j(;ì_~M=wޱ>}GaEBp#fJ7ߜgO~v'{nS[oeG}tꇩ/Dԇ~:ՋmT'G6lcoq歿i,~Fɓ''!7fCpPG4yg+oܸq~k\s}g;l!.O5\N=Tȭ5fgC%"[Æ ^yD9[bC4}'v뭷ڧ~:,[olƌvM7%DE7l]|8N;/H6)!|" " ̙3W^K4"ƈ{{쮻#FQ#7_D΍7h[m]~i7뮻Ά |h1븘f駟kg$#EzW_*7< Ƿ馛6Eш#SO=cǎ5bfȑ Znϙ3'>$NPvwؓO>D/obJsj|El›1K/4V1kyT ?C=d0fS\D+$ 5XK/{[M?" " !Z-iZnK/""O0+1H4Ѫj{챇u͈RzZyS4H/ol$믿&8okDLQ3DYgĈ)Ç'ć܎;hlv)okGD@DC`ƽ{Ir#ֈr1B2ӘDEx)SN9$!bzoih޼/#vvE1ux%4g2CMՙ]XxzE ӿ1F"<尌GѦG~k/޺D##LQAuQIq {3ϤqFx<ǸCqےoqXj>`j[([ke&18$tPZT 7]#]a;,!B5~iMS.ӪyBxeLǹ0MlL'.Xc:D^KQ8ʔ(eITxEcM*!L9K5fs￟|&$7S[nebdLws5옮mJc*%ܧzڊt<B }i|Z8Yf0ӣ֦\Zmk&+5}d(kxפIBDdq#~v--^kA8ңWѰn5Pbmkcj$>|+Bu=$H&%Cr9=5}P#^/m1{_8N>U5&8 6qc'sz6iJ )"3—cX\cf"8NŗuN@[[ڎq(t,B @DžוӬq5^uC/ ybj1Gn¤6zEHk͕ bt 6OwA8ؼ.Be.\<1.[,ddrR3mv؏Zswqp.g~,u@\7>mlm͗P8*j_X(M)bDb͝j=ͶY>nb3m ʼn›)UVZFY ^+\D &M(1{9jhV5+9Iʍg]m5rMnQeڔӼJ6t&Dk" " f̳Wkb6oxxYP#k{BgmؠK qk;W۹ηF+" "PA+~Q<:3Z6ֶG.ܰX') =AzA _cG/[aQxlLy<f( |4{9٢g1c?\p)+p@Ek_ko}]h=Lmx}D ]Y-U^D@D@D@@!M!smܘnIkb '"k<9D\=</R| {wItvv/Kla&[x{*jiYÈXPkƇO;_$ڨ$" " " "М@6jix6.Bͣj֭|V (<Q6> 0[wz]]lJ}MUrl~@ @8Wg=p 4zuIFEZ*)p m64>j:Q~˓@''2֢~EPC@*h UV8+5}3ִŨ>mPPK\;!P+kA`0I#վ@g'fr ڦ g)ǒbB*Fҙ4_ˆjPSLA N[J-5o7L.ⶥT&" " " 9jk8yCQ-ټL[\3|߷voi[X;*grmE@D@D@D(qY"[cʋL-TD@D@D@DHxu+" " " X|D@D@D@DHxu+" " " X|D@D@D@DHxu+" " " X|D@D@D@DHxu+" " " ?2V?|T~IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Export....workflow/Contents/document.wflow000066400000000000000000000160671362112712700315470ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx export --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{10, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/000077500000000000000000000000001362112712700245725ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/Contents/000077500000000000000000000000001362112712700263675ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/Contents/Info.plist000066400000000000000000000011671362112712700303440ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Ignore NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700302705ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106631362112712700327300ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATx|TOzGETP 7lX?{﾿ޞް`Âw d7$Kg;oYSNC0 C0 @v,0 C0 C#`d:!`!`5#k5qh!`!`Y>`!`@ FZ n+!`!`F֬!`!P0VNJf!`5!`!``Ʊ!`!P 0 C III_?nݺ?&++^=xI7UUs߶ҠAwT?x:jxV,Ue\PQ:tԯ__k/W'i999j/Qs}H7g}6N#>^֟a&եWSd2hMj +KAH k[lɽOa 7{6].ɼ"ĵi)qAߖ>{]9Ӱ9;0KzI}9NRN'AVɷH:iK %GrdɒK#3g~էDZhK5֯ks:wqm3F֪E,X Ҷm*f"Ehƌg3YT!ӧo0O M6 VPXl@h"y饗dȑrꩧJ=u[͛ K'tW>4/My6mrx.n .qxQaLr jͭSd;s~q\{r#-V;y\LO c[6oL& ;PզXN8 .IHn~ԩP AF鐏dq'J^=dBY_$7QFy֨Qxʶ/25kx+ല-})g:Ԯ Zu9G'پ} OרLMҕU]<؝;wɓ'\]y&e!|̙sţaqrn|S1\&h8K,h_ ˮ")rbGޘ_~ŷ9{ۚ5k&y^wC %NsAι'؝|FOQXް|'x"^P Sߚꦾ!6d-(&=H#_o|y֫|z+e)?lf>/ߏ~; >hy]]Ú,?=>&1Z=- |-'T<~]Y*ceblڴi\lM)ck}&N(z@2SPPdnȥ-td/^&R>f?t(ߗ|ǔ2:5?qEF\Ej&ԉՓ%r˚%n-:xzZfN$7pdywГ1gH[:tWna=M ҥK=a?>cuz0rHȂ,usĨN@ ̓|-u]~}9lMe~1dQ2kRYevLߣ嗤cǎ%rm~}Yip7G$H{O>'ꏥ9 U~NLwm3WD4k+bj~4K4h'e]cÇ痼vqGi H. o䯹?0',j+yoi>Aǒq*' ɑGYnk }>;N~x>:,/y\fXdqT& lvux^CA|}eٳe7|C󈖛rVM 20 rt#hhӜzn&E gs?n8_>[o5>quЧnx|̓=w޲;h.N?H++Zd1᯿-KÄo'WzʷI|+ 0ԅ0A pyL@y2l0D[8:?~G z9l_|'#tM7a& &Y =]v{ /qfA|à^4(Jdc )c]\ǶtixOoF7YsʩOlV„u'I{'?..{uZ,[o^t{'E_~ /LӔ6gP-c?-N6lؓ,e4ZK.]SO?^`עA/g.}>XWN&?l[won/;ʊ|Y~ke?˴v%1C#E2eqi>iH5o͝rC"wtFku_)~Q7%p?^^|E4 q &ꏅebsx8(ؑg绺*u63ˆmˆדEirgN[+~54~=-I~7ȋ./B>q/DK&LۏwD5\<'N [kuTsy~9PF,?t,cOe٧[nvr~ ʰag- ο$UrD^塇?W 'ؿ]23fGxbdp dmy7K&W\ /D{S DW^y';|H d BBzU&Z,!S?BZ&BʢK|$օ2 Cz:`tEYghe 5J'h*I-a\!#xQfC~4l oOd$Z> !$?K e*cx5Fg=_6qDrJ9TAZ4fS'kDvЏ5k=BX> RGlw:=I>+6f{vi'ƤGY}1ć6~I'Iv|]Ȝ9s嶫k?w2kdR#kw^Ы$x4)A&4]TIĀ҂v-զnBIGnP0hM4i!Gcs 1} 7mPG^"дػE Up 7娍8jj17 }[V'y [υӣK%!/4"S)~h$z 5.ۥEVנAif#,jT;X>[2g4r"4bB\*%[XMmPN>#S~X@?L\l.cb^PАh<1/瞱}uwkRLw[e#rH b:1z5.h O,r1ioҺm)Ï0db3{F1w\{.ްIi\EiHGE󁄅u!8jy!,upb4y Ӓi} h|ʁ2ɟzqld`>:6ޢEH5gd~A铕 *o,ِ=6j㇛ \i{.ʩ&>N0.-;/giɏr˽TcKȚ2e&jM~ZFM2%wdQ^O`C<-;K`3q(;iV R< 7mǾBs/φ^=vuͧQGHc MʮNSȼc_qɖfοY.n]i6lioMa24 + 2gO1#>iР#u wn;Țh6Kԇ(2?aV׶W76"%ϵcNk?b sO~hs;C 82R}u23 ꫯdv2_iVbV.z` ^\ &P4e,FTg7y3> . 6k;#Էo_z6a:4.]t/+Ns饗|\^]8N=Y(K X߾}{?p +`v 8,2aߎPGQ:2\r!#>?Ŧcr~?C3tAq[ 9= ƟIE/'táFk,0.ɈKaZ- G$8qǁ2Ѽ#|T&㡯;ġy!r?{9 mk +IDf&bE}5rbN+햆irĹS Cξȵs˟WMΑS$M H&6R_ c=8[MGx?Y ܾ5a`[0Y̚$KH2{ a4pD\ES~ERmM4^͸=Ĉ甗cU" E%/4UӇyice0/ܱCe!t9'4"0֧6ZGk^Um4A7޶X#cBsƆAÜȨhXOZN¡#(h&$uùWYzO:MM?py Uekzu YҴTk5L'+A_ˣ2I5jG 2izdiAqr!2q(eU[ej:ͫ:nlD6s u9o~)AxťR!WtՑz]]Ӫ'Fԝ,H^F nv~7*F0ԓ& w^#,}/ĵa⤇6BbEZmcE?!^8&ȭdi~S\.aԐcl;[FO\چX62/}MXx3X`Gh⩟Q9sjk5>dB{5Մy25\5 ^m[mB6W7Eӆ5I9%NFSdL* |1cc&4a]4 *Cӆ0G8!#LJx4nlOˁ_x}UkX.[cp[寽6{\M݅X}tЪ̐Grrfv -Mc+&axwEQf3{дg 99.mI3=l6m-ּu$N8ZW;,p e'gUZ8DrC;|nT/4eT1{? "V`f @`{&uU8ф-8jO'N.aI8/ta8^*CǏ2cBk]Ϥ!_׫aB\~d8e!(XVͷBT? OJp_^DҴ*WQ+*tW?l^ q`u@GdEUyUlZCjttKCaC2` K|]'1M'W,ur FmM[,TB14\ 9ģ\LZ>M;SY MZҨ!ꇍrTARFeòL`6dI )[ 8&*2C_6hA *JjxR)X~z7m@}g=|7y7h_DŽ$,0lH2ZP>P7ҫ!>3;K{uh=E1!033s13!ɍ I?Z'E5 kziԎ;t8;;̓{L3i3y ME'h {$x+9P2GŜ?}d IDAT0jss,%3h܊= 5=puGIMO7Wg+Y+ 3*NLx\h&0,03qo㩒J' 'LUV0$3:y+Y\kPn;UY?O+ꏉHIzjDaUY&wu5_TUyU&зQ&toFU997̥mIk{'M5 ȪSQ$od?}ԝ(NuԫȌֿաWUk[Iae1 C0 C @E21!`!`@0V9,!`!`AZF`L C0 CvrTl cǎMW(~ޤs~mߌZf!`!` OIۏ|CIOrqj„ ;[=zXM?MՑO|0vܸqҳgO/IK,Tǒ!`qL"MfmOJT*q&Og1y+|Iz|Denv+℥BbBY1bA4,9Ne!?äIR-'Srɓ*/Te"+ d!`Yd3!r s9¢R?$qCZȞ{{-sdK"[]QUS;ry8*C㩭y<>ٚfed$m!`k6Y[gyze?XtNj[7n5@J~\omkyG5{-nah/nD9 ?y_˼y|wY%T'A ǏBivV/QСC20ZC j~ l%"vʔ)2lذ89>C7c!`T#k@ rŗY,).Wd \(I6m']vDžP>Ce˾.ZtAd@̩A.ħe˖,ԩ)7 ?pOˏ1':ꨣ|#q'H>?S6|s!oF8}`}嗞dv %dwIVn¾+ׯ`ȑ| DQHnvdu/ZѣGK^IGOd4QF@ٌ!` `d)},O q1t:ㆨ`&M$sdUVMq;oϘ1ÓC{̙3gl4df m 0ħX&+7$&1c H~[/-7b-|;nzb $WSm!`!FA+I"ŤWDaB $ rò(Z&Lwt¢rU{G\ <ؓZ or,y3%,ڵkW cO A QhZfO]ݼys7UƽYŋa̽^AӅeQJ G[ҫ k1 C0*0$rL \&R?‰Ѵznl4@oK!ujڴ3!% h⸟3g/ B;4Q.ДA$6`ai|Od4*Krk=Hq hKK4nz)jΐO(w"(7=kH -KZ^+<w-7di{H[r}0 C$9]tѵL&I>21Bxn6CA4 Im&>P,ձ?HU_!{m1!V-Zi7mb$x\^ (_Y#>0.:Al {ްYEsaC~.]&!Q"F)*Zn( bJz]/ 5vaʠ C*&vMq6 C0RE>*RA<ռ@ QlNg.ϠeN@,HjgD`4d@Ӿ+~ i42  (18hlƅf2AÅ?q#/cZ/)$Iʤ ďO`kQ0>^P?O1".e'cMLa5 Sꏭ6l\lC0 C lZ:hE2BۃvI:ag9:{%Z5+ ÈYQMe8|Wq5?2 ô pǠjq) /r(Ǐt_([!pn;4t)p҇i< C0 `J°9%@xX&p&oJYcŸ\"}Ԅ hZ6ի& SV?އi4~]E p(?uܫl'h| S8zv.plWPf%epmWP0<[Q?3!`@eXL5~L$a~Ӽa+Jr4]MzCei/2SH!`5E" RZx3 2R++g2 C0V˾] `!`!`$GZrl,0 C0 UUVC0 C0#`d-96b!`*G*o+!`!`0 1 C0 C`#P[兰! ~o߾F(U:ބ ?,7 C`U#om~$AlU7 C eu{2-~g5j˾Gn C& Ƌ*+J'jB !!ش[ѣe޼yҧO?VA!lJx)/,?5Ɔ!ie7ҥKV6c@M@r^hƍ'W{𛼘T\=AرרòךPw+!`JJ4B9f̘K5j:L!`jtLb|1j2i$s=u־6f͚%}lVC.k0 IO,fM81 t` 2cdIǩb9kN{68H0tPԹiӨk"n57 5B9m4O)rE5.A/^*,9%UXƎ)ݻwҩуn&:M8[ڶ/-ˠ \:8&"}*lC02@8y6gΜ.5\& cy! #&4jl՘:'_P-&KEb'矣E*AsJ׮]]2?7G/͖Ņٲ]f^~P7jz CX(ac=Y[ CH.]X Y˒:/-[o/؄E!d!yE>~f CUS[eaKe?naFEҸA, S"F~z!|!PC0VCŠa+"0lLӀ~rj}UQ⥤,J W|1c@MENM-0lrMUAs J$;ˑ+w!K#1 SBy-(4f CiT9@&.EyKvXɤ9E-Ce< @~Dd-JA^s'w,|7}6|3 C`eqͲM:ҦylӱsTJldm"ymtd;0BIǚD R%kLS'wbq{b*iن!`T% ХmѾ~\t8n=#75@}3}G#iTYCp#i@ Z9cQQ-uGᛴ[(dnC0*F"Uz]y:q2`fq!>dȐ\ef EtVa=ciن!`!`='&_)82%~C[#L5"by>MkE;ygH4lC0 C0*B`ȴRJ%RըdR.YC-;Dpsli\ʒFIX`!`@\߯d/ctY4>5t4g`li\4j s~~~& m!`!` Q-3}i^h&N('Onݺ/}َ߮jrM'Y$&)YM5L] kg早 hwݓCʬYY5 6l5N]y{HV{MR٠AvҺu)Qmb}JB}ah{0>/{}z!K/˥#OOY1c'7[o@a͟q05>Δ)S#kxz-ڔ-hRIƱT ?/|VS3a?jBa] fl`?Ըn *)]Jʼ 5 )%le2a&M#F޽{D1N-<#q )";%k& /wqGaÉ6ijWNÏqN!DC\nj955oM6!￿4mTܯNx!K='rr(Ano2(67PFꢆCNp۷/P# 0}v ?Nָ2/93B EG^uHa۶mLf!`D@?5O4jJԆ6N@M+z)J#7 Z)Q[؝V#2EB5Lk9JOB N"ƒvn|(t*_!t_.|;&4s <|Iy׼Wg͛*Sơ!& 2ӟȉWB MG/ؓ+C?xSfp !]2F25OmյDyk\>!B%; PSO?C0 C` 9&$lIKnRƦ|gB&$k%ϭ[-qy_}$O mT L` JJtb*%#kiG~jQhdĉhJ.OQ&pAb[ok=\s L74TQF iՠ|Uq4]hbSM7$h؞}Y\pA<_8Dɉ[FIׯ_=zx) ̓*+ C0 L"y>4FMD5EN {}, i`W;˻D?}2[*i"=JtWsq4,}g=%dqÿO>K/oQ 1h t\#8b9HDksFJh0|OTG&0 CXT12BACM`GӅaʷqd-Y'p %g0H>pEBCZ6l%-[4wuG{mֵ^0,q2 ^9 ˞7GEc TeFԥ\>&q6|Uэ,{bTC}M!`! lR^l=L&L~IASƃ䰟 bJƏC 5j%bR%x \T~"7AXCCSh8.t@9>g1sL,-j7.9IR"Ē:pRS s49wV[ zoqRO PCihp.9Lp܋XV7c!`* U%Z&DMI2W5 cǎ@hS!Z548| bj/ps9f|r>64HK.>|x:ƅx°5U6H91(*OA IDAT|MP?4g0hNxC\ /dӮ]v_pBUhg!tz~vC0 C`U!wV+OJȢQ wϣRqg@,;R0٫ɨ%ұu[ Rɬ8N=MtE5sJDT^'6eR8Z&N6VҢf:w\7`4',_˞ʇ&I]e? {lt+u6 }BW0!`@{Ĝ0CԒ-i7+G-h/ѹ5k ?MڵhALhV'{NrUᐁ~"*BU{o\Uah7>|93!`@MAB ↂ(phԴ5&'Jf.XjϧԮYm C0:orUQd:+jk,1 C0 H鎊Y C0 C0 L `d-([!`!`T#kΒ!`! Rڳ6g2Q0 C0 59yzVkO)5~/Y#J!`! .xz{iY2hYC0 C0VFV!`!`"`dB,!`!`#k{0 C0 0V!D0 C0 UUl!`@Y"`!`Cڪr6 C0 CBUE0 C0 C`!/\%%%2zh3fYu֕X,/$gee 3w۲%''w,m,l/ǝ4hPg@U#`R͟wk`_~U?s&"yYaf8\Z18HHWTS+ OT}/(@y)W*Ú8TWM].]*ԫWMZ$D^z{"yl-ɒ\lGܕ\ly%.<[LmTG{Ui-WCؼz̻5qb1bCel:JwCL7v0wILvuZ|g^iܿӮ9 瞝'Igt˩9z@yiokyDJP ciXvmsv PGZJϭvmP⢖8VRyf2~$nj!`T +3/QK ՉGMGtSNO98k ,Bo#O+}"qDOTږ>(&/rNcK[}ۮ|x#h/qb7YCYdI"@h¿"v/RqJ>|l馕HztMR8Զq:Y}KUY8TfoQF7|0sUH ^Nos$-W˜/{챇h]I)4\D ^uۛCyp =#>leذaO>s'v2^S_|Q>Sy'!`*_*Ӭ 5j7dW} @n>)S~C?C^{o/W^ye| |vqGy۷lgC^>$N;WRh{irٵk3dIaN6/Df.* sd͌!`T|B[n2vXi&} /ϔ 1]zNҳgOY`A<?\ʻP@0{1|:u$Gu#[NwE禛n!C27NK9cIVIe^:moAy7>3'῝x$gV灝wYSN:$%#S`BYgt\xꪫߒ:ucJtI$5ߚ+pĸ8EܻM{-?[N8+GYQ܊/ 7*Z1H+ z謳#5 od28aݺu?sS'^-֯5qr}k</5TMpљؿpa`TPjڨDMUEN676qMz@gDN1 pu㏲[!-24~lŏA u?4ÒCz-˵CB6iP5ݰ^4_Hx4ܿ_?$};nOz_+qĭ؝uŒŒӨBh!`T!|`M6KD֘K/ԏsw&g/􄋱7fZEFpÞDYԆO~tL=dѩ0ۣ o׮w$ Z2!Hh`ѡvXM'{n2 {9yD*k Nԏ7;ɇS fZȬGz!Y܍A頢jcr䫗sK-NDpA;]"6=k?C`e$X=G'| td\͉'%TZz oҤI^+c6qrK(0%h1c~PCYUd*Xbddl B6RA8iia` >؎yjZr[o eÍ,SCn)KqXq뜊ٳg% ?6bm;V`R\r8Iٞ=t@AEy <++Tn{ FmY8oo&=5 gioIO<ᗡ+a1!{u뼣#nK,syأ idO#kuBD05qr>K/eZa_'Hש#IR5|^YC!z!C'2q wRѺ[ebKO0oBEmT+hRҙK  ,( Ÿ9**?7sb[QzV_ʄgr2}lu@KOHԆJi*o ~0!SvFұeRճ6hb[U0ܪ25<?f/0}(2Fp}ܥ |Z6uBpduRVFhW\3#;ۍkR?s7Ц~@!0p5y]Yխv2әSI_lʙhxW9qC,1)oN_"KTT"uL/|kDL%Ǹ2U,CE0ݴL6/T%ˍf!PZI`R9wBueVDM,Ѯwo+0C0RGԱZ]cV:l~+ Gm,AjWT;wtIƌBO:$W/ϣ"奵0C0j:'kw}+ څ-ܲB9U>##GLH wFmzut2-y9ڀY9[թR믿lRڴi#묳N#F>X&O,_0՘[/^,djن!`d6=x`9c};H֭eM7>.]ȋ/(;SK/0 7 h:qzͯ@z!ݺuo&|'aL {キ57kL6l(?DAy^~ È0tPAyyy> *[ʂd_IV[m%VWW.! r{h5~{iԨl{ѣ}ؐ!Cd㠃KwIL&@ٳ Z$4L_}E%m[N4I5\㟗s9'&Y'CEszk_#wXofi޼z?.첋|G駟W\;Ӥ_~2|9SdqLra… c`c3gΌt.#vcn DMH?H3f̈s=[tiO>#>N^b\^gk.I#ZGy_y\DMB;viPc4O&/+))=17٩ӀŶzkW_o>Ȝ//-9;vl\ԡ2;Fs74sGJћ3u 6ц0СokGcO/qiWk/_E}x'6<g 7Eoqܞ؟θds%ĜƓ+}Erwܛ//Lw9eP^T"1C~Ccv7.R_%օ^_yOº2CV0Nks>wڛ0jnE2i?><}iΜ91'a%HMvOq10vmiisZ9ti c~ml7_d!`A`U->~I&q%$˂kv pQ5q;'jۜ(?M?ZZ=Xfmr]wie#%l*LRJczӺi>3|<"m^$''Gz)}ݗ%#̰V$UV;=,;G_%ʯ+Cb#$]Zh!]v8-0ɿӧz@(-ᢉBrCe|ٵ3n|A&rj>}ѻRwy2~xV̉'+Tw3Lϱג&N ׎e%a!0A.IDATff݉'(N%nY Y2'|K#ao!ώC02 <̄jJ70ܠYv &lڵ_aP }ا2[K?޽߯6`6}A0 >P|5K&:T6aÆӨB7̨#@1޳и!fm旻[ƾ/aҤd2_;$!K7tSibN 4 (/}m9aictOVQ'CE K`6jY+cDZ'|24^xKc@u *AƵ z(8OFM-'.;bD~w+ k ':4p>qr'ÈljEg͟MMx._2yh7n엨a S~ [!rQ:T6 mmL+ MO԰<6\qX֣јrh:&Q]Y7qUAI݉4rh1Y n{챇iU!d!Pe§?36Zd?7gȈJ-sPtRFF?|`ԩ҈z$.T ,)g4_^IdW/QjfZDD0(Q_~۶mqm}++3BN wP&-ꐊpd*+çUX"6c! e٥~$p=| ͌!I^d}nFI*;8s/8P <3!`d).3@S3"J!`.2rvAf1 C0 C sY֖!`!`i#`d-m,!`!`CZ氶 C0 CH#kiCf C0 CF2d!`@YK2K`!`@09-'C0 C0FZڐYC0 C02am9!`!6F҆!`!9ek0 C0 06d0 C0 !`d-sX[N!`!`!!`!`d#kr2 C0 C m %0 C0 C sY֖!`!`i#`d-m,!`!`CZ氶 C0 CH#kiCf C0 CF2d!`@YK2K`!`@09-'C0 C0FZڐYC0 C02am9!`!6F҆!`!9ek0 C0 06d0 C0 !`d-sX[N!`!`!!`!`d#kr2 C0 C m %0 C0 C sY֖!`!`i#`d-m,!`!`CZ氶 C0 CH#kiCf C0 CF2d!`@YK2K`!`@09-'C0 C0FZڐYC0 C02am9!`!6F҆!`!9ek0 C0 06d0 C0 !`d-sX[N!`!`!!`!`d#kr2 C0 C m %0 C0 C sY֖!`!`i#`d-m,!`!`CZ氶 C0 CH#kiCf C0 CF2d!`@YKoL`*>~nuP8OP=0.qOMܷ[Ԩc\2jܗ}׸|5;24*B2iu?u7W=us} " " " G]M8ͩ-zkcǎz " " " &iJU{" " " "PAkD@D@D@D$*MT퉀@ HUJX4Q'" " " $ VAjJD@D@D@*M@bD՞TZa)4^;e?otjOD@D@D@>% `oݺu[E-д>9[,'>9[,W}kķb]?~6^9[,ǯ#g~~63r,V[[k}iY;Xʹ{-|[@ Lˣͬ]?~F U9LVcKŋ󾍶RoΦKF9V9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN6f*KZ^ҔgAЃ+J/c2|W}׃_#~ "G^FmG/Έmg闚M/ZMe5Z6ڼ/mN)Rv_rY}[z:#(%VdeSJ2ߪ~@Q*/~+{^Q" " " "X+: r-PTqs5^2gΜ?ofgڴi\OϟeF " " Aih"UGu]2dmvva5*d裏e5ְѣGnoW矷^[uUfe " "X)"k555{_o뮻w}_ \8ڥF/{/{ήJ4i{p![O]tQ9&أ>jlV-hp ;O?mguV)yМ_*mv2msPrX 5'HdkK7xfΜ^}o[߾}#4"!x3HdoNB3Lѧ38~;餓l}Ic{m7ߴc9&">HmtA-6]mmM74E6h4[oecƌIbԩS7n!8#G77a„Tok>j]vL^xa:cvBÇW_}e/rb "_5!{>c[O>Ig}m6k,馛[lE.>cفhwyx'hA[O`ֻweJYcD}s=v]wȑ#/"o.ތu]gCM>4qu\L5joL"=+UW]رcAp|oysh=ȱ>S>~xC fF 8`Zk%yRsI^{ewq=A~%Kj1<0^&ۻKhGIp?=Cc&1E!N 9[{mrwtp#" " pbղF=AX *!)"O2A"^+bi.R'Ckz\h;mWhdBqroiqimQ__>'oEq"5Zs5m=ݻQJOz1I9ט-9|גd=p-)jF믟1:bĈϘilРA-?7ti Ըw/kZiQ"F_Ca0wꩧĔ"DLo}|\-X]iL^r%m̰aRu;cbz9^tQoL~#.x9,|Q&^c. cDA9n9>ꨣRT:G}tj\w=3il?c-1nP?[ܿE@D@ڃ>Z;VZ=mI ("1MHDWX;5KB}YZ("oM!Ĵ*k^%Dq.hn)J$u ֘$AzWS(N2%@8qb^qa8!XFu~lyESm˹eKOk6`l͒玩ޭ*E1N}9pvLW6S1i|_mE@D@}G>p>-,tsmYPkg/nE5p>lz2kk҈$!S\LU"I ѫhX(x6PL1Ec~%SDO9cq!FN8ᄥ`Lw^$DY_Eb!XE9Ӝ>kx(D\۶ט/8Cy"zC<@D IsK)Smol+ |>Sk70ONqicG'֪K`A䌱R9e=s4%΄zΔzy{~K1r~Sq^ui':'z- -mG[g8D@D@bn ߕ3i5[t? ybj5џ J0ݤ)mK"5Ǜ+}q 747l><q ۱y]\ $cxbJc] *3X6 8fڎ瘋9\"X ǁv9ouc}:/ǡ$" "u#Ծ)0X [g"͉dŚ;Rg=ϵ9M}4Ěl5m ʼn›)UVZj#,Z.&f=,+ǚѕ$իƶ^P{o}1&$܂2Ji^Hv\%oh SD@ځ¬ bmk9/+jsT+Dy~fm *߾rZ:T@qxAG]4kٴZvYj/npbX+ vk]7d@O ccʋ 0CIQ m-{3֛b Yč`_ͯ gӒaKEʋh(=y3tM= 5c=:bԦXÉO 5lۗ(M~}W|P_ID@D@D@艹:}oҲgK]P- Wj 5괈aDT(5^}`Co'u6yjΗ6)$Уv^vhk O"PZuk% G/km0x[:uV7Pc3,[," " " "Pg_d.-Z\> 4֨H+QsR%Q!ԢmƦGM4b{yrr)c-ZmmWth5>Pe#Xߧa:cM[#%j%^"E Eռ^1X[IbE@D@D@u/++Dj&ӟK5 wJg.|-~AMID@D@D (+xȷZkހ 6o]mkLD@D@D@9%kS EFS̷f2mE@D@D@D+pc}}mYb(-k+" " " Nj2vP^D@D@D@Du_goG" " " " D@b[(Z9#" " " D@b[(Z9#" " " D@b[(Z9#" " " D@b[({2*XTIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Ignore.workflow/Contents/document.wflow000066400000000000000000000160561362112712700312750ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx ignore "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/000077500000000000000000000000001362112712700240705ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/Contents/000077500000000000000000000000001362112712700256655ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/Contents/Info.plist000066400000000000000000000011641362112712700276370ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Log NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700275665ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110261362112712700322200ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGEP 7l}k/]{]{ vD@[HBw.%p&Μ;{f}3gΌ9C0 C0 @fʔ2 C0 CY`!`@ FZ S0 C0 #k6 C0 CYc!`!`dƀ!`!`5#k5sL5C0 C00 C0 C#`dwf!`@0X,&_%/u  [x۳$+k͞{3\S[i(o+, ]e,@ho֥^PDfM {# 6b_R^=OҲjqkw[_J6M%ӑnx x Jr"E_aQLX&/?3JLngG7FJu2-)U9UTǣOV;Q=de-~B.u Դ]dZ.C`F M0[E db/ԙ,u/[,SX8<8໴-thf2ei2 LyUdxKs.w/k܂ Oy籯SH:u A-ot)*-s]q\ۜJ%KHNNm۶5EhΜ9kYg3YTٳg믿N M6 _l̍pٲe/ʘ1cO^zp-x͛7~f͒W^yE?|0u%L[2N/+IN3uLGbnS߯?k/:Snzn7IPĭpen&SfzyplWxSnKsWM%'/Wm(ҠQ#d2ēo^ty+ƍɸq}~Ij+_GdKT_ W>˯ʘ^em {=A~w2~x,4tRw=NZvmdö#gӦMbkb:uq~Ƥ"C'j7O~~_ YO GϿBM8M~,GBWNX|ΒLٕfKNKCGR؃N'/GT_i5$.yZ>*A.v}BhO^a=wnY8-@ϰOܙӤ^Ο. }\8q9iuK)(ba]Yb',~v:G}A_%15iYn|YHE{'G,?a,YP6뺽áH-\!,ٗ{\T_zQ:w\sOKƅ]"@y{Bz =x,aK#,\wxTx>3u̲:&)p̏e~7 iwur 'ȨQK^4oH Ox䯹c&O>0Ynv7||ǂ5%TN r1ǔY?Vh=wyO_~%^s9G>suC4{9OFqx衇|[ig},D[`{ c .Lϟ/ZGTo&˝wV5 t`bal Gа8ݷ_/@wdW|'Mu0[pV cn:(O;L+=~|m~XcxYnW yo7O<6̗W(rI?!=r7{g .EP}w\,kq? oDsYΒV$]lQ{9aYL_psdͷ]?}-><(>KXDƁoyQg\Y(ב:>K)Ι&]m-˶;=>L:۞( }o^N8BMS|xIݘz`,\߲6}?2+t=zHpk~ uO?O~4mIg1NolOz9 ~UאXCuwƍem%qI'$|0}~Ɣ)SE}HL://;m4O7n,>~I7TtقN֭rY#oݍ᪫$ VG8i_Q鿥K/&i&h9T`ܰ¶ G[Ѕ.@b ʂ?2rHDh&O>쑢nqꫯ^m_+F>tMrG }K7i_~Dz{#' 8t@s{p%kX>O½wE[}l+Vy9=d=Dui? ֩&+]%V,ow{'E_|L6gՏ t;8#˿xY%d{%x޽[wy'/Gs˲Oͷ0+zO~ ȑȹ+ߎ?$UCu},wspǟkQ*QQ>3VEڪx /w[gx{ꩧ dr%˅XJz9)nDW^y';|H d BByҸLX8B'<=ׅL4Kz$[ dm!p'2t?ՇBI[%}n*s|%m/&jy+om6~ᾨbIXSNvc7k#JB#TV{;%F=ISk3{Qh`BcCׇ~r)Ү];_{n`O!xćm }jeOG \I5Q,ý_x]ߥ922;R%:f:1]wuҲeKҥ'DIH4]ǧPX#b[&'gȪ';LG A?Jt)ѴUVPIKᆭK.̳ϸ|b<"70 cILn6Ʋp}OZѬy3믿'EFqCNr;?@àAG8m%ӛebJ]zsd"#7&/y4e8# <2 r 7eBAఐR:c uB q&?)Gu7i( Yay&M4y 1c0}F"q0ػEUp: 87ᨍ8jj17P;MOyS ۣW%.=~2~t?H]t[`4rB,`B*%[XM}'NMpH ĩ8^8qM\|ͯcbPsh>q/{N?>5=oVW@*p"f3aqn& R)71 Qx㍽=eđL|n`'h,\㜃'liY=G.h9Սr.Z$,l Qtk!SX(AS,QL3̃Ldc%[mwDx-V A:22!CO7TY{lԅG\{Ɍs N0axF["8q_ҨzwTZcKȚ1c&XVN~SUº,eY6SY+5NɃAVUH.|\_ 1}\zUV|FuY#/4)=:Kٶ{,O~!s'*cs|м>2/o<6pwrV/?W&rA֑O x#̾:}2`x{[]O]uW݃mVC,kAR~+={j}P/H(2WE7T=g7y2t c}b?7'bL\lF;76tSo`P,G尸\tE^W^B;eZϥ^a#pYma`s;dylC(A"cǎ~2VC>=`̨>QGȞ86Fn,Fa!OA,hTop|X=8Z?>xcF.q ϤeN:F^dd팁B9/L:nՓxQ/}<pG{ 8.d1Yg/ cGy;G[Xwͣm̽|¾D 0ɢK'2)VsHZ#.niح#S6j-GmOm𵍌#Ϋr ۠kqsɟ-=89`&bNTn4-,oaЁx,$srX7M~!z8<}m uUZ^C,2U.zc1~[t`$IUI^\OڨMZ?:k~Ճqe5qaUMq|!`mCT +&%?ZH 5I3݋i[7]>RgȚ;a̭"7H e2{h``}׊><z ́S ԩ2ُEgr5Hvݎ4qK͝>t3$Ǎ㜜i$whqDc}Uqϡ!"צWc|0 |B%Nu^+GٓX _?aQ#?ZW"Ugm] Wx>5uV>Zf1 DŽS?`xPYɄ^sΡK4!Kͧ~XOTannT.aGOBZ9e 0(r|D<D{}|(S׺07oz!1Z?ԛA<}N kVPnLLF sUaUYab%N' |¤i,TO|^&uC/&P'-, h(H!oȃ~誾rZWUZ6m,M_:\chP\qkqYrH=w`wۮeՏzqNVxdL.\ d@obXUzQu qm8顏XQV8Gzq$CՇ,-C]:Nx alOM8{k=Qu=}X]7%++,B$kx a:,44N˨9x5]ÚO/2G|Ϲ::SqZEˆz֭qL#-YQeZV$J#9%ތȘTQ 7 ۢiVZ6li>t|_P|l3)EˇaEhY|\X>Ճ\Ǫ״\XWWZpC9 #PaU!kŎd#.%ցO+&a|ZpyQf{1fIYYmI3=l6mA k]CK6' km'']BZ2K-DrC?nT'.tZ:Wx1sk1RE@ћQr,}X{‰&tlQ|:OMp"tINzxǹӸtӉ08ͯP&?q )m!:R BǼs:͜:!P,sY.G~L;x/ى'I@tJǰO\Sd\@ >ͷBz*8'NӈӾv58׾0ypѺ';|q%Rſ]5-HeqagEs"*)g!5;O!ư!}0uay%K+:9!Kj ! ˘Wo9C/&gOTB)KuWPR4/:,KI%KbXNR[XЏ1Poav3-HUySMOuw1;uM.ޮ2eV^5ViS~'|*7'c'M${RZO\|HmuYAx!`!G,kq(oaYk߾}RR3}t=#^)GTPN;"NZ*$&EѣG{KdMRC٪t u@&%NO%ʥN:Sd2d$m!`g}΄3H K%ezq{K-u|ͯ~yӕm8|k?SO8kdYd[!`Y֢YIJ9s~xO 4!lZִƍ{ /[}n=A*5j(Q;}JDCew+{pW_}%-w}we}PYA9DeIes!`k $C,1őW$N6m,\ГVZx,Yo?gO!~8,:cO2Ν_x Mec!7o@`OW43g!`T{1)Xރdp@ CH'/N깆m~/թiӦ>τ4`|^AŁu iB/ҰA$6tSaizOVd2*KR<O,yȥ XX}#e9';|VC:An ' a]ʲīX?47UodiJ{(۷*C !`!PA.k+Xv-0d}d$%b$lta-hCʻj!Xȏ<@o =q.>[ž7|{Ajؐ߭[7OНRƢDŽ9 D6OYB= VQ!')كuƾ4ա?2,SHo^@G^C*&uMq7 C0RE>*RA>@ QlNg.aen@,HHgD4d@˾eh>d@,!QbyN)$:AA C0 ` °9%@xX&p&oJYc j|ԅ hY6ի&LSZV!>eqi:iO[0?*_ϩ#_' 5_U>p謤=5Q+*.q(C0 C MvAj C0 C0#`d-96b!`@0.0 C0 CHX!`!`iGZڻ0 C0 C 9F֒cc)!`!`:}{qT0jxPwY:DpASdRMPt0 Ml?^-Z$*ך6%j<~^D[9_X Cǡ-=YVXj9C0j6i$~ ɋKh)Qɑ>Ν;{ZfXZn:!$aD&L Qê750 t#$Oz>}L6MgiݺW,¦yɇ~(no?r3itqArO9C0j*v=cz1E2/qBiܠ)#M8=G|i>` C!Y!aj,`Ļj*qJE ZY*D^O= Cԩ^!~#kB{X23r/ dzeLӔBCr2|=9C0j&kn _L˗i dYҸWZ1ab2mA׿ECRA)h)a#Ed+Y0ɝ!͓I#ͧ?C0,wٰYiVG4ϒ:7p ]c6gq6~2&GrUu+dk@k6HYE+QMyQb4 CLx@ܥ[C9b&ҫcKָ?fC.^jQSf yH!`@ nB [4-5ҷh#Rܻ`T C(V,rG"_{6{4 )eQ\%k@j,utU{[).!`!"炘|דDJ{5+hKK|Ίv4#h !`!`%1#Y%J.<ߧQyŤLYWϰVms;4C%\`-!`!`Qr~n,+ƿ[΢ 'ݭ맯9נȅfJUgQ*5q4hhW!`!PG?&ShCdMڼ%̈́<]dWl&o2Ѵha܊+$??_/yKBsс7щEuQyѴh8Q+(^Ѱ[iD(ѴhcLKgUU\M&f͒ Hvv4iDZjxM7 'zn!}:HYk2!Y&ſḡ,yZ? 'a{Ge-++KԩpP6`9D/TKEGÉH|AAL2w(Q~mfm Z.gɓ'Z'qoӦԭ̪%ʛ(gϜ9S~w?pwOH7Q\&%Dɕ(3Dc%Q?={o_l?N*ӧO=z/yXrCY$.)YM5\] NV/SA {'k#FyyF8Ws~Y˺x7x9ԩpr&l-"_|gS^=/=4i<󒛛+~x};  ]vTwyG}oc9ºЇW_}qrWX4 C0j?7,V7mv5ֳFbehn2R&YtdEҰlѢErYgFmMF4.߿,_\~gyZGe9˿kR'x$/I>0qw}y~ISN9%\KPf'}zO˩-CXv\?Xt BK/]WrKȑktXo,9~S,|BpmE?O$P0<B'|~\˫r6tPy뭷]on:(Ҷxb>JB}iX{p999.{'x!K/˥򋏣NOY3g'7o@°~a45?C9DXD':8$O>m2\3Xx-C'N~'~ϋ5L/ܛ}K"wyg\f v{キ|g>ό3뮣jxyI}tK<ڦTʄyc:&s TLƏ0~؇rر1c;0ōr_*w)a+{Y4Jɚ>(6=:^gϞqWISc RC'JTLi|2=Ou]Vot!r ,8HqOf XbV"w{!K&Lˍ5uo-!t4mTܯNx!K<'v*U۠ Ѱx~ /7#mQG! ; IB\]v>~ɒ%>ruk^}!b.:m۶!`@u"˟Z'5%hCBKy)s;%񑓄dV\V#2EuLk9J4Nu! RAH'_Yuzv 7i=袲x㡇 |I-MX9u>ꫯz˯XpZ7 dJCx)|Xt! B ۟ȉr!F;BשS'y/ГN:ɇ!L]:t/!12u k'[B!A-T.cکg!`>u!aKDO[w06;:W6!YC(Nrh(|oG$׾}{$&O kTL JJtb%z52#C?5A\ԩ|,w|2XTO%Љ8r) 8djhyqk㭷wH RQ* ܸqㄲViQ}U.j-XM7 ~Ņ^"Qu-}$[80e^tEMD5E粢N {W~, ib)W:D?}2[:*izHF[sFJp|OTE&0 CX02BAàMG˅iʷqd-YU' %g0H>] enJZHװe֬k6n=^"4Ǜ8XLm>++HgxDߺMUf4VL]3*X7l3 WU8݈ɲ'N-'d!` .u֗ Ԓ6Յ4.U?2h|3Al B]sUM=D|!OfC>#XXV+V$vTHƚı=r|bܹ~YZL 4o\&%KKJSx}m/_M8*Xy .aamΊ8Xp.yG?f#n0 CHC|㪑A} QxʬUd %u9U<QÂÇY!HJ fL˹k !w`Ycs= DK./5jMD' `/?c=$3j=l6(b<z7 w IDATa ~ x bd]/2e 5cL37o!`B=pVEx wϣR g@|ӕ`WK/q3s"`@/RYyy 5)Q{ؤWUJXx҅  )˦Ʊ<`HU<-f]L<'!t,{ewoӰN+$u%Jڹ!`!Py/V39yZ%л>i eIM2-ᅹ<:Ue-©C\4a]*-MgBǺ'G- ?Q~1a!`!PYC0 C0* g C0 CRڳ`OC0 C0 {vkO)5~璓/Y/F!`!P\Yrer! !`!`#kj6 C0 C\ e0 C0 C }YKV!`!`"`d\,!`!`CZ C0 C(#kBd C0 CHF҇l!`@Y+"`!`@H ҧ\\\,Ǐ &?Un]b@rFF8 <-S$u}:ʉo% !PؼTݚ8Z1l0̔;Lׯ_לɫtytڨd:"wO f8Gi)r b2g2yQrO t^%Cvl^v+TaMGQfرceŊrHzXJ&q&+ ɍeJNq;<8໴-thf2ea:ÿgZ!Pyiݘwk⛒-s=ȲeR*K&"dL1g=).*I'g?O5s7L\~8묳V+*/ D믿.cnj]E+dO_m+[wq}g1syW1mW\ZN9?YSo0GEavI~ U ǨQd-@ԋp]SR8Զt2_lMG*Ͳ7ȸq믿cIԩ}γK%I*Yydv+.Y6k!'_K\4=^Zlx#;Qyp82.>!]yJ&V53l2w4W;C?G/Y uD>X ^̆uӛ9C~mС_뮻駟92gyF>cOUd^R}矗O>D{j5q4{/OQFxqEe[oU#GqOd'G}@ s|GDੈ#V/e]va}bV[ɉ'([E_wAɳ>+}_y z>3fȁ|C?߾;,W^ye\?n zvuW{߿l駟C]$:Rhr߰ro砳%I-+ dRY3gUPѣL8WpgH~}瞋WJqܻN?tmݤw޲dɒx~=SMGuewwyC)!qsK.r8ҾUdآsM7ý&M/BN8Rq[0pu$wrDqy`weĕSN9o9}-c4tsw?ح1v'bf>'^+i쳏ߘW.] ?;OfΜ'7os=c+YJ_Ir:輝^W+HYva93e=.L." F/?`Ks/b!\D<a?Q5o~"yyF-%|k"SN6ȓ|G [Y`>u]r˃>$i˖- w=Yޕ+RwgfqHnnwq~ݓAG r\N:ov?vک^x^vvO۟qD?[k%%|I&Yy's)s<7r=y죏>;rvpY~a{uy&#fYc_W_}_0o-2ֽ{wij a\$enݺIS7sSNV(#KQ./K7*V1H+ YWG. j %Y 6G<1SI'8SSqXWbуpcnBD |T4Oy~f̈́6R:w )0r_gd䓇ϣ~|t^ ](;vnj:}r8BXSNn~+x8u!>tMrvG#n^> ozMGGc|?eeՉGUv&#nB\of /.ΓA~Avx,>DYԎOq L:=d18pc o׮M@dC1Hc@-iA~T@'Or04őU9>Xkނf̪|qɏў-ܨ6(<`HҠq 9Q{нY,>=k~?C`e$"{N=T?cGpoN:/ɥB֒yӦMV!gwԈ1 ]b cЙ!^yy%FVYO d3*1`}^˂ojY+#2#aduFzV<‡|#KTǑAeft`[qs|:f{qylI"%f=ZvێU9yj ,or&se>o-\DTij} O :9ps"s&OnlTŔ :9G T`eyWӉ<_~E-ߏ 6eFLl+Ӻm B;Z=Gp84mZ>Vy!r{l}U _[VV4ɯ#MZ jCo.7QD':V- d^{͋C Dad;l:^@ृ\yxVVr/{ƋfmfEʲǛ2㜥Q^x.HqX{1 M[Ic! 93hX =H-|l]bʚ7=ڐF4B>Zf-DY&#ngX+,V~dbݱyFb;Pt\B`kg2< 2ՉsO 7U 8m>%\~ʔ)~*f[֧VAa'1MmQ=4OH6iL܊[>͇oOԧ뿄|77P&X,ǏNo^d CJ&t7n^7ÚXǽ>z^ ꜵ&y>/$z&7^yy,w K,17 '/|%?yiy|*R?/YzMG*عƾ35jg׭ DTX%g[8]-U-k 9iA<)+m^x>߁t`_$s&L 3nLx*-n!`"nZu6/aT%ˍV"PZI`Ryyj+Xnǹ1؉> ^b CHRj]YH$kt48 6_`ֵuu U7Q6n~1m#jUI5wl^#ZK|L7-ޡb-[+FA+k `R*(yrdM*:7 C0RET| /C0 C0 jGZCn!`!:FRr!`!PYvȭBC0 C0RG^0xSr!`!P83+uF1=ܳ3A!`!`N'&'>?g8p|ϵW_}Uj2hi C0 C\B־mE9ҪDƭii[kۆdr-X[ VU!d@@_%sNWPPPʨoСr1W0s׮]姟~ am[MZ磞y4h|{d ..]Ȅ Vk)"jeE'fj'kwy\pk*Vmݶ\9Q/cƌIHJ ke6 am[22&z8;vl±6lT}ҲeKiӦlF=Z;0>} 2Dbַo_lkX3$@5D &|Nveiݺlϧs=ҭ[7yew]wU^|Eq u]7x#.SOK^G EXjE n77kL6l(}^zr0b􍾹 *چtAn4/qDK*f^x9ꨣ|a;S4jHzkg}d>m (RK6v)L&ݻ3_}U6o_#E~&te2m4ocl_s5Z:v^uxWv|^dXKC2`^7|/}Qc=?O>D M38C(/N;Mvix'd!~"tXx,Y$&ܹsc{lK~q[,p7&DMHLs̉9-VXs7ߘ{R9'ƞ~Xvb[-;9{衇gI>au9nM>HS= "Fϱ}s9 Xle^yXǎcneaٲe1Gb'N[6T>*v鍹~#%q}d]Ō~tMc!;u}3o{'_[猵<П[Lg\/Z(W]uUY˪n4Gcԯ<]'vW~ةso1Q}ZO*~U{_\{a].LzHa0fwqXoƚ6m9CXw2e?GܿEpS;ǛH_[eJtGyTV~!+VO5mH}cH9|'}]ƌ~e, rkG!`ȵo%\B38,\8GO5c=~'dHf8v˓٪U+stRY&J+KH{.[*YV;~ ,/簔,:.Wy%-Ze]&,># 4x,2N;tOC0D jjeP̂n?*K7>ݞXƍ&aLso<K-̘Y0?;4;ɹt_8fDDYrgΜsOޔ&{KUGΛ'/'u]>4-߿UWIDATA5"mh}-[oU܆y> f,~ASc,1tٌ1Y?y5$F0iy,W-K&Ke΂ǒq6ˠ,<1g9 Xe ]u( kB|Yqw^Ɯ^9V0j\ kŀ[~Ks|'/{ %nC|l-u=v뭷a~)9+'Vo-Y}L={߃SEY?cSq-[=vnIԕ\CA!aZ6T#GP.Ҙ[_ͯ h.νν\j<gAd[¢Id٘{IďCTtM1g9+`z4C c~ŕ `nzYcr IWٕWg?$Z۔H-G}s[,bs[6%k*@H'Yˀ7_cɸһc}䕯oMsSׯjz2&Uު"o,Md܄'j*%ǛZ 㗨aI W~ՒJ[-sQ6TimL3y{X7o*Z QgϞF Un2?][*/>.aZ: 8+v]%`Lh87TxiiBmXl!b}eVM'MrH/+M$+چ֗Hڀ+٦m.X_>+ck+"zP&.ijѝq|NB7_!Re>)d0 BZZEe-4s@u"9䓓V>_FI%5?|gsU|Ϝ!`@%knOp3ҁ?㾉N>a0 C`C>ݱAc!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`@0>0 C0 CHX!`!`GZ40 C0 C )F֒Bc !`!`#k0 C0 YK %!`!~LC0 C0"`d-)4`!`{cU0tDԇ@ш/ *%ŘHlQ>{䩱XbgQc{jXШ/kXwwf`'wξk~ |k4(I@b$@Xs@Ik%Ѩ@D@D@D@:@]%0qJ6D@D@D@D TL;a TA+MT퉀@ HUJX4Q'" " " $ VAjJD@D@D@*M@bD՞TZa)4JU{" " " "PAkD@D@D@Dz))S}=ZSvh6_X0`vum-Z¶Cc,b9yc,bꋟ_#~Gukďb]?~1^9[,Sϧ/ik֧O /Ȫ~·`?+T盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN6TX^z%AЃ+J/2FtDߟx=5 ngıKM¦0VSYb|~6Xl/Sʯ]b-yʋߒk+2\Z2)^zU@ (Q(EFvXHw}nkhh(*鸯s5^2gΜ?ofgڴi\OϟeF " " Aeh"UXGu]2dmvva5*jlV#hp ;O?mguV)9h/VYe6Y9)9VȚ$zHoa3gLEj{o߾vGG<܈YR$2u7'!vggatI>$Aqlo1a :b.}ᇶڦnymQ 孷޲1c$1FdqԩIȍ7G#xcEM0!okO?4e]l7Ӆ^:iflDdkW_/ÂH#_Ml޿?nVO>6pC5ktMQ-"E~a{;N.Y}7zq{W쪫JoرG PoE#wIdO=T? QF%.ZI?o޼?s8%B^{waO>d:RM4mv#8"mcC}aVd'bhQ5\sO޽ꫧhKSQ{->"H^{-MqH?f0K#FH̉v S|CD@DK`ƽ{YJ#ֈr1B2˘DEx%SO=$!by믿nh_FG%GHcK.ind ˻$/'XxzE ˿1X F\rX#hӣL^]@"ƈ2n9>ꨣRT:G}tj\w=3inyˆχs({G-_E@D@ڃ>Z;VZ=mIL("MHDW;=KB}Yړ("oM!IJ*{^%Dq.hn)J$u X$AzWS(.$@8qb^Ƹ0QV{ #R>?"%ǶR{ܲ{%什{lmfɍsRV[m"٧w9pv,W6K1i|_E@D@}G>p|ZXV0۳֦^Zk&+5}d({xIBXDdq#aw=-^kA8ңWٰo=Pbo{XcJ$SDO9cy!FN8ᄥ`Nw^$D_Eb!؏E9˜>{x(D\;ל/8Cy"zC<@D IsK)Kmol+ $2A!ƋD9͜6I} ?n1gW;Kk70/NcaDx^5^ccLa$ "g̝đr)h)LL$#csr~E1N8xs=s疶2%EXpcw klڍO:{Zm#L7i|HMlJ_܄cr :L6OwA8ؼ.Be.?\<.ؙ[,2F9)Ιc;|swqp.g>|:q].vΛAX6r8D@D@rڗ?5&KA} X9XsCg6)uXVP8/ihR o噪E6Z1"j0ynRaòr]ERn\klmK"P-(ӡXWthUҙVɉ4E@D jO[`/ FlPKqxYPϞjG]!s 6knˈOlP%oպVlE@DR#h߽tԅNMm17, BO`VuC?4)<6@+~Q{;jeb~sSVXc5lkUAl26luTyp 4ϖ2Ocη 'tGGk8YA$wObs׽]2O+@=S/4-x@cR5'URB-֨mlztA+Al/ON!" " " UN#eE-B15TYF㈯(hĿ0-Fh@@/nr@CCj^[Vył-vIbT;4&VV6?L?K 58kR1 6\^6U@@3QV28o-*ּl08:RTMshKצXoe:@W$Xlk@qGmٽ\GvtT[\IƖ؆" " " " (u}T*" " " "I$: rHCI>" " " "I$: rHCI>" " " "I$: rHCI>" " " "I$: r!(Z&IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Log.workflow/Contents/document.wflow000066400000000000000000000160651362112712700305730ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx log --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{170, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/000077500000000000000000000000001362112712700260055ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/000077500000000000000000000000001362112712700276025ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/Info.plist000066400000000000000000000011761362112712700315570ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Mark Resolved NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700315035ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001111451362112712700340600ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/QuickLookPNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxE3"Tg:g;g8#8@=FZ=8^5GpGp9#Pw$ _U~w3g4nXGo-e{ MЩw-9.ҬY%GߖwY{B+Le n 4H6m*{キ4iDIZAAAn}n֮/᳤s֒H7;W1Å\!HyWVٿϗ.ggL+soӕNzpr!2 jlt)G`F :9R-koҢƄY9WNLr^ʂיk9DB<|) d(Łq.i _TŚmvymsĄX7PMcA~G*/fc=$k!oXICcey'] Zץ VVV&-R`r///ӉrW.v}&dva)״`K;n{pKZ4OzU^s9攮ҨQ#}#X}돔[ZZ&OM k%Yp{rQȴi3B?|S^!ڵ c ^;9'kpEΝ+ZkՂ6W0M:U^|E9묳4;E]:ʜ2eK)$T-/:u ĭ\'xZIiI5Ip3СCO7<نnIm6I]6!e8SN>7Zɓ'_9Th:+K dk<4!%)QKuO~?};HLk $40E!oێmd|vF'7o|3H6﹞IͥHh! |W;d{sTI˖-dJZhzL>]:蠥pZ^`3X{e _q1l߾}/3 UW][}7d0aBuUf:VҧM&?xR4p䛍e҈Ypc})++:ʤ,X.yc|P~mkӦ%֗*.9'NW?HgvTo~z(Yߨ~5L{빨B *>q˽7_[9 0#SX*AN$Y 4 $N/Z2dlIq?S4c|uZT*o>|8)3Ezl 'ҴY`! k-v}ѵjfn޽{?,lfZ_Mo䭷ޒx}-\Wê?=>*ʸemzteĈaYRTT6dy:׿{,2Gێ.֭['֗:fgܸqrabFOn&]&,=Vzq#G Q^V)ǔ]aL$تQ@R؃cG#^_i)4$}?Aׄ6ў&RdyaY"?,=*&&Mò߱H5,BJ+žeѢEJX9f'=*Db$?# ;B2|Nϕ嫁Io?zSǦ2Pd2w,pm2}"Y}~P ?3ҥKk~~aeڛ-GS*UxgG.]3F-kKcU f~,K?r͚5;CvuW9eN;u@ yxuu`&O>0Ynֲ._|y}ǒq'?ӂ?rQGeo0^߮p ?&ˁx9Q6D'T9׶Ҟ>(3Zt2Dlv}xj|}eɌ3d}_~Yaed;(fU25cL,A-ZִGX+넾ѯ_?UѣGkw |}`h+>u-$ C>}N;(c}OyǏde˖r}/KPYbe ;rYoD00\uUJҰn mOChAU͛'?1LL|'%RmaP6H!.@b ȿ_ZUe263fGIǡ/K`cm⋕rݐcЍ7(kKWo.rŲ{eIP#zzI,oUq.p=r%ah ǶhQY`n!Ld0viIZN=0i'BUԣҊfmÁpVR'|}`ǞA~LNԏL7]nm `$y\rݺ#>xϝ;O(sφ{ۮ`c4i|&O]{B{O~ {^{PWjWY0L%*@dFvV52kaZxߗ˝t[Ga,kSj(Uway ZR9ҹx(zꩧtiAfqMKĂ0p?@nJ_z4jRN"RV_¥˝axaA=^o>OL bv@8q6m^Q"ӕ$'Ijcm&W^;Cu >\3(駜r:{n2sL%‹ؕvs^KeM;t<FW6i +AnU ,ia}Yl?I-ޢa,kϼpMN>Ї6mۨ!F '=B[Æ4u8U{|*`}'@V'MpVX|&W_ I}l%Ȥ Ig!0BZatMCkGˏ͛7Oax㍵N㐧,+K6pC-rMP:M !OZ{>hm_8kĥ7Ĵ@st#nL^Id,ly8#6}d,}6ꫯyBAఐR92ʄHA,<m Q]LjҪU+Շˏ XKmQC6{kDWaQx4o@m$Ps%{ɰA(}C" ۣ - QV>´:D ?Hx$ y{ 5;V׬Y+iCitd@?>[2sѲ,`B%[]7󑡞875Gg>~0&oȱJC1(XȹgLty@sX}3q_v iG@`DAN̄ōk 䉥R1t QZs5ƞ2HC'>w8|,fR99x&s|rPgu#/m DRox,OѼGbmO90XRGs3Ψ :э lO2YYv+:GqoAerZ4.d @Ъh,e[~̞0J~qLl0i4mdK ۲IA8Qسf}Fe>}s|0YWiwEŋdȧo޿[FyO?9ӬY@NeGI@ւE+\T}:>as^dXady8f|tGS\5+?81XN<f_ Gw>Sׯ_U~rlnY[ #Y9 U=샂xq@2@<Ⱦ,"8P휍l 0>&~'bL\lF?Zo}VYrEi]y Y9^zFLma`s;dyl.q `E|Νu2uW{o2=ql ,Fa!秠t ?^o .P9,C|pg+1y0s i3aT /2I^z`o /uAvO,mDZ]G?Eq)m$}a:9g}H&+ ]u ȄGǑtX? //B}dK̥3h/琴a]"?XpX GnQ2v\≮=Ĉrı*{9Uez(BT#}N桍q=aG7D= 6ҏ86o.631˞tdXn0นS9OƓ7ᰂQiԁx, 6hD97]vN>MC$wzGM=Q_8a!zE:!k?Gaagu^+GٓI_?>aQC{ ykVgek,~^:cA ~nAVnf#v9ʙDox##&g~. nL/a+OҢ-z,D#ш?d,=QVeDe-ŇX~h)sY9QA ɀr9HA0`e8,7Ш|3~?ai}x!wCpgX׮1ygA.:&u[{Ȳ#^QQc|;#lgeaX<2/,yqQikιQ\![Úrah֣N4щĂnTF~$rxǹ峸98M'œL a:,v9lq|zXbMZ$-%sC_-lnƢ)kU]lӳ폐/Jُ #lk`es h/cL瓏pLd}k.އ@>qQ9Dby- N+sp'rxrey{NxXN9ęؐƄ̤2mI&۹'ݜox4297|;967!mpDm`$oF_[.h% IDATS7g6C|:~< t.:Gӣ疟r8'K׎9~e+3֙{2i@ ɀ ev?i<[V4,I7Wk%36yY^[0a;ә?O돩HIv\lW}Pۻ/j>Nj IDQ&tgON eWH\g\cZ͋8,2䵃9>r [,&o~u+*g~6@yꩧ8f̷2 J8\:,t=pG`F-kqYIJ9 ~xO⠖4!l탓V-[?˅VV[m' /VG5#믿~h?XzbbZXQ?.c8AEʁX/[(&CٟxsJ>%=z`,BqMڧ~*W ,4Hu䮳:k #wz@n~#O\4Pv8#<8Y!zF2w3AI0D7~x5k:h<,d+Nâ8ġsڴii 2{!ƍӥW*az뭷dvHh;FY$ 2F90k7>TCM2EA <Ǚ2]!q 79G: }|;O\c-د_?ywXB0c wGp'k˂VLI"AD0q63X`!Bɂܰ, Ax|bzz,iX~m%G*O}CMiʳ2cL ~,vޝ,Iܞ{dP,^$%iuKݭm۶սi#ks ,X 'h?$s;כgu?5'@Q;GpG 5DI$R=,tdq-h6ҽdV֭[k i̙3AŁu i^a)Hz<y(%T0evd XKKx,nvNYЏ i rK8N5^H /KV_ + }F Vo*8oM#8#PC .kjwf0d}d$#bH Z0.&y׶k{Xc/q U_5l0vGbծ];̓>!=V88Hg?TAPx ]bYC}8ځ^{MeRǞ8-a>˽X 5l֭2R) cQc"'/z!`ԝz@B gE҈7G.,RwBR՛2e#/U@!nӱA&upwGpE?-R9@ QlNg2ALvyg%6y 9ҙ!8 X^_6 ( ɡb @:ed4,K R% 4zAL!IL'u@>k\cQyCЋ}c52#0B[)|1VhK3o7oD&#8#,eA+& k-&T ?jͱIy΍hpܑn*2vn~4_#FʐtX縨>xa|9#85A`I&W<6)g O*Dqr`N:œCqMxr, M&J*,d7VGd,|A[e>!OY&Eay̷}ԄEǷ^.{%&QG0󳒍$ɤPy#z06m2b={n:VAQO>Q]5~*nYzW[8Fq8Z^xL,ZHj;Gp聅mx{ ɋˆhQ+,,wyG Z.]Ԣ \C۽#+Irȑ @!jXlPsGXؘdcԄ d^{IǎiӧOw}W[o=Ywu<źsG> `cKyƍK0~5Ce#"XY`|q\M!F,;SlF R*f/ 4HnC:u\=X*X5"-w5}De9 䙋qA-Q#JϞ=%ً]o&F<_Tڵjˠ 68"}}Gpr@t%Y2bJc]T Frd6MԲ{R]sy-^/X5GB,4C~\,mKMJdeq-6^$%ZkMq3Md^qlV3ՓV5'lG>"?ǫur%Y0rt ˗뮖;%\f[,@̺v*oFԢr=C/qWMa#PpV/Wp*\=) HIKXD};>itqAzO;Gp+>B+rVae9 ea3`݆eҲY, 3"FG=C/)gj9#POpVO.WpFˑEF|ɩuVΈ8A˔n:*~q8@}EQ}pVmr^ 4)H *$?/BfY:T8J@B,k^*Q-#l$Bl"kq,}m a2z isG`y(mSFҩmlۥYH2sٰ!RTF{&GX&Z5[rIE eq/Ĉŷz/g-J+8@m"ݚa۵;7M[IdОLn%HkiӜ'ܘv:#P Z~6*jaqFƝDW; 5yp`qNpT."=N޽k[^u5vӋ3eO*"m"}-M.;#8#Eෙ GWoB8R[8Z3.G?y:+ک@Ҝ;#8#PS&D&WR*oed O%gZmE(3f,mҨQwgeeej駟$ztgS*SmR;v^Pn;yd-C9$.)|8q3fwqo):uƍY5TT8"?i$_vݒ&eH%*.|*Tq860R?/UHWRy)S?d-7nL0Az_TYlۮi\Zjn_A2c%k ӧ+i# G87s~3 'p|l~rGkM7$|2piҤ|J8G-O=ɡZj~&l"?){ 7 GuT5_"vz5GpsL|V[-Ez"p~xl>d$kUaU1LIV2͞=[:,Yc5ܴhB-OvڜOZԥ\D>2F0(Cy9.=sꫯ {\sMرc-QmΜ9z>FSkiX{pZq#<2_z饺\?je|RԩSl6 bCW|6ۥ҈7y!tIL>޽{."rKaG˰8|{1A,80z_~j ,~IQY*GĉkhŊ}Y2|yMx%tl?/zfg2ԇ>ls̗Æ ۩pZȷTUT.#lUIo)˚TPY%MC F/q޳gdH(Ӭc Rr''Y#v&N,>O>;Ԋ6ijW΀# 줓NTT!K#GF;ڷ ˁ8@Zn-W'T?DR5!Xdq42(AT֫pni c'^6g4roq:g2EN/0/N`mzwyeu@Zp20EYްP#.5ʍX5M7x`a{Z\xr!RwV&ormTelXnJ `ae kezpG%.jQ%Ѹe|񹬼YP^ş%{,%N -O_ VAc`FO5M/ě?wܡt1l]n37hou1\A8  Gy5k1Aۿ=gik]ᬜ(u:#8˃fLGA0a3xht&%YK'>a UAKQV7|#-[ңyҝcQk5\/Xv\8XmF* =of3.Ӗr 7PŰ|Յ,{B]#8# l2^l{,iQFh>O $LPuר|aUe8C7JSِ*pՊұ,qlg6m"?Kٺ#8B7.yD%mMM#39^`[o Ǜ|Bk /\pf8欉êEo p\,by79#8+ !q` Qx,UdJb-ҥK3Vl|D f )Ef^ 8_ 9s$}lX r\r 0xeQR^0~R {Hfl{ 9lQD9Q/ IDATL/ a ~ {l1\cۮ]v.{wxLXg!tz~ěGp{Y <!' @,~3`7KO͖*Kr_ ):o=bMt-sFDfij^'6U:V&lE+t֬YoX@j~Ah-{<'!t5,;eӷ[i]h\_*=*玀#8@.^41gstKw|LFO/kǵW sy|uZ gq҄u-^xx::֥%?rsB KЇ5 kWuqԆtk s8# `t nx0x0H-EZl2FUK2o#8uYˆˠGpGzR~l.8#8# e/pGp"dy6GpGpr@V{fΜ>a.e8#8#J 0h)+\r%pHGpGprNٿ-(_"pGpG`!dma%;#8#P-N֪GpGXq8Y[q{Ɏ#8#Tj!rGpGpVNV^#8#8"dZ\pGp8#8@8Y"pGpG`!/-_2b9rY7D"<0x|)(Xgp;RYN8o3i֬8@m#Rw<`7o-r!HӦMks}Mv.FZD'3\쁴e :q<`G`oJ#ry Ȳ jiذah"oI&Z ,i8yX4|%"O Y+ Gq`k CU|if9dVFZ1KuK+Ǽ[i>(//!Co.2g~>%_oX8ZEz]VrǤ'ׁk_EE"Xׂ-Eyk_) ˩ z9@yio}Ⱦ+BiׯkyHN8QmB&>{-;찃\y1(i[nIs7ҷo_fm?L4m%:VTRhŁq= Qrwձg 6B/  d͝# |BG2j(-3ΐvMDZ'|2Y(+3?0N?ty睥W^2wܤ?܂v믿c(y 8ØK9]v>ZHꫯqm[tnF8pa'Oj]69a{ ~:93'}hxW$첋-s!/r)%𵄣:J IDž2\h S<<쳺^{Ƽ:o.*R\\H"=WZJlDƎ+k@ 4X`>qru}/ӧO״ɬYО^[l,soW\)Oųx yt>RTT,sv=+I;#O\Si*{챗Z,Xi(r;rwJ}4_^$'.iևGTsiXom~QL-ymG &q_'s?|]az)**nAW_}u葅 :TCdX͈~7'_~e%$3ҪUwy#fY^xAo 7`m޽^p wUW~;7I&׭[7i:[u7}z^'/0cǎ)(iޢqgzB wK˖ Gyӱxr#?Yg]ҥAi:ቓ&`B]M Bx꪿ȫ"7Ŕ:t]I$VoU 7 ؕb\Z~aiӎE᜸2%K0ɢpHӐ??[@*i`%^:$ HVu|<3O!'xZqSqX+A817 "Id>m*&SߦM ٸl.](!FuNVpN>y0cJtJaC3<@ؗݮ][;ȁUK 6 osqGHza9 7kLy믿NZݼIS?fVP(qu}k/5\3&ckcnF5+|B9٬sʌ Ը;ˢwxz0ˀvS[dѩ8pc _gu4EG7AF#lKdO2L;fՃI,,Dxcrx R 5t#ўU-ܢqpU*f6v?P>}`iֲuٿuQix,_!-k{ִ?G`e$X=GzNX.qtI.?~ZlFvԈ1/]b c3+B\uKAf^U* c"qoZ^qȳHX*ٟGYޡCŖW^yE/satٜ>88LX69a;'ls*ag̘ǖ$XbfOې!Cd[\}Gj9/1l}`cfҟJ'O<W@gxjNρ 9D:qC4yrc*\9Е/˻N!d?Z!8~?&ؔI1U|+"F-Z*]lZ,kMpy5 Gury7#WCľu¾ʽj a+((V%uŖUBo#3x[uހtq0n2@(6h#?ś8Dyly2/D"U02K^Nx8lg/ Auy Jw~]&kw 3ʿoOT_Ibhx{LL#3F [@/îRw@Й XkٲX:&n䱰-ÚXX߭^ 휵,\̫A/9, `a49EQqfzE.?+MJ}K{_rѩ2Es|JHF]Te:Le3! Jfs?ODLvǢvQ[M'a.1b꣎q}tZlJV>[_!hyB%a"m\W\.d%I p0IӢF$]cC&^D8u\a.NԈawy7ʷI_91:yqZ z%.O͚5Kv*#G\>roKgNg8.9'k~\pˍ8VڪZ=Q޾+CMI2E+w5ȆnuemD  *6l3nᆱ|}2lذV >|xDpuוKNd5H?d9Cd„ 2`L3Y>} @:#8)Y)ߖc=6YZvqGرlO.֭>ɔAɜiմ 5-q+iz%ʊ1C=T1>5~i+; -Z-Bk/1b 8P{oa@q.y:Я{%uz_wu۷vM/]koΟ?_D~Gɔ% /$럮d¬m۶:pS<檻9;蠃wCIӦMmen&܃>(W\aIrgHeΜ9rioL$%<8@y%ܹsaNL6-q$I%GK]?BSNMeDXH,Z('Sl"L<*ox묳NN%D X@}QR#>LB.]$vyDT4%“f ~"L~=ܓ8sMU"Xl FΝ;'Da"ĨQ 5)kĉ@z"Rq][olgխު:D *O>Dea9Kk￿gW]ͤ׳gNUW]L%If w@w_"X4_χD 'x"kbرzHZ",k);D y7]۫  de'NZVXAxnP+'O'|RXR[$wLR^E?,#:gF-aȅUYث&8᩻VZIAA?)5mCM#Ӷ@zE3+}駟Vً/(v={h3{pXΈ"r駫e~GUw3pՅe R]q6h# R}駚7S V_YfɺZl//j5ba,8vf c~0L-~G}T]tQbvq ͝#8˃@d^ llff49`Y'GIˣ;wNeڜ<ˇ?~˶n˝?tOY4O. 2L*miy_]j"renje'HXfi>묳Kc'SB#{С>8ה\Kc9M[y;ukEx>6ӏ,oKGyfK0?Owm3%X.W[\M|mv. <@R djmIDAT8?믿~2OG)9!k SmXV\aCӧOׁ.:YvmF$-,HXzPLT 7tibaiDQkL\+B0G h=3XxyPT~CX LʐeV],R3&΋Xqy ~LKt|4INRҕLiLeꫯ$K?^oOVQXЬ^fMwm3B5Z`.,*1e/?NpX9#EbZx1 x ^" v`J !I!ff7Nt=q7ڰ ߇}J_پt}7={~%%X݃fӻsZs5ai#ꇍɉĜK.lROzZLi |WHײ,miy_~#q饗&D_uiѐ@]=B^;} aiL uf[xOhִn:a1^~^o1 }P#Xvt}7SU@Rl^>beʇp { _ƒ$-]I˄r׌{~k.ݵTPu CmoxT%%5e辔)L#R!"A֢/ )f.j T!:7O^zTy*?aZ{xt.%޸B7z-}S4]0klKK]˖-u*LL,C]l4\6Դhv0`1KO%C049VF Mo:?U]^_]͔i3-,:MUXY-GsO/jKqz+|l!Mz󱞳ggjօN!-kǵWkE@D@D@D &" " "  V SD@D@D@ X+Jn" " " "P k>E@D@D@D B/ŝrXs\?צZ~kֻw浃ȅܛeUu Z0g*\ful0/MpGߟbڋ}}m9ߜM,rrX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1bnX={)W^eFtD'^~۠oIw#~_Z闺E/ZL-}mރ^^_%/=,-;yTʋk+2\Z2)^zoUD UVDFvX H{n6={vYIvΝk.eΜ9ԩST;?-X`)ˍLD@D@V@ihM075x`a#hefҤIھ6GmMӧ_o/uϟo[okd/$}vgώ;XRz7ZkeF#}GmEBp#fJԭޚgOguv)~;iӦ[oew\ꇩ/Dԇ~:CՋm]裏l7jv<L_|qzggqBaÆ_mJb "~-!{>O?M{m6sL[[mU.>#lwu|_$ѫ6_砭@'0k,իr t1^mĈFԈs7۶nkW^yeZoMn!C$G̸:.Y?zx {WkIo̘1g P8-ܲ)F4}IX~d7n!@3#GL\0Xgup޼y)y%qJr};Ӟzt x9S%טSKp/bތ]~IrY裏Z~aÇ1JF"ZY'q~vM6\z9ܫ7tx܇XjikDO "bDcH/R<䓩5EDq~Zf !گݻ7(16hPE|\h{aGuTZq444[}AqD^{m{ュ[nFӚkiLER_~IE5f|`#q_$6Y#\ $"?cQ/n&¸&FL><3&>Dve8p`OyMYMX#Ak8LcN?tCt#Bo [ô+".?:thtgLL<Ӌ.jɏ5`/e?6=k~$b((9sL RcMBkNg}6g0b=^Mk_D@Dc@=CInQ(i+MbpDI=д@nG"šw9YBjӚ,@!}]'UYj)!ʘsaDؘvcMO\EbZbH^{-Et+S &$Qe&b5aDXǖW0Zj1{[$~?vo6-"qfmR#gs `t5m3US%>j+" "; 5EK~idm[|OZ6kIkͪWMWj|>Sk70ONVqicG'֪K`A䌱R9e=s4%΄zΔzy{~K1r~Sq^ui':'z- -mG[rJ" " @PC7qh6q5־[u#/ ybj1_JJ0 lK#5Ǜ+}q 747l><q ۱y]\ $cqĔ&"@T`gl;l866Hq̴a?k1KsDArs޼U/ǡ$" "qj_X"M)rDb͝j=͵9}Aۗ@.־=vŷsoVD@ڊ@y|AG]ج4kٸZvQj/npbX+ퟯtuҿ(<6@3~^ߺg1c?\p)+p@E$z4. 6tMTyp-Ni%eFY`vKBXX#*p"Ɠ<1Htۣ-[c.WNN`i>6kP- Wj 54aDT(5^}`Co§]mҔn/mShN{"|u|[g@Cz5G*[(Px(=l|p[lAg~ŦήsQSgjXl, .aY\! 4֨HQsRQ!Ԣm.lq?" " " " xh_A! ZBk4bF|5m1ꆏDD@D@D@:+)&N44T.ʹeŚwP.b3LkH/" " " \7Ra8YIXQyt"ײ᧨ԔD@D@D@:;4e/Rbp ӡm#@g")u 5Zk8yCQ-ټL[\3|߷voi[HyfrmE@D@D@DZ\b-66h@[Q@H"$֊PԈZ[(B@b%@H"$֊PԈZ[(B`CI:IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/document.wflow000066400000000000000000000160641362112712700325070ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx markresolved "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{209, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/000077500000000000000000000000001362112712700246205ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/Contents/000077500000000000000000000000001362112712700264155ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/Contents/Info.plist000066400000000000000000000011711362112712700303650ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Merge... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700303165ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001112251362112712700327510ustar00rootroot00000000000000PNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGņ(+k/W]]]{ٿnֵ]{/ذWD@ޑ=y\.%/!呜froL6-!GpGpܬʕrGpGPyGpGpG pō9#8#d#8#8Y,nWpGp'kGpGbeqj#8#8Y>8#8@#d-UsGpGC8@"R_ HӦMp\NN~z-yWޜPN]Zʮu-ymUǛթ-To"s {/#` 6l0i޼ҬY3%iyyy j/[H7;W(1Å\!HIW\Sɳ.>ggLr7hӕN|\uz!@[[_pfVq03hDcǪem}MZԘ0&IIίcA;Ӗ EKE#+KYGA`k\/qK_ssvZ3„X7Puc^nFr/m3ݷGI5HoXICcu5yd,_ͦp]  lYjD&bI@mhK[K%GMih2- ;o,:PBֵ`a ~~QݫrI=I&'jF0}+돔[TT,NͥUs ,O,Y,oq12k֜Џ1JrpuùWN?nhZ o&K.]ր4QUfΜ)?qɢ6eΘ1C^xᅔe_TT.]VD7}t+s'.OrM]2N/*J`Z %ºu&W\oG.SH$(X▅;IrUdjU4iEո|٢ _4m)EҢU+yor 'J~[%EXZn%GV֪UˤAશ/2>S={tA+ᴪ=g:4 Zqg1WՙL!CfaUU[MM7TLsmNBYGM&%+8aE2iDYdc})..*?8X.Jyc_;mskN wwK rA.\sN~k:~F+z7dHoo^S__ОˊKei _'l˵[se`q, YZ$!]BߑkR/^;ѾhiĈ;$G9&͕giE+/ɯs'L3[ȰO.[  ENoyEk!oZ'>|kYڏ~;W_o!q},{&}1qZ[=:@~2f̘,J_Aiy:׿{,2G,ζm&fbn4iva:Xe2aS՛Pt a 0Gq+}Ѱƅɏ"/yKUJScʮkL};\?t( $=8|rEGBEg$&ԉ7°5KsiIX 2kdiּEȫ<({p,-*ҰeSYld;wޱK_!2rQQGdAv9b`M ̗/~"MCuɂ"cN̓66P"-5; P/ݻi~B7[$os%tħe M~y_!u߭_IF! ,:ȵhB'n6m㏗Ç'K^;SZ)zI+ԁ8>d6Ȯ*}ywkK,ǙO ?QGUa_~ErnV-N>Ydz:K>Cō!?q^+2Kc2'- X~}W{a/9s>#/ʈd;*fU25cD& AΖ-  kZ#,Q_~\s5B4h zAp| M7ݔ܇oS7|s2A~r!ҿy|,~ Ex"aEF?zk-󽐇 yQ}_u-oC=meo(r,}r 73CXpu]'˙a)0Xxirכc#Y,ɔ@ִ.Ih?>N?AqR,}YGk%˂5:G ,ҥG-eBzȼܴڑr:X!1ks/kz_myСeq}o }z->@_L0/d`m<#oT` XѺ G]Ѕ RȀ 6c|Db^0i'BQfłm@+)#v> 0?sR^cϠ k @WYed,{*qճh+¶ۀ6iӦau;C+]/+*/5J& EM`-i"X¾/͝t譣Gek,k3 BslÏ;°O-i:x(z'tiA?a~EŁ -ViҶ̜5C6Z6趎,Z¥˝ye6^ҁWÂ{ý1|.AtXx nx !~2q/:vW^y?yN4Q^}5yŗdQrUWTyA*<,Qh@$#Gҿ,p Ro-(O/>BتpAޕ]{/T#Ȩ]w\~Twp"_12wy۫u?ayUK&Wұ\/5αN1]veJ: v51LX8+BfA#?B^&Bt|%U9LȎ[#?V0{Qz)kq)R2wZ \i&q@!^GBg^a!П<8| ^,!ȰIP#( *K)4]?6x1Ql~RO4 )u>C5ayקIJI'$뮻ի̝;W !hݢ皡i[HYhߢ0IjjC儷=~hz@B BJry^x4| q7sW_}tQz衄401#[4ټ  D8edX 9yd#]Q87gB.evI8y(W6iYV\ش<أ!]nUf5Fܛo$!7r^cY6a9ē4C2ڵoi>37n/r#r9j>@Gi?pJKKVخ&laoJUV7Iado 2`a@H>#LsX6lґkGˏ-[LadMT'q,+ˋn|mM9 P2- >B_z%}Zx^pCj!:~`2E8-'xvA.=7 >٢~A]qV K7ԕ =DFnL^IصM"܎Ƀ c8p,\sM̓ER 2̡P`+"ks5y1~h~&mڴQyȱ 5m'ˎʡ?:D ?ˆx$jRvȋŭ8|E6ҹFҬY`ٛa3|dlia7'Xr9LKAOݛzGf>~0I*<`!瞱t$h8G8O8!X> `ML'f]gu R)uz|:F(jmcOa!;XD>yi:9x&s|r3ȇX@¢u(q4}!,uyKy-((:@%:ɟzF X|uiCI+Y d! *O,ِ=65ivMzy`ׄsua|ܸq&?o]4VcKȚ:uZ,Y'?ަ׶,eY63Y+5ΖIAVUH,|h;bY7 krZ5 d@Цh,e[~̟2N~~l=0i5o6V!mfyȕ&aϚ,Qq&j`$H0/X&#>|2v;ə-rD> /1GȞ86VG~ YNc0|秠t ?7i8s5>8<98k™T /iix遽=첟ԝ>k~ċ&MRmz<0b$,:d£w 2}kniOؗH_A&Yt̺t*KtXȕ:ˑ$]9DӵAnݰp $_.Maiۆ]0s|;ƷkKOXG|?Y\}ka)tIodoSdɲt\iE̞,ۆ=l=.li_Q>YYKf\ab}Cčt*yer(BT#}N桍q=aG6DY}ouq^!U[u631˞tdXn0นS97ᰂQqA8 I4,;' t3)r-=OѺDu5ٖ͇߮,Y^d\bD~%H>&qgi):Z%bib cA~s9Xۤу|R5:/X= '?eSGCsVOpR$#,j91̬ xRGOyoutқ˃o73, }ͬj(:kÄ?sF'cnxQ 5 ҿoO` b0u9B\Zц'\s C'e>>GcQ5{unaG%Af$_h4\p4K6 } ܮ>ПCzE<őЏ |%tQ_+GٓI_?>aQ#=魮VV*Mgmunm,^9C*A ~nAVnf#v9',4,ፌX:eqfrmXB\TA[^0cr4 4 V},Toe64 nCb,?~ToFᴹ9+'*°230P.q6r͹7 ˭"-a6isMq2=>' e1G:b2dez!FJc/X}H y^A?t5dZ>+6:m-mۅ_Bp`hP\zQBNh XHpb{%ny͏דrav.H^V-[Ƞ ƄoM \&K{ qm9wIC!ϰ"1qЏʲq1muѺXM,eX]v>ѳ`cX6,k+:pzYX^[:x;dOь/ɍZ>|¢nuQ몿G1sZLk~|0Tk?؇.>[*:D'[ di'M,:đ&IXvNYXxnל,smɰkθh8.ץ\ʷe뢰\aAՠYP D)G^nHQX"G,߽,~<;xb贲mP@8 p-U =iBfqY[Y-0 keq&ҡI}[>Z8u@GMЀeo@xU|ZC;O!ư!}0uay%Knf69cږ,B1;, 9C/&gr 3YM^#OG,Ң#˲Q]M~]`5dI )[ xK*sC_-lnƢ),GKbiqm6i=#\S&i}5C[_ h: DuoL&t8F~s'rxrs-4u x=kG``gg `gcC>2<tRhH*Jci8 !B2!\0G7| IDATg6C|έL>}sEt.*4vG-?p7<oo4]z[_Hw߳V:T 8LXFa`gܞ3%kPgNuUYk(Jezo},W\[ߩɺtp?"%iRdMVC߳_Ԕ>Nj IDQ&tfON 99R6amI[{M4/!kΑUHVAxu4QlUSzDk$ǗA5\GpGpbc\tGpGN֪rGpGNpV'0{!#8#Tzi.6IqoU$7tM5"<pGp`P54u-)~bni'wbdALoV@6F9JT=`o߾*%KGjjGp$nYKBQMemKKL*iL35y+|A}=>ʇ2wa8q,1B-y5Dykә.Yg8Y\z>&2iT&ҹN;#4>|Z5ۜ /7g8/ϑ'IKAg9c{K-soוWg~&zy'8f*ҙoer+<ogUdᎀ#8Ber~9A,q6CظNZϵŵnZ-@F;].zk=A?sj>|~T$w+{p'|"~Y%T'A 'L?N;%XK:l0]jHD|W7\/SN?>.!;GpG:8YjL+ZXQ?p;駟d-T, er#nݺ)裏d[냅ꫯ uǥӛ?X92Y.q(t䮻k {̘1ү_?= 7 '.I(sGXU=#!-&q!*ɓ'˼y,tIñd/P̙J!~8,:cO2g͚/<g͞=[ l'8i$]z!OQV7xCvq$994X( A(6fGooƌB5Y8ң?,Q6x;vʀF@>aqcv4h[J,!櫂ad;#8UAZUЊeR0s0)'f "klRgDZD !BaY+n),>a{7kz!z,RgeXrիYt{!`d"zCpVVO4ғ禳/^ '?$s;Eu1Fz~'&GyGp"/T9&e{ Hz0IvnX6xcK!`uj۶,qϝ;Wu DYX }&"KDb(tAFC9,.A~KĒ\eXo:s±9`f9C>iC'-שpBo{Xx!,V y 7z y%=l[ar@8#T?jml, dD =k6CA4!Im&^( G$rAuWȆp5J]q СA{H=V8qϦ,zʃkT 1IJFz_yM.:Al {YraC~Ϟ=;K*>4E s@ lԟȅ;z@zCF!OS "}iCڅeXt'/-޼ TLƆh5spG(nHEҙ2bs:wE+d]vQa7 #t6J>cP Lj:ed8,K)B% 8zAL!IL&:>G:KrMGӣB.Q0ÈnS& cꍎSTo+L㛼-[PupG g*h2cڃuI:cgZslR'=Fuo*GzȊx^!ŷi:#g: қOaD+&n[Y&-?a#¢- gq3ybb'ih۹']Ica6l'̝#8#PdI=SXxR- &pqv9d8 g/DIYMceqmi,|A]e sGp 'kD|&zKi7; A&5\dR#8@=!8#8#'kGpGp'k#8#8pqGpGpVM 8#8#'kGpGp&w_+ 8#~cFi~}Coĉ+Gor~?͏d6շb^#8 PTT$Ç߿ꐶѣ_~$~8ـ8?+ل>hJDL]Gh|06mV2f? 0@*WU5J?#Q"p=h92l2#G W j~ 2tRy뭷u]-j5:8#$aDʱc&XaUAarG1ƨ)SɓeΝ;6fϞ-ozS+!yu8@6 `cK9&MJ0~5زAYp/E5'Jd92n쏲.o "l6"aäǦK5E՞\Kq#d gXrJe]GhXQ`te2}2iW*9ŋeܘҧOx@>s"A^KI)*ɕK6uTd8@] ͝;7aK .2GHc5jL[ P4-6KCi&OcCL ͛'z )˂yxY,.ʕzu:%CkwG>0¦cӂ էB^#8%y wJӜbвDz]$k*c 0ax>֭[˒%KtsY&'Ӱ0oiTIQg'Y]3T-a#P(Y[pwGyzkQ"7- ;'_t/@xv&ޤMdf O6B.>tͤU w?GFllpdÈ_ Ų0,_FB6PrOoq\1ѣQArj s,DZ68e@dO@&rdP`q"ֱcGqx<0 '̝#8يP2#Ј,)%πKeT$̈q s| ȧp,AZ48+#`#O"\UKltؐȥ_Z{&GmZ8֤"l8YbDKسGwG&q-ݚ'EGǭd`RhO}X}{ $UڊknL_:#PlF~6.*jaůDM4tKkGp*GKE懣vq%TFr*(+C%6H"-9K3\wGpG /sO")(7ޢ\zXpDydO}X~79XN@tpGp[BnGdz(kUY6a!Dpl^ΑVnIXO8#8@a_OȜ_N/ ؖxzְ҂kT伽suڳ8WZh?ڬJ?GpGpxԩr㫥/m_{]MGR5#j+hw#k_՛Ȉ-[L y$,hvn>:u*_\x_J#+~ǖrX 0r3RaysEcɓ'eܹxbiӦtIxח-['#6(~ƩHy+{2%Y/${ܔ,x?Nv˜9sK[^^4i$]%yqqrꩧ&^*ٙǯSi"8q6(oF^yjCKZh>L0A;8Qtr_.]HӦ\4q$i䧟~Ҏ۫W/V?!UTaҧJ*!&~MTa㗪o+¼xY]ό3TfѢEzL4IL"{/rY+li\ZjnY7LAdJֆ &gVF87s~+N8T6pCo裏uY'^['oQ>#eӬY3㏕p?^x ϗC=jZAɦn*?)ku]'GuTu 9[n8#d~*a.Feemhn:R!Yu TduⰒlrgZkUVj!,jQ Yz 8P,Y"}} 8$d_}wyGd?^G[EK/սotyӝSNer̙Jnv[a!+^>q_Jq[z!tN&upHf~d]wo9iʰseX>Ab[yB ʤs>kZq`B{_r%j ,zIѴUs=>4SN+'yN䉦+(6;~_^ͤDx }/G%3S&(61"y>} LF(2Hɽޛd231qf|?; K8`C<{ XX1a:(k!TT!KcǎF;ڷ&ˁ8@ڶm+W'T>DR}ݧSNYAZ,"~m￿.bat.;׭[7:B52ykF]w] 4rge[Z?y!b,:k׮#8@]"`˟V&5#hCԢ6Ғ@+ev)'c')ZQ[$Y~ɐ:聥+h!Aoǃ>X ~a&,s2|Ayz+3nO>Li|/%!0Ahx!&bd.6pC-\p+C5)k 6Зlȴ2cSmi!Bp *ywi'%hzZ9zGpz@s]"j'_|-feJ.MIJӰZ,Je[Ӏ[o=]FO kLL JFlbez-<#>5AXܙ|,w|2XLO#fЉ0|) 8dZx\ƛnIwsZ\)S tѣVYq}M.Zf,lZU/FenFZkIwξc9FYW]uUҪg{Dci7kpñ왩x5)+Hgux:gT$nF Wm8ۈɲ','(e:#8 .sŶ ̒%lě泰Lˠ 䰟 bJM?|A@ kXl3NHaF%pqِ*pՊQ06гGY̚5K~LGaIR"Ē:LY:^`6l Ǜ|Bk /{z9,qYUΥ߀7/hYn,sGp !q`aY8yVeQXw )тaì$#e‘˹Uq>[OR@Ndž "wÇi!'plaFԱ |@e*A\ IDAT^|E}Q0,ak8#X`0|6]Vڬ.Xu8#8#g#8#8u@pGpG8Y&ppGp@ =ks o}.2GpGh=Գ_{ʈ?xa+8#8@] p3e/*-ʗA+8#8#P8Y?dGpGp*EZyGpGp'k8#8@8Y"O8#8@!dGpG'kB GpG?^#8#8"dR<#8#8@F`PZɥ2f;vYM6D"srra͹Wgn-&'hTsGy)lG,Yx7%77W9i޼yMs./ tٲZ$7qxZ&<e]$+.I̩G˹''?48{kGy!V8TQjOQFɲedf͚X&q&ïcU(ȕ9?pR$!>WZN8gGת<z#Рyiwqi惒1bl¹-sQrbB yK2?D54e?&ୗe^Z`] H߽zs}.'7,5+8uK|H ҥKeuѻ`3ȹ瞛]s 7Yg%۷H7EQQtEK2yWNLXzƌ9c'Q4EO=Gj$(=qT3TLRAM/*JȒ`]c37u"+O(}E۠4$- DdY۾s;0WdpjUP2Â5Fm⑍H.r)rAɱ+lb:sL ߌx;C-ZQ^A!#%%z0&Tù&>@iUh 3X)ś5˰@ 2j*O/NO*Z, GAqY.)o\=7_& k@ЖIHH^?]KYdI:@tAVyaᆱ\6lj< kU]UѣG˧~}YF7iD}KQKU0&˞{6rWZlJ>CN<1RKX<>~=?)uQ( Iu 2j.!]J&VOyeִҬyOWyP;, l)4ERll/9@ +l+v<#5#8"/y$fO}Qyw?SWyd7q'{OxjGq1{~W%lܪU+ig2eʔdM7$;Ldx#jgk^6vI'閜C:(H0H?.1vbf>衇٧֕K7Յ j;aAg˴i4yy01 }w5XPVt%)`v[}m^u6#5fYnOvM.b9^?,_r޳C^p D<a?*^{mr?\EdV@ږHRgؽ&2qDYkbEeokF^={-ZP͛/_r`{M.2y"Xt.k)&@] cNػw/%iG~Dؘ :k-SN=Kz/V@Y~-ۥ//)׷쑥^O],cB d cq;E2 iYcsr^ ˣ<V/ >ruk=i!F#GTj4fD 򋎓/JI7q'?Z秂?~b ڵol1{2qKC0D6$wy/ |Gi5xU+q!oMCFy yǐϿ ڶUx"y7eF<=|tN Yd֬Y:|sq6M:E on%zI z)iӦM|[a[~aӟΪp<3grw<;okkҡa;K/Z_kz^y,ktԿs Cmz'=\p_~nꇽsTz)mCg􆵏_˯ssΕpc5s)(i٪q'=yICHw%Hm Gyӱxr#?]w=޽aÆi(6Ga97oʇ^ualޤ|[}z?$YW8Ը r5n j.zsљؿN1]MicnF5+|B9٬OzIctFY d0_-[ou4E!M1(a 3иIoFaBs|Y&9خ[6ˑ6p E#gd԰ʮCxmKN@JJۣaXDZ53wD/l&IX|sE8'X C!Cp1z뭺~cUl<9fU]ѼYe.k8Ų(7^xo˶?Iϑn޴riV W髕 j:#kȧ5x"au@,z=(iǧf>U1ih'#NŁcS뮫4:y+$,ot0P5l}I^SN0A`i#˫38Q?Xkނe0BfM>8٤YOcn4 -3ֻ(?wYVdl'1ָ!1>˸9i$]˄&OV!IFXjĘ駟.D1s̊D2Wټ#,'ckWlp1`8oy7m-/qgۑT?X #SN-/!_>es*peft`19>6rr9sؒDKi1blY}ksy ݃ c7992 Ƿ͛?.=lg_"Su*|50 !@qɍry$:#CV̾,Ze-l䣸2a3f|:xv*9@ L,ѵnZa,DD7鱰ÚXXMT`tΪʼDZe.U@73]X2}!]z,X 00@NA8sT\~Uh(g \їԇNe_yϔ,>MuTBj6jݏ-sT"9Ѡtl6DNfz6V,FXn5Of/h@BW(#l复rE!HZxg$R韉%kT<7;74wfZkl1u<|+-<#+ Y3î=Ws2-BJy m׹x wp~[]*y)ոկ&^3(la%_,9jB_e< mؗ-L~ph:Iu Bz\^n9v`,:Z eWyvG!|weۼ,,7[@6# 1} wD?[, DŽ>C߉? CG2juMYH$k448 6_`յ#޵(vӶ٥:ny5r(M xVUA:@& JgڜG4YM GpLy)S<d14pGpGpV{#8#ḏ򔎀#8#9Nr/pGp g^tGpG#pXjc{)GpG&M`|y8Z~tO>Q}Fta#8#,B>ӚE%꺼TWUu]ު-]UC:Z52&d G.ꜬrYg EEEʩy9ꨣdɒ%+WQ\4n*~m4HϫZU-o%R4RT˃zG57oCƎ>'t/+WP̊z#9Y[s]etl֕ʩw_9rdJVQ\TJ6hhkWR Wp0z뭷tQt"kVR#F!"SL!CdY//dZ##Pd'7|S=$r_~NҹsglqҳgOy'd]wwYz)8]{ꫯ_Lʴxy[H޽Kȋ 쳏=Z۵k'-[_]_@~8 6L7??_uH+/%lZZ]]1;C=OjҪU+r-e1chСCe&CKwɗN&@۷,]T`ek*,{dk u0`4>Ygu4ɓ#~W}vgW(BEY{ete6HLt0y7po>vM~myK/MƝvi2x`Y`r);$8I'sD~87 .LD~-&ĬY'Sb LvׄDXLx b&?d3g& ?裏&-[h"HD+q$I<޽{b]vI:HS"#MK'=z^ѿnE2)~=x_~`)D @2 .{Im{6DX"W9`@W`I\qo&q''N*2*[h斎㫯R ӵQE1?}cIQ/Rm۶_9@#0qD?G"KΤ&x|k2D< B.oq^cbUJ_'beu 'hOG}Z*u]V.L>]q cIot1IU2x>,a]t<3uܨ%tabAiY4MqY<]V$%`Ӿ,گ*[%Oث*Guٌ{M0AY&$`Uԭ,A.Zx1 R"6B'/6 R6'6dD^7t O)X Xپt1YG'$%X݃fӴsZ{a"?t.,H]Eq Pʌ֡}ZVE]9ZP/E]x!Dێ}_oq*vfda/5yE}7̰</h?do_D-%,;gUٓH AݏYY,lPOKc"XW dV*Fek#B*]*,oUwy'f$u6zTPUpV$k91TGD&<1_FO+ݚ˭'.<ο⋴?70saX(oo&<.fR^:yqD* F8⮢xuuPeyC,L)d8{>@h3fh|M껫*3]YS?X:cf^Kxj\!\APu~Q:]2JϞ{)}YybG؆"VpC=aOregʈ_Iur:6:y kesXGm22)}TR4K_QIW-/ 3WLo[Yz#l]dA^Les|26GVGf4U2itTNe>Ep8uBfriRK /'xb"6e V`~asG @֒L89oUo[Gu^&p8#٧;#8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGpG#dw#8#d7Nֲ}\;GpGh8Yk8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGpG#dw#8#d7Nֲ}\;GpGh8Yk8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGpG#dw#8#d7Nֲ}\;GpGh8Yk8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGpG#dw#8#d7Nֲ}\;GpGh8Yk8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGpG#dw#8#d7Nֲ}\;GpGh8Yk8#8ٍnpGp9Ny;#8@v#d-ǵsGpFF#8#8YqGƪj3QQ/E#T*4|M@bk_ND@D@D HUE@D@D@6}};*' V@$ֺQD@D@D@ZO _D@D@Dkd&O\TT=W=LJ2h>  TU" " " "Pik&D@D@D@D$*SU@ HU X LU%" " " & ViOD@D@D@*H@b0UT@Y/ŝ6mt۪OD@D@D@>% dh=zX%K-1l1cLbʋ?t#~#g??>GG5c|koy^X~,,LET-_h33/MȠ?+A_k56`T_#G4 "G^}t-n3YfqSB,F >@?Fi~,)]]b\_Έ}zr&L0zx:^xF_~&MJe[>Kvm7; tpZo30^^cv6X³5rHW^Iako%6xx'|b~}sϵ7̙crKWtJGyq;O>پdzdJcO$cW2{lj́N8}468aXC}9#sEC%厲UtO2%9C^$ {vyg ?O{XE|wiy=N4i;' >jc7P>2A!!s|ˇsHm=`+^fKB?41ڣ ɇjG`x x;#\SQ?)9w&ss̴ _N:f"'flKg>PcזEXppcu,klڍV=툿L:{ZmM7eB2OMJ[܄cp :q  @yvl^F4X?.XDb -c }sa#Lݱcsq]\Kę<>ru6(SG|釂@!PP&Ri2A4'ky԰:skrh&ּtD0 oPy[yQD@@V=h9LRXcr숬kFWrWvdAB2Ts t(y"p4&Ur5Lhr3KWkcj6d@˥ؽXCg1֫3'Vxyڷ]|zk" "P)soucsӪenmmtA|}?^g>h^uG_ˠ¦X" " " " yPiVsb>iŌp-X#blF]ֻiGۿkJEhX$=y7|M3 5c?:bЦX#5Ak.}o6/S|= HT;S;}bƒe|f[x{*jiYÈXPkOlM/mShIWb~:\^GG ^RJ>+JJ/5h9=lFC͞WrlMYD@D@D@D:[Ć_d Yd#.~y~}hQsVʣJ52DPj5]$ ?)@pO{jk @C!*+֨9{ڢ׍<mPPV%BMhhWsˊ5oXFg$֊\D@D@D \7aYJX#Qy4"O^5)T;4eOBb+pӠxl!@5pݔ;:kdh#![y" " " " f~ڱ,7Ԗuj'PJGeZleu(." " " ":¯G" " " " D@bY(Z9GD@D@D@:Z'W" " " "Pr()tNfE@D@D@DkPR$k^͊@9bCIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Merge....workflow/Contents/document.wflow000066400000000000000000000160671362112712700313250ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx merge --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{188, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/000077500000000000000000000000001362112712700255035ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/Contents/000077500000000000000000000000001362112712700273005ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/Contents/Info.plist000066400000000000000000000011731362112712700312520ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Properties NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700312015ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106701362112712700336370ustar00rootroot00000000000000PNG  IHDRjNUiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATx|UEO KERW`Âem{]]{_ 6앮*]z' i?Icf3g~3{_ڜ9sbb0 C0 C!^42 C0 C0<Fl !`!PC0VC;2 C0 CC0 C0j(FjhǘZ!`!`Q1`!`@ EZ S0 C0 #j6 C0 CQcj!`!i@ ŤP~71c,]T4h sҼoډSwdHFFٞw\Svh"{ HU7nXJgѮԦ^ PL6:.HѣQF~IÆ =AȨ-͢oGOZ,]:tG'߱"-2+ʉ17{Y2c|Nn=3DZTbG͟vңzFZ|B_{B85m(Le[›ɓE[Ҙ,& k-x\Bw%lw8A8 ߥr~vaKO[ʐ v-'5VS񘑞.QloF}<3qF 0 xԖ^NMeK57L:7|mvRPP&|? P~]*&K%BקEO{Sr]]Y՜eyign2/ӺIff}G˗s:o#)Da82!V@{̟Ѝc̆=Һu+\d)q]w8uQ[]ldeeFmxy`7org{Lsܹk%?ia:%L["NȋIV3tGbnSGu%7?Fl(ϱծl-eڂt/J /_B-{m*Y9ْ٠fKMQГN~}{Uy:'_5k*&M$i&qA/2KY`zാ|gQ{Q [,c2p8թLaÆM*>[m̚5+ʪ3\Յ˳>#K8aMŅr0u"CZʟcu+>%Y, qc\~'ekٲdx _@(t -s.9_dA>ǷPP?ڿ︾|槽55L{C|Zv~Lr\/,GrOU9maWҕْɓ'.:el"+Wp,x7n<ħ|IQsii2yN2caitܦr|iԸ :-rkƧ/6`fmeo߾Oȏ?(lˏ#_ӿ;yw%+zz2cÛ~+[ xK^Kyy*){&->TaۑMEq5ET1L6M|z+^\'Q>g? ܥ3 C#(Q#/4<-WS>M'':X[,Lwˢn3rS2LiبgɈOȁ'+.#nYyW05i Wd%0S4}k%#m`<" ڍq:2]D4`|;rei/gʲevp8Ȃū]}^'˵Kk׮E>?h\X?%'sǢ*8xGUw3E,jbRj 7 LX~gkܸ1v=Ȟ{)'x3&?h ̵ny fD}A k7eo/{챇|Ẇ~(XX` N_A_W9cK,7}toswzO:$;vl K{|3d?lGyķ|'qL E-6{:@:-KW\q,\Py};L첋]iZ/ž#ՎaEsqonAA@/O:븗nO\[7o=_sE|,7a=F?~߿#WyowדO>9җWܒ(rI 呇}Gn/7vqdɒx ousd 3-:#_>S9E/>r*g˿$ǽ"Of-w9⮟d>Yܫ{ʾj3ṋA,jk(No|O>d9CIs4~΋/Μ9-&f͚?,_F$͔e5]Ӿ}{D7CwSk%ӛ+c٣GyLju[:F 帽>8nrKP=O}%mիs+WyM7z&8/qcGf(^Avap#c+/A:khG,? 4cvKO-0+zÏ~_%w|7 zC{oz$>\3~hWwΘ16F#7?nl_|N*O?n#|,b!↻K_?I"}ݷ/[r$bJ8_T$@Y,eV.ɢq-[y|D1WC<"JwoRHɗujce&O>>jw LfLx裏 =cN;M:u]-Z m/P|_䡡<7Af8ZC:z4G\f'B 2Q{S}V B8ƛ믿^ڴi#ݺud<0Q#Tټ p$,9+dI#i er>S{ ‘˗,q*x"nH;na,j4'N=4!-[y+2e_d$7acN:Y4Za]3{M[m@&,\88 RNI+֩z|ʦŒc&Mu@rK8S7*-nrozk^dDB=qfiRȈ:K?[@ B*rb†~l׮/%Be e:ԡKO_094Lٰ=1NCYL c-i޼-ϋXK-"^w(6k^-(}WaQx4i辉GkroMIe7{5r94Ɠy825Hi#0s\G8O(=}H;j{PZmFfx㍽ĉQn`:9;ԱcGoecq!u׉8|,/8ɚrZVˁ.ZNucy B=!iT}!,ofe>6@\7JtT9? XV>6޺uG-fdt@唧yi(ǞuW=u"\K&ÿ9ŧL00ćrz,UAد$fϞE5ToՁ.# }Yc< Tw bee;e5B< 0}>Br/m׆9~ei G2eG g!!d1v̟:^:RZ ۬a;%Q1 R19>Neh^ė6iv9eOw/}?+Ӹq#GL3Sb*{r#jΒ,Bdx'z}a|EH`e&/_x\<ԇ9DxC'2u~;i 80^VqWUUx`ۿu0:`䉅%A` T&p7\Xذύ k.M7[94`z>Ka9,-^zוsz[R[4N;Y%Dҥou0qܹX 3tԑ6>K,)2=Nl0 ՛0\tE>;,֏8s is#3AYyxeyi;c ,PqKӦM8:[$yˡ29gcܑŞG& YudQdh0]h?q/>L̪t;k[vkHM1&O^;L8F-y:\]96@FF4͔վ#=sp05?q!&Zx$,?#}jnsl,Y6K-)YItY`lus7,E _qER}O=4_4}%{H)6jDxo>|rBRu恍({yP/ [:T;_82{]`"z&č'~XdHb 9SѴ0zHCHpFιsa@7՛x\%Ueky QҲT荥UoMII$W}T&NSmzK6i:rUFljt+VǩN4]i^܃as Q*+ЗJl!1ژ^ pDMBor\?C bnн)/^*s'5{CJ8PIqO*WA{/X('^lԩہ&nӧd:W,]zdq}#Sem}1=u졯99=ġw]s4}ƑbXhĩN= qE6>({0k0~x%\k׶j]WU}jy^7bJ@ ɒ}. HCiMC /v%"O,ԩ\Zց- r4^aQFy4=hP֯u)6anC`<~7u#x\83P/iz$̹WzVeQɇ80 q4S=C{xԑC`iqBƣG.0c}iO1;GXGuaUw53RЋly4LZxs^8-r\t k>S>ʫ Nejk-Zƅ2>|0oO dE1 kY͓(8nXxcBG]Z7wbL߄.l![ehٰCU_|Ck:τ--eqaTsZ^raZ_]Ek*];9#PaM!jd̟ ,%ցO+&a|ZpiQfYs{1fI]E3XbE/Yb6f~0xۚdAJ+jz(X}zP7}@{G=|`0u7"^HDž|$EjS_+9pO:xr2uům㽮m("6nܼs03yɘ ;7pB(ZDJʣy82zIWkQ?TEhYhN52 }68}-:G-ì! C+ʥ:st~&h%/\ T IDATA39PYKBYѼ{ky<S6Z2o/Y;js|mt=j%ci@ЉɎn8קTZը }:6bEXNEEe&ģwi1!IN͗("Udֶ^EEcD49@1d:܈R6:'F栟9/cd ˒8YJԭmG婌v*Jpֆ^QIrl&b!`@@<ة!`!`@0V>ܬ!`!`J*0 C0 C|o SL5W~d%`i!`!P6e[]#l͒[TV޽Ua7~Gc|27'`N*}R*[O\jmUYNx!`!G,jq(v·m&IIJ$ϬYx'x^H#;S:8iPeƍ-x5MKEe+ө.Q㧕4iZz?*:鯒LU&L!`?lZ9ɘ/7e8/O$KA՜9 Z4]å_WW~*zy8*Cu=ݺuY dGyaDA Bw/u~4wR믿ʶnq<_!tœ>̞={`(1Bh;.ޤ}2h BnNcǎB=E_o߾ v'2(G #hl0 C`}0V`8$8j9 CRp3gΔŋ{жm[<|͛!%=oC l,c , 鉇8N6/P&Q}XĨkԻ+K@Nu!4#X ;v,jrs CX#?RLou'ɓ'{>h'.7zlv('Khyba C0 `D,hy!LLI<8Hy5LNL8%!Xư@ 6,b]m.\ڑ4,r#Gh 6 Gʠ"-Q}ZHXcG;>:Ug^tvjE#?yq:rup"C9\U՛S<>W43g!`{1!X҃`p@CH'/N깆l~drE>O0`|ѢE^AŁU aB/ҰA"6tSa9zOVD2ò)˖RO,ϱ8r?T[!5qDoB>0u־ F~L쩂t6cKT˳B,jGv yB8&a>KX 4l޽'c(dcIC!,r!_Q9êqcП~a) 9K7/`u#/P@!m"UMq7 C0RE>x*R@I$u R{7 #I|-K/ #oH<(L GI*D4,J!B% aZ $u*M#װ^a~]>>#N1"/I9Řvhx|פIԼ!`eA /?V+ByJ,j - 2Z8t|x44-Z_sͯiG˅皎*|8tVBFM~%q ӣi3g!`5etBfDD x@!ɛt9eEDyI'h:%3LZ#M늦.ѲMyCee5.2S͟H!`5E"EIYgl6ť6f!`TkQP [!`!`0K1 C0 CZ0V[冀!`!`$GZrl,0 C0 jEZo!`!#jɱC0 C0{Z C( N:ߨo~̞=-0 jE m1~H?H7j*7 C3fŋeVZ5-_\F)ltٰ6 C wL"8`) ~ ƴ1 zĪK.O2p@F|Yɚ4,hF]Jʪ7` 5 *G>ơ,S  CnTyǎ%kv={ƭ,E~gw:7BdL0 JF_?x ɓc,{BXxC0JE=IQYYYkʝw`)IC_-,BҰq#&G2*j C@q_gڴibu*Ne@ 'U+r)ofܼ<ٲ[wiѴ2+i C` jzJ?=Q㦦Gi C(z/҇g@5b'.wִ\iѨPZ6.M d2uT4h (|idiv,IӝUuKj5g熀!P(Yc 4ӳ5w2g@MBC$O&13ӤMLi _6+twj׮4jH>#߿7;z뭥E~m3EY8+S~[Tdlص`M~0FZC0  i%g j.MeGOH4÷SsFۻgOhQѴh8Q?\ ֱLѷh,Ne 638#NN~/_44T;U? olvrᇇyH-q.CnݺI2O>ޡCL7Qyq6g_ѣGQbͳVdDyũhZ4LDqV(6Ѱg'јǮDDc%Q\m?5Ŋ6m̚5Kzh[tODϜlnE.I$oڭM"P> 1x`|Ѳ`OЍs9oӦ#= qN:$ꫯ4(mxrqo:[o>̳oi;{9uTy~G[?зsV[IrɈ#dƌn馛c-.w9#;(+h!`T7?7( 6{ W1~<`>H//"FmJb2aqu ْ%Kϖ 7MzijItմȪU䧟~zlQywO>r'zK|ۤazea8{y,Zj%W]u+{LX>ySOmݶLm瞓-[ʅ^L!`U K…E/Yn62a„uxc.۫}J7@g._!jJ~(&jM}<+%:~pReRKw}%,aFݼ@~Cei[:Yg%;5JӲ{jOT^Q_{$+B@QƏTƂ]?J+N1V_|E^B[0$Wcu cVOv:_d((N~ᡕAX裏\|Ma/Wǎ}A!sK5a^$Pj@+.++EupOرc}udy'|̞=[zXQ/WGTΣmJLʯ=ClR97 ZMēylÞku̕'NHۧp-m_cŜKɚW&P1QӴqƅk+VduUQFJ!yGlBA^%u**J4>O?>yvWqw頀# SN/1`CX!-,Nc̞~k &h4A>":ubʀҥ`d?!dc9a J0ˬt%o4p[.3 C0 ]z]'-$k i\~=jtٓHPT͛( |@԰Q%ax%w [:qlbI]XUob=F%oe Y7Md,d)2dߨsg?٠A@JSX6X~f~}т%I3)Xyࢋ.aa8X(.dyqG?4i8/3 C0 GoոYi >RW0!`bu2ÊIKyGe q670G %S8xH &jQELX֗e's67NW/?Kba*9p5NkH9C0 C& ið9@:Dm},iE`7GUQ,/3+-t5!`56k"jP]`Ӝ!`!`@s\R C0 C0#jUa!`@90VЬ!`!`U@J{!#> }C0 C0<vm,R"je^VA!`!P\6m2<:N|T^4\.p@EKigdҰQcϒßO8W}/Zt$>+P޶& œ9CXz-ܹ_{gY lw#|g?T]y$]_?|G'Au&!fQc?ό3nI}Cܡ,=O8گO.>G"gϞ-toC'첋\}q)mod;ou.:Xv.˟qcg#CΖUy._LV:ڒB"Of-w,5s!P={ʔ)S3}dٲez§>h N;$#FO@pܿs[֭wq>of-?}>|2j(ԩS>O{GnyGd>mŊxֵ϶:rUWbp~cB~ >nwudgaϞ=}G람p|? :TƏ _禜[dbchVy+ʜ4aUp_|tA:O?LnW@EsJx?ŕ+;~P@Wt (~kҲE OV\!;Rv׳wFY!sʇd~œ3iY~w֡^zYNs}‹/HsCSOy[y9gոsosvpW~a{u9&!fQcW^y_n-"֣Gijg ka\$%ݻK 7JsX<5Qy:m"]vl>9]w~tMv#nE^> oLGg^#\x222Q}}sH S㢀x‹Ğ:'c֋Ř,%iZȅ$rq1ɣa#4tڅDХkᅲ,24ql%f~^Ơ>՛魷*,D"ٔWG{[I4iިhc?.GQv]$>?:VPu7U $iC|C x-KV/  O?-^ ջۯ@=i9{a J9g}.iN2R(+6]v_!]=#xY#ǷD5̖ ;K8p0Lk,>ÞDYӎOq L:=d18pcԩ?cC1Hc@-iAT@y'I,,~͉T:+73-DV#s=M~Էp۸覢b! wEsqrJ g9<"A{7=P5t}h{@e"j(4,CrcF/1Vaqo{i2\*D-Y7sLo 5y7pˋpY%eqܠYJXVdeclB6sLOC@,F%?y'cJQ+`mco!|y0t>ExiYZF5`=')a.\$XVf۸qd[H[s\MC*sc7692Ʒ/^)Y~ٴ^CI'T8`ιQ@t9$66bIx#Y*r0QBE6vXoIhx`&mDFOAܮꪸ<ڶ./k֨Yz\>ráErɓ#cc'ףhooB22ynh\!&Uwq3 \3; [l/81s?ŲuT@ H$/0Oø7,y =sl $𠭬Jm^dC6|s9ze?7+ȯe9ˡF]4ⰄKϴ4Ґ9uѹ0ہԲV%y鮤9؏ ad#m2DUj6x]aW>D&)>]ݧnX*FEǥ8-!0z! S8q{+Ӷ:N˥s-NSk Sf VIzN?U}S{͗;8 sSƣw!__DVJ{K4_~T2In?q3R$Chxɀɜyef͚*C BǤM~,k""#q^Wz:_eN"/2s*xx`é9,R,?+ )*,a;+Ķ.+R/M^yҫry2njq6'JhqW'pBXQIT}IrHCli䬝>Qya:e5]/6 Gp#6-ܯ q{;QsC6bU,"hPΝk(;SV+Ǻ1u|\N!P)@,p$xrח|~ ,WܟSqL8dMsB{~8g9_bb}pɧ\"S*׹4kZ8 Ф{k8+dit2oLQj$9 o^3 :sE*W$jdjR',*/*]7>mq@uˍx7f;'uKX!`!`sRj8\9IFgB3Zue]̓txI%U<&؜TwG@e!u1$ nRCZ>0VV0JC9i]^j!` `sR*(YE i C0 C0#jUUb!`@0Vv̬!`!`U**1 C0 CT>hk!`!`1: kQ5~|0L!`!`5iӦl/S}<j-p? ͏WϊDd!`!PT Q/+ i^W6Tu}Ӷde׷ Z|#P}~E^e_2M!`r6c 9sR渼RTD}Çc=VVZN}%j+(^6o}( .`YU6]"?xb֭L}:%E&f@YrvwE]T剼 Ȋ &$$j%z\wu曇Q~-mX֪@]YR%#ʵz,6diӦtA6px5ƍ?\f͚%Æ 4OV\) dj!`TUJx9rp q[u]}[?v}I矗=Cvm7y|o,?_?^L=֗+{={'hH7|ay"2i$߲eKiҤ; yKM#ѣ;0_ڿdcrd>}HVV`s 7X]ICi:%D1cko7:+^ǒ+m\8^%GZ2*vgʠAdҥr;O$̵2Y0 @`XlYMֱNΗ;cnٯ %;73͛7/b>llձ?0zc@<}q۱gy&֩S?s1Gbdy|'qzx7ĺv}csK=Y"nbO<;UTYb;찃//ǺtsDΧF+VM2%.o}Pؽ.s7,sGHImŌ~tMc!7l33Wwq׎;>_җ?gtAݒdR?zɒ%1kb URu>-@bq]drp-ڽnHNlر^d2]W^r8PokѢ# C"nĽNoq<={8Pit \*!'\EԜ , ~Ԯ|ABw8pw}7|mIܹs<-z>~W }&.,,/X9S<-˝wsO>40`mCys{cBUbcvM7.r$%\_z%O¶2 Cbpzs6ƈwV0kni2O>9D~'ץL#?Yc~{\DXڸ&Oz(Dfycy1g}W-"oi!PNVeKO= 2D7o7خ]x!Kc·LԹ AOfsNN\RZ|g%gz߳D=HFF<2xpIH$3l۶KOӸhy4=)H&+l׃c9"qOJך'K4SO=UeI?Z::#J$<,--{;^~m%IDATp]M CFE,tlsΑ)+H;V.,@ŦouleS67QDͤ%M(mrKСCͿ|0qDѣX+ό<, ]h7yA#9CH҆}GZO8od '`0 z~b}l" 8 xdѢEd^:(ɕ6v|8A^Pa /lra4z(i\'%5UI[mF)>?ٵY>d&S+O[x!=9Q#!PYjtsKdҜBӥ}ڃof'RMMnLNɜYDGmhyJ8%T0f͚ybq6`Fh^R:򶡼UOf,eX%QHsFc)вZh쮯Dr=$*qLE&ad9,.ѸN|*OtA..n/Z*YC`џRd?!y2njq67:1D%e'뢂 kLjϑ+baLٿegϞ͇ňJ䢓2{[[QXBJ}a=JDD5m(o}Zo̴=|r%c^0~HoiZ*~tRf}eFMz Q=S M6CD:'Q8Q}KbI7g@20pO  掐X6RaJxo*@ڷH}I_(JF ,GMըU]`?9IʬO|e\!s}XeM=s!`Tj,Qc?9C:Mp[uYCe usC0 GJ\5M!`!`#jϭņ!`!PK0VK:4 C0 bC0 C%Q%ej!`@CZsk!`!`Ւ25 C0 C!`D0 C0j FjIG!`!P0VZl!`#jLMC0 CQ}n-6 C0 ZZQ!`!`?տ>!`@-AZ-(S0 C0F_[ C0 C `Dti!`#jϭņ!`!PK0VK:4 C0 bC0 C%Q%ej!`@CZsk!`!`Ւ25 C0 C!`D0 C0j FjIG!`!P0VZl!`#jLMC0 CQ}n-6 C0 ZZQ!`!`?տ>!`@-AZ-(S0 C0F_[ C0 C `Dti!`#jϭņ!`!PK0VK:4 C0 bC0 C%Q%ej!`@CZsk!`!`Ւ25 C0 C!`D0 C0j FjIG!`!P0VZl!`#jLMC0 CQ}n-6 C0 ZZQ!`!`?տ>!`@-AZ-(S0 C0F_[ C0 C `Dti!`#jϭņ!`!PK0VK:4 C0 bC0 C%Q%ej!`@CZsk!`!`Ւ25 C0 C!YM+R2 C0 C^#PaDmv@Z C0 Ch󀱪J UD, F4ݬZ&ŘHlQ=Xb{X^0jUcǂ( }oޜ7o730?ɛ{ws={wνOS&D@D@D@DJ$ԪR͈@ HU*PH5#" " " & VmjOD@D@D@D@BJ ՌTZ= *T3" " " "Pm-zIovjOD@D@D@:%I;=[$gcc]tiE9vǷ{M7oP޽{7,-{WM_Q1G׏Ɓ_?jIjPVX!/H6s9/YXlN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:]P.b"VSSk={LӜ@$'|_/^~)<<yOGAߢF8#_jjfzF5Z$hh.̷:Uy(eůFQ./~K(ri.T_׃x=eU"ȣ\^ǯVQMD@D@D@j%'޳[nKJnwΜ9+QfϞ:ߌL:Oӑ+zTAD@D`) xs)ۭ;ƻkC{ =[53'Nxk.L=zf7ٶOn^{ֵkW7omv1+SjD`_i>o}2I'p,9;0۷o2?}vJ+ToAD@D`&\Djjjl=믿^{m쫯jveJ_oE]d=]y6a;sl…M/$p`7G}Զf7-s[x~lw~<̆PZ90Zq+v<8(9,#:ӛoi3fHElj{wO>vGG;܄F$"u7'vg駟nx≶{'1lڴi[oGa <&b-U裏lmM6$E6`4omFJBɓ=z!6# G37nܸTok>j]vK\pADZkezC_mJb "_5! {>[O?Mgu6sL馛oy*>c`wyp _$WkkA[M`֬Y֫WrQcDs=v]wÍh/o.򴾌u]gN>3qu[LO5iOL"=ꫯUW][llgDDJ1c!3bĈW_=6Νg}vD&sO;'Lw}71]Rk95"4͘}ޥ^+5w' oHk[o=tMݭ*E 1.}9pvLQ6ӣ1h|_mE@D@:xG6p8- tsmQTjf-nI5p>lzjkЈ ZLO"O{Z0GrakXZ(>1Ǵ(HOw5<䓍Vƅ9u=$F"Ĕ%>r6=-}#^{/m1{_mlm͗PZ"ҾX,K) R4B͝ j=ͱم@ m7ۙy DO@|T-@g" Y.&g9$+ճƶZTzo9&~$Ђ2mJ]mHvI:Nr5L2DYKDSK+ 1BxhYHֽk1s6sNHOlP%nu\[j({h f* +mE607+^AOPo^tؿW\S^D@D@D@D)f% x4ٲg%cm?Hh)+p@Кۈk_oo}]g= K6>Ά"*/" " " (=:y5x-4c9BTQDD'y2G[`B%j[]үw+@g&;h'O[hb[XlϿαumi7ʬRF&55$ k|ݍMܭF=%.kϳͳץMICy4:τRu#њf kS~~Ŧ،5TcCԞtz-}:Ё w^_k\9B (iѶj# ^GD@D@D@:183DaAsB^Qш0-F`@g$V"E q~EӼ^)PJZZIBE@D@D@:3k&_FV6<8<ˉ4jR15\5M@g&^e0"\jVy.ּa:tau2,\3ΠHïPoeڊ@G#z-~s 5oJv/VD@D@D@:3rj?alCy^\%" " " " D@B[D@B!@;Pk'VD@D@D@*PDH" " " "N$ J$*R vnE@D@D@D!=~=wIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Properties.workflow/Contents/document.wflow000066400000000000000000000160621362112712700322030ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx properties "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.000000:353.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 446.000000, NO 0.000000, 447.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 446.000000, NO 164.000000, 0.000000, 217.000000, 446.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 599.000000, NO 382.000000, 0.000000, 618.000000, 599.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 618.000000, 408.000000, NO 0.000000, 418.000000, 618.000000, 162.000000, NO windowFrame {{167, 102}, {999, 676}} workflowViewScrollPosition {{0, 0}, {618, 408}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/000077500000000000000000000000001362112712700245565ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/Contents/000077500000000000000000000000001362112712700263535ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/Contents/Info.plist000066400000000000000000000011671362112712700303300ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Rename NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700302545ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001105411362112712700327070ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxUvEETT{7Xb%v?1Ēb{Il"bÆ i;y\.>Dzf?w̙33;ѣ3&'B@!$(iRB@! ""kB@! h5ዣ ! B@dM}@! M&|qT5! B@! B # ք/&B@5! B@4aD֚QՄB@!R!xd2o~2ejʈh" /x~e.{o=Omm۶/@#Sϛũ7-TM-2Up3FDm֦My睭u֑67qmlҳ #ppBϬ*كw?L?]i#5>j^B+t=|yx!8 j`锔XH>؆-kk֢ƀY3 r bq̵7۬lfU82%63pAx&~H꒐^blMyĆKKJ$y̱rm^|9;d8P4<ސNSҥiЦt5TfJVUU8"Ã\Я/uҌMYi-"״`Kʳmw3%/k>-oڡ-[>7׷H ƪpBVj3fLg}84?l*ԩ콯l~+2k٪U.K/>gy `]:fWZ>D}v٪' {}omկ5qkZмkדǯk;C ;pl< \'G7[P]%_c5lԨQ67Vz]H7nyYdZ6B\R/FLť39֗ʊ9GUEU o {-G}9k:wlewuM r|Bœ? W?HS~Ae򴷩i/VVp=gUV@ʃOvnuڔe63#3‚Y;6=ĕvngӧOd_4tPlͲ2<msKq-l { FXٔluֵo~b;ڴm,-چ|s__t-RD l`z}ᇶ:IJb? {Ϟ~iKÍu?, K,k xՓw}׾0-lRVV66dy;?8yޅ:O]<8;uUTX(ޞ#F~oL!:<v3̞=;Nk&(x+#﫯fv/ 01U+Cފ@u*%k1d7d/G^ ;lNCE )q#ˑ/4Տ>ϟTU WkBhOyekd-´fuI" Sgƍi۴ ({[mN Hk: ̊jkڵYfE’0sGx=}ғ$&G@DdgVC?,?߰VK`6eGS&٪klpfJjer.}g{Q/{SE?8.\ ģݯem~L rm۶'Үjfm#!Cd rhi =>Bެw}8fFmd[o[1 /`X`:${_>Z}J.窫ygˁ0x)ثqlw؀l-0m+/33~Xw|umᆱ̗B|%SO ⵉegy&(zI;nw?G' .ɓ'g.?, S峃e-0`?]7%fA~ry؜0FM |kxQGe8ŝv)b=8?sM\HQKlӬ|L9;6d[n}lR`n#-ӏ~^ryF{':5i^z}1⼿/̓> Om=ZkYYp< <0v~6aI8}~J>믷uEgS^7C;Fn.Ţ3z8a/~a{1|qw}o{.Cbйcޑ#GF@֡C/Sx2}ԇ5RM:]og+ 9O߸&|&ϏXnfb$P#z2=~k?8B wq 7;Lױ͚UL>#?a>vq? /0hgBs^G r[IkAK?,]b~DXtYе&vk G]5d&sΉĽ}oxhE?l@ضv[c0x/IX㏇iV9VF S "JqzK2)XZJkaZ:5Xmcj2vay ZrsRt=ĩA^nqȻ-7W/3ж[e6vOrlUiZtgiM؟Wl:jXq~{׻ϓ|o]V1^H!/{!3`wg'_/8R&Mmƒ5 )ɚChe_70-{?̪c=>ø߲SO=yR;kK/n)B3k7bN*z͋ڼx3ϴM74Zgx Oć%+rLb)o~Xx]xᅑt@!-% IA:bZ2RqX\r d[kpǪZ5\ӖYfksXe?hQDPFrpI`UA&q@CE CQfH:@YC>`Ty}.tF>#\5Q"H6b={~7i@t y}YKbZ-Kv@8q]bb#\WIH]C⚤7Tk3Q[mU|i`@cУͱ<׌>Jk+B׷6qH!x'ۖ</^+=)@׷" ҡpZݞ5~iªZZҰ4| RI8?֭[7ӧO$Duꏀu#"VXe ;ʧO_fwݢmg#PSv=pR_nf^YyםA$X_U #gX~+"?[kc^ѹK(oW_ AqGst|>ChE6a:xQZuu9dy~t1خ]lW_=։tRtUW]5M9<]P:] !o=Xr!}mBtNs?aAr1p@c?X.1]H6RpG{)H0y4]XM:v 1}0pV˖Cy=B`285v[2q0"Xńr9\S\cn#C=q~o@GZO##pyGY^yAB=r< _2sG8׏|=אvGPo>VxXpӉq_~hqybwz|:(-ƚ2HC'>0`YcqX4&M8 |A]<׍| \HX-$^_H'SX#Xy) 4>Ò:v&eЉnd`N|mmk׮Y+[ d!7T꙲!kl%OapsPO80<}I;W_}34GkX^/~JtњPcɚ;y=@اE}? r^w r)fd;yЇUR>/ 0׎uX_> ?s ;>^NV:9:KنiG}e?|<}m8h?;id[Y ۡui8JeX}&}}(812_Wm>;++eC_u6|3m۶ 䴥6ven ;Y pr!NO={{Xbއ ҽ Nw8oԉ:¬q(N믿no}-V~W#7Iܬª AA8  Xʘd] ?P, 0%E<1po[J+8p jr>|X\:XW6!2/sύ0pv2=6Q4A"~UV^:&X +ra,Йv!CYG[ȃBX( !d=4qQ{ow <94yaT /2A6=6uAvYO,m$z]G?b##"$}:9g}H/ ]uY ȀGǑtx_ OXH_> %YOt9VsHZ.Saj8:avmS/ /r+πk"(-[Z6 Ǒ98x.O\Gz?\?#Ϟ֭Еn??Gs{0~lpnְ #v̀E~Er̯+>2~\:s{)/7cV"lz*Ceas0/m"nŴ'G:,6MCe?uDk9^;lf3gmH6pя(zzߣ^qԟCNtܛ;G9K G{!sv&>E y5佭^V{n[ݯj=b@~nAVnf'~9˹$ox'#.~.<ܹ^^-%u{x%,G#DtO,&)\|HO֛A<ܝqXAy30P.i$̹:x ˭"-q>h&8gG2Cz1&B.FdBu/duuuz>/1~ݨ֩u~ > сRw`jHBs5'm'ڸSt;)7|iG4µoֶ_ojXe{!CKⅸv,ϱ"_cA?d=ۃ\DzAn%Pi$\ɮG_{h-r9?<ù%>H"9sqIsq?N9ǹuxy3.O~o tK~P ".T5,TgAHTŜyU6r7OؔǏgz8& :?&IhJ ~P?p-Uzr\8O#ί+)y_{#KE8y]Qjqw8|^ q'ۀQ+foF5xSf!%_kcX:ֺ0”%_DA}pK}q) e0>~9󼄓q|zXbMZ2%%rEu9/ X ~_hzT)뱘}q lz̚I|n”lp}ݥG:.)#?'ɺx^O|}J9m#;I$ㄓey/nnZB"8rq031 3j+d|Bsσ瞟tw~{.$_Z'ܩ IDATe8jwSңiЦt5T! B@h׸T! ! B@\B@! ( "kEY! B~hApXD'tMXcM/F  !  6,^Q:K~䃘zʻU}]ֺ뮛-1H?? wl#yB=`_mZ9cƌbYOxM! @YֲP, &²+%jQFMĊ[o5QCmY8i. :4Z kV6PdariBd]/erj+PBG>݊B@%Y5g@ s$5qId!9n]v;,~o =\%ҽ~Rd9y{'c:\}//t{ёO⅀B`F@Lobف_o?|<'qPK6I/ {Z G} 70 =PJ 2$~Ts+g~WQOXGoM<9zBez2]o?[d8*/ uq!mw}{ŏ:Q?o%oԇG1{m|Az[oEܳgXS/=ztl{ۙFmM]ȳ馛F]//ʧux9 ! "k@rŗǙ*Ud Y3& 6le!To?0anŬӦMq{w$2,s֭[$KX~E e& s zC9$2~Zq;/m֋8 e曶{GkJ$XZ$kVlJOA>uB@, "kDIcmj!|' Q9&MBc<,dy;6CkXq n,dǏ7 쉇<1"NO͐'WyX(O?moy$ہ V4B'i1ͱy7d?1O?A <ǹ2_!q 79u@ ~too>l$Lx~c?B@,"k VJA"AD0q>3㘢`!Bɂ0- +:%^!Kgy&Z(O}C]i2var۷/Yw1!dBAH@!J8/L){;tצ!4νO>}>Hd/Y0]o'FyrB@! ꋀ69e{ Hz8ґy^?0>V[-%@p:u),qO8198NA Mԋ4,eVZɘڣ!0&k Kzi=biב >v!:An ‰zcúƆ2u߱@ЇlLB^c y8}:\o,PB@ҳ:z]b Y`ɉ!yaCA4ܡAﵭ1PLձ8HU_駟Fkq!V]vy76 ,Ǣ<ʓO>j!X֐Gv2cMϖ ^,g䯹暑QwJ!T|h"Ah?y b7d1%?kа.BXF;ualʠ lCW&uq ! (}PrnyLAX]1j"] ݑ@d>qq&y\Kz )'q`YN"p,qaL b Ir:4\\OSڅ^#?#dן2nuJ4]vB@,Z hd^a 13'9>#Ϲ-tN;ҝP%ӐK:Lҝ,N242N8,W.>NL2\đ9o%u{>1"zԤ%ŞNdy.'_! @}e0,g x'R9G-RO>'EnIK'x>⨻˥ItҨ?m|?̗<>(f O.DirN:ÜCqLxr< ]&I*!Oy.I%yŏڪEu ^y;WB`Q#O>H6?`E]1/ 2dHmdAiK>>Cl 6D7^T]q~V%|Д|?*:!!i׷/&Olnm|VA9Q^ jT܂YZ,@Ex̚5+Zn9! @S@r<}jw6~Wr6sL{g#Aݻwes^\BU! -P><(D ?B`Q#$O5j9vi'ѣGbm͟iǏ{VZi%[q[+C+'h 3S-F!*:!"ɟSU6njV[jAEyF[5ֲ=7VsMN9,B@4xq`Y/cƌdMK&,‡q0 :e,3q*/Y~,||#AXeG*康iPpE\|! @1H>"Y8qbƧbTFe! !g5jXno9:mk*km/]f7> &Md} mlR>ĦWfkv廷S < }1/X8aϦ)SD(+)ISg-OV-*k*[k [}[ܷ~7C6cƌ>L700if}S+\VjvmέeMkr] !dmԩs uTB`nǿ ͘rܶ1zunt ll$`r-7&[ڋ[R[}v޾Kgj"l~B@4E)^IHa+mj\q3U|ۜY>}쩧GЋ~֪EO&Z(5@{cUO@VgZ}求Xnl77|2Ѓ>89! @SE@OzeT/!#̨a?)πŦVZ5\$̉is|'h"5 j!0?o/ 0ONqN Zm鮣F_IO9rB@@˦Z1K%\#WDZf¦j+iUp1OsB3G;E,B@45MfW6ll9¦/k_iSXȉ]ۅMsxD , [Z!C_wOO!ҝKgֳKmһmKS* a3lYPW&! m}"l4YKD;[X G ! ^XiG[w6YV62uR'YoO~0nzn<$Ye:unnJB@@`JnӪtZ:&jӬUO&u#l㔙fQ/qv]m:gEZQ\'k=<^$8ǭٶk]ά]k4EB@! |?1c~ifsmo}%|~^'YCק/V_n IAs ! B.~9c;A[pm[suhx5~_gJ۶m6JB@! f'6m[8$kN\io /MܲO [nd)OH͚5fϞmm4eԁ:tѹ뚖q}t8E W:,csћ?MɅcNKc].lyUFicƌ'ӭcǎֽ{{+kn>>oq֮M|r~O$komVINRx?璁r-6aVZZj-[~W p8p~^YYiK-YKw!Gs\e¾xA_gL2%8;o?={ZV\.\qQ8!?zh/c۷'G!l|ds) ilar ?ᗫo+O?ɚ[iӦcĈ6j([k|`ߒ@jk,9ۤOFAU[T4H;m񑴑n9?=9dBW J:O2$-flkXč3F둫|/x≶&؋/h'pAJ 1ZH|r<=ߎǩN.l$/˓<}.ɰ:QlS{9zY'uy0`@<QQi u/?S Oō|9 ۜ7eSjۜiIKƇ_~ Γ P[ RrM7e'Y'v&M<>wrKcǎijV΁# 쨣\n=C\5voW7!{챇u¯ND!S7|s$w<a}4(667PG⎶CNpad}!m%\WXa?xȝ28~7v'R5 [.$_! @1O/4!jIK1Z!pINVC ӏ)ֵkx`J;ZHPm='ku! RAHGA~@x]z|^uq]{qbV< ||ԉ8|) 8tzt8/ֻN;-Z\)S a:>3Zze<_ǚŢ?O;3̖ 2q˵rr bF) /Yו.Sa! D|%-j>%/=UU jX+?dI~s͚'j`m'/czP10P'M'މx]z]}[b7xcj'nw}hg)qX tG}tAׂn?V:֜Q'uc8r B@!0au$ 6OK9ar|(3N`|PuA+=uwB=='9=hͺ⋳V=c9v&6±VǴgnVX #Pi9>gT$Q Wc8_ɴ'-7([:B@˻ܱ7%-IHwqyA U䰞 b5OC 5j>&bqx<& \Z0 AB]X.c=kŸq/3X;E;;)JXvj:a.T˱umQ\/&;E @6q19,q欏êEo8a{<rB@! C|㺑} YAZԻwg -> ArR1KZ</p _ڰOR@NXdž "w94 IDATC Y9e!'p,aF-Ա |vr@x I rG}4nT ('/믿>gc7M];8MaB׉rB@! yg/@0,] {+$"|bϐ-U3>]m{T׾ꒁ,k +ms"7O'?:H}饗ұ2I&)".czjy[>홫~X򘞄6Y{v5ئnw2X!)+WzRVB@! b13cR|]~xhxa,Ou nYWB!.X+ΟNg@Ǻ'Y[xq q.Tpl2Od4>YXr|!׍s\kB@  Q鐵y[YMwzE7/jϧ45B@! 8+|1]"kPnZ0 *'B@ԍ@OwԝMB@! @@d( ! B@zlB@! (Y8qbxŨB@! IJB;?s1,B@! (g>&?΢4 Z'DB@! C@dmaB@!P'"kuB$! B@,:D*Y! u" V'DB@! C@dmaB@!P'"kuB$! B@,:D*Y! u" V'DB@! C_0Xt[/Ç?ժU+d2@s-b)<+-]wX i;umV?Bиݦ84[ 3XII>֦M礯 "2$qxk b =v*ccf9KvmBiF /@иTtU`SGQf/L~͚5vm7kݺuAPx.q2%6d,偭qf$Xe;ہmnڷ;ɢ*UfƥcmH4TUUСCmu5}R7/&䲪x]~Z {ٶ;jUWgu-X؂_Vm;a:YjC@36qڔ)Sl̙ǻ`̘1gQ]?N9ҥKA:)***gϞVY]9D͕%?=viyr%_~g dmrO>9b+ j5}ZEf%Zg?g>y]|։Yנ:VV۬KXH\GNA`a%*|a/FcǑ=l;6hرc[nq| yZ6mZAy,BF9* ֓Ot¯71&ӣ\'t|=%LB#ا>]뮻 s?W[ʌ GyeOQn7\~QC7^qM^g6¢Oٌ3 oBnv_Vyl죏>;S=$ bkv=r낺Hs{NkOe%u͸(Ǒ[gٛo0sQ8He˖4l2HZ^5cfO=ay w5Ӧt?cᫎzKÓb\nbH ~t?/.K/rZX¿3nFm=aX5SϬ֭]MNAW^9\\}vw4ۉ=;^0B]}%׽<{饗_ޚ E84e=?C$lܾ}{mgРA6jԨl_nl~ftA1AfϞ0sVđ~m-acmuֱ#<>(0=J}!n= ` d^ 7ocyH㏶6#7pζۅ^=B9[n]yYyn{hoPV,/O{s`+Thux v3_us;^n"ނ0]w7Um=K/ͮMOv`)// mV<6h) ^3nw2DR7;;,Lö ^|ɮjKoǴiӦڤIО,sO\hŻ|Ɉ |<(ZYYz衱VH<08ʖ[vY_jKaUoQ?m3En{֮˯i/s[|?NqևW\sfڴj[k儀8śn)D~qzcħ?Ɨ^:B CdH|G#!YK4r|~'D?!O1s7yŶr3nYcm4cW!q裎5\#n;3mvY̼k}:, WB5y?j-%Cʫj?u)ӧO?c?v÷H'5ƍAѢ9ggiӏ?2)O?=p >رc|ֳanv;Sj7O>03]wuq{uy'yJV,~8ZSG̲FG?{衇 Cm}xpq]tEqQ?읛6kZras%%K$0v!#elڷQ\J߇ƺ]D}>^Pu0իWj>(>5\it*^I&F7pKb[C7)ޞ?f񭴴e=^o_C8&ָ) _k:Egb1]M17ˉ>z!ܜ,G0>2&?m3H]HC}p adȋ!EP z@&ˌZ _tqXM8h V[UU=3fUYi|!  g5bai̹sلp%w|a8#zUWF.cPygoY0k |ut1-9gfH89Sdxy {wP>'M/ f& bF=Q_c8`d|Z7". *gZo%+4_\G';it*WXa#N@dCHC%;[Òa:. S~Qf~&82\>'Ǜs.XfZȬG~y,imCv{զOvj,h@T6T]%%֡uZ FRXknj9/cqG\#FSr|@ȑ#Uȟ.1&KKL0:3#ѫ5.1, Xn"0,8{^0cEXI&ş'O< YW@g s!@q͍ry$;#CW̾Lz:qr}Ѣ6Lڈ䃼]pY}^6mɲ%_6:b.OF8tj:rG۾qf;|!lqvKq%x PMEC+2.V[-b(g" <pY D"*w%n YC62CNFXǺ06q=%-͕5g@sFFY4Ⰸ_д49c}0˃%ٌW۸IYц4y6sYBDpMqi|֘_ kϿg}6Ʈ:f:1t(.\B` ?V8tyd^'q:T(DX e}]\U}XMu?]/>K5V=eѹOGWڞǝ_Cʰ14ob̮8W|x9v5_@ Lu!ót ca[5Xdz>}{r1kA%d)<WV?5=0^%c8Xchr>$̘Jb[W~fpտ.}I/8rcm%v"!uRw JSykHGHT9dN_ҸtlFD},zX<700:==-3u ]2RuLKfpv_ċB@4 c4Q#݅%j}/'}A,хK?g8p|ϵ*oѠ4h)eB@! hX Y{7uh+vy^m(vy Ӷ|y *~"PYY+~Cu:C!T(:YSNiWTTԩ!{3fW^miI5X>dT<_6,lyU GDs,GD৽&Md}ÇWc=־kKgmy&h]uUvg,4.X]6p:4Dy 6,'Y--Y/V]udT^6,Ly^K9`VK󔴈Xq[nֳgO[fe:t>6j(;WU6-f ӧ] NO/X(*Ymg;,ٻk[l^{mӮZ[s5{ڶrKbK/5,@裏fuIٳgۺkkV|s0hYjd.b}YܹkΞz꩸u!0xhAeee1ۆ|yIFmdVW<̈ vnX57|sk߾zN;_|^|Ey "@{c|]]u_fΜiX0]r%WW2dHO_~<m饗60vmޏ>(W^xual]tf[lm{^z% i'p 4ȦLbwmf4NGH! ԩS3΄;3nܸ̱W}3'\m&LzkQ R{Vhر0};3fʼ H` 2O>d;Ȭ ?<N2`etMxWz$]a;V[e€ )c0e`\_׮*,`78YeU26mZ&W_}շ0mOygEx=3 )ce:u1B@.#"KX<ǃ?MïY-2^M2uUJX(V6\GydCV+ l\3ǔW\acfaM]weXJرF95mOya1m 7✴\8cu/{r~g`ul9C38,\@㏏5}.WW߭M'pFЦnjEbzfTai/CQ6LD+6ڮ{>O]mբ9X zK|ԘBX6?ۣ5דּ2fvgGnON!$ PRF>eBfI:I;ָw-UO ܎8dMt,']wL.moy2πt;fLA‚HI'^q\N;-nva$,9sLݺtv=80^Ddﲆ"{?>蠃r]B+hӦM$}`[HyoA`a]ygn7|s6{۶mӟ\W^9! @sG(d7piydM e_;4~@N_1HZ0Eu`-` e,P+/&O?EkGj̑,d Yz<0mOy^n.9`ZC,U% !XV],D~}]eIDATt6z`}ňd.e9ZDQG fmՖFGScV`-[XjԷ\qa:L۱%maޑB@,)&e,阆m94kH"ku04!X|pW5 ~ׯ_\Ȍ[.Nq>i^2O% ӷo K)lZ')mC}{w2V !b=f4 /0Zb?Ml a)"ǔ6ӟ,[n>&HQ_6&L[^#ꫯ6,ea9! 0kµ$L`eaj{&g*mcnO9BMXia{}>;~S4_>vq6]!lRסC8EN#h--- ׷ -/Y7̼-Xrgb msaZky"s݅ՙiVE uuԧێ;hoVmbJB@ =,!*|6yX,|]~x8k^TDO=ژrCƑtOf6|mi.˯o[^:4̼]il,I5ciK݆Yz'PuԧadXN! "P6|o b"~ssqz>_o ! \,YcMX2|kQ2B@̃@Q6SB@! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! #в`_~$"B@!P( F6tB˔B@! @h@󀱪J  ꂢb7Xvĵ-jԵK,Xb F#jXШ;oxs޼̃Isss}rjXu)" " " XD@D@D@D$֪A]}@$*%7jPW" " " "P! AMD@D@D@A@bէTHN4. @9otT*kی.], shq-w-5x}l\׏F|-׈or]?앾63|"V[[k{n^;X*{͠_Q6G׏Ńe4A}$U(jo߾xQz޷8x޷V*T"*gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։v˦ZMM3My=2(}Gx=5@ |?zkD} zĿVKo}bHтз=xouJP"G-"ȥ|,S}]\P*V "Ry[KmRddeZIx[n۝={YfNwcꫯ.}u￿]vemWqvEs=gW^yM09?E- /0hGM ni駟3<l)oS۫yӧqQ$7bL|Iq)tۯj'xIzlo6:u[vG~BD}ᇩS>vXC fF 8`j%9sRN{iwq=A&Kj1<0^&ۻKhGIp?=Cc&1E!N >`[c5lrtp#" " pbՒF=AX *!K)"O2A"_+bi.R'CkwTHڠA+4Y2X!J97Ѵ]w?𴶍㨫K "8Dꪶ{Xn݌(W^9EӘ/joFIlFHDZ5_LquIb>|xgL|6pfND@D@:4f}jܻ4-7b(#D!C0IT;S Abʏ "&>.+2:*?biWDS\rIS&3tTΘ%y9y]0k!ƒ ^8~mz՘ HQP1r<QGk /㸈0QV{ #R:?")rrn~|ڽu]6dƹcw-LCcn9\&մTiLD7_W[GuQO<_O ' l}zԙ [kV} dyƳ> e@t4"0U7{3+_|eMzlñpDxɇj18.X9c$sNYF\<\鋛pL.VA_ Ϡay#O܎"H^b ['4>;cañQ@c^[_.N%̏rh}P7֧rJ" " @%B >qV,ҜHV]G61s&`;P8/ihRgE@D`׊y-Qs }^cMJNrYWc[ +k[jjAv%4R];$o'9Y%B)ڨ |3^V!Z޵z1y'6|Eڶպvъ@k({? f-Wk# BumnXbkn޿(<6@3~Vol3͘.@Ŕk8 X|"n۵/̵.K6>Ά,*/" " " N~΂&kYRi6nL$x5RY5Ak.yog)n~W|P_ID@D@D@:;S;y|ƒe{uٰkP- Wj 54aDT(5^}`Co]mn/mShN{|V4VP^GED QRJ>+JJ(܆k;h{Ǯی.6ƦϪYL96?LYD@D@D@Ds իn 38φ o{r$X"TDIk8DPUj5( ?ID@D@D@DHkjk @C! *+h> kb 6((tV%RMhh\Tsˊ5XNg$֊j_D@D@D@3nee[mqPcIF!`NEeOQ5)tvh& ʊ?^'-Ś7CgqRG*DuSn 5ʊ5({l^tD|lbﷴHy{" " " " Q,X-m E@D@D@D@Z&Pu}T*" " " "P%kUnE@D@D@DkPTZ[Z%#" " " U" V%VD@D@D@*! V %@HU Jkm#YjIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Rename.workflow/Contents/document.wflow000066400000000000000000000160561362112712700312610ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx rename "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/000077500000000000000000000000001362112712700246165ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/Contents/000077500000000000000000000000001362112712700264135ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/Contents/Info.plist000066400000000000000000000011671362112712700303700ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Revert NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700303145ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001104711362112712700327510ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxU;";wc-{?ƒbh%1j`ذ H [c},osw̜93sJƌ19! B@f@i*%B@!YSGB@! @3F@d_UM! "kB@! h5㋣ ! B@dM}@! f|qT5! B@! B# ֌/&B@V@C XMM}WwɓuF<$ /xyu{oIhj^mAvZb ?~[͢ߛZh*KsS {܂pQ2dmvqGkӦM$ieee--i\[C>h{u@$Zn3\UUT{஡6黩v>Rim-?|IO3ΗW\kB_.:XNI mĈѲ;g-j { ,<\qkfT#Sj3Y+GE`kg/) a.)ڔ.k@l!Jl/瞱YF~?LZJo{94hsKA[UUA]w]{uuUA.kח:qz&ͨHnj5%.ҰlvpZu;訾֪U'F)ʾS*kn駟<ƍ)ċ=5֭[0\k1Vn9-͉5mƌ246_Ǝk㏏,Q?h=P2I^zVxڬY&<Nj{ >܎9[{m+]f Ħ U?,/O}M~v)DyҒD.*a .qʌ͘Lka4LѻC3on6"$# mf۵g94CccVO2ͨ(V[rkס3v/mSW̊*ر}'u>[d rA/:^u?~ഠ`3X{m ZM6zy8AϯsGqDqSWMW^W]`ی̌J rfشW֥M6-w}ӰalM6_uG9FN(ƕ؈1w?i5ZۆPkۮ}Z OZb%l5׊[nv{m֊e~w=䓖~XҧGY'o}gaZ騥|.mv%q u,l;xpv9ԱP̽=#G}' ޘBtx\f5kV֊MQ6W Gޗ_y9`߿ac:2WeU*Jcn0S_wQ@RXG#]_i)4$}?A ׄ6ў66+XJ´fMi"Sƍemڶ h{mO Hk: nj kڷ3gF’0sGxg=}ғs%&uG@Ddgf>,?۬_Klgݚ6yg#Fϓ'ʫmpgڒKker.k}Q/{SE?8.\l ģݯyem^L ҧ~rڵ'ҮZjCCf6|hi =>Bެwu8wfl`[n1s=gX`:$__v֙oVt9\sM,}r 8L?x/G(3y4rKl+y饗:u':O[*fmvm-\=\駟lv~8HכrM7Uˌu``a l@а8[o%\bmzAp5/u:`vWfC[7*+e{ 86l3O*c">[z|WQ|!aG_OXҪmz'U S+m[ k-縆~xӏyQa"܃龈._?IMv8*ϰlm&^^( }:ߢ:x%gax_m?_աO:3!4X8{bO?vm7lk S<cY`fy$p:oF[;Xy0~3M}?o ,=㡇&;v}wc ;⺍o&)+Wh u) 6cqq]e| k(t8o~36Ƴ:+Wrm}5 ._I;"[oXf< e C}VLZC94. Eul3gVD=ӦMD. c`>I~_A{?NL=jX 70 H^y]_k̏=6x뙮6h@ndè}ّ[q(x{V[o`k3{7 `˄~}=裡跹GU&#}ծ T&a DʾʺN ֢VVu-[ }YG#òF԰tlE\[Zӎ8,oSKQt?^85 y%ꏕebZxp?Q`Z 7_zƎV\{Y:m+NwՆyŦ_ww{{c袋.ջlI?x*<$\p?t(Kֿi;W>`V{%(otI֛oŗ*Ǟ~u_g^zt-t4}] wZhT;}FnnDƣ@n~m:[y,>,\cK 7gXx]pt@!-% IA:bZ2RqX\r d[kpǪZW_ݖZj)sXe9hQDPFrpI`UA&q@CE CQfH:@YC>`Ty}.tF>#\Q"H6b=;~עi@t yYKbZVʢv@8q.]cbl #\WiHZ]C㚤7Tk3 Q[lE|i`@cУ뭱<׌>JQGe-\ׯ6a„H!x'ۖ</^+=)@ ׷2 ҡpJnOZkW?\z@pPa%eֶ, >Ty<>/ݻ[߾}#!B&&#Wt@ĪٙY1~;6ֻ#lĮ2Bm]jkڣGKa~IkeXrwvw`) ^Vj,bIƮƲF, ׄϑGByh/~ۗ vH-D3]N(^c2e/ۍ.8Y|ml>8o7Ĵ@st#n ^Id<y8#v}d, 2K.`хaaa! wԏi( yy7Oѕ̏դSNQzAӗs WYelI=,m#n!#_SG9ѾMfZ8@ͣU->Ho` ha 빰{t̐CD:GSdGI!PC^,nUpuV6NWGl= ӟ%[` Ӿ%/&us{3?Ғxܧ,'\/>{¹~Ӹ/aX=s!0>W ÂǸōF ,S<ļsWDi饗6֔G:y~kǢ1q(9o~^nX@’m$qB:`yKy䭨m) 3)Ntc%[ow>n#oݺuZr@'Ȭ ?_Vϔ Xc.Ys+מz`ƹ!L2L.˴ l35VkO1#CɃ>2yYv+:GqoA7er:. du @i9Xfw4 !6ˏlXߥm :َmQjš53?[G8?ǹ#mYa]yLnÞi׮m [{Kع\ZhkQtz'~܋,K?>,/<_ؕgp2?甇59dxxNf] Gw^}UvmEobWֿyemHfg-V P `R J,fa8o.aO,Uӟ7VXah`РAPHrgƺ y9sN,u!q {^:&X +ba,Йv!CYG[ȃBX( !d=4viQО{ow <94yaT /2A6=6uAvYO,m$z]G?b#ȑ##$}:9g}H/ ]uY ȀGǑtx_ OXH_> %YOt9VsHZ.Saj8:wir#l. /r˅πk"(+NZYN6 Ǒ98x.O\Gz?\?#Ϛ֭b?I? GٌK[i`0a,paG1/ί_W|dpt #S^ nǬDtGUr) ,D5a^xf бϋ@XPZ:',栜%FM[^M6| =|DdRo,F48XIx$ڹ >eF/Y!~]\8dw5k{ x1UCM#NOٴ>Qw^ǹOpT$#.i9q̼ ظS6yȹ{=6O<#Xur[wsY$6TaDŽk W]ea@ k#v?[ΐpXE ;H'ۏÇiƵV\C8IqO!XA{ƍWrÊ4 S]C}X jܿ3/Ϙ1=|4M _ڠzkD?l}z}8Qoq;.y~pozh~X;^.q^'텼=ʚLZ~裏5אzYu-jbwE`Ϋin>LYLJ<.O\.2.דᝌrҺpsz {9^~ypzy\OHCѱ>? or!1?YoF\sw^NRa!`@ `C0e8,< @ O4iz|9`G tK7x{M }~} u>ԯ{NֹK5Ph/DK j%ilB B?V&vhٶ{^tӴ ס};v·߾ k`s#;ڣ9o~}k>NJ~ϓu8orgI,CYOx9 oNy?gr|xE=װݱ?9O9q:+Mä%d:<,74ry\{a2].s dĹNO8|/y~':<|l:OLLJcΛy]&Wq<ȱ,3"cPGY^xc̵Id[< ݮ&i.Gw FA)?F.zz<=-/Yw^_rIz4 4zc9=2êeS6n-~r/zy:cLs돎5S'w\>K(+ umNrmbb{q|o{=%}Iyd:Oa䉣θd<-Q.Ѿce. ̋PPP!Qٟ(+ m'#?8!Sn ! ˘.`|@rԋy '\&/yܑI=ԑid]]|ĚĵdJ )K %sC_`6hA Z՗B#䋩Rc15H;)A\ڋ5#܄)dK!/t\R.FOu񼞆\'9r8F~wȓN9I< '<-_{K=4" D=p `,gpc@fP?9(U$u =?}<=\HONɹ IDATyRGYisMth k$x+=prGǜQ>ps9p]sI]ɸl}=x1(#EH\g\cZ̋&įVI"ϰaâ%i!oS: e@&'NVh=/DR&׫2 Չ|1tӭx! XК^sdXߜܿ`?GRYUDAvi'; [<.~} +~!@{82 ⋑qNw|Yt+^! odY[&Ys~ a#b=u1Z0|q[ "FСCG5h+bh_~9nĊ9?yk٤Ib-2~Y)T'A JmYGr@P ~w}gNHZk/Yr{G}Xz!cjO>{~koF$z52 p]1c6nzoԅ<oq[|ZB@ 9 W|y:5A֐%I?a*쳏Oo.N:5瞑d@ʰ̹C/ħ{,a۷o_$Hc̹ʃA~_<^FO8N?~Gr :_v}wޑ`+d=X(!=v\zꫯ#ÇϖK$:@r[n9[z饍rK>[/D~Dȓ!rB@! 5='uAA0D7j(8qb$ =zXy뭷?vH!~8,:cM:Ǎ7<溱? ,'8r8?5C\amYrlz2X( A(6Ƨސ?j|?c!.|Q6x1bD#6~뮻nn=ӑXB0ݏ #B@!0?Z)Ye>rz`FA@cB $ rô(V&Ja)<>YҰ=S-DGyCHUvϔ0ǔk~Ȓum ! F Qy^gOۉߵk׸6 ydquvڴiD$su|ɺ^'zsǵ&?>w4ʓB@!P1(ރdp@ ГǑ,*q-թs1τ4`|„ AŁu i^a)H <y()T0Yve XK1Kx,n~N[Џ i rK8N56$)^>dw7djJk[zc'By50ba HN ҅] |mUWibpA O?4 ?8ZЏ# ֭[̃>ָ!5V88Hg?\AP8U 1IJhHk \|5oLb9԰ W3U CX0Fɋ^ut!')Yuƺ4Q Ӱԝ\fSuLpdSdF?p+k['/OB@BGq E*!$ u9L-" A<<7l|Plj`rI%)BGYd[ $w: NCe5Y<]>12#1B{)|1^dOsڷo?W.+_!  5kVJ[ ҹ8Қ:;B# U2 yȊt^ˤ! {yK: ÑL: qrq8J$\|/PoO{\RC#8w:OmROrB@4YZ xwj*eZAxd9"EKs2yYT֛d^Iy2#\:4O'//)ϹsH{|sOs׏:;)C"q'iB@!d{12k"[@&<9d4g-e\}xi}]w%]s$rId\}ϓitɺu@G:˻>z\}#_! @CYkj!qx8l ΝO'=%׍tIKti{\2sD>Y^|yY4u=&=.: ϥCqB@! 5Gb>|zSiɝE:.-qjB@o, X! B@F)B@! X-K ! B ?"kQB@! :"k B@! ȏZ~l"B@@[ouWBB@C_4hQ1_o쥗^| ! 6%}QGk-슩|! TVVСCo80 JCH['|b뭷EU'B@4x󳒭$ɤPyAM뮻}g6i$z 5?͉/JQGwb! =h%23shUG儀U_ϫwM^\!Dˉڌ3駟O>Ѣ}~qmmWJFB9bĈ S5jPLB@?x>3j6j(agϞu6?ޞy[al嗏o< 9[B9 $OL92C׫9TVuB`Egd?*+m[laJ)a b}W[z\2XjX59" !\yƁe-PPTVB`DE5A'Oi?Lijj}p߿7ϝo$o-˴dեL֭S8 ÐH/(Q$k<CWʨ ! @>xl¢R1*ϧX5֩muPmml}g֭[c#ĉ_~AMQffڴRd.lvq/ 'l4yHfTB >:q, ֺʺ5%:Ԯ}q:vhӧOX4i|3 S gg?IeVielÖ&Zִf-P H֦L2g`aH ! f#ɾºͲzTe7DaK:66`ekz mlJEL;;w%V56u?! #$@$Y0YU6%L_.DV핉*mtĬo߾OD߉ZRs}E?Nk" '@3D@d^UIZ W6ͪ' k2%m깬`i"ֽ{wtM t:8'NN!\^K,fӫmwa3`Uֱ], s"F'=C/)ƀ !  "kBB@̋#ʃSCj/'eiVWWSB"ЪVLB`F+6eJK p2?|3B2iNbCzgUrK9! @sCd|VM>eGͲQ?Uq+mnW05*ֿ[`6h9a#Ed+YK0dqVb/~\a_b ! YKzu- o6vr0|;k$|!ЩϚ\ R&kBy|w4 k2ᨵy|! @c" f}6dknU|ne#S'5f{g&EҘ5XYᦴ+(hV\,~6*iaKiFZLkRX!P?6Na6);^<Gn٪KVI}:YBݺ+mYeڷKs\ ! B 2fiV1ۈ?xv>=Y‘5}u1O`EՖ44QB@! Cǟ3vݳf?R*;}zfu5rMg[ev KZJ@! ifߌ23yq_r'wϟ>V\fXj6EdhYҮ]ͱ'B@ftɸ3gڬYm]~L?w:cǎ1:Wt]2?Q9J߼}lz y50q i߼}̱˅S9{ӨQ~ &شiӬSN֣G{+o~>[o;_8fp'k߶l9's5O|ˊӶY4')K_<ϋNKs@n6駟 K[YYj*]%yUU-v1d^.݅OsQhJo޳G}]w]k2Hϗ9F{e[jpdsE1c?_~B{\I'_SQYTϏ?h~i$koN#Gѣm5ֈ_RAJYly\^jn+-Y_A2nHֆ bǏ4u}fO_x㍨+._–]vl|S {W"6mث _~is{jW_`=(B9 XGR]xC/&p~xm>IM%Gìb>uU!iXX{6i$;mCC[4hM>>馛"v'x `zh8=쳱M^7y2|<{yݶj+ϖ={2WO>\_-???-ZO2f>qn5׌a_c ~~';}'-rm"Q=>2&01 /D⃟>d%rw]n9k饗={fwB m'Ol.pԟ<7cƌXq;weH?st~(S*ǎ͆nh0,v8tg!wߝ'x"{S3\ol-*kKsex>o̠cv=a2;Qkp;h ,_s5YIY*mK/E.bX^:O 9Orw=Z r1bDndHځ'־UW]՘nֹsg :C lLz뭑}sOH=~]wӠX@i;9۰NBN6K.-\c/.={;?DK\rE~=z+3ME)Ʀq!& 2ݟIB%J+d_Ί;,!ԙV\qŸ сN/5fX[}n>W. ч#]l"AccB@!i$lK5qY-cs3 ys5)4LRbD/|L&N kBL JN|`%#{y8GjsXdĉXN.=Q'pAf+2ZN9hs L7,TO>kW|Ik/r#^O?=[.D d-U<8k, d]WLB@ PIhڲFXV].aϒ%y5k8eu@Zҟ`Bd@4x'j>л^9wOtIvo|q1lSovoѶzbaqqvE^ V/ZXsFNMi2S!  ב$j4 *N\?/|+I ϥ8Gl89AAuThR I d|笻:蠃5뢋.Z|zM8ؙ؎ Z9ӞUVY%bt&BubT.Q+G1,_M|!&Ӟ8`lB@!P,rZlL$a#]2-TARz& D(׼kR>}@ְg!Nț$pi,rQ` Sp8vbEb\:'sƍkbn ad*bIة鄹P}.Fnqop*XTpi0kı!&5>Ko6nL ! XX0>FN6ǓgAƯF%kTkQ>}C jXp0+I,i5xr`8H'lXX\') 'cÂ;g, IDATfCΏꜲւZ8C0Xaa>;F9 <$Fs9?7*e7׳ bxg4sύ6[,dN/ py+'B`a!wf3ONx iB%3s} n:IɘӳN۶ V d]XS ]i˜y:L։EK.d}E5N8M1X6qAӓtTcXX/mi\Ò$!wޱ뮻6x㸻65M IYғ:B@!P 3MeLB@Ʊ7J95+֔ ӠrB@! @tG$!B@!P D֊B@! @Yk p&B@b PК &X ! B@,L(&_{*?gyb)B@b pcmҷ3-JӠB$! B@,<D*Y! " V/DB@! C@dmaB@!P/"kB$! B@,<D*Y! " V/DB@! C@dmaB@!P/"kB$! B@,< W+>31bY[L&4SeqUVV6 %\ ޡ򔵬]ֱ?Bи8X SOYii^ֶmƾ礯"ڦmXi p?2S ({ f_Uu~?k;boZ_#q78̟ A^8>c9s.֦MX ,i8y,Z>fgJmFMd<qҦ4Zlj;*UƥEcmH4TWW۰al6}R,&Nؤx]~Zlvv`] jj2,l/,;oӎ:q@N-k'@и茷qit6yd1c-.N;"xֵkׂtpSTVVZ^&!+7+KG{SN:J+|ZmuȺI&'pB$W|[jʌM5;Kõ }[ۀ נ&V̐k.XH\GNFA`A%*|a/FSǑF=m=>6`رcns| yz:ujAy,BF9 ֓Ot/q1Øb}Q.S?~aa!{衇W\E 7`|꟫~--yUf*YL0&O+3AQiQ~zٲ.m7 !P?ݺu/o&ԟC5\9 u~Kq=󵧪v\^oHYx O_}0$ ުUs^6$-I^ډ1'x¶~￟wrİ>Y5kV KDl[GfvW_6,oZ~_ڧ~G/2nvwmwѡ6vm|,/vu濄2\nv6tS 㡰[(g7*+;ؠAl 7_|1ʊioKNc峘 ~E `;n| a i6MS dMNAO(_=XzsgPf2g|9u1[la 9+'|imcg(y 8;g.~_8z뭹tr,ѹ矏u/W^C=lBƥ<eIo,!ǁ-⅐܎:꨸$g< Ƣ?OY2\Xtg S׌wq=p}q&mv)Su‚z'ۘ1cb|&Ua|c6o``&kpC3I>njՆ8h6Ȏ;8jsϵ3<3~6 9ꫯ@.X{v_guV Daooz^]W*RQQHxm$RgXfolnV vXm,0/<]{ݵv%7bǏiSN'ۡ=Y'XϿ 7w? xPO ;蠃b'\c~aaŇan,mѪ7mڴ"73>nx>;\ZJJna^Ϟ=[ց־C{^ dBC;cN Gyӱxs#?[nyӧO$eC 鄿}|PqギP?,/7=bZJ跈)uX}~D"{pݬ@+K_ycf8'*K-lf8Kʬm_w{)]4bf|j\@ @Nڷo|#yc8;,ZqxĢp؄.$L}~.]6  )0\gd#~|%#fq.[QO?mG TVZi0~P<9}!k +ޱ^'D7pKb[C7)ޞ5?fʩ񭬬U=^o_c8&ָ) _k:Egb¾1]M 17ˉ>z!ܜ,G0>2&?m3H]HC}][adȋ!EP z@&+Z _tqwޑ;iwEoHZLϕqtL.zF1o)|喋a.:JF< 4:T%;,iN0P_`m#ӫp}1N9a̺~qyh:

Tl ozmڄ]nvDasAU\ZZcۄk5khjY*)I}_Wq0wD k<y9r8%WY5*Zac?7>- c33B\}S̲Af\Y* c"3vz^qȳHX*YGY̆ޣG-1}8qqf:0r<駟XDS̬i6ly{rkH5'7k A̢&g>[sXĉOD'+3xkNρ 9 w 8hBUL s+WGEf_w=8Cj>hQhx`Q&mTOA?>/޶dYQbcۚ`Yk1 '\p:wir#lX\XQV*4u4B& ! W_ HM*Os3qxl8[PǬ B7$ad;lN=,g tPo\ Zau`h+|`(7W^xyσ>ΙeeA҈"-NCVcHC5qG,r K*f3^]&eFȚFE]̵f e5q$,5F w$dL ֮9rz1t(.\B` ?V8tyd^'qv@qvKN|2o&.Bl*>w&v:IɟZIl^²ܧ?׫mω%laievVO>Į:trj5M رc,g9$"¶ k g}~z*+PcKR.cx0u~8kz`Kp/3ǂ}3FO1Ķ4+%/Z}^q;ڰogZeKCGB6֐\,sT.=qA,獈:/Xby/o``u{zZ>f/d>֗L'ty ײ29 A#j lƵ8s…%iaHx1 5k[ڄ> }hlQh2 8wiF?g8p|ϵ:k֨4h)eB@! h\ Y{h+vy^7m(vy Ҷ|y *~"PUU+~cu:C!\(:YOlWVV֫1ʻӧS^]iIV[dT<6,hyT GDK,GwsO{M8k#FG䨣ov"YW^ ! ;E'k\svi V_^=Q;lÇIJKV.W^9 R\h <%5Z~{֫W/[j"Æ FmGq׿Φl6m4 2E%kM?Svg1{m6={ښkib_os=[on{oL8]z饆/?'f͚ekà%fa ;}'1K.־}{{'& s}՛!CYve|0|*оA7pCֵk׬mf[m=3 /矟M;cm6yd;mM6ɦqO\B ! ULI?s& ؙqe&g9Ư3a #<\&]2Bcǎ̈́]wݕ9sf˄L Qfp<[.駟fI&L Z[n%/RV#> B>}dbLP3aɄ7% \> SSS3'| Xf 7ygz d.וԩS3e⋬iCCʣ఍8Ho&X."恔d'*f\VX!5āJ+}3ꫯ:LœyW,5LsڮW_߭K'ӯ'M /0,Uu]@2a<@2~ap++о[oR^NtPyG2;wq ! 7|Oox%, ^D&W,zx6'y疎h*`Q <$)AJ|lW^6"gW̦Or2aX?`gp;3U>eu o14W0hР mCC k3R@ ME.,s9&ѷ8xDrl+? 6`ic`I<֧paԟ/2W}#X2W]uUT9Wywipv$׮#X3y72J櫯$B@ 0ZѦANSNY#$ӂK.d6 t!ӣXwN܅OsJ W=Pht,']>(\WZV(ICe"ւoĔUE3ǂӂHۗq\`eeevwvm7.t&n}:{ôszUq.+`R_>/3]w]f~`anݺٹknzk6{vӟ\MӉB#Pbn´\xkS|(ڡrr s v7[":W8p/c2._y11Ͽ1n g}"d@H0%Ґ $YWZZ )XkGy ݱ[ou\p"SO=վlzVZ@Yŵ'w)3Nϱ֒&JͣF)|8{IDATYwGZ>Y0lp/_]ewWWZvlrIdX[HrB@5c5o'pBdbp!n@z]lw}Bpdj30a)_y lbq!3YfvmmUW'l`8묳o?8Z2 + rXΦ}Q64z+njQQQ-3 \-ea_X_!@†mxdL؜g2r|:zHBri&UN:餺nXgXE!}a-ɀ -|]].\WWy3_Z.PErB@!`V%`:+ S33>Sczk>!= ߄=s ^ɝaȱc1Y;E k#9ZHyaرc%h+-- 7 -/Y̼-X i([,MIt  ӡr9?'eiVE ..Օ/'w{noiUB@&EC̔XܔUkþi-+g ˔2p!Uט&j|`̘1|z U53u\$Js\~Crա%`EHJ5c]mKِz'1#.KIsdcdXN!  P6t|o b"~ssqz>_o ! -YcMX2|ca2B@̅@Q6UB@! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! # V0TB@! @Y+>*Q! #Ъ`_|$"B@!P(F6xB˔B@! @h@$&B@@]e ! B;4Q.( *v keWM\{1آF]{{%`;ƎJQ`(;7{<=;9߽;W! AMD@D@D@A@bէTH@bBPrjXu)" " " XD@D@D@D$֪A]}@*z)IoI#0~FAܬ"ֿXҥb .Xm1m,b9ym,bꋟ_#Gukķb]?~6^9[,9^kS~->+kֻw浃 /7˪~y Z0g*\e~tY<QKgi?JRbڋ}}m9ߜM,rrX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1bm`lHZϞ=ӔgAЃ+J/c2|W}׃_#~ "G^FmG/ΈmKMq--}mރ^\_)/:,->yʋߢk+2\Z2)^zoU@ (V(EFvXH{n/*iٳgK5k֟73eʔ?NG?$Fs]a#S P4R*UGe]=wޱ>}GaEBp#fJ7ߜgO~v'{nS[oeG}tꇩ/Dԇ~:ՋmT'G6lcoq歿i,~Fɓ''!7fCpPG4yg+oܸq~k\s}g;l!.O5\N=Tm5fgC%"[Æ ^yD9[bC4}'v뭷ڧ~:,[olƌvM7%DE7l]|8N;/H6)!|" " ̙3W^K4"ƈ{{쮻#FQ#7_D΍7h[m]~i7뮻Ά |h1븘f駟kg$#EzW_*7< Ƿ馛6Eш#SO=cǎ5bfȑ Znϙ3'>$NPvwؓO>D/obJsj|El›1K/4V1kyT ?C=d0fS\D+$ 5XK/{{M?" " !Z-iZnK/""O0+1H4Ѫj{챇u͈RzZyS4H/ol$믿&8okDLQ3DYgĈ)Ç'ć܎;hlv)ooGD@DC`ƽ{Ir#ֈr1B2ӘDEx)SN9$!bzoih޼/#vvE1ux%4g2CMՙ]XxzE ӿ1F"<尌GѦG~[/޺D##LQAuQIq {3ϤqFx<ǸCqۓoqXj>`j[([ke&18$tPZT 7]#]a;,!B5~iMS.ӪyBxeLǹ0MlL'.[#1t$kDq)Q㓨2e ǚ0"Uc+Br,j/?> [wumM6In;zr9:=Åk?1]MLTJO{~xX?pͶ->`ЧGAMfMWjm}jQD@:fxGr5<70娡Y9ք$)7u5հ{˹6EiWL+EڵNҙva@@U"~2^_Aͧ>eB?{] QG|bʷ-\ĭm{\o:Zљiֲq< \w_f0:!OV np?z ccʋ 0CIi=ӌ[LYb,F]\{@Ѹdo#lm" " " ",Hi%eFktKBXX#k8YA$&}.߻KzD@D@D@D=7-&N"F=%ηQk5NluuTDjU+n䳢T@Amٺ/jbSklŔcÔED@D@D@:Yؠ>llؠֻ/ׯK5j.JEԜTIClh[Qy"^GD@D@D@:9+:4bPAKb_Qш0-Fh@g%^"E Eռ^1X[IbE@D@D@:;4&_VV6=L?K 58kR1 6\Z6U@g'fep"RjQy.ؼa:tq-u2L\7ΡPïXoeڊ@G$-~KۊĚ7PQ9k+" " " @)UvP^D@D@D@De_goG" " " " U" V%VD@D@D@*! V %@HU JHUBI>" " " "P%kUnE@D@D@DkPTZ[&6EuIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Revert.workflow/Contents/document.wflow000066400000000000000000000160561362112712700313210ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx revert "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{170, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/000077500000000000000000000000001362112712700250225ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/Contents/000077500000000000000000000000001362112712700266175ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/Contents/Info.plist000066400000000000000000000011721362112712700305700ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Switch... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700305205ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001105661362112712700331620ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxU;";(b(ލ%Xb=cIFFM4ƒb{EĆ A@]<.vcY~sg̙ߝ{wW2z ! B@4KJeT)! B@Ț:B@! 1"kjB@! YSB@! @3F@d_UM! "kB@! h5㋣ ! B@dM}@! f|qT5! B@B@4Ljjj믿&Ol[69p%%%WxΫˬl{KBS{jo[ \8kzMOQۂ>oBSYZhث/m۶N;Y6m"I+++koMD[Wg+ G1Å\!YuWU?Lbj_I#>j^B+t=|yh!(E j;锔XH>؆-kK֢ƀY; r bQ̵7ˬlFu826#pTAx~HҐ^jbMƼJK4y̶rm^xY?%k!,%౨Ƽw.M6xUUUdmֳx0WWWŁ-~}glҌ*+&\Z- ;϶q <L [+K}ްcZ}oo}r++?+p[±YM>͞y9;ࠃmܸB?|S]cݺu cs_/~ҜZ#\џf̘a,L#hEhرC '3X4~e^YY-/z ĭ:YMyN:^6l{챶:dpWD]v[{cY]dkO=ᦺgQF;cyx&j)//K4k`V[meof<s=I׿tAu0]5\/i}Qӏ't+7ʆh_r7-J{^~dɸNĖ x~vmG ׇ;~'yG2fl"nU2cDXX9934i!x?Dv饗}cA^\M9ꫯb ]yV }ꪫ{'{m -6ӷؿϤaE~uԵ2_ yїO>2;&d~ ӣ%N[nva./'MmĂ뻰³d:wؚki7*!1w}1ȑ##b ر|_)ES'"P,(jC.prtѺq̙Qϴi##m0s1 l1`W A&6ՙzZ wmQxA=!*4 0?ЃR5ǞA~ NԏLW]oq `QUKkx}9H?OVp=v mm }= '.2=g|=X+mQhHmk0@*Ua] ~_.wQ85l#[.WV!?#[R#{'N r=C-nIcex9lͬWj:w~h+M6;jbӁWÂ;ý=|]{B ᅈַo.>;YHX9bķOأd{KKsP믳.nl :Ů݄;?4>#77"ksQp 386dhGx< 1]3όDsS<.H: vu tXp^ CLx{d y8,.aDw-ԉU8cՁf-kaK-]92zh(A"(#9e [8 C!Fla!?ypk3$l,!A0* >|BH:xv ^`Z(jf$^ Lw߉XڴM :Sڼ>Ĭ%b1cOVeE; Z\wK^1b6_H֏T4$!qMRǨ-2401Q׿XćkF%裏[.w 0aB$! ב?O͎PXY bU̬j?~HwIYj݂6FbW{.5ѣG|0Yݤ2,dz\iؿ/cg5FO$cW]}U cYk稣^ѥk(oڗ_ AqGud|>}hE6a:pQfZMM\U퉂-_;E-&iZ`73a{~4Y.A,]8L8ω+VZk9dy~t1ؾ}lV[-։tRtUVY%M9<]P:] !o>hKo;s.'PC/rŠwqEP}嗏FcO6BhxV}՛ibJY~ 9:ёv\7/2A< >2r%yBAఐR;4˄HA<<ɛl I] JjҩS= XKjK6kLjh&|3-XѪ Go ~47{o8~tՄ\XA=:}f١ "ye#LC2#KGҐ]Y!/Ev:Y^X'kÃeo⋶۞ْ CViߒ`Yp}Lr i~D/Hxyp\?i_CQAտD+ZBaML'f]ve 䉩Rb9KGkkʈ# q mdMmo#~ Nc0|SP,: ڟ7pG9,C{Wg/1x 8FgP$d|0e=>u!#F8Pw^דxQ.u<pGk 8,tיg- }G~;G[ׇ.m9l>a]"}0Rd=YLX^!izLiJ0?Rܡxv}N,-?!+C:je;۠3c3G~a|/cyB1k si2A\dXuqy☺smSij12c xFOyS'#.x?"Gs ܸGF#ʦׇsG"!?Gcu^+ݣɤ%?8aQC{ yo^gۢ.fk*^Zϛzc䭟0yɄߨsr.ir=Ɉ˹,'07wek iIݞ=y 'aǑĈ?d<=:|/˱Ix/lt5w${VP F? s^a?r`KI8Ιy=񑡽 >^ :y~tyЁKd|#dG G]wjʰ_7Cwd_Bt`ԠyZ&Мp ,`*oemI 6mu?NMy8_Z]>MpڷV<|훸`V>7Ѫ;r=_ax!/KzFsטqЏ#^IQc|v GG\~ {sdy:LZH?}C#qϹǻv9ɼ/> KAt=-7{{<~2.HʦĄ4Ferǃ;#)2|9\K:.Y<qs﫞Ӓe{~|we%d-_7Op`A=#?j\fZM 9er'O;&4q9OX35ZX賤Y@Pg ߶ $6/ {YÝmD&vo't?HKdM?6&}z=>qIikIt-Pú~Grah^%} \}|`AOp.tI#x~Ny\tOaq.pF8KƓB|1R;V U 5 ՙM+9 1F>|q<\$WZBuA5 M ~gtn*QOBiv%=8kadp;n>c0{>eҰ@ G~p2u/Yoz>q㺼.KMKI\Kİ]X}>>vaU} M/?B*e=S25XY3ɚO>M2Mt"H%bD$Yi~u|^I#mw<锓ē{p,REYK#X@xA Ƃ|7d5~\?}sׅ\>UwݓsO9xMkǢE5ku4!|0`2c;?mPր,AXk$3>x;Y^{pa;י?O돹HIv\lWsRۻ/>"k6ʀ;\dQ?auk5띯5ɼC')\} 4p.hWsљnsWc#gXnNz4 ڜ"B@M*DA! B@! 0ܔK! EA@d(0! B@4 m0hn1h$×_~.UꫯŨu4! B`+J'wIۏ|sWλU~m:묓-)H>? wl#xB=`W_}eZ9}b@xM! @YֲP &²%jQFMĊo=QCni8i. :4Z kV6PdariBd]/er*PCG>݊B@Yk5g@ s$UqId!9nwC9$~o =\'ҽ~Rd9y{'c:\}/K/t{ёO⅀B`F@Lobف_o?|<'qPK6I/ {Zǎ Ç~ 6 >`J 2$~Ts+f~WQOXGM4)jBez2]o?g8*/ uq!mw}ƏQ?[o%Oԇ6{m~zwoFܫWXS/=ztlۙnM]ȳ&D]//ʧux9 ! h"k @rŗǙ.Sd Y3& [oe!Tw_駟wޱ]w5f:ujk"ɀas^O#YӧO()7 Hǘsу yq ~"@, [wu#.CoJ+ ֫Ikۃm7i 4(b0lذlA$w喳^(t?s[IGOt CTp#G'FУG% ~;cǎâ8ġsܸqqi 2{!#FSS3U1*SOfm%'v')Idasan| 裏F?|"!OqnWoHe'MÇG>h'.]ozv3<%ޮ\yo}L ~Lۗ,Y;2X Yl$%uKݽ]vkӐG ^gM6N~H2~Pϗu7~\kO~ׁ~O<9!  E@ 2=H=yx<{ ЪגA 8X:wLI8'LD]X }&E2 +`LQʃrBe ]^oo]%SH^Ήz ȐF sDa]cCyXq} hC6YopzSOV!ı<u7B@! @Yguq.|, D <0!]X  V[mZ(X G$rA* O 8nݺ4E s@ l腀QwJ2 y5hX!oK#0 K AUo6ePG6U@!nױr&uq ! (}PrnyLAX]1r-#] ݑ@d>qq&y\Kz )'q`YN"p,qaL b Ir:4\\OSڅ^#?#dן2nuJ4}sB@Z6?hd^a 13'9>#Ϲ-tN;ҝP%ӐK:Lҝ,N242N8,W.>NL2\đ9o%u{>1"zԦ!ŞNdy.'_! @Ce0,g x'R9G-RO>'EnIK'x>⨻˥ItҨ?m|?̗(f O.DirN:ÜCqLxr< ]&I*!Oy.I%yŏ*Eu o^~;WB`a#Pgm~$®B@@ee 2$4%o|}駶{YTu"@s@/8?+ي>hJBLjWXٴzn&Mm&> ^C؜RꫯF]5~*n~,~W@-BpV,33gΌV5~[N!\%,l_}iB͘1ÞyHz-jهvA!$aD/Ç0 Qê5$X3?Fe#GwzXaggVX_~Ð ! LThɈ#2<}?ؚCeU! _xA8x>sƍɾm営ꪫFr6`g5W%E\S/jgX 1c"YGs!≀?!jLN6Lijj}0ׯ7ϝo$wm˴dեL֭S8 ÐH/(Q$k<CWʨ ! @>xl¢R*/X5֩muPmml}֭[c#ĉo߾AMQffڴRt.lvq/ 'l4yHfTB >:q, ֺʺ5%:Ԯ}7q:vhӧOX4i|3 S g?IeVieÖ&Zִf-P H֦L2g`aH ! f#ɾSa]U۠g=q% D25CoĄV66V[ϒYmjWEuB ,`,{*/_"cDr6gdb֧O{'D-)9у>jB" /$@-{_fU5ۮO\V4޽mfOZ:BFzЇ^''h \%c|60d*خ9#ӓq~rc@fr!T ! EF|ɩVΉ4A+u+)GN!\h\+z !x#kBLTPc%\ 8!i4't1ġKb9%B!`V>&L̲a#gȟ*mjyҸ6EP߭}T0GA" 8u zO+>~ m1M @Yx,٥zuieƽۅpY7Y; r_6g5ueB`ngM.)Kt!NzYf&o=W܀KӇڂk쌝Jcۦ 8Wڵk9VZB@!ЌG;0cW<^i]|-'Ys6*{sxEl}Jls6xͧ<#7sL5km[KOSw1FʗkZ\2?4^𛷏Ao47&&a:-V9v~?6VqO``9r3&L`ӦMN:Y= ־}yDeKlk-~]A}۲yI<*NvҜ,}UF+++o{1[olN$#=_2˾;CZӛ/w}qիn̪G/"vܾ}zr r'K6W"&F*W~F+NGgQ??}gyş:uj6pԍs9燛=/K{7ʶ뮻/~ [veMu+W_ rڴicZ$_}s=V^^nOvnv[z?n~p`:ׅkw_GB@4?hX>X7`y[0.oϴGs:ڸ){U̧J6$ +k&Md'p-Rt!ZxHs~Bּӧۇ~h7tSOZ{.F8O^ɼd8gXt.vg$8_d|kuQWx+K.viSx! ECE@kmÆ |GyJL֮->P~No9Ÿ0u6Y0<-CqL2she01@rql挑z*m /qg,HL?_OOz뭷wq /0[fsHV2/}喳k^ziٳgv(6yx0?'zIciX{p3f̈eGٻ첋qQs=7N~G12>erرlF bCW|{y҈wy!{1I\>_߶j+ꪫ?w?Ys :k= ,(ι;K/eƁ Ϗf_H5\ՙ;`/rK._l~ԭt ɓQtB΅KޫOs?vx'ČT8|'-n䛧]NfGgy,kRKff5OKXX4>td\VpT2:ƎPe[n%8!e:s5i|-˜jűs`aAꈣ|¬7;#,|@>+c=Ő)ÇFvxb[mՌ@Hn;wQ?DT 13*mtwm8 ԑS:J+dX'Y_F'o`r饗[.1re,_x!b,:pe:B@!PL|Ģ}Z҆,| Vkgv=~6>u9jncJu-XҎTW~σ5ɚy]Hs7ґ,p7k]vY6C]\sqktwi \.o|h=c˦nɔycSrXB Oz!F^wnWovgGrtÐrLY+b܄S@3>7lC .Tn摠1r ! XyK\D yߚڬ9ߙЅ9JsCkE{k1"ǿ_>NI&X5L!F@&p%'h>ӀzՒ=dkn8՘O)f{7hO?]p1\A8&SsLllDžciBݪEXA:Gzm:rX1}*Ϩ`I\eUpiO[Ho0MQt ! (wc-o&pKZ. N )a="k5)>|A@ kX|3MĐx'xM\ac9(0)8Z" \.z9qŵ_gjPwąwvR2 t\>c#7pø7_M8v l*8csXUΥ߀7 p\Lby7儀B@,, u#^'Dɳ W5*w@x !Z5,8| byC{T$ttYmoWB OG)eΉ[|q!rrB@!  0 :O7 <<GCĢmmVd 6Q߲`?ҲZ! MYkʆJwBiP9! B~r~lB@! ("k@Ye! B58eB@! @1(hڄ [_*F}TB@!  &oY=Ds:gNB@! @18α6黙iz!B@! "k {,B@zY" ! B`! WB@! z!B@! "k {,B@zY" ! B`! WB@! z!B@! «ނ\SSc >ɬ֭[[&KJJb)2R++wp{.Ե]ֱ?Bи8X O[iiֶmƾ礯"fm奺Xi p?2S ({ f_Uu0k;boZ_#q78̟ A^8>9s֦MX ,i8y,Z>fgJmFMd<qҦ4Znf;*UƥEcmH4TWWСCmu1}R,&Nؤx]~Zlv`] jj2,l/,;oˎ>N-k'@и茷qit6yd1c-.3fv|WN:ɺvZnJիUU1pׄ#deo6Qse?hl|< 9ڬYY@ bފ82ïm1oL7x_>(0=J}!nw `첋 d^7vmcyHn657tNfم^C9[l]}UYyn}hmKPV,/O{[r`+ThM+qv_ m8WVM ֵI56nj^ krB@4 |Bi5״/2pq6lc׿2A<AϮc=ֶrK߿Yy?SM￿mM6<>C! )_"Ƒoϥcc_n/BW_}evad2.`<;\gL"~gi̎>lV/vG%9%tAF0?4̔1r;bf<;3i;cWLN9F7 ؠm}3YL]I uq;W>64ǑFmv[omwuY^_mrڳ=&-śee%';TT63GIV};[[j"Aa ̋/h^w]zvͷcԩSlINhOu ' .{E]O󟬼> \o$i@X`rG2K/mӟc~eocM6-wu]g{ErN{k_YZni262J0xn|[5¬[Z^cc+Bv[`x-N;-N~TKƁYѰa"y5[ Iw}H.8>UTTݤI2,7θeь]Bƥ#8V_cI3ΰv*fVD2+Z%ϫ4v\I>yX=xwאt )=֥sHܦMjO=y")6nܸ8~'98K~a1NAz꩸cGkx}ZN糞 cMvw'Ty'7os=?S:",g Kך8h5:o[{ Cm}xpq]tEqQ?읛.kXsaåK40>3ed;8^PO6)nN ?d?:v yG:7G>ft9QrG/DG tFy `H{glA6 y2ı8J٠Ay^ohܤW\q1][;>.tY۔X8DD#ֆC| ـݏk5UWݣa1}fuhBZV#Ɯ{9M'XD#<2.\sM`1ks>%<6დ9u Tl lvlڄ]nvyDasAU\ZZcۄk5khjY*)I}_Wq0wd k<y9bĈ8%WY92Zac/0>- c33B\}S̲Af\Y* c"3vz^qȳHX*YGY̆ޣG->!_>1}8qqf:0r<駟XDS̬i:ty{rkH5'7k A̢&g>[sXĉOD'+3xkNρ 9 w 8hBUL s+WGEf_w=8Cj>hQhx`Q&mTOA.>/޶dYQbcۚ`Yk1 '\p:wiz#mY\XQV*4u4B& ! W_ HMŪOs3qxl8[PǬ BCEu"dc; | csKA[Z;lpc]VYe̒o3^ y9Slx,HqXihJc iᜱ>HAncSlƫkܤ,hCYc,!b8Zad+kZ^|a' Wt:׉so *Eߒ<_oP1< 띿y:]Nsgq*[W0t0:jsczk [XZ6ݣU?[9>ZM/@S t:vYH:n䱰-Ú,GY߽^ T5?XA/1, `a49EQifz%/?3MJ}K{_s9α6oR:MF5$#$ 2UhKi\P:6y#Nnz>=XnuO.?:%~y8]µ |wB=d-tZ6q-p!kIZ3^Lysږ6봏BZ+/E?!  ]5ラaœ>?cB%c<ɓ/q!s?9P\y,weSIy +/~!>5|U|qiTFÛff}\nNohor 纔?(8-57zjhN%Z o?ikp !rۊѪBǥ\ϵd#5ۅ7L2%]cw]8HFcmҰ%ؒI-nNeHf7/y^>߁++ `0iMS;$I>fg'@ B5q [.n@sGZ$YcJe} s:EK,C͡! @h\*EU)ǑIָЀ9ls׋jGP,]:bo"jM K-48b]\7|b*jق @_I[WBиTJLS#-nJ B@!  E@RHI B@! (:"kE\ ! BpD JB@! (:"kE\ ! BpmKB@! Z0|?6ZŤH! #FoqI0ɉY<s?:7j5 ڨpJB@! BxmE=ڊ]^o]ނ-_mC>k|s*^z.Ct!  E'ktIz4FytA6}yʫ+-)|ۆ-o h hb }0 ;cp}i'Z>}l;ロ't֕WiB@@5\c~ゕ` 6WOc.ذarҒmUVIFymÂ7WuZfu4oMZ>mu׍?5rdt/uzeK-T6СCmQFّGiin10`M6<tz|! @QoO?r!YxK|ͭgϞZkߘvkasmV[ؽ N]vaK#duIYf:ckf|s0hYjd;tڷooO>dDA}リ4-Է<_C~$nZ]T1;3"Ox]w5jnf֡ClǴ^xvi'?k_߿|}|tr3fV$,L^zi}ԉt<QE߾} K bȯY۶m[n=J+&lbovwn!?ֵkWnͶzk{g_ . vq٠Alv1ئnM$ιB@,L2%<~L3ƍ}M,s܍d`GxMu0 edƎ +3s? oۙ@"믟Pgf|g0u +V[n/'-ӻw̖[n j&LxY 3555o1s)Le6h?O& R0 JC`ԩ@2_~eV߂!QpF 7,@JE3 +|W>~uW~HF&ɼQ9}mvu֥ד&MʀE] ⺊it^~+"b 's~`}{챙fF3x`:|g@Rף>ܹsČ{TN!PL8~x~Ë.a9S|V'7g˳e[:ZdE!. tzj)yꩧW^ye؈W\1>UC/`裏2sN&X`" ֧lZ.ӟ2?ו ؒd兵`U@~nQ}sύMoy(V~R,m`u7Iќtr?sEIc=ծ]̛ooy衇R3?}> k***D= ynGr* ضUW]5_{|! @QXdhӠwyg\ܩSi%\2prQwqaZ]]s•;6x8?9)KI?&וq64`1%%%shQnj@ ,X]4p }ٞ{L!/VVVfwqms+Kg֧G;=-jW#.NTyӤ_\jkvmO\`%1C%E|A];ςn֬@Bӟ\MӉB#Pfn´\x7PCǏ`?1|H>D;XW^Lw_P2 ]iB+- ҆[f5d"cSf>zۈIDATދ0%hv}7```Qk!Y VRf>c%MdGQ٩K'k:T)U{"Oז|}>[0Mma:|AcK#\[k B`qA(d XұКO<1n2`18ab3Vc2V0-ba9&+?/.d&2,-OqdgmaM}'q>ȰOԕ^M9,Fg=IoZ "L[E-3 ^-ea6` "g"|8وPGM+X7.'|r]Ŵ|:I Ӡ%3,OZ *L3V9|tAܵ^kXJ ! YI\@@,l?IR[9[S@Mɀ|+m `bXwOj!Ӈcǎq*LXLӮl264d~0`1SuXo@OAp!P0:?.W]PʯK'1cle &0uXɛBίma,߬B@4)zgʟ|6JqXLl]yh8k^TC=ƴ4Qsa15v.őtOc"i._Wچ-3oW.F7TDjC\6\5ȇ/TZ -KrB@Ez[hrB[$kØk\ |ON!  lk8@/ XEL! s!P sB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @ B@!P|D֊JB@! @*X^z)! yXU{czQ/(F=WYbyOM|c"E1ƒ^b^{ٽb;;4*Ea7|Ygf3s`濒3{o}k~{o@Qm&ƍWO$iЂ&" " "  V SD@D@D@ X+Jn" " " "P kՠ>E@D@D@D &" " "  V SD@D@D@ X+Jn" " " "P kՠ>E@D@D@D B/ŝ:u,ؤD@D@D@D@Z#0~F!Y!6p@֭2 .^mm,b9ym,bꋟ_#Gukķb]?~6^9[,5^o-? Z۷oR Ͳߺm-O3.V~tY6&8ϊ~WERAVcOŋ󾍶JoΦKF9V9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN6j*$jjjwiʳ D{>]?%#/}׃_#6[#݈gĶZfQc 9S!F >@Fe-שWɮKC9/~NgDڊ"Luq=xC<^[/<*oտ~zի;*]D@D@D@Vke'޳nJ:nw޼yRΝ:ߍL>Oә+т {TAD@D`]ۤ Ȼ{S[Cv8&[[fLb>im#zՖdۚ9s]/[ݭzk;m5)7"2Y_H/3Lwܱu?S?n:ZƌcGy 0^^xlWoUoJO`^{e7xvW_}.p+ 8蠃+h袋7ްK/ԞymvۢE,Bl9]r%Ifmf=mvnZ4h=vM7ٮj;E:,_SN/ Bwa3f̰zˎ;S_?0u!4('Goooym&i,~ƎiӦ%!7~xCpPG4^h+oĉ~k]w}gnfx!.O[8 5fgC%"[#F^yD9[bC4}'vۧ~=\xmv-$DEj]|G>.;/H6)!|" " 9sO>5U"ƈ{{QFQ#7_D7ln]yi7n |h1븘f駟k$#Ez'W_k&q%@r˦(4{$c}駓}„ Ǎ=:qAp`uI y睗)}N{ꩧҡÃ(HLi^cN/y`Mx3f_w'9f ޣ>j!~g{ Lb*he!Bva6RMX#z@T#Cz饗RD'Le)"D$/hW]u2\>O~ٳFGwߵ!CZMd,bHDc;ꨣ6.}O4ߊD #jk{m=z0\sMc*zK*j1{[s'z>?Z iSԌrq3 701buȑɟ1!.;o:8Aq^޴ʈ5D! 4&Q<` O7D)?+Do8ZQ;L"Ҙ:˚3ÇLw.s,<袆ߘX F\rX#hӣL^o]@"ƈr܌s|1Ǥ u=$ԸN8{g8~ #Z>cΡɷ틀t.z( x-:Z=mI (ɡ"1MHDWX;5KByZ("K!Ĵ*k^-%Dq.hn)˶HLA1I"k(QneJ2iҤ$*"DYyB&H[K5fs￟|mF[$7SlMbdLws5옮mJc$ܧzڊt>B }iђ|Z2Yf0׫fYZk&+5{d(kxפIBDdq#i=3-^kA8ңWѰn5PbmkcHO}=<ӌWƅ9餓1]pIMd}K`=Lsz"jF"Gs_n^cxO=1D&RRp.Le"flnqH'xbZCSESG-z\X@a5ZYG>k1vf,(1D r3},{ilwN`jc7P>$2A!aCD9?͜6 I} ?n1fWa5vyʧR'+c841kx c %q\ rIl)眲xx}gB=gJȼ=L%9V?)YȺ4fllxs=c疶Z|9%E\pcuLkh\V=숿H:{Zm#L7yHMlJ_܄cr :y 'ϻ @yvl^F2؆\<1.[,ddrR3mv؏swyp.g~,u@\7>ml͗P<~n L,&YHs"Y#v^=ƀֿ>_5ەyMDڞ=S(" ]@V#hL\crkBWqWvDITS t(y"qL|ȉ0E@D ̊/$lpSb 柽GZ(ϵy#>Aۗ@.־=vŷkoVD@ڊ@y|AG]؜4kٸZvUj/npbX+KncXZS^D@D@D@D OJ_?,^do;͘.@Ŕk8 X|"nZ`o}]hL}d:D[8CgI=P:֣#H5 O ]s{ &}.ط[zD@D@D@D=f,2-JtW ›iw2GcKED@D@D@D@YƬ`luեQQCyTҺϊR#u62~n6fͭYF96?LYD@D@D@Dk էn 6F Yd}{r$X"RDIUk8DPj5](J?ID@D@D@DHkjkK@C! *+h> kb 6((tU%RMhh\Tsˊ5\Ng$ʑj_D@D@D@3nee[mqPcEF!`NEeOQ5)tuh& ?^'-Ś7CgqRG*DuSnZj*ph#)[y" " " " foҶX;jڊ@W'PIGeZllE;m(/" " " "2үR*Xxu+" " " EH$*W" " " "PZJ*Xxu+" " " EH$*W" " " "Pؙ)tIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Switch....workflow/Contents/document.wflow000066400000000000000000000160561362112712700315250ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx switch "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/000077500000000000000000000000001362112712700254065ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/Contents/000077500000000000000000000000001362112712700272035ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/Contents/Info.plist000066400000000000000000000011751362112712700311570ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Update to... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/Contents/QuickLook/000077500000000000000000000000001362112712700311045ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001112411362112712700334560ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/Contents/QuickLookPNG  IHDRk_ViCCPICC ProfilexYy8U]_8p12y &ƨ0f.WvoFֱHF@8oI 9'0 FgkzP}`? H^zT?6Tg[FGP~_!}b;6,C7\+":o,Œa^VaM(C[m!] 3/"/=Kayov.QMwnj7F:X]qv0# z`Κ_r/c}! De@UJ?@kh ` ۄØnO (p >0[Nح.#0_}k722e %C)tQ(M*XP@ RA頴Pp*0o`k?/lxc\^ځ/@r{ H _$$[Z"'#+[؝8j{.X% P@},_j?/`ԌxFڽx߳P@S` p'(@*9$8A@h-t`<` ̂` u A"A; AiB9d @?BI(ʇrAChW' "a BaGG#"t YDэ@#fKoHA RH CF!! d=ُE"?P#FErQŨ*T35C~Ih.Z mvFBt=~^`0,2 bJ1 .f Ųc%X+,^>žnhp89!KjpwM<=^yJ|;~I` 4 B*,G&Ө9Ks"(N##OU$L&bH'Hդ{W ZFZiZZfڧtBt:tttt7zTC%mdBrj2,daهNDGgD2 01z3adc|˄aa2a bacbZa&3+0;2`.a<˂df1a acidy򓕛U՗5)w6N6m6_lqv`S-/9P688989999_p!Ĺlr]m}2 6OOO'{^F^M@޻(J,gW7ķ/R "'P #"+h!$X+B/" T$/]XDI8SExQMD$QVdZ$%)Z!:&S +{"W/@H(IJJH%U%$+$'R:RqRRs,i-ҟqsjO_22!22SdYS4vٯrrr%rc$yCV/  +2*Z(f*(n+)+E)+WTT><¤b@ڡCMI-FQzz^{+kkP55f5)5gZZ}h ҹIWF7JI^^>RH?[Ȁl`Plʐ߰pHQ1 IɊiiά쵹yyŴee2:mZ: ڦfV6ɶߎîn^>~A!֡Ǒqcw'}|Y=...XWG+ θݧ/c߳"~ǃ΃qYEVPyxZ.^)yO/o_€@/AAeA߃84B=Caa<G"$"2"f#"DDE]G0`hع8͸xLOJxhx $ԤdC!C=)))oJ%>NIO[;t=;pQQeP eg(G&0g+;qg;1w$dgNU3'ϟ8\@).X;qaBaY(hsN*(/-i8u>Rҧ/ԗqxyQyspE%̥K U.W_Ḓsej*۪jZDmlk=ӯk/o`iȹ^pƳFƞ*7o :ؔ 5'4̶7ݖ}NBgzĻߺ"{y82E܋ͩ/ _qiU3?7Լқ7[oH xU/-v7|ۇKK>$gσ++oD}ʾzuMaW߳77~fvv/_;;;(\ ??^9 @)~ktu`_a` wH J&jxEu1ӂ=s734OG8F)& Tk/8,9sxx-(||B5_DI tl+\S,bV>eSۡ7bHcjg"elgncbof}Φ ^ٯ8'g1W[})OWytzPg|~ zA!aIّQy'c8p21`JRlr̡aT4# RGy22v2W-gMgo>1{Q~҂3;E2gϥו.%]/[T1Y,zjlꆚڏut ׽n$4ݬ4Ҽ򫍮LNǻ>]z=W{݇C<<`<2a8y|Y禓o^NeNۿ|lkן{ߔM\px'ȰK˧?~%kjZ?~lrٍE!CLt B N!~"CPqh"c%`pE)(^Alɔ|:;Ø3+%ϧ&%&4/B8-y[7&YU9b&n*[j{55h8[Wєɪ-mK5 ->T7/Go'_+?s@ `P0pr$}6)]́ɄOIn;Ԟrp}մ#ӫe,#eId~b8)Biǂ3Ņ]EP%cK.}*gP^{tZƳ6Z[Buэnټſ6!}'nLνޮ~*>PTz44DvDĨ83 s$4ԇ/߿y;;37zv6}X^h)sJ՗_x'~X)l{qo) ;y Bq1E Q7h/"&É$qTOC瑣 DFk&fy*[&{=07{- ?C LFHK_-!:.,^*qXCP"L9Wyq„*"*;jU{-5$4QSZ׵*1\6L2r3V5a6lyvS½ ||V}hrk}o𹐸P0ux]< bgz+&$ObHH~u7#iQGmjfHecBg3?';O57n,h8sًʊ+JJW^plUpZyr略*jخ&RnKTk}rܽK }7SσGӏ<4vsBFRf?͟X{[]0J#r +k!o=g`j̑Ja8 QF@0ߛA`D22 RiLF 'Q8x!fbCh$Z0c19~,k=Ǒpb<^ %0|7i440 %> rHN0)'_acH%00`:Ld>R*f6Afnq⭤XQ~ &ùw6QC1IJIS)Qi̞>*lxy_}vJV*&j{55Ӵʵtu? T kL.4K5O OqufR(OT!1E';?1,cOq\\+w7`KM"_HLu@6} j wȊ&Fun&cf7XV,6g45k\ܚK<xx7(yD.>$qE򘔟YܼS{]J4TQMs}1%}Ak3L4*23i415ohb98J98;ĸfU컻C5 >swt.'kxwDihw#kJbR2X)},;k"'7@dt^gzk,y3WV^~WPyC&׭ֶ[]>=n{+<+w|,/1vs⸒R ʫ/TV\Z 7)u4h_k49ռޚض}Ϊ.k{_{H(wq룴c!'|66쫉Y9יoZYd~/o#'O۟_t~)*v[:e}{q?~>TݬbJzͼ]_;;!;ͻ'/z o?Y/>Y} &??+v1]tF?Syx>a IDATx|UEOzGņ(;b_uuu_ZXW]ˮl+""JHKH{<.G8igܙ=3ɓ'ĝ#8#8@N"ZR#8#85#8#0Nrj#8#8Y>8#8@#d-/8#85#8#0Nrj#8#8Y>8#8@#d-/8#8@pT*%O?/"sΕM <=rRPP޼N]Zu-.4P?Za"V^q#FDmСҼyskYfJ qwӸv}񇎚-ݺ@T. D¿ҲL4_zhe\{붡T<;dZQnG˟vzÙzʅW.Ӷf\*@t`=zZgE bbԙ<3rzHaȢpeQ k( l"0!=_ZN?g{׮Q7[]ޒRe`n.(K dpy7#g~0\:th+,ޯ}2wqcsN믲h"ڵkHs5Ehڴi3gř,QԩSgMt%2!j%L'e?.#FSO=U6lt:߾}4vلXB;q7ߔ)Ss9h:+K dk<$%i-S b\qr]V;)N!`[ʶNOWypkW]lҤiy?f}֕EEҤiK)).ZCސc?QL-,EҺu+5jVZU""㣏>3fȁ N+WLp+chAˠt^;>l9u0`@::?x`,+郿ĉm:35]H>}\ntqVhx9Y<=D^~yefSR8wt3ѷgäyBk-v}jɦl~}'_}lZ_MW_aU=>*qZ zt¥ڸ_.,~bl۶mZl-֞ˡ5&V>L<źMYV'xKĆ{/sGFcX*P$NX4g? e1CI )1g#/4<+@5MuͼYHR`''H-?Q^z>$5,cQI=M-ŋs?|M Oz4R@U6YQsW)^8G>4]mwW7o"s|?z:wl21{1b_fWhv?t޽Bpwީ!V{SE?8WB@zR,`h+#<\wx4dkemYLȁeAE:8v7."w 6,?h ]q@H ON_t`&O>0YnV;ez-ǒq&'?cwrGVYV+anI=oIaΒ{Oqn#T*o 8P s>fq׀_܇oS7pC:Ay|ҿq|,} E|*ߧaEFq?rKP yQ}_yo߯F y_{5- OQ?Ac==3]p_Ι3'>黢ŁYBe-0&VyvV& C!r8/Ț%?mӏyPs=Kx_DŁouѮ_ e@v{#E I ң2cZlܴͮE#MT#t4C.cas/z_m!C*17\}1⬿o탵#/R|7rSz-mobO?p t:ѓaK8}~~#+e~Y2k#wKp,=cIN8@V-ta`2 $T@O>DH JՋ籉lرK)&,?- .Pu#{Zo~#\\&IK^zwM֩'ZG ?8`AYZ+c=N'\H{uE*gJ䯹0Ysʩ'Ar+a:äG eT>:G r[!0D3OKi{-=6~LN~났m&YFeU2^ĽW^r+޿:O(O{.`S׌>JI'$kի̚5K !hۢZb32Dp}K$ ,/_xK\DHY^4/oZ!WY<>f+;J=' PXA b,./Snj+h&;_>‹ؕvs^ХBN:'Q*& w~(w_<ެˆ{5o05g^&?'x[}CF4G},?8ZI >qσr9B<vkeKmWG36w7 Njvpӛ$ 0iTt0l &WH 9Tl2ȋ#ǖ-[0mF8SEx 6@sˋx[ !O?Z{:(m_,8X!O?]vNrVN;M 묳YqTLml>8keқebJ]vsd"#nL^IX&pnG4l X.  lW_]`хaaa!s2HA,L~ S6 QYLȊjҦM+ XKnaC6{ȃ׈h,|3-HjUK7CWF[  +(o.\JjFL!fGz#i䷷PӲCY,np-Z]6f}ϒFe ˟%fH`- ˾yh&aXu3<艳{Si~D™|q_v iGCw-}hd71 wR ,K b9k=eđL|0`YcqX4fϞ8 rVˁ.Vtc ztk!S,QHAS hs&̓Ldc%[kwT:@f9t ed B(Io,<ճdC9ؘOapsMf[ 6DsuaL,67r-ɵ:hXD֤IԚPaZ2V6ے;Зe9ؐtgi 8[b&SyXU9 eȳ sqWueް8;ǯϰcjZZi~M6Xʶ3G囡2}̷C]o׼iTZ#_=kg?[G8;Ǚ ˫#mh ?[o'gZhiy/lp+\Zhkԇ֟ [۵0>"%ϭcJ~-9aͥpYc7t⡎0 dg8꧿EnC?w U_Cw-[֖nVnza` ^ &P,e,T;g7y2> 7]w]vGhUgD}#尸+/!2碋.z\U[8N;Y%d֭NW_}2`݂z@f\#mdOmk#?˅,QB~>SPl: כi8s5:(Տ<940L*vP/c{B0{ sOXA=|֞[Ggo xWAk z D n<Ų'G:,6 28n$grix&V0! 82 iF4seún7Sù3ږ&[|ȒEEo,Foz[MW$Yc2)w:hK^!v],?q,:(ok6){xT͠K#N)Oݴ>9̧MXl)xfVxq6Yd:rnM+o73,}ͬj峼(6aµ?SZ'ic~xQ 5k W(r-\gZ8a,"7HKe줹2up9wPsk5<~ ́3 igdُEgr_~kw ;$,Y4&A/E/Z0|4Y cd6я=99=ġw]3~poZy>Ȱ7,^L'텼"y{=5sju%o:n+[!]SE`ɣiS |LV>*귺 hoz!1V?7u#x9'*Ⰲ230P/i6Va;rk(dKMI8YǙ䡽L>ȇ^LQױmki.(|4E 7ҋ0$Bs54 '-f}ڸgVx;7gLiUG4µjB}Xݰ_ ujL>0L^|׾[ז&MzF3(k8Gv=䋎IG uY?!чs#+p4}}j1#l#:W]ÆKX22/,xM'?~C⬌!s7-l&zN97guP\L[oix;76qQV>G4o&Fd1')8r,KO10Q36Qm!dXh{-Q㛾2÷tdI)^>&_E0gz=j--Z.Z7WV_}uMÁhXεGXո̐@r [' h|VpuѰf3=ZX賤Y@PO߶ $wM D6ۃc}txVm0gh [k'Ճs+OEe'{hZxF}cr>qQikTQ\![ÚV boG{h-<&aNB4$IΉ7y[9t-9[M:\_s>DʑӈIT+kivPd"|M|ɇm7G~ҩ''8h]V+[o,d-DI LnLLj Im"*MZ۹'ݜoVx)ceiurny<*ΙهisM'^=|BdYC~]l[L IDATan$m8u0y9L2X{4=zn婇x8OxyX<ݿ|ڱ2ǯl}eƺ*}ZUx#P l2`2cs{ϖBF_$:6TcFɌMFVӋtf"l}.b23GѻDJi]&we/J'kuq"(M^L戳's'kJ99R7יî%خwD˒F?YmmDZGrEfW]+Cv_ͥ8#8#C~bxpGpGv8Yn^pGpAZ8#8#P;ᦥD'~GmD&o7V9#8@ j掾%o?A_?\]5n8fm>HW_ݦ'݈Z'3fWԷԹpBHmCYKx#8#F-ki(j~·:I%ĉ{F&3b}ݧGTPvm_'-EÇ%fiȡl}:Ӆ: k 'KVOgR'׫:L.dd#8gל /7g8/ϑV'KA{o9c{K-sn|o~uWTg~6zyG8f+ou~wqO||+<22xGpU-gy,zs%?XlNZNZn # _.[}[n ~iJ 6L?ٿYoDd{}s8~?9shwY*˓ cǎ՟Pa?z*%偠:T~g/"~$tM7KDIO>IC9Da%{gݻ˗_~?,.]V' y_{Rх2n2dGeX=w8#'k@ rŗY,+(Rd I2e .y!T=P9s|gjkA$Rer9 >;vTGRovaJˏ1'у uQZ<ďQ? o`y>8@tM ￯$w,ŗ^zIh;.ޤ}2h `ĈzID$wז5\SOH"?o}"rpGp'kDHcUbȋ#I0D7a={N:i<,|O6M!E=pCL63fd CǏKS3IazWeOh;̓Idasan|}7N DX#?bIoHu'MѣG Hq=b _]%2V|U03,#8#PX^&e>r|b&"B^ g:=%J2,4, ˢXp뇷N)ge!,&׬w% khV#ZedTձgJXcɵW^I;Jȃ ŋ QY3S/[;۷o{O^#h/X`Hd@+3kMy|)o2oipG-A-cRƱ0G#8+k^2S۶m5τ4`|֬Y :4iX 뮻G=g2Ba %Lv['<,{,>|ӑ >z ! pBo{Xx!,V\ModiJ{(۷&jpG%,I>21B$lta-hCȀ}ꩧe%|ȀXB(c`2I%t!xG]hY $s&O#h&чv!GkdGaD^t7r1FG)ci&M^˖-8#߳Vby^a$Ϲ-d;ҍPEY1/k:Yx=V2MpDLX:q\Y~t8hED^|䠷'r[\TC #8;^"u )tG|;#8A-k@-nasqGp $Sҫx3'lQl60sG,\8K÷s%gy7VGX&4y2Qg[hh\T+cEZ4-=]dX~G\T5ʸ8#'kA-a" GEڄMę39q`ahv a,>*+GKK:-.$=:iVWDeй ˔YiA.!}3g/赩|کth\A 9lpL"}&}Gpxdm֬Y)[jp 8@&Uc"yҦii^.ZI3)~^:t~Ax`ҫW]T ˂|ٮg;YS ]b`0ͼV}GpV$Ftl;w8@:{^,iW*ZI5KdV{l!scǎֺukYpOcc.ˤdf/ʗ69Rj"IVkL-kg- x#h͛7ozwGLiJkQ&6.;_t/@xv&YMdf2@6B.>dU w?GE\*#('cJe^X\gl%J6+db֣GyW79呃<"{89(#T zR>Yʓ=ʖʼnXǎe|2␃<"8w#*>BqU{i2KX XlAnQaK"aFHh#yE>^ ?Gpr'k9r!\ GXOF 'ցZU8#^FtQ!/_S;Gpr&86X(QK咟Ux!^FZ,G[\P2G5jM AP,fq4׮d¬RտCRA%ha#Ed+ yqkX',1Sg"M#8ˋ@AdVo/]5. d-BVbkL֦-'†ܷG,bggB 9@hb&Ad-^5oX aZ*V#RTiY+Nlሖj`<ίZs3$ #8#8!0הȔ J%QתbR%Y,mxx+ҵ'ܒV-pGp8~??a,+wE_@-g3ְg? ҂kT伽uEEE8WZh?ڬJ?GpGprxԩRrK/mo{]Dɚǣ;ȓ5/yMLi02q/bi޼- K3?ZoݺF'cipR/8^l[޲i߲cM&a<-l3쒰q{ӄ dʔ)2k,Y`iF:uꤿWJ˖-}ʓ~׿~]Amee=H,1Eo;?/ŏIy ls̜9SH&MUj&zj%Φ~\/?N#%%%2n8nKye->8*.'iq?C2vX9cG3TVܻt"MjpIy4s$ɓ~Ў۫W/KV?V )oR\Iy|qlar%9~_RH+Iq,gԩw)Y~?|=Ə/'N޽{^UXrMY .#YM5\ Wo_A2v}w%kC3f(i# n9?lU |*믿rQGZku]'2pi֬|J8nj#>!Rk5z-me7l^zI~%k#<ֺp ?ɡ*7xcxAGpG `.ꫯ԰T>XݘϷre[1.o/Gs3*ycXU$*%kgs̑38CXc %7ZR ifQÏlȚcpB;P!Q +W;88& 8kWl<}˥^{x %Dg:ٳx≲רM<<Ү];I;#8 +M7TFLO>cTbI\wm5 Z4eȚ Y+Zi&K:2Z$,f(p뭷ua,bdFݬH갲~l62d9RelgO>D/ѥN]ve:$/*˒,|ag:g7.)I'%ʵ̏ʌDѿm2c #첋KV֮h`q{O&\  xɦ/8e!c 'Kul!rg+]W~5%|΃9 K\$#GY} ! ab V?dErn7Yf9{'^vҹs[:Hܹs`} E'kiX{p-Һ}G~CE]˥|Q'˧,UN6M[o-0,v8dg!/X&x9D2ׯr 7-`Qvn~3Xx+C'N:{-&\K.D;`%n)-3 v{챇gҤIrWRbE?0]t2ݲ9)2<^~>&sޫh?rȑ#bv*>a7-Je2:-cY V$kDi|VpX::X %wuWqB8kɚg#h;(,x 3`aAꈣ~7o/6`CYIP!KGF;ڷF ˁ_ڶm+W'T>DRw߭SNYJZ,!OAr:srJ֭`d!䍗ȇŏ!0Ahx!&bd/_}-\p+CO8 Cљ[o=} L=fX[mm>n ч#P);(AeLǴ8#mdgL}2Gpl`{9bfI6EY\~elDAr%F!_V5[1qXkFM'D)6,H /P_6lXMD'x±5[6HycQb<n( IDATzEⰌ?rz~6^5Ym׋/X;labi:=u[w#8B=pVx w @,y3`7K%ΑQ˥{29w`/dSYuy 51{ؤWWUVXxٳg )".cy yZͶ왤<'!t,>s[dmշ[i]h\_ԕ玀#8@C Xib!j@o~Q }ʗ\W疵L gq҄u-h|< h=f9orԅ%DF]Ú:8qq&ǵȹsGpr' ̣!kcQYM(5Eo\lOi\-8#*0QQ.Z}6e,sGpHtG<#8#8@C d!P:GpG%Nj sGpG!jڬY[i}GpGpV fY=eE Op8#8@C pdϋʗA38#8#pGpG'kBGpGXq8Y[q{͎#8#Tj! #8#88fGpGpEZyGpGpVNV^#8#8"dZ<#8#8+~`ũ|5/G~2iӦJ@r^^V@ߐ/5{ eОs6-j#5>/H%k,͛7{ o?C_"UT'3\쁴e)6i<09ho #48>/58䵪0瑚 jShȑxbw}YfI,>ӋE S/n.#|PVV&Ç6L8e|:J!&Ļ߸p0%s ˭~I-O}u]-X¿T [ K=?S sC祕gyܹseѢEZk]0ey's_*guo>+%%%ҥK)-e.G(_%Q3aԩS婧s9ǒOh?Gb4*?i$`rg*&IFP3oKR0XX:Pr˵wu[נ#t i\&MyAx jI2*D^yc=F@+M)g'Wrsb\ǎ ٔˋ%QsU1 * V20 kO> 'Of[}1gIK/*)-e͝# /zrq7˃>X7#R'DbzKuL2?o˽ݗ^ \G̲_~E j /)y4hL81K~C*#auV\\RqxAU<q*|'o]6tS9 ˣKyᇥ>~{ ϐpC8Pk}HN4Io?mB;K~{1(qnHe[;3nui}ۘӋurpirk?mn,ie!_Jڜr>D& L/5w#P? ޽{ˏ?vi뮻8#+e%xAcש*;W~t~;SMvem^zIP@p{1zz!GuƑ駟.%ocε^+C Qƌ#wqe3/`<`:sۅG8֘=#emyl+eN-9%y&a.?lX)c%L2||~SO<+i{o̫g-'OM<6hݴo``%kPCYӕIڼZp.#ufYfmO]vE.b9^O?$r޳'Ž p_}pUXE i[j#QK m`ȸd5PRWAa CޖoY*λdƌ6<={|w̓eepcѹx@/0Gw^J?1Atp9J5הr)'V |P ,or-ҿ_-oWK[xÓB#Ya,\}Z5[_X.ӊBuv[;GDIqɜ?:ѓb4b%I%a5#ju|甐0VM/R=Xo]y:? ܜ9s[H׮]u~cYܕf^qύ%;Ow?)Z\dޗNƫ5b^ e{n~;\(o(K:{OyYi׶ ˫&SC;O[3ɚ/ӧOyCh?aΙ4iDal꫺詧+'kK6m^sVgV>nM7|C/(Zy\G̲FG,O?0o-2֫W/ij/Mwn\Ϟ=ml9ްqsye8?p&Ν;#erˇ~%( %\"['3HNɑ[{u{Jʆ'M Ndx? /?[@*i`%^:8 HV˖-u|<3O!'pZqSqX+A817! "Id>m*:]vBqK{tWBJ!̝x`z׺߃#G(fyؗݡC{Uk_?osqGHa9={ʇW_manޤ~[{z?VP$W\G܄`7 vM5L_o~ɘ17#ˈk>r!ܜl'?a|XΈ)#>_ݷ$?Iq++ ob2)h tp F%bakE]\:!` / VzM7j٣V9(:0^2Fx #y \p6eQVo.B]!yr!tY#F-!?Md8p0񔳶A:蠊E~Osd7^k/D(=/`j¿,yJZIa'[dѩ8pc _{5E'?ob%#F*٢4 {t wر*3?OXY^e-dZ;,2kǹ&?G{VpamQ1<˂YSErD%Vp~~nY~FRXkXdcE|:c#Ǐ%lZv o„ j1F ~AK8^c~0άAsK,1~2!yV'A y+ fikeɏc` ?؎yj:uRl92Fͩ#0cs|6f{̙iylI"%f >\6ێ90[ԛT=ޔg A,uA҈"v24m%94p\cawl~$ ub^ƫjޤ.hC+\kQgC\G† K%VX` E/C"qȤL'q<T(N쏳r2q&T̶8ϬzgOb.X' 9zXlYYեͰ zK|:Q8"Ma [+(naq4Wf~?Jn8n} ;G^&tZn0C"XؖaM,GcWR=Xj2/z y< =Xj/0j2-=?f/hW26 Aǰ#*[%iZ p!+HZxg$/e?x9#8#48NrpGpp=VpGpGZC:#8#=uk#8#4bN?:k]5~ }v3\#8#8[|ors|?\Nu/).pGpE`>n[Q/I򸚶[e*m$Ƅ@ii6h2.d G= N~9묳jqdIII$|Z=rG… h7Xh״ [2 $D4Q /P #$dy\Sigϖ=zѣ|I'?L|Uɬ9@#dns=w[e-VN]Է>Ȉ#ZUiQ宸 ` Q]6,O}KU^E1`VEV$~+wԨQ YZrq9uYG:v(]t5X#]hrĉe.fk_e$wEAOs1V~g;HΝeM6v뭷JϞ=GwYvqGy5 tW +R{.-Nfm&{'Mܿ/-R#/J0:Ю];iٲ+<Z42 :TxѷPmm}%\qՕ3HC9D1>4jo/Z7\sO5mȐ!^{ 㠃e껔$@۷,ZHzUW]UeumMiӦɏ?(XjMϪB<@ׯ{ҼyfaÆ}Zk^O?_]0Z$G.l㭷R 3]tmݦo>{]vEx yK/Mvi2h ;wr)vۥ8$sLpC`޼y믿„>}zꤛ~Hmwwn KUa0/AT„?&T0zŋSaKT@4O\R/rLک.L@Rh.=}ݴ\;G| lݻviTXSarI'P-&_*//O~>D,[knݺUa@RaM[6Ԧ>*M'm_Ud$-Uodo7,ݘ::>ӱ'z|u^.ެ),_~>:=Fe1m Wq>i2cu/D.ӽ`q, IZMOn`,qVM~a.;A`ZOZO4u5k(IJz0aj]uϤ5׮Kҽiyj С\|2wߝ.ޞIDATE }d{fK# qS[},b R,D]3jݺ.m %Wp,0SaLa~dᥗ^4GM9Ra8TiGC+B'OJ1 ]<کy2Xt9oҬZڴpS/U 3,̖󁜥~',))6Krݪd<Œ&Zkf43k ᥖA3+j,ty?Lغ J{ԓ?sرdQ^eVsIֵP}'B|U&qluS ڈ2#P\ kŀTX~KaI&~@'}=mL@aC|j6J+u+2AaR)}kcӧWB^X=h&/<>5\3 R~ؔ OT_XI|ɪKUi |}'TXJԟgm~cFk{uvԦnd:-9{ Ò[hn&ay6^~>k60S KˏJm*XHWսzЯ8g Z.S/S|ꩧ+@"7X#uguֵߐ}"u6%RݽiekJ7TRSXXd-5u/LdrɣsdrۭtW£O?sSu]3`eXM&⫯of*&<ɦLx;*X t*)Oh4o]UipmPuyc,>oX1cR7 z\^F{LfU~R]^ehu]㼺>?Mx|DzZUU. x 7Tgҥ.kg=?آwZ")dsSIΝ4bV\lGݿߦ d:ėhu!ݤ<X{eez;$j|Ɲ#,+5۠5aO[hD'xb*6e0{%duY ;G`E [;T+J!#T4ا;V*T\YGpGpr'k9r!\ GpGpp9#8##8Yˑ j8#8#$T<pGpAZ\WpGp$%q#8#NrB#8#$!d- sGpG Gp#pGpG 'kIx#8#89#8#8I8YKBGpGȅp5GpGHBZ*8#8@ d-G.8#8@N֒P8GpGpr'k9r!\ GpGpp9#8##8Yˑ j8#8#$T<pGpAZ\WpGp$%q#8#NrB#8#$!d- sGpG Gp#pGpG 'kIx#8#89#8#8I8YKBGpGȅp5GpGHBZ*8#8@ d-G.8#8@N֒P8GpGpr'k9r!\ GpGpp9#8##8Yˑ j8#8#$T<pGpAZ\WpGp$%q#8#NrB#8#$!d- sGpG Gp#pGpG 'kIx#8#89#8#8I8YKBGp󀱲bf: "Ehy \g=5[5K{%z5gQc{jXШkXggf3Y{*! V%'BD@D@D@DJHUɉ0D@D@D@D G@b-GE6kUr"4 XQMD@D@D@Z CD@D@D@r$rTd*! V%'BD@D@D@DJUr'OdsjKD@D@D@=w{ " " " &eJU{" " " "PAkD@D@D@D$*MT퉀@ HUJX4Q'" " " $ VAjJD@D@D@*M@bD՞TZa)4^;m4?Y՞t[vj6_X4hM~c,Y¶Cc,b9yc,bꋟ_#~Gukďb]?~1^9[,=^`3~->-%jkk_~-kK9^poUo h ~WpyG6i~?rRb ڋm9ߜM,rrX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1blN|sX's9[9ߜ-։o|7gub>盳:1bmk,VSSk}IKŃW^e_/^~)<<yG?zkD?t-݈/Έcg闚M/b-mރ^\_)/;,w[~9#(eVdeSJ2?~@Q*/~{^Q" " " "P$֊N{gv544tK7oޟ73cƌ?NW?$F .\i #S P2J]*#m 6va;#mL:|Aw}>=F4ݻdۚ5k]/[]]566[om:FD& I_~y;VSO=>汬Z6vX;#mʼ v=}gzݬj|ۜD@D@*YnF[﷯]WpAW\.}7zEoa^z=vW۔)SϷŋلzKq6{1nTuGx<x馛l]wgy9SsМ_jmv*msRrzUYsD6`iz7m٩^kߎ>h(1KDn$>}:묳_SN9o$?wq͜9z-;R?,}!>!Ң^l<ѥ>ȶ~{|S4oM6IsA6nܸ$ƈ,N>= &=qD/BcI&~]wug%Vx`⋓?} [o=;3"ל #l9Ҿk{WcXi\o 8'n~i~ols̱[n% *V[# r-hD#駟N'13f̘uY' 7,Xw^D(g;JCQ<._|fξo/OsG}4B>̙R2C8_waٺlȥý@'}V+VFa "F4K/ȓO>SDH7_|Ѯ喹|H1 իWsM:wߵC^ɒY UʑvQGm>}O4ߊD #jk{m={4\sMc)zK*j9{Gs'~>?Z iSԌrq3 701buԨQɟ9!.ؐ!CZ;o~ti ԸwhZeQ"FCawĒ"D,o}7|\-Z]i,^vem̈#Ru;cby O/a7&k!ƒ ^8mzל HQP9sL RcMBkNg}6͍3O1vcH@"P{衇Prg٪XkUMbrDI=д@nG"žw9YBjӞ,@!}]'Uj-!XsaDXvcOO\V"r$kDq%Qɓ2EcO*q!,9k/?> hl-Hn;zf9>=9 ~cY*Hs(" "; 5KB78A6sZTX7Y^sϥ'Cٻk-' OR%"N;mIlZ ‘͆}kb{ rK>6W"1.$zxiK 1rI'-s !*˗< ~,YDԌ{CDx%rܱ}3z!"bL\"NYDh6tS\N<Ĵ,MͷqOD@D`"@}h g{iƜؙܿh, 4ɳwI9iP! 0^ e|'†nܴhO"Keq9#pŗYZiQx-u? ;>'c %1.X9c$sNF\<}tXS-U^D@D@D@@Â%!MӸ m҄Ik6NDxr'`{E?SܾLlj #J" " " " 3l-ۄ5 5 xVPNFĚ/]6>&ZgSl|h@KjmQ:*"j5ڷVYQ*PzD FC/7Xga3jlca"" " " ݃ᬾKlhEE6rbכ'5i"jNX! 6ZU&W^CD@D@D@9Wth5>Pe#XNtƞuG J" " " ݕzuk'*Uzܲb;(lS3LkH]D@D@D@3nme[mqPcIF!`NEeOQ5)twh& ʊ?^'VŚ7CgZG*DuSj)ph#)[y" " " " fw?{kDzĚ7PQ[v/QD@D@D@;R:-.+$bc+alCy :{>*$k^݊@9$ʡ$$k^݊@9$ʡ$$k^݊@9$ʡ$$k^݊@9pO$IENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Update to....workflow/Contents/document.wflow000066400000000000000000000160721362112712700321070ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx updateto --vcs=svn "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID 2F01885A-5924-4602-9D34-AAD298520867 Keywords Shell Script Command Run Unix OutputUUID B27AE539-FF4D-4DBF-B8E2-8886B412CA83 UUID 9AAD48A9-A2C5-4613-89E1-E052F8BDF569 UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{212, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/000077500000000000000000000000001362112712700245715ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/Contents/000077500000000000000000000000001362112712700263665ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/Contents/Info.plist000066400000000000000000000011711362112712700303360ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Update NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.folder rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/Contents/QuickLook/000077500000000000000000000000001362112712700302675ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001074061362112712700327300ustar00rootroot00000000000000PNG  IHDRk_UiCCPICC ProfilexYy8U]_̎s <,ypሂ^'9e 00m D9_P":H3 %/XXCap0v~pH^m} g9cW;(chkIoJ%R@Q(@F1؁$JFi` 0a~Ƹ?7lX?u߿c `he9膅GG7Gl%%AU)kZ dj-E# :f+&2? pnD, Q ` 3pHA H$8@)@h-t{` 0fV:؄  ! !qHR4 } ! bD AEPT ]ڠn4 MBs; D.bB0E!#D,qьF &%W$@R#HI2RitA"#Yd9َG!g( EFIqjGy"PP9"TՋC͡VP?D4'Z6F;qtt ݇@Ac0f0F cqbbr0%Lf3bٰXu%Ʀcab`c`7p8, ť p5Nc[& *%7U4~Zښ:0Yk稿H1.a!pPI"LVDQB& V_7hhhiiiii|զuM-A;LLGE'DKG;DWLF+= %}}} E$D'yHHwI H~]/#  } o1ŒƌٌuC+L$&y&LLfB̹̍OphdԳƾǁaC7G=.ԗrfpYaYsPy%̥K /W_a}e2rʦZ&QS꾫#uzue k{\hsCFMV6v[R*;x;o3wuI+kۯ{ǽg^ޡ>Ӿ s_~m (4* 6=Rx48<4:2>w1{O<{3g>ߜ:WxtɄɉ1Iч)R SՏȧINMX=95ݖSwISyKJu;VTWxAbNYSdʘ 5CheLy^o̽Quiygm;-wº{^K;N , ~46ty8fD4:aibIӃL&&_?oʘ{!be̅و9W,>.}`Vf~ǻ';OH)hs7{ 鶳'0{f`/p@53;K4FB@ ߣbt5 &{"DfZ.: z5-CcS%}u62GgW3 2+@0^DZ\,D-R_eTd)o2S7ԌNn ;SFƫ&M̶-PV6"vN&Φ.&v[ٸxQ\=},}Lu4ՂBC9ØIt(DVZطq3&'<F2>~pS<Qg ϡċ-ǔ^/XXrɭ"r˕*DTGmնkף/yO_kA[-Cv@g靑nLݔޮ~>PT|888"3*X|Lx{ S3Ihr^{97fvfno>,ly{Ͼ$c_>|5[OVsV_0ߒ0Gr b )GnBPўEL8f= ų{ %b=M4GW 9>J @v;]N!.,:Ar#o1_:0ZxCdBYDYjk3z#.rbX W(+ +LV%P@iLi^:K7 HŘ}2xs[ K+h[c;Ag3]\\svgwM) ^[AcC BC}>hWf4o +?P,>q#SFqK>.{!#S|γp<Քp1Ղg/+-*/.>_^rBeP\+KU*5^ǯ-6^3CMfOd;ܾs}.wor~8f\3ӆ/g?ΟX}>[0u kCr  +"v*!={`ʑJ`8 C0ߛA`R{D2bɏF&!k(|3!4A_BOa0VlL?58\nJ*τߠRS'p(H&8Ҵl@wn>)$3 sK;) [,;Cc3ۙ{lI[÷'߄ڄE DE'*%L$ER3{dd|)*Z*+Zy PH,jӞGW1331lr4,<"2*&6.>cSs˨¾7nwuGJgQX 9:3#1>4a$Q!R2C);G>d,gg} ?vJ$1Dsv%GZ. _AU)D\\?oӅ{;:w)}-΃CKc[O2ͻإC>|vYY[X?!rjf_ |Ug2R! #`_G"H 23rIE렓L<6`8N?ʅ'>AB єNCɠY }AgMGJ@jbPcf4bereZ`a\`Uf}N^aαYĥ}ǔg|7oLSPXpYaKQ.obCW$IJfȬ=ХxS NCUU:SY{m>B:FZ6~Q36 {nIGe'{hL}wϹc<)^ǽoLa|  /xbbc}WN8XfrT_2ee>Ή<>K>u4m癞B޳EEZK%EeLc9W̫64x\WysyfGIgJwk{6gFƚ'fOOИajuB{>e|6_Y{~fqc;HM` "Fh 8D ǑOP<`T+vDW71˘{L%OU#ҎNh%JoӴйѭg$H X Ymٞp}Nj,KͻwB C0LULDCTJL\O_[Jd\|B7UCu Zuf$ ƍ؍MOX,[X_eK_t4vjssۏsKp_z> qc 63R8R gxu>Gxn)B^{͙HES%V/*U_("TY 7*u4h]k41ټޚж}mΪ.wzI_}@0gQ1O|2:˧Ls62_}3=2l?\\Ufuuאuķ Fww~xYŲuis~{ϓ?'wwww?WNvwA>~|*_}jgg|ggL2o ]Wc3ۿA4zX8 IDATxU_v .{޻F%nh&5j4j1Ĩ @tepeY~Ng9g̹m! B@T$UY+UJ! B " B@ F@d;GUB@! ȚƀB@! * UM! "kB@! `D*sT5! B@i ! BYQՄB@!V!0( VWWg_|}76j(k׮΅iӦM;j6dowֱcB̆fy37p 1msSs {܊pQׯuvak߾}$iխi/vFRYU ?B=7& ̦S 61vmo؅WoHO׷KN|Y }<` }B`y2JDN;TԨ1aO:Ӱ[ˡ&ԙBdmB&ƅN<njcwy}_V_}Xu4x.;餓bOx^y6lŸ4@',A_oqxLMONQZ!{{~vo oekYǐ2&=nUEy1vm۶+ѣMWYO`mucOa묽Wc&Z.>DsNofu!_.,N*_qkMAЛ ^~_ف'٭ڪN}ۿ5ҧu\als^:tPۊN㊁ 8|1\QLdxqE7ڗښWŔ@ޘ)nwy'y=5pASA|}ސ.R曋đ7ް{G~O~5+x/ T[glFh]rNV_z;ƇpҌ,ªwcN:}<6hb1x0F/>`^zkMߵ; aE!_x2o7jQük1ojˊ㼁3}x?x]~?|{KrF'|R&L04fKЀ/KIfE˘U;m;xpv֭(RX.ޞ{mL nʑ2y丬'l /tA*R{\)yj^Oב8a↦'Dx EӤ2%<Bү=MZ6aY*,N KՆ~7w7o!E ա5&Y]ԩM4)+c 7'Y4yc8,Τ0>4*hFkOd|gUmxO FeVX?0ņd ߗʍ{Bwu-5 c}وaqرc|8wUW[lar}%M7@ yxe]$3q||ֳ7<.ySO]3zc&m iƆ#' cjlRYq?s^c^~{y=0e o~`FNm6qx? 2`Kz=mD`nDʸdD9S uÃ|^ryx^|}~x=eS6asB88hoV m]w?O+ۄ1ϳaK8Emu(é2Z[=hy KKwƍ4YE.z?lvqm|W&'>.k4hP$[N*Ir>-ƒ Rl 1Ǽ+%ujMٗ_~9]}.X6do;6SO=5Wt m}1Sĝy˕VZnFd:61P4(c.p3 _@ֵ&‹?^7w!|}s;7N?4ھB&?L2yZP?:ujW^y-䒱-#;j%¿Pg..a&Zvl[1"hڴ?uaZ8,QC?4kш HL Xwj¦6qhX Ǎ;KpbHS<%rcMx9`O m vbC`K.Ŗ\jQ3v+.Wyšoxza9W,?DB48h01D vgI.Y 8.-AȜ0ĈG͠e.Ygr|Bnh!<X [ C!Fa!?y0؄j3$,TOd$^> !$C8Y ߋdL0{W?&j&H){XΥ^81۽{c9&>hebR@[=)k s}64% FN26Mu'HGq}̐*5a} z>}DBD< .@jٙ4qGvX#Į&\>>^K} 8Vy)L뗎/VX`~B"??m#9R{'Kc!pxM?Gqd /dt=yWçG?|wۀ9{{miw_kB_LnJڞc{+l4Ad nzp<-}l\lŢ 1 $nxH 9T H#N:ˀ0-rNcHOY<%F{G9s22Y!zAE{Œ uaMZs+}E=yv?x.)%?4hbNԑ}j?Ҧpݞ#/Ѵ {{~nyٟ⃻s@Z ]^݂lݭw?ogC?u; iY琶Kp1嶏-?1.$H{ 'YnoI9&+KDif[mbrR4ĺry^駟a#pCma@CC;Y¨K M_j"ٸ fT{o ih#{o#~B|b1Xl?'ӱ\{q $9x0O8O,guV<AYHG: nY&l<&406^w}wG}L<čyy^fL!iUa`X Wu뼠%v˹^'\^ ˟`|l Z:uo=nƸy KLČGd<9[ KKqMii 6Ən _ۏÆө=l}.4>`-er|dA+w§:9a8Ǹ/Us6 _2CD|"rE{ s -:M1#MWS`HqyW|VA@kz^fu:-+d-\A1V aߎ>o'ZA* Ox 3gGcQ:G;/lŖ{:wy CeGsVc'8qa>Q.o7.njOsش@>Fr :1i/`Qp=N~|ņh]ӄ|/+^go2HKY|lGC ^fv27*ḹ<=ayxOɈs;-'+ ?77x9^vx'iR^/~nɗecȓyX: ,PKiРq1)qDhnZ] 9C?:%tx\jg66Kqhicg=A4(|wm֑@|ce1 KH|y]>eI;Nĥ2ɽybs62S3mަ^zDfb$Mva4t@7MNeJ'ǜg:4w.;ueH8xytR,3 $k )&OA|a<^8v>%r66}06A?LwDS2ر*sTǔەx<ǟIc=Ys?ayu:xXqy6/Z8b6 z|LJxo%͖fhlUBe|KCaC2` "ObnnCP1dNPx$q. =@\23"$%14l)3(߇8cC >Nas\ehX*e?K/1h~!{,7~$m/7>\&>6 #៏弼\&M: m#OS4I> !B2!Lc򙤝Xq8qy\.6J4n76.)w֟ 'o6?y<4]vsxnP)>0qƒnǮTNjZǖaJf|vnp~;&Yj<Ny$./9UiZk{^i㢹#\HJHQ&toJZ}0+6p\ޗw)i^C'5;Lc㑲 >K̎vUl+^Ut 㽹]Ir ZI! B y"B@! @Ykn%B@A@dE`V!B@! h:`4b.6I>,6]CyVX!oQAqB@! !3WL K/]$W_X m^~;8mD䃱Q'e7.~l"<&B4kE(fЬ%'8&qboGTPFm"N\9$&EGMdʑCi.Yg8y\$}9i].e_ YLd2!l ! 5ϙbs>?8IZҐ/Ǎq{ކ IDAT[lx7f{zK?~nSr6wqGrex:L>l$r񞮔yfEF) B@yifYD9TM8 pҋxץKr;B~ou׍'H{7j}QuYǖ\r"p?|>s~襗^#Goy>K,Of˃@~'6dGaS奁/.5 oxV[-^"b[{WxВw}/ooVnk{W" ݻw~! wklgZ[/֛g 7~i[eUb /2B@! ZPc\q.T7א5Ғ'p/Ia-i!T{o_w9f3fL c="ɀs\.O^"YBӧORoム c+~xM8AEʁX~駶kF< e˶nGcK-T$X/B$+rlJC=dSĽַo߈|P,8Hu.b '|bkv 7 '+C$ eB`VYk"zN2wCZ i=O!*Aو#"Yc8,Ҽk2dH$? 'CshȆ fA6y8p`\z!O^yh(ԣ>joq@N-e!8hü{Q~ Dh!=ǸƲT!q 79 e@ ~!lZkqm<K&y<۱c~B@! fA+I"ŤIDaB $ rò(Z&)<6ġ{"9oy".qҀ&cHQ@)Hz "KK{Cx #PYdoA~OD\ڀfXڇu$/nѸ?aSoל!4Q'-<7=kH /K^_+<Ҧw7diJ{[rc'BT79yl> CGAr"AH/@fxH"d1[.Ʊ: @>㸿 +dC>èB>?ĪgϞ1FzM챂đx6+ǥZ!5#C;4cOϖ ^4g6䯸⊑QwJ!T|h"Ah?y b7d1%?{.BؗFO K A˫72e#* 7ƁX:h]8yyB@>[.RI:׼@ QlNgnȠelf@,Hn73C"02yx؀0Ҧ<KrxSN6BD E"Q1seRgHi5-xx.bhx{)|1^^ǹ|vy:uLO+[!  =k3V&-?+=h 8Ih!*#=dM6d! :+: ÍAs& rIý\l/PoOHTaC#w6O}4ROtB@4i֚ZV x wbY*eYIprFYs2yTڛ4ex^/4]Nx>¨ˆQqlwSF6ǹMwKnO: uvRF~%Ƥ8ۄ! h T2M=I=ShxeɁ8 y8{0nO 4n /i⼬luzpYn{޴|˳]fd(L! # H̄Da)-=9"ZeRǥU6NB@!09T+B@!P(F! s9B@! J# V! B`# 6ǻ@B@! @iDJc! B@qxsBV[me,LL߯o}Ws-U…s6~Gk銩|! ػ[wu)Җ>~m裏l!@% U~WlK4%O&UBU! =x6Z'ȑ#m-*6'j QD9^B@4< oI&E?-# W酆?7W;찃񛼘r? /5jŇJh WPXU`B@iɟQAoo .`bC͟iÆ 'x–Xb [|[+C.+#6,j`ʪB@̻,q|TM:GlǶfٲ.A#l< A~ +[7VsM]r! *g\h 5*&,†q :j$~$kW]gmjg|`eύ$jVhjT"w];eP\p#}.KB%HG >K %*2yij [5>^tumWg];YSMO?zYPm55Y !0dm tTB`*Ǿ'ZS mkq- 8D"LCo6zb-HG;cZ56 ?! *^Q$ 3^F+r \ŷͩ8Y.yh;QK&?r\cW- B@T "k)@|iՆO@6}L^zole!d!yE>a2B@JE@OJKaQ߄%πņZ<D8O܍!rGZt!:`BЀ~rjqUq,Kw|ʑB@T*m+b6h .CuV&p!#1sB3MG;yJXy##4L&L AmЏ56fBҸΕVZ>B`.F`LQ-'lDBl呵,#-y=acسNi1N@ux,нzwok{Tw &i6dT6>x0YI+3@׎?k,Kֲ8QnAU8B@DMVd{oV_CQt*f5f[c'FMGX5XYNf+h:~6+*հe,Q#~f} f%/hVG7f/~2!^Glޢ{QHcMcuv4r1^,q-B@O^lT%~;Y{?4%k$űv?< -mIAse ! B1~`~zJevZsc٬AZpxkH:K(J B@,~߂˲2y1rMn _? -N١ʺt}5~yĉM8W:v9VZB@!PA~U.~.;ˡ[.Ys6Z{eM{L;l&m)ٸiؤIl֡C) s;-nSbw%5ag4? ,^YqMCo87&0k8Ǝk]v?^K,a:uOh[{:{_E߮֩C %kNz\R<ϋ@n& M[uum۶]%¸o>/~Q$zy)? />+555W_.޲|Zk-s=Sq4iKpvm_ԺR{޽]V &/m^XLO?wVh3 +>/m^#&'U^~yc#oih-~?85cƌm+/M{Y׮l>%LIjvnK/2LAdlφ Iqmp78CW^rK;l?lE-./^x!2pi߾⋑p~vw؄ ljr5zmVXa+W'{衇o,?Їom.rQ! @% \oGRCA|@VY %X]2F$[?|4i ]OzURdSВlȑvB -MΝ8רajlܸq;u]DnYyGl5ְC9$j|&ug^iެ;rE=쬳Ί{xHKIrvGؚk9SmoݻI'TJ…B@/4jbV[m5f(IGzJ,->P~NSj9>f*Y<:-!CҰbё(s<<{_gLG+r;uF:DC8[xJӸs[?p~8>nkh3tm>AXy¾뮻jݪ9ҳ.+=>|΃9 mk'Ș^ab g;dyq{~]kngZxm,AF/և9\D/玅ġ?>EeNv-4ğ~qދa)KC f7H; oG }ݍLYdڶۥ^ZԀ2vZas {= ,(;ڳ>Ӣ3όj_@HW^Yvmg=\L{X^*:MqgTN4O?Slq ?ޫ匙4ƏO%aa bv* 6~SfTAuSyEk͚dRMO^eU."L׎q"mn(2NHiع,YR6M7Xjp s`ańA|76CYyfvC\ 955o3!u¯ND!K7xc$Gut#~e]2(67PG↶CNpK-d!m݋-X 駟b82 ; B EGYuH",Ru-B%O/4!j9Z!p#iꦄ cF3^hP~σ6ɚy]27IPY@~@xЮ]p|^uqY{8q=˅z]~Qӄf.@(o{7jX~E{ۿ2!oJ ?:Bap ?O~NmKO1>i@9yCC裏nVy\p4/f /44l?b_r)r!R5^&'n/'lO۷o"z$kR2H벲e/B%@ Ug@K iRn]xQuyz! KsLlnCDZWògfeIXA:+{\th1})ϨI\feb24_FL=1!;̎%S! @9 {0kRF4k\-W@~& D(o5MuC 5j%bp'xM \V~ h ,b éVHvt'cf@9>g1tи,-koqIJ!N˕8[/n||Bm N>g8Ns6ŠDƇs7a ^4ƲB@9_ødpay8yfejVF%-@x˱!Z548| bj< pόW24klAȝvi0;3sB< Oja` BZa$@Sʕ ^<@QO3^4^{m!.&5Nqqٛa WL32B@! yg/@,[<i>C&{TyH:[~)v6 0(@86ҕ9q{ؤ 4VTYh8\K^#eӉbXd@C~Ah/{M˓!7x?ۆnOӴL-$eŧiB@!y/V3KyZ%ЫhUK/ٹ5k*\N8MڵlELhf帆' k7Pp?fj70>.ekB@JAB ↂ(xڬhԼE`^Q٭ )ejB@+0-Q5;MEPɮ,XB@! G gS ! B@@@d%PVB@! h""kMNلB@!gm϶D}TB@!  O:_{*?q<)B@@[ȯ'5ZAH B@!0Ysثd! B@4Z& IDAT)B@! "ks{,B@FYk"%B@! C@dmaB@!("kBB@! s9UB@! E@dQ@! s~`UoJO> `dVvP( mڴ&KzAڄ_p.wWB@F@Rϻ8Z cYUU֡C$XaaBݭ*qxkY b =v)_픂 vsۻv=co/֨@hq4/8M*瑙SA4s&Ӈ~h&Mwڷo+&~g"䟆Ekgd *_c6!\[?;č _ennsfЪT! Z5yV>2eV_}u˜UU 臘.u0b\FN5tws϶~W ڵ𯮮kA 5mlؽ7jGFXNn'@!yio+qiv6j(?~-.ﶓO>"碋.?zQ nݻ2qׅ+deo*Qsa~{NyE5\cRyϫ_k?`56hYGh]rNC_z;!Əm|=6ƍWxSB! GgϞe6y35!Żkjr̚y=K~^y4k}G/1Fm6ڸ!T_3{Gl _6%{Ï8"(l|?2)+2Gv9)%Q7y?6ŌLj_类o :{=tͶA[Kȏ׭Sb&#@ ڒK.W.*?<)lyWuvmSOv)˞Wwq=3o.h%#ͦYc7| wh)y۷ <~%km{キR ɓY&@ bS/ފ S/m&oL^{jv衇;,R_n묳N68Htf>~kKl_B뮳w6xc;쳋㡰k(gM7.7ް_}{gX^A;6a2KuўVm>]3zcm\͔`cvm::L/5! f|BiW>,pGۖ[nc?A8A Ϯ_fka?S1;TӾ^p P@0m-En'x?:k{%ֿ^cflhM{,O1xn|[5[3ΆL y:5m2B@LEI 7'sO:餸<a3a_X`8ѓbDZBV3R_$$<+y&[oe|ĉ bfȑmE\hrL9??VXqxHSN]v&NϿ`7_x^ՅAJyȻ !;ģHyϺwرcGB;1[?5ƆAѢq3odG[vd;Ӻv>x;[oN8;6̽b\}MǞ|/?0OЊ%/m=Uoz=^g$=WyBYsP45olT7;84Y#^j"3vP6,^d,z{NOq *. [lII@dCм1c@-ĹA;@_~eI4,ÉfZ;p 2/d=sXPq1xnW?X.=3b݂ jp*κ}=kqV m K#Fğ*p6򳯀А6;7  pC4ysc*\ yAF~H-7{5Z aolʤI>YgUe#ۖ΃t =pyAKsN`baG^5NBتk֭4M<,Z ^h/8o@xn2@(]vٸ3L٬V- dQ@$9|\%߹pa={8LcxVVV ܨ{AeY&tޢܼ&?=p4ʁ7ʂFo[\15yGlr [X*0^C&eGȞFyL_2[T<&lWLE yH:[cv 5od@q>` EϪDX=aypcxU8Qx-:?꫸ -s s$~w?[O_n}~0 /l+mv;zVh}(C/Ǯ^ !0;:sKt]t,DhfŠMp#^r;g̼DZe.Unu`eR`4@9EQY3gΣRlJR_TהGNuzh]rpHHԦYi*o ~ܐr}CrCl獈:;m4zhXnuMt ]?Gxzlϖ'=+^¯ <Y CM%mg:3#$kaB[k=ƾЪq;Qm@.0\nDp^vg||]*xF;/OtRtyƿy4wKizK'|y/G+r翦OW*f%k4 7;74wZlcu6~g*e)º(yxȚ+v=ZɐgMl! Z~[Ky)﹖֯9^Mz/Khr4|=7ʫyU5{8ؗ-}cKܭN]iNeHʦ6/u TW_0<ņ d<#;(I^SB!|wZTڼ5,7LCVI`R9wB㴁(׌}`39"(Kc5H$kt48s/0:TكQ6.~1mك yKwyՒ5qo;TԲYA"6+* y4sidͻ{veB@!P.EJ@ /! B@G@d!WB@! (RJ! B@8"k- B@! @4嗪B@! hs1ֺf#k[ol ! B@T `|y\:%K/Ԭ2h)aB@! h^Y{嗛HkӞ3mhfmjJUE6V樍r9dJBRhq7,iTNsww`ƍ+iPtlf*0ivZcǎ- rgYD׈#O>6`$yG_=CxCl(℀@+N>Y˺ۨ(ov> 5VγeY& 3ۆY)oh<o~GVY+Y@_|qիZhb۞{i?~_\c:ĺ񲅀s3-Jx~젃*b&lb .']}ն+waomvw8\`h~/tGɓ'ꫯn+r|s0i/YXjȎ;'5"wn:uGy$>wuWP 5w„ 1چ83#i\o,oiun fѿ;G?Z͍7:wlkm'ĸ~va0>cؿRc|d5XƏoh`q&ߐ!C>34^φBv}w[{ouС;|cwߍ墋.u6X4k_tE֣GbM7d[l=3YgU;裭o߾6j(;ꨣl6*(%sD! VF]H~&СC G^ia>.}헅D&LH?ODa)mV4iRᩧ*B@b0~?b-V aV! 7{(6lBP aR*7%L@wyPWWWk կ\T!h 믿~RK$#1c $[7+mhJy-Eh1K.K㲎Sm& ڧb\.W\qE!\V[m5Y#mhjya`!h*c 7(~I_}=Dr… ZBдֱ@xޤIsݍdr /N;)Yˎ Wxr-EB.] } kh̗=P;_~y),\zrO{nGrV:W^y%/(B@A`N[[m], .E?r!ˣnwN܄ĝ3y奉BO!blA\yuy 8چ4|#M6hnnj屠u1 =ؾqƲ C_[nŶvпč lf@+E9#1,m6rY'O0zq&fV a+\M9lF|hf M-ICh-&Nm&w3 g5ea__C @ p8ie"4ddw} MNhw衇{i47y /800c N y7>^@C K\5Y1W]uU'@! Yq-Ao,,͜yH:[cvӎ'ɋN@M#9 ix})䕞 #'ÞxRT>Nxr˫WJ'.Q c0}4Mچր>kXE{~.4,W^(X7vgUf?}2MؽB C޲17>]xd9 mn,Mkq!h6PLMj@C UHIDAT8!IʢUvsPvR%| 5e8K}H}9啪Pd#iPɳچWր+ %j;G!T=}ϙ)^vp7>=.'abdXF! !"dmZq廘|oD*e6| oM o! 4*/KF 8>1'2u4d hs"B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  D*3T! B@dY""B@! * UE! YDֲ/B@ B@d:CUB@! @," ! BYPUB@!E@d-B@!  6g]}'YB@! h6` ! B@47ZmnD%O! ͈Z3)QB@! hnD֚QB@! @3" ֌`JB@! FTB@!Ќ5#%B@F@d/,iNx~>FNG^Xct|䅥??>FNG^X3oٞ_Y.]̘; )g%gp*wВ'/Shԩ32ћ&IGOSU9LVeݺuAnInӰRya? <<;/m^X'u Kyaiԝ6/,͓慥yRw^ڼ4OKIyi<;/m^X'u Kyaiԝ6/,͓慥yRw^ڼ4OKIyi<;/m^X'u Kyaiԝ6/,͓慥yRw^ڼ4OKIyi<;/m^X'u Kyaiԝ6/,͓慥yRw^ڼ4Oꮮۨ)UUU[Ng~w_LjO=)N'>Ftgz>Fz8FsTF2afEEd9 hdQ[4D5zD"#xtUFQ`W׼i`zTw*R{U]P)dM95z>#x6eW]!"z.~3<2߮{+(%qLuq?xeW$(L3Ld/" " " Z"̛7^x+--ۍϥl۶mݼyS?+=^125 9AiJձcG;mԨQ^y{젃vƷ@' ,kvO?m;w_ݖ.] GXNx/ӧرcmvZe%AӃ>D:mʔ)v'zVûuo3i?C`5tP 4f̘P1N~vmfg%,[=ze˖g}K#bݺu 8ۄ l#8¶lb=\U8i${w좋.^znF駟Bה`ѫmA{O`֢֭E=Zh_^}U{嗭O>ՈڠA f qA7pApCAQǎ{  mĉ+L闔5w:^&Y=#Ar>7>E@D@[oZ*3$K. HyuO?=,!B05!& ("da=Xpʖe\'y݈)˚Huk#IX`%[q"Pf̘D1/,Lb0,U!KZ˵7;׳gO;cC5N8!X$Ns\spOPvWi4ei^ڋ4>}GS|,*/,I [wVyfӦM og-7 qqDd ?ӂs9'->k9ҭWVC1PxE,8\>k"1/zx-Wօv5w}A`M$!Ǣ7'fO/E`9(f8.p/`Cdb-"q+˛yƵ"]!,K sM7y@"8kYGZ%Zj;VݔyO&-f8_\76xe‚KaCX9Ssړ8vWxSƚ8l|95~n0^a.Kc<`lĪs %1/X`9c$sMgnަܙΙ.^ĚO) uKXj+t5L_5K$q T{sۢ,PtPp'Eju&26 e@ rj+W&Z?SUgtziBͷa}Y¤gܴR۲'ڡK -#6ŷi]oVD@j@܂?qQcl ^D j^tX ?EYI]Za'£XD@D@D@D =<VoLVȁr-Ҋ5* &6r,)J!S.)m%ڢ@u," " " Nt%Mb )4K\/X#U+֨e7yc * nߥ}/|J" " " " U*?~ Bˆe >0%J_/ZqF*52k źƧllf,.EmSJyJ׹̆.稰!ܪ)n-㻢4@!dֳ[m֗ئm)ǪT4 ZaZVX6֣]P@#FEZ&(֨lh^feWM+".^*4qn)#Y jllҊ5:G|E931mQu$ڠ$" " "T HQ JgUvqniŚlAg$Hu." " " \7yXY,2AI1XQ24ejPShL!⛗l)X\y ,6D@D@D@D)pݔnjԫVQ;6=Ey" " " " f~mXUڋ@S'IGUeZ0ڇE@D@D@D@H:{:*#ku^Ê@.$r:" " " "PG$\HBIuD@D@D@DHx +" " " X˅ꈀ@X#VD@D@D@r!YbtIENDB`rabbitvcs-0.18/clients/osx_finder/services/SVN Update.workflow/Contents/document.wflow000066400000000000000000000160651362112712700312740ustar00rootroot00000000000000 AMApplicationBuild 247.1 AMApplicationVersion 2.1.1 AMDocumentVersion 2 actions action AMAccepts Container List Optional Types com.apple.cocoa.string AMActionVersion 2.0.1 AMParameterProperties COMMAND_STRING CheckedForUserDefaultShell inputMethod shell source AMProvides Container List Types com.apple.cocoa.string ActionBundlePath /System/Library/Automator/Run Shell Script.action ActionName Run Shell Script ActionParameters COMMAND_STRING /opt/rabbit/bin/rabbitvcs_osx update "$*" CheckedForUserDefaultShell inputMethod 1 shell /bin/bash source Application Automator BundleIdentifier com.apple.RunShellScript CFBundleVersion 2.0.1 CanShowSelectedItemsWhenRun CanShowWhenRun Category AMCategoryUtilities Class Name RunShellScriptAction InputUUID E86D82B3-74F9-4154-872D-EB71C690C797 Keywords Shell Script Command Run Unix OutputUUID 7A324629-564E-4136-8E09-4D176E5C2B40 UUID F1B87754-8CCE-4BE7-8A0E-3A27D10AF24C UnlocalizedApplications Automator arguments 0 default value 0 name inputMethod required 0 type 0 uuid 0 1 default value name source required 0 type 0 uuid 1 2 default value name CheckedForUserDefaultShell required 0 type 0 uuid 2 3 default value name COMMAND_STRING required 0 type 0 uuid 3 4 default value /bin/sh name shell required 0 type 0 uuid 4 isViewVisible location 309.500000:382.000000 nibPath /System/Library/Automator/Run Shell Script.action/Contents/Resources/English.lproj/main.nib isViewVisible connectors state AMLogTabViewSelectedIndex 0 libraryState actionsMajorSplitViewState expandedPosition 108 subviewState 0.000000, 0.000000, 381.000000, 475.000000, NO 0.000000, 476.000000, 381.000000, 107.000000, NO actionsMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 475.000000, NO 164.000000, 0.000000, 217.000000, 475.000000, NO variablesMajorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 350.000000, 555.000000, NO 0.000000, 556.000000, 350.000000, 148.000000, NO variablesMinorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 163.000000, 555.000000, NO 164.000000, 0.000000, 186.000000, 555.000000, NO majorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 381.000000, 628.000000, NO 382.000000, 0.000000, 619.000000, 628.000000, NO minorSplitViewState expandedPosition 0.0 subviewState 0.000000, 0.000000, 619.000000, 437.000000, NO 0.000000, 447.000000, 619.000000, 162.000000, NO windowFrame {{191, 73}, {1000, 705}} workflowViewScrollPosition {{0, 0}, {619, 437}} workflowMetaData serviceApplicationBundleID com.apple.finder serviceApplicationPath /System/Library/CoreServices/Finder.app serviceInputTypeIdentifier com.apple.Automator.fileSystemObject.folder serviceOutputTypeIdentifier com.apple.Automator.nothing workflowTypeIdentifier com.apple.Automator.servicesMenu rabbitvcs-0.18/clients/osx_finder/toolbar_button/000077500000000000000000000000001362112712700222615ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/toolbar_button/English.lproj/000077500000000000000000000000001362112712700247775ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/toolbar_button/English.lproj/InfoPlist.strings000066400000000000000000000001341362112712700303170ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ rabbitvcs-0.18/clients/osx_finder/toolbar_button/English.lproj/MainMenu.xib000066400000000000000000003755541362112712700272370ustar00rootroot00000000000000 1050 9D29 664 949.33 352.00 YES YES com.apple.InterfaceBuilderKit com.apple.InterfaceBuilder.CocoaPlugin YES NSApplication FirstResponder NSApplication AMainMenu YES NewApplication 1048576 2147483647 NSImage NSMenuCheckmark NSImage NSMenuMixedState submenuAction: NewApplication YES About NewApplication 2147483647 YES YES 1048576 2147483647 UHJlZmVyZW5jZXPigKY , 1048576 2147483647 YES YES 1048576 2147483647 Services 1048576 2147483647 submenuAction: Services YES _NSServicesMenu YES YES 1048576 2147483647 Hide NewApplication h 1048576 2147483647 Hide Others h 1572864 2147483647 Show All 1048576 2147483647 YES YES 1048576 2147483647 Quit NewApplication q 1048576 2147483647 _NSAppleMenu File 1048576 2147483647 submenuAction: File YES New n 1048576 2147483647 T3BlbuKApg o 1048576 2147483647 Open Recent 1048576 2147483647 submenuAction: Open Recent YES Clear Menu 1048576 2147483647 _NSRecentDocumentsMenu YES YES 1048576 2147483647 Close w 1048576 2147483647 Save s 1048576 2147483647 U2F2ZSBBc+KApg S 1179648 2147483647 Revert to Saved 2147483647 YES YES 1048576 2147483647 Page Setup... P 1179648 2147483647 UHJpbnTigKY p 1048576 2147483647 Edit 1048576 2147483647 submenuAction: Edit YES Undo z 1048576 2147483647 Redo Z 1179648 2147483647 YES YES 1048576 2147483647 Cut x 1048576 2147483647 Copy c 1048576 2147483647 Paste v 1048576 2147483647 Delete 1048576 2147483647 Select All a 1048576 2147483647 YES YES 1048576 2147483647 Find 1048576 2147483647 submenuAction: Find YES RmluZOKApg f 1048576 2147483647 1 Find Next g 1048576 2147483647 2 Find Previous G 1179648 2147483647 3 Use Selection for Find e 1048576 2147483647 7 Jump to Selection j 1048576 2147483647 Spelling and Grammar 1048576 2147483647 submenuAction: Spelling and Grammar YES U2hvdyBTcGVsbGluZ+KApg : 1048576 2147483647 Check Spelling ; 1048576 2147483647 Check Spelling While Typing 1048576 2147483647 Check Grammar With Spelling 1048576 2147483647 Substitutions 1048576 2147483647 submenuAction: Substitutions YES Smart Copy/Paste f 1048576 2147483647 1 Smart Quotes g 1048576 2147483647 2 Smart Links G 1179648 2147483647 3 Speech 1048576 2147483647 submenuAction: Speech YES Start Speaking 1048576 2147483647 Stop Speaking 1048576 2147483647 Format 2147483647 submenuAction: Format YES Font 2147483647 submenuAction: Font YES Show Fonts t 1048576 2147483647 Bold b 1048576 2147483647 2 Italic i 1048576 2147483647 1 Underline u 1048576 2147483647 YES YES 2147483647 Bigger + 1048576 2147483647 3 Smaller - 1048576 2147483647 4 YES YES 2147483647 Kern 2147483647 submenuAction: Kern YES Use Default 2147483647 Use None 2147483647 Tighten 2147483647 Loosen 2147483647 Ligature 2147483647 submenuAction: Ligature YES Use Default 2147483647 Use None 2147483647 Use All 2147483647 Baseline 2147483647 submenuAction: Baseline YES Use Default 2147483647 Superscript 2147483647 Subscript 2147483647 Raise 2147483647 Lower 2147483647 YES YES 2147483647 Show Colors C 1048576 2147483647 YES YES 2147483647 Copy Style c 1572864 2147483647 Paste Style v 1572864 2147483647 _NSFontMenu Text 2147483647 submenuAction: Text YES Align Left { 1048576 2147483647 Center | 1048576 2147483647 Justify 2147483647 Align Right } 1048576 2147483647 YES YES 2147483647 Show Ruler 2147483647 Copy Ruler c 1310720 2147483647 Paste Ruler v 1310720 2147483647 View 1048576 2147483647 submenuAction: View YES Show Toolbar t 1572864 2147483647 Q3VzdG9taXplIFRvb2xiYXLigKY 1048576 2147483647 Window 1048576 2147483647 submenuAction: Window YES Minimize m 1048576 2147483647 Zoom 1048576 2147483647 YES YES 1048576 2147483647 Bring All to Front 1048576 2147483647 _NSWindowsMenu Help 1048576 2147483647 submenuAction: Help YES NewApplication Help ? 1048576 2147483647 _NSMainMenu 15 2 {{335, 390}, {480, 360}} 1946157056 Window NSWindow {3.40282e+38, 3.40282e+38} 256 {480, 360} {{0, 0}, {1440, 878}} {3.40282e+38, 3.40282e+38} NSFontManager YES performMiniaturize: 37 arrangeInFront: 39 print: 86 runPageLayout: 87 clearRecentDocuments: 127 orderFrontStandardAboutPanel: 142 performClose: 193 toggleContinuousSpellChecking: 222 undo: 223 copy: 224 checkSpelling: 225 paste: 226 stopSpeaking: 227 cut: 228 showGuessPanel: 230 redo: 231 selectAll: 232 startSpeaking: 233 delete: 235 performZoom: 240 performFindPanelAction: 241 centerSelectionInVisibleArea: 245 toggleGrammarChecking: 347 toggleSmartInsertDelete: 355 toggleAutomaticQuoteSubstitution: 356 toggleAutomaticLinkDetection: 357 showHelp: 360 saveDocument: 362 saveDocumentAs: 363 revertDocumentToSaved: 364 runToolbarCustomizationPalette: 365 toggleToolbarShown: 366 hide: 367 hideOtherApplications: 368 unhideAllApplications: 370 newDocument: 373 openDocument: 374 addFontTrait: 421 addFontTrait: 422 modifyFont: 423 orderFrontFontPanel: 424 modifyFont: 425 raiseBaseline: 426 lowerBaseline: 427 copyFont: 428 subscript: 429 superscript: 430 tightenKerning: 431 underline: 432 orderFrontColorPanel: 433 useAllLigatures: 434 loosenKerning: 435 pasteFont: 436 unscript: 437 useStandardKerning: 438 useStandardLigatures: 439 turnOffLigatures: 440 turnOffKerning: 441 alignLeft: 442 alignJustified: 443 copyRuler: 444 alignCenter: 445 toggleRuler: 446 alignRight: 447 pasteRuler: 448 terminate: 449 YES 0 YES -2 RmlsZSdzIE93bmVyA -1 First Responder -3 Application 29 YES MainMenu 19 YES 56 YES 103 YES 1 217 YES 83 YES 81 YES 75 3 80 8 78 6 72 82 9 124 YES 77 5 73 1 79 7 112 10 74 2 125 YES 126 205 YES 202 198 207 214 199 203 197 206 215 218 YES 216 YES 200 YES 219 201 204 220 YES 213 210 221 208 209 106 YES 2 111 57 YES 58 134 150 136 1111 144 129 121 143 236 131 YES 149 145 130 24 YES 92 5 239 23 295 YES 296 YES 297 298 211 YES 212 YES 195 196 346 348 YES 349 YES 350 351 354 371 YES 372 375 YES 376 YES 377 YES 378 YES 379 YES 380 381 382 383 384 385 386 387 388 YES 389 390 391 392 393 394 395 396 397 YES 398 YES 399 YES 400 401 402 403 404 405 YES 406 407 408 409 410 411 YES 412 413 414 415 YES 416 417 418 419 420 YES YES -1.IBPluginDependency -2.IBPluginDependency -3.IBPluginDependency 103.IBPluginDependency 103.ImportedFromIB2 106.IBPluginDependency 106.ImportedFromIB2 106.editorWindowContentRectSynchronizationRect 111.IBPluginDependency 111.ImportedFromIB2 112.IBPluginDependency 112.ImportedFromIB2 124.IBPluginDependency 124.ImportedFromIB2 125.IBPluginDependency 125.ImportedFromIB2 125.editorWindowContentRectSynchronizationRect 126.IBPluginDependency 126.ImportedFromIB2 129.IBPluginDependency 129.ImportedFromIB2 130.IBPluginDependency 130.ImportedFromIB2 130.editorWindowContentRectSynchronizationRect 131.IBPluginDependency 131.ImportedFromIB2 134.IBPluginDependency 134.ImportedFromIB2 136.IBPluginDependency 136.ImportedFromIB2 143.IBPluginDependency 143.ImportedFromIB2 144.IBPluginDependency 144.ImportedFromIB2 145.IBPluginDependency 145.ImportedFromIB2 149.IBPluginDependency 149.ImportedFromIB2 150.IBPluginDependency 150.ImportedFromIB2 19.IBPluginDependency 19.ImportedFromIB2 195.IBPluginDependency 195.ImportedFromIB2 196.IBPluginDependency 196.ImportedFromIB2 197.IBPluginDependency 197.ImportedFromIB2 198.IBPluginDependency 198.ImportedFromIB2 199.IBPluginDependency 199.ImportedFromIB2 200.IBPluginDependency 200.ImportedFromIB2 200.editorWindowContentRectSynchronizationRect 201.IBPluginDependency 201.ImportedFromIB2 202.IBPluginDependency 202.ImportedFromIB2 203.IBPluginDependency 203.ImportedFromIB2 204.IBPluginDependency 204.ImportedFromIB2 205.IBPluginDependency 205.ImportedFromIB2 205.editorWindowContentRectSynchronizationRect 206.IBPluginDependency 206.ImportedFromIB2 207.IBPluginDependency 207.ImportedFromIB2 208.IBPluginDependency 208.ImportedFromIB2 209.IBPluginDependency 209.ImportedFromIB2 210.IBPluginDependency 210.ImportedFromIB2 211.IBPluginDependency 211.ImportedFromIB2 212.IBPluginDependency 212.ImportedFromIB2 212.editorWindowContentRectSynchronizationRect 213.IBPluginDependency 213.ImportedFromIB2 214.IBPluginDependency 214.ImportedFromIB2 215.IBPluginDependency 215.ImportedFromIB2 216.IBPluginDependency 216.ImportedFromIB2 217.IBPluginDependency 217.ImportedFromIB2 218.IBPluginDependency 218.ImportedFromIB2 219.IBPluginDependency 219.ImportedFromIB2 220.IBPluginDependency 220.ImportedFromIB2 220.editorWindowContentRectSynchronizationRect 221.IBPluginDependency 221.ImportedFromIB2 23.IBPluginDependency 23.ImportedFromIB2 236.IBPluginDependency 236.ImportedFromIB2 239.IBPluginDependency 239.ImportedFromIB2 24.IBPluginDependency 24.ImportedFromIB2 24.editorWindowContentRectSynchronizationRect 29.IBEditorWindowLastContentRect 29.IBPluginDependency 29.ImportedFromIB2 29.WindowOrigin 29.editorWindowContentRectSynchronizationRect 295.IBPluginDependency 296.IBPluginDependency 296.editorWindowContentRectSynchronizationRect 297.IBPluginDependency 298.IBPluginDependency 346.IBPluginDependency 346.ImportedFromIB2 348.IBPluginDependency 348.ImportedFromIB2 349.IBPluginDependency 349.ImportedFromIB2 349.editorWindowContentRectSynchronizationRect 350.IBPluginDependency 350.ImportedFromIB2 351.IBPluginDependency 351.ImportedFromIB2 354.IBPluginDependency 354.ImportedFromIB2 371.IBEditorWindowLastContentRect 371.IBPluginDependency 371.IBWindowTemplateEditedContentRect 371.NSWindowTemplate.visibleAtLaunch 371.editorWindowContentRectSynchronizationRect 371.windowTemplate.maxSize 372.IBPluginDependency 375.IBPluginDependency 376.IBEditorWindowLastContentRect 376.IBPluginDependency 377.IBPluginDependency 378.IBPluginDependency 379.IBPluginDependency 380.IBPluginDependency 381.IBPluginDependency 382.IBPluginDependency 383.IBPluginDependency 384.IBPluginDependency 385.IBPluginDependency 386.IBPluginDependency 387.IBPluginDependency 388.IBEditorWindowLastContentRect 388.IBPluginDependency 389.IBPluginDependency 390.IBPluginDependency 391.IBPluginDependency 392.IBPluginDependency 393.IBPluginDependency 394.IBPluginDependency 395.IBPluginDependency 396.IBPluginDependency 397.IBPluginDependency 398.IBPluginDependency 399.IBPluginDependency 400.IBPluginDependency 401.IBPluginDependency 402.IBPluginDependency 403.IBPluginDependency 404.IBPluginDependency 405.IBPluginDependency 406.IBPluginDependency 407.IBPluginDependency 408.IBPluginDependency 409.IBPluginDependency 410.IBPluginDependency 411.IBPluginDependency 412.IBPluginDependency 413.IBPluginDependency 414.IBPluginDependency 415.IBPluginDependency 416.IBPluginDependency 417.IBPluginDependency 418.IBPluginDependency 419.IBPluginDependency 5.IBPluginDependency 5.ImportedFromIB2 56.IBPluginDependency 56.ImportedFromIB2 57.IBEditorWindowLastContentRect 57.IBPluginDependency 57.ImportedFromIB2 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency 73.ImportedFromIB2 74.IBPluginDependency 74.ImportedFromIB2 75.IBPluginDependency 75.ImportedFromIB2 77.IBPluginDependency 77.ImportedFromIB2 78.IBPluginDependency 78.ImportedFromIB2 79.IBPluginDependency 79.ImportedFromIB2 80.IBPluginDependency 80.ImportedFromIB2 81.IBPluginDependency 81.ImportedFromIB2 81.editorWindowContentRectSynchronizationRect 82.IBPluginDependency 82.ImportedFromIB2 83.IBPluginDependency 83.ImportedFromIB2 92.IBPluginDependency 92.ImportedFromIB2 YES com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilderKit com.apple.InterfaceBuilderKit com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{596, 852}, {216, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{522, 812}, {146, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{436, 809}, {64, 6}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {275, 83}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {167, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {241, 103}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} {{207, 285}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{608, 612}, {215, 63}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{335, 390}, {480, 360}} com.apple.InterfaceBuilder.CocoaPlugin {{335, 390}, {480, 360}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{437, 242}, {86, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{219, 102}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin YES YES YES YES YES YES 449 0 3 rabbitvcs-0.18/clients/osx_finder/toolbar_button/Info.plist000066400000000000000000000016241362112712700242340ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFile schelper.icns CFBundleIdentifier org.tigris.scplugin.${PRODUCT_NAME:identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleSignature ???? CFBundleVersion 1.0 LSUIElement 1 NSMainNibFile MainMenu NSPrincipalClass NSApplication rabbitvcs-0.18/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/000077500000000000000000000000001362112712700273015ustar00rootroot00000000000000rabbitvcs-0.18/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/TemplateIcon.icns000066400000000000000000001461361362112712700325560ustar00rootroot00000000000000icns^is32g;g @Vg D]?8SyV0g o*T~Zb egK ϟ v+Xzpy뢀IeLʄSx~xyނdf}˨g4Ww⻵ߦaDwǀ`,̻؜vHG6:<ۍHJ];<<?e]< Fxqrd]GUiJv0/RO>LPB;Rh{tʝ(]p)0//-NL&CΒ;[:ܢW{"texWGỤ齃3ex8(X>i݅mnnq6iޯEa7>*p8. IPkxHG}WqOMF+8shPq(QjEAbт 赿c\w¿ ѷ|_{}ϢpQ7!EUĠɤdOHRrLIЪʤ澙{bPKX{ED8qo೑t[MK^88-qmµļ嫉mVKMht;<2jgŨuصϗhSJQu;@@:*6٪YŦkjvcQKXS?@@=/|µe;/(3_~iT@?1|u[\B~iT@?1"V}zDiT@?1*^#^tiT@?1-`*fy#SMiT@?1-`-fy-[ ?oSiT@?1ʏ򷥄) B&h7n/.,N5C&0@Uqy@p1N<#6:'8Pg\|Ub 1u43 $ǀ=}ĕSpoeo>,:b~*e ƻ92]څikk[X퍓ՑQ6>j yoPsjv)౰a]"i\*AL0 B+ MX$p@ $hw촬oA/Gbu꾮ͽvViq ȭ޶`F29tGƦײpWD>Fb@<ЫʥѦkUEAKk<;-pnɛ}dOB@Qu.-"ok¶ɔw^K@BZi11'ieƩw׵Ռt[H@Ef166/6ت[ǪaRcUE?KpG5663$~µe1$'Sqw]H64&|v[[?qw]H64&"W||@sy]H64&*_#^t|]H64&,a*fy#TM}]H64&-a-fy-\ ?oS~]H64&Ƽ񪔄ƽ$##=ֽ>,f21I)Hhgdy1h4I !9O7HqtGL4V ~7 w}K_feh_ 7_U̔ efF/ Jڅehh4Qcܼ{o94?@{t`\DgPtOe "L0eF2~Ix 2H6Y-Kd罀S,0F_wxapȤzvsp^BU\ʐgE6'(Zz4ʮɷmUB4/5Kj2,ӯ̪eR@519Sp.+trťw_M<21=\wusoĹyp[H911Ef~W""mjʰ׹ybsYE604Oq{$((!ٯgͲR,E@508Y~v8($ĸc" @[dL9(&}w[\;[dL9(&#X:[eL9(&*`"_xgL9(&-b*g|"VNhL9(&.b-g|-^ ?pTiL9(&l8mk 1?C7!  ''#.5;/.{_DYyxԬ  T*VS%0r( zF S#Gtc]PIq Rit32{'Ļ ôn`˾n=xvrtxwy}~̾sd&_ ʣqjlrx{~Ղ̿qe]S}=ܭjdilkigghknprpqu}{pbXRL=+ f?ӣxfgc^YXXZ^bfmqtwxy~yzömaXP?6BA)GCҡugd[USRSYbhlopruvuvy~|ǻh\XM6@`l_) ]jaTOOSYafghhiijm/lmv|˾bZVI5Oz~m`#t)FggOKLPYchiea_`beimoprw}ž~_XVH4[vfbW3I)GBPEHLU_dc`^]]`dgjiijjllipzɱǩ~WSVH4`thb\T:6)HcwBCGO[a_[WWY^bca][VTVVURPSY\_gmot~ŚWQPG5h~od]XQ,S)kf>DIS]^WRRTX[WVWL7/7KSU-XWVXZ`a]VX\duΦzPPRL5hsg^YUOr6Il_;EKU]YRNPTTPOLH5F|`3+Գ[uI㱉S[ehc5ӗK]d1IOGDBD>.,$ `}зúqspJh_kmDmKN8LLEECA3,$! Lɲrs{Wuϟydpl6ŘՕJ@?NHDEE;.) ¼¬nwy{TݧjuLj!-/.8&K̦:CLFFEB5/'|ķ򱛟ݖr|x{Z篇mr8ęOnmqQJ)ݖ7FKGHF=11'ŏӺܰe~ݕsgv|{pmpQjMU]\T~`J*ܓ6GJGHG9/2*!̾~tҋt~ϰƵPv~xt~}am8ř9`]\WsA&)ٕ9GKIJF603-,қ_qeusdlpcHlMU]\Wu%'֟AGLKLD40418]UxĤ>:Βέȁ񸫛vJ`kfn<͙9`]\Wuq%ǰJFMMOD4033EP4[#WΧԀ뭓YJvaJM=+塝qXqgTPVZ^uxmԇM=ebZeOgƖmWؤh[nlA405698458;@BFM4A֒n[fcvf][WW\fPKyzTJUNMs+HGF%ΥzFuŏae|\53367;768?ⓍNilh^bda`cn}qۈyTCHI(z?>7?6"lpΩjy>537:==;;>A=>@C9fn[nyʾOWWX^`admy}tuuoIDGC65.\02gŠzu967:>@@?AC;D̿b^YYX\`en|ukp?FH6W2KM&L!oš~>4;:@B1CF3VİrbZd]ZZ[ahs~wri~\=EGy86(8n|˥L2;>@C0DI6QxeVQU^im]Y`ekrwvؓoiNDIJ%L%7]9-}حk85AABCCGODG]XNMU]dilpnfclswwx~ulkxDHK?FLSY]^aa`^[[^nհsgkyzCDG0i?=E>AXۉʾѼ|tnmqrxའmfjuk@FG)wJ (_)֌ļͳrebep\AHH)"_!љûɿwi_YX^jyPDII%!KI`M'bܪ¹zqh^VOKKNValrw~GGJJ%\HWaYC[ⷈȿ~void^YVRMIDB@??CIPV[ajq{q@EGF)C\][;ׁ%޽Ⱦ{unha[UPKHECDGKOT[dnwc>FGC4Ӓ+NMBO+нȿxpjc]XSOJFDBCGLRXakt}VBIIF5БK>JDM5NȽȓzrkd]WRNIGDCDGKQW^gqzJBGGD0ˑJjiEjdN˓ȿ}unfa[UQLJHGHLPV\dmwzBCFF@9ڑJihDjE͕ƽxpic]XSPMJKPT[airzl=FGGB6ڐD:EDG.Xɾ̾Ļyrke_[URONOSX^ckt}_=GH#"DEEAȼŤxqke`[VSPOQUY_envSBJIIJ5\,POEQ-ژXtҡȿ}voic^ZURPOQU[`gpyJFJI*ЎC2E3#&ldeάŽ|tnhb]XTRORW\ajr{y@ADE  -.E-Իʢ㲯˰wxôúyslfa\WTQOSX]dlu}l;BD8@K0UTTU@cވ\yΫSOgqȸ~xqke`[VSPONPTY^fnw_=GI K~ThgheKilЮualـOpҾǿ}vpjc^ZURPOQU[`hqzT@HF-KMSYY]4~zԱjΧvn`Ȟuĕż|unhb]YURORV\bks|KCHF1όK*)*'̱Ɉs̝N={͚ºzsmfa\WTQOSX]dmu{CEGA;ٌKv$BADaJזѦ{}tug֣xrkf`[VSPONPTY^foxn=EF8PD:GH-X@ؽsΫ˩n|вǼzuoic^ZUSPOQUZ`iq{^?J;UK>?BGOZfsngb^fe_eYGIJ"fـ7uovmVMKKLLKJIHIKPZgppuwqajmse^fe_eYGIJ/]hhsٵ̻ybRHCA@>BDDEGJE:=inksdrore^fe_eYGIJ"h~xm^SHEA>=??Bjznserore^fe_eYGIJ/]h>nw޻z÷|vqnmora Bnserore^fe_eYGIJ"l1Cmyz»)oserore^fe_eYGIIJ/] K !@luhOmyserore^fe_eYGIIJ"  Af܀HdLdeǮ|  :rerore^fe_eYGIJ/]   [>aʴ^n~^Ϥ1  p}erore^fe_eYGKAgf  5VѳЏg;drore^fe_e[D('M4  .Qvˑ vorore^feac:+nʗM")FmױD;zpore^h]?L|ȚK# (>bw h~nreGF\НJ # 8X̞) 3leKj{Is# "-Mtس^  )x|G5# %'Eo%# %  #DhѰGJՃ!# %  %Bf~ фUL 5 !%   'Dfʧ-a ϽaNE!, $  *Eel) ڽ|N?'*   "3IfұR  ¿dO.! $!$(D@ ν^E $ '%# ¹WS%#*! ⽲P;%  ܾgJ#Ǹ ȸ|wʿŻ[R˺Ÿ~^/qֺseabffhlnrtw}ƺqeXY ƚw_WY_gjnrtxՂǼscXRIx=ڦvWPVZXVTSUX\]_]^bkrsvppɿudVMHB5+ f?јhSSPIECCEINSZ_aeeglqrtwzlrĹtaVNG7/:;)GCјeSPF@><=DMUZ]^_ccbcgmswz}oɾs\RND08T^S ) ]rWL>99=DLRTUVWZZYWZdjpwvx}~̿sXPMA/Eko_Up)F\nR9449DOTVRLJKLQVZ\\^ckrx~ֽpVOM@/PtgZUM)C)&>}9-16@KPPLJGGKPTWVUUVXXU]gnszpMIL@-Uxg[VQJ0/)H^b+,19FMKEABDJOPLFC<;=>=:8FHEAEKSdÿkEFHC._{h\SOJEm6IgI$-4AGC<8:@?70*(,hqH>;=>7247?DBCGB<:9D^{~G=I2U~kaUOLIE tJ]M!-4AE>65:;2*%%# 5;>D92>?C?$%BmžH0JncXOLLI?ŖK7_!-5@B835:2%!"'GQ,4w}@ <@>A*.Џy@og[PKLKG,>Ką!+5@A5156*!"w:&ŪK*D'>ҫWнuh^UKJKJGuM,#2>@6043$"f:|(|(4GKخj3ӱth`VNIJFÖ 9W-:@6/3/ =7GC1Lzҭfzs?ǯ͠^WOJGIKM3HϖK#$4?7/2.G77C`˳κV4AdsEȴչnKLFGKPQ?W/;:/0/ Apт,̷a|l:e,8F˷ҦRDFKQRF0hK+"6<2-/# XomtgDp»p/:Uǽټi\RGOICXۧd?aMU]\T}`;)ք03/1)q\]iP\a޺šz'RVJBK Dݨa)™9`]\WrB&'Ӈ"0422(nv}=Z­nf;MϭeR?B=S[RP@ܧ;bMU]\WtI%В)0543'$\6/S+$oZ룒U1L]ZFNDۢ1ʙ9`]\WtpH¤3/665'.u$ 1_]a~ ?s?>[?6"c_śiPf^'!7y9REL{nŰP"4559>?>BMOFdCHcEvӅjbC;??n21[4{RſiWqZ# !?<*BU|³*0/08;;>EO\VLLKbJb؏ijd>:=8*ޓ5.\02XϺnax[#  #ȷ{@:3217:=COZa^\Y\F[֐h`{d5=>*N1KM[L!bչwjd(  "4~hQ@8B8534:>EOW\^_^XAdЍf^rR3:<y76(8mru߾ts7 /%+nXD3.3=IL928;@EHORUYXYP@{ƒc^v{C:??L%7@9-kɝ}S" !$) 73))1:AFJNK=8@EHMOQORS?N׬xa`|l:?A1F2GK\L"hجwB !&++(+036:]8isE $+02359=>=>?BDDEFGE@FC7Dwˣ{b]mO7=<Ŕg:NM=NG2߼lַW0!),-.269:;=>?>AA92:Y̦e\bxzB;>4;_qt]vRv̵~`E0# $(.2356652/.3Ecg\^kn9:=%a?=>AX׀5ƶɷ|nbYRQTSXbpͩua[]fx_5<=oJ (_)ك~ĻչxfZVYbq||Q6=>"_!ӓz»yj]TOLP[irtw|~E:??!LI5M'aߦx}{'|~~|}|usld\SKEAACIS]chnu{r<=@@\HWVaXBZwyrle_ZVQMKHC?:97558?EIMS[bjsze5;=<B[\CZ9߾|¹~uoid^XSNHDA>;99:=@CHMV^gpyX4<=9)ђ)MLCN)ѿû~umg`ZUPKFC?<:989=AFKS\env~K8??;*͑K=JBL5NȽ̆»wphb[VPKFB?<:<@EKQYbks{z?9==:&ɑIihEicNωzrle^YSNIFB@==>@EJOV^gpwn79<<5.ؑJhgCjDҍſ|unga[UPLHEB@AEINSZcksz`3<==7*ؐD9EDF.Wʿ×ý|voic]WSNJGDCDHLQV]emu|T3="DEEAʾɡ{tnhc]XSOKHEDEIMRW_gow~I8@??@)S,PODQ-ۙZv֠yslfa[VRNJGDFJNSYbjqyx?;?>͎C2E3#&mfgЭƽ~wqke_ZUPMIFDGKOT[dlt{m68;< -.Իʣڀ+㲯ͱxzŶŻ}void^YTPLIFDHLPV^fnv}a19:-6K0UTTU@cމ]zϬTPhsʻù{tnhb]XSOKHEDCEIMQX`hpxU3=?}SgEeJjmЮvbmڀQqysmfa\VRMJGDFJNSZbjszI6><"KMRYY]4~{ԱkΧwpbɞwȈɽ~xrke`ZUQMIGDGKOT]emu|z@9>;&͌*F'̱ɉt̞P?|ҐǼ}wpid^YTOLIFDHLPV_gow~o8;=60׌Kv$BADbLחѧ{~vvhڟżztoic]XSOKHEDCEIMQXaiqyc3<=.GD:GH.X?ؽtϬ˩n}틍Ѳ{~xpie`[VQNJGDEJNS[ckt{S5?/LK?:,݋K:aKVrNຏq|jʹȯT㺆˵v~yrkf`[VQMIGDGJOV^gowC9A)ZKu1I'̄WHqrurvkSƝkzvqjd_ZUPLIFDHKPXaiqyX8EEDFLhtVe}z]\؍qymPÍg|rnic^XSOKHFDHLRZckt|d?LT8}|pEcxK̾Ģk\qyy{yvpmjd^XTQMIFDGKQYbjr{lLXQ=?A#UL%K:ukvMkVclopojeca\USOLIFDILS[dkszhMS^O=?@L'`tPRnPV`bdd`\ZVSPLIGDCDHMS[ckrx|}z{cSZV\O=?A#U,Ԁ O]X|bڿqRKSWUSQNKHECACFKRZaglnr~weT]ZU\O=?@LɦX\p|oζ_MHNNJGFDCB@>=>=?BGLRY`l{vXuS\ZU\O=?A#UgL{[ޓWrvWJGHIFB=:86565569=EPZeouzpa]YS\ZU\O=?@fـQvpxoYLGDBB@>=<=>>?CLYbbfifW`ci[}S\ZU\O=?A#UbhsڶͻzeUIC><9;<<=>B>66`eblZgdh[}S\ZU\O=?@h~ynaUKFB?>@ADbpdk[gdh[}S\ZU\O=?A#Uh>ny޻{ø|wrompra >ydk[gdh[}S\ZU\O=?@l1Cmy{¼*vek[gdh[}S\ZU\O=??A#U K !@lviOcok[gdh[}S\ZU\O=??@j  AfeMefǮ{ 5xj[gdh[}S\ZU\O=?A#U   [>aʴ_o_Ϥ0  ft[gdh[}S\ZU\O=A7gf  4Vѳяg7Zgdh[}S\ZU\Q:yM4  -Qvˑ ncgdh[}S\ZWZ.gǗM")FmװD7nfdh[}S^R3AtĚK# (>bw ]rch[~:9Q͝J # 8X~̞) /v`Z?a{qIs# "-Nuس^  !ksG5# %&EpŽ%# %  #DhѰGJՃ!# %  %Bg~ фUL 5 !%   'Deʧ-a ϽaNE!, $  *Eel) ڽ|N?'*   "3IgұR  ¿dO.! $!$(D@ ν^E $ '%# ¹WS%#*! ⽲P;%  ܾgJ#˲ ϬoY[ܫk>;ï}peGeЯpZICEHIKORVX]dlr{žrgYPEO_B79AINRXYXYZ]gorw~vsxւºth\OFA:r=֘^8/5;:64359=?@>?CMUVYftiV^uj_PF>95)+ f?̈M12/(" "',3;@CGGHOUTWZ^hq{~hWfɿĶvl^OF?8-&. 3)GCωJ20$!,5;?@ADECDHOV[^bfmtutqoouv[mƶxk]KC?7'-BI@)E ]Z6*!+24556579:869DJS[YZ`dloqljjgouzoɴxn]HA>5'7SVJBi)FJQ0 .562+()+.38:8:?GPW]a__bhiicbgimljquxwkZGA>4'?ZPFC<:)&9\ )0/+'&%)-/22358;=:CMRX^afiiddfilkmp}xxnY?;=4$B^QGC?:"%)HUA #+)#"&)-,**&'-/0.,07=:7t#V)!,/38, %/31#618gtfvw8!;t]TH?==:1 –K4=  =F $ls2 .2/3xrzk2s}_WKA<=<83Kg   k,Ť>5/ҫ@sveXOE<:<:8nM   a7w}'3<<خe#~eYPG@::;:6 65@  -D@/Hxӭeys6pPHA:8:;< ;ϖK   <54@YįɵV3@cf =`==67;>?L;7  4qh~°~^xn:f.=wD46:??3 hK  H_ctùکnbAmwy羶Ͼb0H[-:@CCjBLd Ga}qxs}ӱӸ}9.dq8AǰFp@db a]xox0   !!!صΑ)7'5P7D-'?1%)/RW>LU>İa(CjgZiTlșpY ā))*  ϸoC[Jph54E1$#%.?M9&94gƲqW92=54u.JI(Ш}FOa"2&  (ʳSFbd $+?A2)*(%%03@I.?M>ð\M,#J>AH K)kk(%N-7  5 ifju7:4(,/)),46UM;FM2y˯`W:)./ gBZ:&VCF&77  %i4J?Eoe?%&%(-.-19>8V=9E)ZķiTQ3+/0o43[7~8{D,A7 .6'(GƳpOKav@%,.wz:8:qbZƩz^KUM' gmYG5&!&0;>)!()+.37:<@6&]ȲhNKczh3+/0N&9@;.zOɳfV[Z:&##+26;>:+%-0167869:&2ū_LMgyyZ)/1 76JN\O%MʿqcdjS0 !#')+22,).3442//263$*_ѺvVIRnzsxL%-/;р$PȧmisoS2  #%()-/0.*,* +YȡbMIYsztur=(.-j=R=?>AJVdvĥr_NHIQ`jknty{y|M%-. dJ ('_)v`Ǹo`QGCDLYbcflsy}|zv?'./ ~#!X؊\ʹ}|}xmaUJC=:DKRZagnty}z}R%-.- H`ab_?؀$dxnf]VRNJFB=:630.+,-025:@HPX`flrw{~yyF%-.)͒.QP R.ـ2jyof^VQLGC?;852/-+*-148>EMU^ekpuy}}zq:)0/+ɑM@MDO8Rʿtxſ{qi`YTOID@<8520-,+,-048;8420.//048;AHOW_fkotx|z}\'+--&ՑPmCoJفm|tld_YTNIEA=:7421237;?ELSZbhlquy}~y|O$-..(֐F:FDG/Zʏiÿyrjd_ZUPKGC?<9643446:=AHNU\cimrwz~}yxB%./(HEIE"Нhwohb^YTOKGC@<975458;>BIPW^ekotx||zp8)0E0TSDU1ܠg~۟hƿ}umfa\XSNJFA>;96458;>DKRY`glquy}{{f/-0/ ɎD3E4$(woqԮjýzske`[VRMIDA=;85459<@FMT[binrwz~z|[&*,-w/0/ ͩۀ+㶲͵ɺqxqid_ZUPLGD@=:7546:=AHOV]ekotx|}y|O#+,(J6ZYYZEhޑiаa^s}s~vnhc^YTOKGB?<9747:>CJQX`glquy}}xxD$.0ZlEjPuvѲnxى]{q|tlfb]XSNJFB>;96458;?ELSZbhnrwz~|yq9'/,KQW]]a8䄍Զuϫ{mʤuzzrke`\WRMIEA=;85459<@GNU]djosx|~{{h0*.,Ɍ ,F*Ѹ̑~Σ]M甅فmwpje_[UQLHD@=:8546:DKRZahnrvz~}x|R$-.9F>IK0[?~ϱ̭xㅴ듓Բ^wsle`[VQMIEA>;96458;?FMT\cjosx|~|wwB&0>K@Z[Y?jZׯw}օrl~yrkea\VPLHD@=:86458;AHOV^ekpuy}~zyj2+0\KIijMӭӸƚw쩋׃V~xoid_[VQLHD@=:85469=CJQY`gmrvz~}w|T%/01zKrH\TEؘyѺptίƺ{䧘ԅݰ\rxrnhc^YTPKGC@<97547:>DLS[biotx|zwr:'0 K@OU0{LbԹ|ϸȸg~ÎSwqigc]XSOJFB>;96457;@FNU]dkquy}|v|W&/0+ۋK?eO[}Ŭ\߽{tηɲ`㽍˻d[wojd`\WRNIEA>;86458;86458:85469>DLS[binqtusuxY;JC.02HL(NH~uߧ[jAFRUUTQNLIFA?<:8547:@FMU\bhmoonvuT<97532359@FLSWZ_jtkcSDOLFN@.01MʪdgzyηcG9897654321/./.026;@FMXfnk_Dj|BMLFN@.02HKPfݙb{{ZE:6420.,*)+.5=GPX^bZOOKuwBMLFN@.01iڀ4zøt^LA941/,-.18BKLQTTFQV\LrwBMLFN@.02Hhs|ٹͼ}iYKB:502201274.-QYV_KWUZLrwBMLFN@.01hҵ{qdYNJEA@BCG"UdV\KWUZLrwBMLFN@.02Hh>o䁳ݾĸ}xspoqsb 7kV\KWUZLrwBMLFN@.01l1Coł䷃ý*iV\KWUZLrwBMLFN@.002H K @ms¼PW_\KWUZLrwBMLFN@.001C  AgqZpq؀#˱} 0h[KWUZLrwBMLFN@.02H   [>b͸kzlҦ1  XcKWUZLrwBMLFN@.3'gf  4VԸӘg0mJWUZLrwBMLFNC* nM4  -RwΓ `SWUZLrwBMLHK[×6"(Fn؀۳E1\VUZLrwCOC"1hK# '=cy M`TZLtq''BuɝJ #!8XϠ* (dPK-SocIs#!"-Nvܵ_  XfG5#!%&Eqď%#!%  #DiԱGJՃ!#!%  %Cg фUL 5 "%   'Cfͩ-a ϽaNE!, $  *Een) ڽ|N?'*   "3IgԳS  ¿dO.! $!$(D@ ν^E $ '%# ¹WS%#*! ⽲P;%  ܾgJ#t8mk@  %)5A?73565:@=8892%    $"*3>OOA;:>ADIGC@>7*%%    " %*.6=A;6;?@??=:4.*'#   "'%!%$ !$(2<>89BC=<72-**+%    !#()&"(,'*11359DD?9.(%$''"    #%%#%*&&&-/," &+),15;?>4+%"!##"    !#%&(%'("#+.,*'#,/.-+/4/+'$" #%"  #&(,-*!!)' $-+'&)%#..$"")*(&'$"$!  #+-/.("#&($&*('',,(#"$" "%%"   #+0/+%##%*,*&*.(&*,)# !!!$!   #)./*&%&+0/,(/3,%'*)($$(()#4kɯo%  !#))'()*.1/,19;2*++*($%),/'W  !&',/( %)..'9a   (D`|xjO1%('*'{ 3j۹d0%&Bd {E2,I4mQyew$H)FeM m-13B.GA!0?FT"tB.Vp0>ܢfC@Jq-_j +O i.f u7AzOA8nv?6vcD"MQZ%/h%l~6(|t8z1+8 =E"\h!WUJgAw4k"*_QFGBEKPYN&`/m?! icnV Brabbitvcs-0.18/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/project.pbxproj000066400000000000000000000317061362112712700323640ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 42; objects = { /* Begin PBXBuildFile section */ 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1DDD58140DA1D0A300B32029 /* MainMenu.xib */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 9524E8930FFE6F7000C8E021 /* schelper.icns in Resources */ = {isa = PBXBuildFile; fileRef = 9524E8920FFE6F7000C8E021 /* schelper.icns */; }; 952D6E5F100EBA3B009C260F /* fileListBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 952D6E5E100EBA3B009C260F /* fileListBuilder.m */; }; 954F9AB4100C0D5100109F93 /* sendmsg.m in Sources */ = {isa = PBXBuildFile; fileRef = 954F9AB3100C0D5100109F93 /* sendmsg.m */; }; 954F9AE6100C10E200109F93 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 954F9AE5100C10E200109F93 /* Carbon.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 1DDD58150DA1D0A300B32029 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; 28639AB71016873500EC00E2 /* SCToolbarButton_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SCToolbarButton_Prefix.pch; sourceTree = ""; }; 28F43C4D1117C89700B7C973 /* menuitems.strings */ = {isa = PBXFileReference; fileEncoding = 2415919360; lastKnownFileType = text.plist.strings; lineEnding = 0; path = menuitems.strings; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* RabbitToolbarButton.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RabbitToolbarButton.app; sourceTree = BUILT_PRODUCTS_DIR; }; 9524E8920FFE6F7000C8E021 /* schelper.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = schelper.icns; sourceTree = ""; }; 952D6E5D100EBA3B009C260F /* fileListBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fileListBuilder.h; sourceTree = ""; }; 952D6E5E100EBA3B009C260F /* fileListBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = fileListBuilder.m; sourceTree = ""; }; 954F9AB2100C0D5100109F93 /* sendmsg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sendmsg.h; sourceTree = ""; }; 954F9AB3100C0D5100109F93 /* sendmsg.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = sendmsg.m; sourceTree = ""; }; 954F9AE5100C10E200109F93 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 8D11072E0486CEB800E47090 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 954F9AE6100C10E200109F93 /* Carbon.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( ); name = Classes; sourceTree = ""; }; 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { isa = PBXGroup; children = ( 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, ); name = "Linked Frameworks"; sourceTree = ""; }; 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { isa = PBXGroup; children = ( 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 29B97325FDCFA39411CA2CEA /* Foundation.framework */, ); name = "Other Frameworks"; sourceTree = ""; }; 19C28FACFE9D520D11CA2CBB /* Products */ = { isa = PBXGroup; children = ( 8D1107320486CEB800E47090 /* RabbitToolbarButton.app */, ); name = Products; sourceTree = ""; }; 29B97314FDCFA39411CA2CEA /* CocoPopUp */ = { isa = PBXGroup; children = ( 954F9AE5100C10E200109F93 /* Carbon.framework */, 080E96DDFE201D6D7F000001 /* Classes */, 29B97315FDCFA39411CA2CEA /* Other Sources */, 29B97317FDCFA39411CA2CEA /* Resources */, 29B97323FDCFA39411CA2CEA /* Frameworks */, 19C28FACFE9D520D11CA2CBB /* Products */, ); name = CocoPopUp; sourceTree = ""; }; 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( 28639AB71016873500EC00E2 /* SCToolbarButton_Prefix.pch */, 29B97316FDCFA39411CA2CEA /* main.m */, 954F9AB3100C0D5100109F93 /* sendmsg.m */, 954F9AB2100C0D5100109F93 /* sendmsg.h */, 952D6E5E100EBA3B009C260F /* fileListBuilder.m */, 952D6E5D100EBA3B009C260F /* fileListBuilder.h */, ); name = "Other Sources"; sourceTree = ""; }; 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( 9524E8920FFE6F7000C8E021 /* schelper.icns */, 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 1DDD58140DA1D0A300B32029 /* MainMenu.xib */, 28F43C4D1117C89700B7C973 /* menuitems.strings */, ); name = Resources; sourceTree = ""; }; 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 8D1107260486CEB800E47090 /* SCToolbarButton */ = { isa = PBXNativeTarget; buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SCToolbarButton" */; buildPhases = ( 8D1107290486CEB800E47090 /* Resources */, 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, ); buildRules = ( ); dependencies = ( ); name = SCToolbarButton; productInstallPath = "$(HOME)/Applications"; productName = CocoPopUp; productReference = 8D1107320486CEB800E47090 /* RabbitToolbarButton.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SCToolbarButton" */; compatibilityVersion = "Xcode 2.4"; developmentRegion = English; hasScannedForEncodings = 1; knownRegions = ( English, Japanese, French, German, ); mainGroup = 29B97314FDCFA39411CA2CEA /* CocoPopUp */; projectDirPath = ""; projectRoot = ""; targets = ( 8D1107260486CEB800E47090 /* SCToolbarButton */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 8D1107290486CEB800E47090 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 1DDD58160DA1D0A300B32029 /* MainMenu.xib in Resources */, 9524E8930FFE6F7000C8E021 /* schelper.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 8D11072C0486CEB800E47090 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 8D11072D0486CEB800E47090 /* main.m in Sources */, 954F9AB4100C0D5100109F93 /* sendmsg.m in Sources */, 952D6E5F100EBA3B009C260F /* fileListBuilder.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 089C165DFE840E0CC02AAC07 /* English */, ); name = InfoPlist.strings; sourceTree = ""; }; 1DDD58140DA1D0A300B32029 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 1DDD58150DA1D0A300B32029 /* English */, ); name = MainMenu.xib; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ C01FCF4B08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_ENABLE_OBJC_GC = required; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = SCToolbarButton_Prefix.pch; GCC_VERSION = 4.0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; PRODUCT_NAME = RabbitToolbarButton; }; name = Debug; }; C01FCF4C08A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_OBJC_GC = required; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = SCToolbarButton_Prefix.pch; GCC_VERSION = 4.0; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; MACOSX_DEPLOYMENT_TARGET = 10.5; PRODUCT_NAME = RabbitToolbarButton; }; name = Release; }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, ppc, ); GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; GCC_VERSION = 4.0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.3; ONLY_ACTIVE_ARCH = YES; PREBINDING = YES; SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; }; name = Debug; }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = ( i386, ppc, ); GCC_C_LANGUAGE_STANDARD = c99; GCC_VERSION = 4.0; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.3; PREBINDING = YES; SDKROOT = /Developer/SDKs/MacOSX10.5.sdk; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SCToolbarButton" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4B08A954540054247B /* Debug */, C01FCF4C08A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SCToolbarButton" */ = { isa = XCConfigurationList; buildConfigurations = ( C01FCF4F08A954540054247B /* Debug */, C01FCF5008A954540054247B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; } rabbitvcs-0.18/clients/osx_finder/toolbar_button/SCToolbarButton_Prefix.pch000066400000000000000000000002251362112712700273150ustar00rootroot00000000000000// // Prefix header for all source files of the 'CocoPopUp' target in the 'CocoPopUp' project // #ifdef __OBJC__ #import #endif rabbitvcs-0.18/clients/osx_finder/toolbar_button/fileListBuilder.h000066400000000000000000000003551362112712700255170ustar00rootroot00000000000000// // fileListBuilder.h // CocoPopUp // // Created by mmg on 15/07/09. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import NSArray* getSelectedFilesList(BOOL* containsFolders, BOOL* containsFiles); rabbitvcs-0.18/clients/osx_finder/toolbar_button/fileListBuilder.m000066400000000000000000000053161362112712700255260ustar00rootroot00000000000000#import "fileListBuilder.h" // Applescript to get what is currently selected in the Finder static const char* appleScript = "property stdout : \"\"\n" "tell application \"Finder\"\n" "copy selection to selectedItems\n" "set stdout to \"\"\n" "if ((count of selectedItems) > 0) then\n" "repeat with x in selectedItems\n" "set itemN to (POSIX path of (x as alias))\n" "set stdout to stdout & itemN & \"\n" "\"\n" "end repeat\n" "else\n" "set theWindow to window 1\n" "set thePath to (POSIX path of (target of theWindow as alias))\n" "set stdout to thePath\n" "end if\n" "stdout\n" "end tell"; NSAppleScript* scriptObject = nil; void compileScript() { NSDictionary* errorDict; scriptObject = [[NSAppleScript alloc] initWithSource: [NSString stringWithUTF8String:appleScript]]; if(![scriptObject compileAndReturnError: &errorDict]) { fprintf(stderr, "Failed to compile appleScript!\n"); scriptObject = nil; } } NSArray* getSelectedFilesList(BOOL* containsFolders, BOOL* containsFiles) { //printf("Running script : \n %s", appleScript); NSAppleEventDescriptor* returnDescriptor = NULL; NSDictionary* errorDict; if (scriptObject == nil) { compileScript(); if (scriptObject == nil) return nil; } returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; if (returnDescriptor != nil) { NSString* returnedValue = [returnDescriptor stringValue]; NSArray* selectedFiles = [returnedValue componentsSeparatedByString:@"\n"]; NSFileManager* fileManager = [NSFileManager defaultManager]; NSMutableArray* cleanedUpList = [[NSMutableArray alloc] initWithCapacity:[selectedFiles count]]; for (NSString* curr in selectedFiles) { if ([curr length] > 0) { [cleanedUpList addObject:curr]; BOOL isFolder = NO; if ([fileManager fileExistsAtPath:curr isDirectory:&isFolder]) { if (isFolder) *containsFolders = YES; else *containsFiles = YES; } } } NSLog(@"[fileListBuilder] %i selected files\n", [cleanedUpList count] ); for (NSString* curr in cleanedUpList) { NSLog(@" - %@\n", curr); } return cleanedUpList; } else { printf("Applescript Execution failed!\n"); NSLog([returnDescriptor stringValue]); NSLog([errorDict description]); return nil; } } rabbitvcs-0.18/clients/osx_finder/toolbar_button/main.m000066400000000000000000000334561362112712700233760ustar00rootroot00000000000000 #import #import "fileListBuilder.h" #import "sendmsg.h" // ------------------------------------------------------------------- // // MyMenu // // Creates and manages the menu display. // // Interface // ------------------------------------------------------------------- @interface MyMenu : NSObject { NSMenu* menu; NSMutableArray* menuItems; NSArray* selectedFiles; BOOL containsFolders; BOOL containsFiles; int selection; } -(id) init; -(NSMutableArray*)menuItems; -(void)setMenuItems:(NSMutableArray*)newMenuItems; -(NSArray*)selectedFiles; -(void)setSelectedFiles:(NSArray *)newSelectedFiles; - (void) fillMenu; -(void) addItem:(NSString*) name withIcon:(NSImage*) image andId:(enum MenuItems)menutag; -(void)dealloc; -(void)menu:(NSMenu *)shownMenu willHighlightItem:(NSMenuItem *)item; -(void)menuDidClose:(NSMenu *)menu; @end NSImage* imageAdd; NSImage* imageAnnotate; NSImage* imageBranch; NSImage* imageCheckmods; NSImage* imageCheckout; NSImage* imageCleanup; NSImage* imageCommit; NSImage* imageDelete; NSImage* imageDiff; NSImage* imageExport; NSImage* imageIgnore; NSImage* imageLock; NSImage* imageLog; NSImage* imageMerge; NSImage* imagePatchCreate; NSImage* imagePatchApply; NSImage* imageProperties; NSImage* imageRelocate; NSImage* imageRepobrowser; NSImage* imageRename; NSImage* imageResolve; NSImage* imageRevert; NSImage* imageSettings; NSImage* imageSwitch; NSImage* imageUnlock; NSImage* imageUpdate; // ------------------------------------------------------------------- // // MyMenu // // Creates and manages the menu display. // // Implementation // ------------------------------------------------------------------- @implementation MyMenu // ------------------------------------------------------------------- // // menu:willHighlightItem: // // Returns index of requested menu item (or -1, if not in menu) // // ------------------------------------------------------------------- - (void)menu:(NSMenu *)shownMenu willHighlightItem:(NSMenuItem *)item { selection = -1; int amount = [menuItems count]; for(int i=0; i= 0) { // Ordinary commands invoked by selection number sendCommand(selectedFiles, selection); } // else, clicked outside menu, hit escape, or like that */ //[[NSApplication sharedApplication] terminate: nil]; // Never returns } -(void) addItem:(NSString*) name withIcon:(NSImage*) image andId:(enum MenuItems)menutag { NSMenuItem* item = [menu addItemWithTitle:NSLocalizedStringFromTable(name, @"menuitems", nil) action:nil keyEquivalent:@""]; [item setEnabled:YES]; [item setImage:image]; [item setTag:menutag]; [menuItems addObject:item]; } // ------------------------------------------------------------------- // // fillMenu // // Populates the menu with known Subversion commands // // ------------------------------------------------------------------- - (void) fillMenu { NSString* title = [[NSString alloc] initWithCString:"My Menu" encoding:NSUTF8StringEncoding]; menu = [[NSMenu alloc] initWithTitle:title]; [self addItem:@"Add" withIcon:imageAdd andId:ADD]; if (containsFiles && !containsFolders) { [self addItem:@"Annotate" withIcon:imageAnnotate andId:ANNOTATE]; } [self addItem:@"Check for modifications" withIcon:imageCheckmods andId:CHECK_FOR_MODS]; if (containsFolders && !containsFiles) { [self addItem:@"Checkout" withIcon:imageCheckout andId:CHECKOUT]; [self addItem:@"Cleanup" withIcon:imageCleanup andId:CLEANUP]; } [self addItem:@"Commit" withIcon:imageCommit andId:COMMIT]; [self addItem:@"Delete" withIcon:imageDelete andId:DELETE]; [self addItem:@"Export" withIcon:imageExport andId:EXPORT]; [self addItem:@"Diff against base (raw)" withIcon:imageDiff andId:DIFF_RAW]; [self addItem:@"Diff against base (side by side)" withIcon:imageDiff andId:DIFF_GUI]; //[self addItem:@"Ignore" withIcon:imageIgnore andId:IGNORE]; [self addItem:@"Log" withIcon:imageLog andId:LOG]; [self addItem:@"Mark Resolved" withIcon:imageResolve andId:MARK_RESOLVED]; [self addItem:@"Properties" withIcon:imageProperties andId:PROPERTIES]; [self addItem:@"Revert" withIcon:imageRevert andId:REVERT]; [self addItem:@"Rename" withIcon:imageRename andId:RENAME]; [self addItem:@"Update" withIcon:imageUpdate andId:UPDATE]; [self addItem:@"Update to revision..." withIcon:imageUpdate andId:UPDATE_TO]; if (containsFolders && !containsFiles) { [menu addItem:[NSMenuItem separatorItem]]; [self addItem:@"Branch/Tag" withIcon:imageBranch andId:BRANCH]; [self addItem:@"Merge" withIcon:imageMerge andId:MERGE]; [self addItem:@"Relocate" withIcon:imageRelocate andId:RELOCATE]; [self addItem:@"Repository Browser" withIcon:imageRepobrowser andId:REPO_BROWSER]; [self addItem:@"Switch" withIcon:imageSwitch andId:SWITCH]; } [menu addItem:[NSMenuItem separatorItem]]; [self addItem:@"Lock" withIcon:imageLock andId:LOCK]; [self addItem:@"Unlock" withIcon:imageUnlock andId:UNLOCK]; [menu addItem:[NSMenuItem separatorItem]]; [self addItem:@"Create Patch" withIcon:imagePatchCreate andId:CREATE_PATCH]; [self addItem:@"Apply Patch" withIcon:imagePatchApply andId:APPLY_PATCH]; [menu addItem:[NSMenuItem separatorItem]]; [self addItem:@"Settings" withIcon:imageSettings andId:SETTINGS]; [self addItem:@"About" withIcon:nil andId:ABOUT]; [menu setAutoenablesItems:NO]; [menu setDelegate:self]; [menu sizeToFit]; } // ------------------------------------------------------------------- // // init // // Initializes and posts the menu // // ------------------------------------------------------------------- -(id) init { self = [super init]; if (self) { [self setMenuItems:[[NSMutableArray alloc] init]]; containsFolders = NO; containsFiles = NO; [self setSelectedFiles:getSelectedFilesList(&containsFolders, &containsFiles)]; if ([self selectedFiles] == nil) { fprintf(stderr, "Getting list of files failed"); // FIXME : report something to user exit(1); } selection = -1; BOOL pullsDown = NO; NSPoint mouseLoc = [NSEvent mouseLocation]; #if DEBUG NSLog(@"Mouse base location is (%g, %g)", mouseLoc.x, mouseLoc.y); #endif NSEnumerator *screenEnum =[[NSScreen screens] objectEnumerator]; NSScreen *screen; while ((screen = [screenEnum nextObject]) && !NSMouseInRect(mouseLoc, [screen frame], NO)); #if DEBUG NSLog(@"screen base frame is (%g, %g) + (%g, %g)", [screen frame].origin.x, [screen frame].origin.y, [screen frame].size.width, [screen frame].size.height); #endif NSPoint menuLoc; menuLoc.x = mouseLoc.x - [screen frame].origin.x; menuLoc.y = mouseLoc.y - [screen frame].origin.y; #if DEBUG NSLog(@"desired menu screen location is (%g, %g)", menuLoc.x, menuLoc.y); #endif //---- NSWindow *hiddenWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect( menuLoc.x, menuLoc.y, 5, 5 ) styleMask: NSTitledWindowMask | NSClosableWindowMask backing:NSBackingStoreNonretained defer:NO screen:screen]; [hiddenWindow setFrameOrigin:mouseLoc]; // dunno why this is needed, but some screen arrangements misposition without #if DEBUG NSLog(@"hidden window base location: %g %g", [hiddenWindow frame].origin.x, [hiddenWindow frame].origin.y); NSLog(@"hidden window screen location: %g %g", [hiddenWindow frame].origin.x - [screen frame].origin.x, [hiddenWindow frame].origin.y - [screen frame].origin.y ); #endif //---- NSRect rect; rect.origin.x = 0; rect.origin.y = 0; rect.size.width = 1000; rect.size.height = 500; NSView* view = [[NSView alloc] initWithFrame:rect]; [[hiddenWindow contentView] addSubview:view]; [self fillMenu]; NSRect menuFrame; menuFrame.origin.x = 0.0; menuFrame.origin.y = 0.0; menuFrame.size.width = 100; menuFrame.size.height = 0.0; NSPopUpButtonCell *popUpButtonCell = [[NSPopUpButtonCell alloc] initTextCell:@"" pullsDown:pullsDown]; [popUpButtonCell setMenu:menu]; if (!pullsDown) [popUpButtonCell selectItem:nil]; [popUpButtonCell performClickWithFrame:menuFrame inView:view]; // Never returns } return self; } // ------------------------------------------------------------------- // // menuItems // // Accessor // // ------------------------------------------------------------------- -(NSMutableArray*)menuItems { return menuItems; } // ------------------------------------------------------------------- // // setMenuItems: // // Accessor // // ------------------------------------------------------------------- -(void)setMenuItems:(NSMutableArray*)newMenuItems { menuItems = newMenuItems; } // ------------------------------------------------------------------- // // selectedFiles // // Accessor // // ------------------------------------------------------------------- - (NSArray*) selectedFiles { return selectedFiles; } // ------------------------------------------------------------------- // // setSelectedFiles: // // Accessor // // ------------------------------------------------------------------- -(void)setSelectedFiles:(NSArray*)newSelectedFiles { selectedFiles = newSelectedFiles; } // ------------------------------------------------------------------- // // dealloc // // ------------------------------------------------------------------- -(void)dealloc { [self setMenuItems:nil]; [self setSelectedFiles:nil]; [super dealloc]; } @end // ------------------------------------------------------------------- @interface MyAppDelegate : NSObject { } - (void) applicationDidFinishLaunching:(NSNotification*) notice ; - (void) applicationDidBecomeActive:(NSNotification *)notif; @end // ------------------------------------------------------------------- @implementation MyAppDelegate - (void) applicationDidFinishLaunching:(NSNotification*) notice { // DEBUG printf("inside appdidfinishlaunching\n") ; [[MyMenu alloc] init]; // Never returns } - (void) applicationDidBecomeActive:(NSNotification *)notif { [[MyMenu alloc] init]; // Never returns } @end // ------------------------------------------------------------------- #pragma mark main() NSImage* loadImage(NSString* name) { NSString * path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; return [[NSImage alloc] initByReferencingFile:path]; } int main(int argc, char *argv[]) { // TODO : determine which actions are possible MyAppDelegate* delegate = [[MyAppDelegate alloc] init]; NSApplication* app = [NSApplication sharedApplication]; [app setDelegate:delegate]; imageAdd = loadImage(@"rabbitvcs-add"); imageAnnotate = loadImage(@"rabbitvcs-annotate"); imageBranch = loadImage(@"rabbitvcs-branch"); imageCheckmods = loadImage(@"rabbitvcs-checkmods"); imageCheckout = loadImage(@"rabbitvcs-checkout"); imageCleanup = loadImage(@"rabbitvcs-cleanup"); imageCommit = loadImage(@"rabbitvcs-commit"); imageDelete = loadImage(@"rabbitvcs-delete"); imageDiff = loadImage(@"rabbitvcs-diff"); imageExport = loadImage(@"rabbitvcs-export"); //imageIgnore = loadImage(@"rabbitvcs-ignore"); imageLock = loadImage(@"rabbitvcs-lock"); imageLog = loadImage(@"rabbitvcs-show_log"); imageMerge = loadImage(@"rabbitvcs-merge"); imagePatchCreate = loadImage(@"rabbitvcs-createpatch"); imagePatchApply = loadImage(@"rabbitvcs-applypatch"); imageProperties = loadImage(@"rabbitvcs-properties"); imageRelocate = loadImage(@"rabbitvcs-relocate"); imageRepobrowser = loadImage(@"rabbitvcs-repobrowser"); imageRename = loadImage(@"rabbitvcs-rename"); imageResolve = loadImage(@"rabbitvcs-resolve"); imageRevert = loadImage(@"rabbitvcs-revert"); imageSettings = loadImage(@"rabbitvcs-settings"); imageSwitch = loadImage(@"rabbitvcs-switch"); imageUnlock = loadImage(@"rabbitvcs-unlock"); imageUpdate = loadImage(@"rabbitvcs-update"); [NSApp run]; // Never returns //return NSApplicationMain(argc, (const char **) argv); return 0; } rabbitvcs-0.18/clients/osx_finder/toolbar_button/schelper.icns000066400000000000000000001261121362112712700247470ustar00rootroot00000000000000icnsJics#Hics8VV+VVVVVV+++++++++++VVVVVVVVVVVVis32 PJSsv)./-1Gëq-.6؜A+Bk,+-.17cՀG¤ll̆4/.-,,*q}4,,-LO-*|xAb^8.,,*x\fP@P?PJSuw)./-1Gŭs-.6؜A+Bk,+-.17cՀG¤ll̆5/.-,,*q}4,,-LO-*|xAb^8.,,*x\fP@P?PJSsv)./-1Gëq-.6؜A+Bk,+-.17cՀG¤ll̆4/.-,,*q}4,,-LO-*|xAb^8.,,*x\fP@P?s8mkLOOOOOOOOOOOOO"OOOOOOOOOOOOOOICN#icl8+VVVVV+++V+++VV++++++++++VV++++++++++++++++++++++++++VVV++++++++++++++VV++++++++++++++++VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVil32:_M N_rf dbP<; ;;:9?LhcM;--./.-, 1GaôNK<./--,,2Dl·~^I..-0=]}aOA71/=JI;-4LuȰ_H<2.--,,;IIGWӥlP<1.-,,-//2CHH܀ߘאO3..358?IV`oxHH؁ЁPMS]hr|HH҅ ήԃHH̓̀ ͂GGǁxoe\TNJIpŁGGÀ{nc\RH>7310.-/>p·ŀGF@4.-,--, -4=Pyy`EF;3--,--.2:G^ymG37EF?5-.18>KYpwY;.,,8EF;35;FXnbJ3-,9FH W\l|t^E5.,-,-7%GZ{^H=76678867878CY{S a]GEG\O_M N_rf dbP<;;;:9?LhcM;--./.-, 1GaŴNK<./--,,2Dl·~^J=DKK>..-0=]}aOA71/=JI;-4LuȰ_H<2.--,,;IIGWӥlP<1.-,,-//2CHH܀ߘאO3..358?IV`oxHH؁ЁPMS]hr|HH҅ ήԃHH̓̀ ͂GGȁxoe\TNJIpƁGGĀ}oc\RH>7310.-/>pøƀGF@4.-,--, -4=Pyy`EF;3--,--.2:G^ymG37EF?5-.18>KYpwY;.,,8EF;35;FXnbJ3-,9FH W\l|t^E5.,-,-7%GZ{^H=76678867878CY{S a]GEG\O_M N_rf dbP<; ;;:9?LhcM;--./.-, 1GaôNK<./--,,2Dl·~^I..-0=]}aOA71/=JI;-4LuȰ_H<2.--,,;IIGWӥlP<1.-,,-//2CHH܀ߘאO3..358?IV`oxHH؁ЁPMS]hr|HH҅ ήԃHH̓̀ ͂GGǁxoe\TNJIpŁGGÀ|nc\RH>7310.-/>p·ŀGF@4.-,--, -4=Pyy`EF;3--,--.2:G^ymG37EF?5-.18>KYpwY;.,,8EF;35;FXnbJ3-,9FH W\l|t^E5.,-,-7%GZ{^H=76678867878CY{S a]GEG\Ol8mk4fz[w#$$cit32W b[Z<8==;19AA;?POUfbuvj^\YUPN PVZ\]bgnuw }oc_]XQOQX]`bgkqvwk^[YQLKJMSZ]^biou}wrmjic__^`dhjllpwxvuvxtrokkjlk!ljkloqssmkggr}mek~ֆ׹ؖ!źxidj{g`d} ̿ydahygbg}+Ș{gci~xvxwxv{ϯΥzwyzz|}dcfvrPIKMKLLKMONPNOKLKMNRWXZagimźvhef_^btQ*$(+*+)*,-+-,)(')()0557@IJOcwx|Ʋvb^_]\`sI%"')('(**))+))**'((''))()*/456@IINbvw{̸r`[][Y\qL)'+-,+,.-/.+(.-./24438=<DZadm}{wfTSOM@><94001+(*MiMHJKHMiN,(,./- .-..-.-02006>1E[bfnü|yweUTQNB?>;6322-*,NiMHKKHMhN-*-./--../0116::=IUWYiwzz~&vljh_XVULBCA?75542100-*,M hMHKKHMhP/+/-.7--.-/335=DDJaw}ž{trn^NJJC;:;71221//./-.-.,),M hMHKKHMiP/+/-,4+,+.002:ABHdƫvlieSC?>9200-*)**++,,+-,),M iMHKKHLgO.+/-/./0-106::;DOPVmofebSDA?:5430-,-,-,)+LgLHKIGKf>L+),--.-2237AEFGXiloÿpjhdPLKJC:98400/..-,-)+LfKGIJGKgK*'+-%.558?RY^_{Ż|]RPL?;;:12/./..-,-,-)+L gKGJJGKe5I)'*+*+,336=TZaaʻ~tRHEB4100++*++,+,-,(+K eKGJJGKf1L,)-0/02<2132.--.--,-+,-,-./.0/34426ScKFIIFKc$ͽX;7Cbjq|ǠxpjQ5-//*+,+**+,++,,--./0101315R cKFIIFKd!οcGCNluzûrkfO93.-,-,-. /.0//.011013245667899=;@] ڿdKFIIFJbʋxw׀ ӴoSML?30..--//0113 46898;>=?BEGHKORX[\\aabdhil ۿbJFIIFJcߌӳƖcXWF3/1/-0.++-,112356677889>AABGMMOU\^_fmmor{~ߌ ؼcJFIIFJcތ վހÎXKK;+')*+ **++1012455678=BBDJNPQYacdlttvy݌׻cJFIIFJc݋ Ծď[PQ@0-.//. --/24348898:!;@DEFLQST\cefmvvx{݊ؼcJFIIFJb܌ ؃ÑaWWH:669;:;:;::>BFK#QRQQVZZ\afhjqwyyی ջbJFIIFJbڍҀׂAœvmmcYVY^ceehorru{~׍ ӸbJFIIFJa؎׆8zqrj`_ahoqps~ՀՏѷaJFIIFKa׎ցׇ+wwohfhowxy|Ճ؇׎ѸaKFIIGKb֜+ézwz҄֗зbKGIGEJ_ԝƾŀ Ѥ ʹ_JEGHEJ`ӟЀ ΀ρЀ҂Ӂҟ ̳`JEHHEJ`ҟЂуҀЀсЀπΉќ ˲`JEHHFI_ћ΀ρ΀ρɀĀК ˳_IFHHFI_ϗ̀ń/þ~zvuv{̒ ɰ_IFHHFI_Ώ̄Ȁƀŀ2{xwvtppoidcdjqox˒ ȯ_IFHHFI^͍Ȃ>~{spopkhhfc^\^dihqˁɁʏǯ^IFHFDH^ˋ&~|ztrrofcdca_^]ZVUW[``gȀʁȀˍƭ^HDFHFJ^ȍ$}}|wrppkfed_YXXSPOPNHGFEDD?>>=;;::98997667::986656344321/..//. /495@wāÁč ^HEGGEH^nj1ƿ~|zxpnlle_^]VOOMHB@@;877632213122/0//,-,++*,140;słŁĎ^HEGGEH^Ɗ%ǿ~|trrpjhfg`ZZXSNLJFA??;877643200//..-.8?;78754300//00//.-,.4::?QdgnČ ſ]IEGGEI]Œ$òT=7:7877323210010/00/.//0//..0.//,-,,0:EGMl xnpŒ ¼]IEGGEI]ËİM40110//+,++*+**+,-,+#,,++*)(+8FGPrsgjyÌ ý]IEGGEI^‹ðN6234312./..-,-,+.-0 1213BPQXxmcdu ¼^IEGFDF[ J1/13322-.-,-,)-,1125?BBCN[\_lz|oigbNGJ_ [FDFFDG[F-,.23,-,,-,-,++,-457=NTTZnh`\WC=<;1-/I [GDFFDG\E,+-23,-,,-,-,+-**)*+246;RWX\u`WTO;532+')C \GDFFDG[E.,.2,-,,-,-,,-0)1;<>CW]^cx{_UQM<754-*+C [GDFFDG[J2/34544--,,-,-.6//0103:==?KMOS^bdhy~~}o``]XHBA>5211,*,C [GDFFDG[ M6356655--,-..-.2566:FJLRdjms|hVROB5544/../.+),D [GDFFDGZM74655--,+,,++,,+,/4$9GKOTjptz~|waLGF:--+,*+*+ ,,+),BZGDFFDGZL6357765--++--,,-..//0*13248;=>AIQTV_ilmw}wd]\XL@=<72130,.-.--,-*.C YGDFFDHYD/,.0/*023449==@IRTVakmpzyc]]YM@==60/.-.-,-*.C YHDFFDHY E/,.10110025787=BBENWZ\epsu|zs]VVTE9752.,,-+,-*.CYHDFFDHZ I2.36878:;)AACCIOPQYbcfmuxy~qmkfTPOLB8662-,-*.DZHDFFDFX9TA=BKMOQXZ[^ilmmu}{zyvhec^QLKJ@?><74451./..-,-,-+)-BXFDFEDFY9VB?EOSUWadehvxz{zwvq^YWRC>=<3200..-.--..-,-,-+)-CYFDEFDGZ,YFCHUWY]fjloy|~~vtslZTQN?;:90.,,++-,-,-+),A[HEFJIL\gVSWbefhprsu|||yrjgfbROMI=99720//--,,-,-,-,),A[KHISRTa|vtqh]ZXQIHHA;:43/.--,,-,-,-+),A`TQRXWZc({pnj]PMKB:773..--,,+,)*+))*))+)+)'*@cXVWYYZd%|pnk^PMLD:8631.//++,.,.,.,*-EdZWXZZ[d}#{xvk`]\TNLKIEDDCA@B@B@B@B@@B@BB@B?CWd[YZfc`_a_`k{ rlkjf`cftti[UQUaqxmdaednwwp_SPRboujbacjtxeXTVcorha_blq]ha_^beeb\XWWVWWX\bee^WRRUJO__pnldaa`]WQOQW]`^YWTTRU.?wf`]\XPGDEDEDGPX\[USOQUG*vfc`][QIGHF HGIQ[]]YSQUUE ?j`^\ZPFDF PZ\\XPJONUU?3KHJJ1)1)1JJFE/'?8 b[Z<8==;19AA;?POUfbuvj^\YUPN PVZ\]bgnuw }qc_]XQOQX]`bgkqvyk^[YQLKJMSZ]^biou}xtmjic__^`dhjllpwzxwvxtrokkjlk!ljkloqssmkggrmek~ֆ׹ؖ!źxidj{h`d} ̿ydah{gbg}+Ș{gcj~yxzwyv{ϯΥzwy{{}~dcfvrPIKMKLLKMONPNOKLKMNRWXZagimźvhef_^btQ*$(+*+)*,-+-,)(')()0557@IJOcwx|Ʋvb^_]\`sI%"')('(**))+))**'((''))()*0677AIINbvw{̸r`[][Y\qL)'+-,+,.-/.+(.-./24438=<DZadm}{wfTSOM@><94001+(*MiMHJKHMiN,(,./- .-..-.-02006>1E[bfnü|yweUTQNB?>;6322-*,NiMHKKHMhN-*-./--../0116::=IUWYiwzz~&vljh_XVULBCA?75542100-*,M hMHKKHMhP/+/-.)--.-/335=DDJaw}ž{trn^NJJC; 71221//./-.-.,),M hMHKKHMiP/+/-,4+,+.002:ABHdƫvlieSC?>9200-*)**++,,+-,),M iMHKKHLgO.+/-/./0-106::;DOPVmofebSDA?:5430-,-,-,)+LgLHKIGKf>L+),--.-2237AEFGXiloÿpjhdPLKJC:98400/..-,-)+LfKGIJGKgK*'+-%.558?RY^_{Ż|]RPL?;;:12/./..-,-,-)+L gKGJJGKe5I)'*+*+,336=TZaaʻ~tRHEB4100++*++,+,-,(+K eKGJJGKf1L,)-0/02<2132.--.--,-+,-,-./.0/34426ScKFIIFKc$ͽX;7Cbjq|ǠxpjQ5-//*+,+**+,++,,--./0101315R cKFIIFKd!οcGCNluzûrkfO93.-,-,-. /.0//.011013245667899=;@] ڿdKFIIFJbʋxw׀ ӴoSML?30..--//0113 46898;>=?BEGHKORX[\\aabdhil ۿbJFIIFJcߌӳƖcXWF3/1/-0.++-,112356677889>AABGMMOU\^_fmmor{~ߌ ؼcJFIIFJcތ վހÎXKK;+')*+ **++1012455678=BBDJNPQYacdlttvy݌׻cJFIIFJc݋ Ծď[PQ@0-.//. --/24348898:!;@DEFLQST\cefmvvx{݊ؼcJFIIFJb܌ ؃ÑaWWH:669;:;:;::>BFK#QRQQVZZ\afhjqwyyی ջbJFIIFJbڍҀׂAœvmmcYVY^ceehorru{~׍ ӸbJFIIFJa؎׆8zqrj`_ahoqps~ՀՏѷaJFIIFKa׎ցׇ+wwohfhowxy|Ճ؇׎ѸaKFIIGKb֜+ézwz҄֗зbKGIGEJ_ԝƾŀ Ѥ ʹ_JEGHEJ`ӟЀ ΀ρЀ҂Ӂҟ ̳`JEHHEJ`ҟЂуҀЀсЀπΉќ ˲`JEHHFI_ћ΀ρ΀ρɀĀК ˳_IFHHFI_ϗ̀ń/þ~zvuv{̒ ɰ_IFHHFI_Ώ̄Ȁƀŀ2{xwvtppoidcdjqox˒ ȯ_IFHHFI^͎F~{spopkhhfc^\^dihqˁɓǯ^IFHFDH^ˋ&~|ztrrofcdca_^]ZVUW[``gȀʁȀˍƭ^HDFHFJ_ʍ$¾~~}xrppkfed_YXXSPOPNHGFEDD?>>=;;::98997667::986656344321/..//. /495@wƂƁƎ ë^HEGGEH^Ɍ1½}{yqommf_^]VOOMHB@@;877632213122/0//,-,++*,140;tǁȁȍë^HEGGEH^Ȋ%|vssqkighaZZXSNLJFA??;877643200//..-.8?;78754300//00//.-,.4::?QdgnŌ ^IEGGEI]Œ$òU>8;7877323210010/00/.//0//..0.//,-,,0:EGMl xoqŒ ¼]IEGGEI]ËİM40110//+,++*+**+,-,+#,,++*)(+8FGPrsgjyÌ ý]IEGGEI^‹ðN6234312./..-,-,+.-0 1213BPQXxmcdu ¼^IEGFDF[ J1/13322-.-,-,)-,1125?BBCN[\_lz|oigbNGJ_ [FDFFDG[F-,.23,-,,-,-,++,-457=NTTZnh`\WC=<;1-/I [GDFFDG\E,+-23,-,,-,-,+-**)*+246;RWX\u`WTO;532+')C \GDFFDG[E.,.2,-,,-,-,,-0)1;<>CW]^cx{_UQM<754-*+C [GDFFDG[J2/34544--,,-,-.6//0103:==?KMOS^bdhy~~}o``]XHBA>5211,*,C [GDFFDG[ M6356655--,-..-.2566:FJLRdjms|hVROB5544/../.+),D [GDFFDGZM74655--,+,,++,,+,/4$9GKOTjptz~|waLGF:--+,*+*+ ,,+),BZGDFFDGZL6357765--++--,,-..//0*13248;=>AIQTV_ilmw}wd]\XL@=<72130,.-.--,-*.C YGDFFDHYD/,.0/*023449==@IRTVakmpzyc]]YM@==60/.-.-,-*.C YHDFFDHY E/,.10110025787=BBENWZ\epsu|zs]VVTE9752.,,-+,-*.CYHDFFDHZ I2.36878:;)AACCIOPQYbcfmuxy~qmkfTPOLB8662-,-*.DZHDFFDFX9TA=BKMOQXZ[^ilmmu}{zyvhec^QLKJ@?><74451./..-,-,-+)-BXFDFEDFY9VB?EOSUWadehvxz{zwvq^YWRC>=<3200..-.--..-,-,-+)-CYFDEFDGZ,YFCHUWY]fjloy|~~vtslZTQN?;:90.,,++-,-,-+),A[HEFJIL\gVSWbefhprsu|||yrjgfbROMI=99720//--,,-,-,-,),A[KHISRTa|vtqh]ZXQIHHA;:43/.--,,-,-,-+),A`TQRXWZc({pnj]PMKB:773..--,,+,)*+))*))+)+)'*@cXVWYYZd%|pnk^PMLD:8631.//++,.,.,.,*-EdZWXZZ[d}#{xvk`]\TNLKIEDDCA@B@B@B@B@@B@BB@B?CWd[YZfc`_a_`k{ "rlkjf`cftti[UQUaq"xmdaednwwp_SPRboujbacjtxeXTVcoٔrha_blq]ha_^beeb\XWWVWWX\bee^YTTWJO__pnldaa`]WQOQW]`^YXVVUU.?wf`]\XPGDEDEDGPX\[USOQUG*vfc`][QIGHF HGIQ[]]YSQUUE ?j`^\ZPFDF PZ\\XPJONUU?3KHJJ1)1)1JJFE/'?8 b[Z<8==;19AA;?POUfbuvj^\YUPN PVZ\]bgnuw }oc_]XQOQX]`bgkqvwk^[YQLKJMSZ]^biou}wrmjic__^`dhjllpwxvuvxtrokkjllk"lljkloqssmkggr}mek~ֆ׹ؖ!źxidj{g`d} ̿ydahygbg}+Ș{gci~xvxwxv{ϯΥzwyzz|}dcfvrPIKMKLLKMONPNOKLKMNRWXZagimźvhef_^btQ*$(+*+)*,-+-,)(')()0557@IJOcwx|Ʋvb^_]\`sI%"')('(**))+))**'('))()*/456@IINbvw{̸r`[][Y\qL)'+-,+,.-/.+(.-./24438=<DZadm}{wfTSOM@><94001+(*MiMHJKHMiN,(,./- .-..-.-02006>1E[bfnü|yweUTQNB?>;6322-*,NiMHKKHMhN-*-./--../0116::=IUWYiwzz~&vljh_XVULBCA?75542100-*,M hMHKKHMhP/+/-.)--.-/335=DDJaw}ž{trn^NJJC; 71221//./-.-.,),M hMHKKHMiP/+/-,4+,+.002:ABHdƫvlieSC?>9200-*)**++,,+-,),M iMHKKHLgO.+/-/./0-106::;DOPVmofebSDA?:5430-,-,-,)+LgLHKIGKf>L+),--.-2237AEFGXiloÿpjhdPLKJC:98400/..-,-)+LfKGIJGKgK*'+-%.558?RY^_{Ż|]RPL?;;:12/./..-,-,-)+L gKGJJGKe5I)'*+*+,336=TZaaʻ~tRHEB4100++*++,+,-,(+K eKGJJGKf1L,)-0/02<2132.--.--,-+,-,-./.0/34426ScKFIIFKc$ͽX;7Cbjq|ǠxpjQ5-//*+,+**+,++,,--./0101315R cKFIIFKd!οcGCNluzûrkfO93.-,-,-. /.0//.011013245667899=;@] ڿdKFIIFJbʋxw׀ ӴoSML?30..--//0113 46898;>=?BEGHKORX[\\aabdhil ۿbJFIIFJcߌӳƖcXWF3/1/-0.++-,112356677889>AABGMMOU\^_fmmor{~ߌ ؼcJFIIFJcތ վހÎXKK;+')*+ **++1012455678=BBDJNPQYacdlttvy݌׻cJFIIFJc݋ Ծď[PQ@0-.//. --/24348898:!;@DEFLQST\cefmvvx{݊ؼcJFIIFJb܌ ؃ÑaWWH:669;:;:;::>BFK#QRQQVZZ\afhjqwyyی ջbJFIIFJbڍҀׂAœvmmcYVY^ceehorru{~׍ ӸbJFIIFJa؎׆8zqrj`_ahoqps~ՀՏѷaJFIIFKa׎ցׇ+wwohfhowxy|Ճ؇׎ѸaKFIIGKb֜+ézwz҄֗зbKGIGEJ_ԝƾŀ Ѥ ʹ_JEGHEJ`ӟЀ ΀ρЀ҂Ӂҟ ̳`JEHHEJ`ҟЂуҀЀсЀπΉќ ˲`JEHHFI_ћ΀ρ΀ρɀĀК ˳_IFHHFI_ϗ̀ń/þ~zvuv{̒ ɰ_IFHHFI_Ώ̄Ȁƀŀ2{xwvtppoidcdjqox˒ ȯ_IFHHFI^͍Ȃ>~{spopkhhfc^\^dihqˁɁʏǯ^IFHFDH^ˋ&~|ztrrofcdca_^]ZVUW[``gȀʁȀˍƭ^HDFHFJ^ȍ$}}|wrppkfed_YXXSPOPNHGFEDD?>>=;;::98997667::986656344321/..//. /495@wāÁč ^HEGGEH^nj1ƿ~|zxpnlle_^]VOOMHB@@;877632213122/0//,-,++*,140;słŁĎ^HEGGEH^Ɗ%ǿ~|trrpjhfg`ZZXSNLJFA??;877643200//..-.8?;78754300//00//.-,.4::?QdgnČ ſ]IEGGEI]Œ$òT=7:7877323210010/00/.//0//..0.//,-,,0:EGMl xnpŒ ¼]IEGGEI]ËİM40110//+,++*+**+,-,+#,,++*)(+8FGPrsgjyÌ ý]IEGGEI^‹ðN6234312./..-,-,+.-0 1213BPQXxmcdu ¼^IEGFDF[ J1/13322-.-,-,)-,1125?BBCN[\_lz|oigbNGJ_ [FDFFDG[F-,.23,-,,-,-,++,-457=NTTZnh`\WC=<;1-/I [GDFFDG\E,+-23,-,,-,-,+-**)*+246;RWX\u`WTO;532+')C \GDFFDG[E.,.2,-,,-,-,,-0)1;<>CW]^cx{_UQM<754-*+C [GDFFDG[J2/34544--,,-,-.6//0103:==?KMOS^bdhy~~}o``]XHBA>5211,*,C [GDFFDG[ M6356655--,-..-.2566:FJLRdjms|hVROB5544/../.+),D [GDFFDGZM74655--,+,,++,,+,/4$9GKOTjptz~|waLGF:--+,*+*+ ,,+),BZGDFFDGZL6357765--++--,,-..//0*13248;=>AIQTV_ilmw}wd]\XL@=<72130,.-.--,-*.C YGDFFDHYD/,.0/*023449==@IRTVakmpzyc]]YM@==60/.-.-,-*.C YHDFFDHY E/,.10110025787=BBENWZ\epsu|zs]VVTE9752.,,-+,-*.CYHDFFDHZ I2.36878:;)AACCIOPQYbcfmuxy~qmkfTPOLB8662-,-*.DZHDFFDFX9TA=BKMOQXZ[^ilmmu}{zyvhec^QLKJ@?><74451./..-,-,-+)-BXFDFEDFY9VB?EOSUWadehvxz{zwvq^YWRC>=<3200..-.--..-,-,-+)-CYFDEFDGZ,YFCHUWY]fjloy|~~vtslZTQN?;:90.,,++-,-,-+),A[HEFJIL\gVSWbefhprsu|||yrjgfbROMI=99720//--,,-,-,-,),A[KHISRTa|vtqh]ZXQIHHA;:43/.--,,-,-,-+),A`TQRXWZc({pnj]PMKB:773..--,,+,)*+))*))+)+)'*@cXVWYYZd%|pnk^PMLD:8631.//++,.,.,.,*-EdZWXZZ[d}#{xvk`]\TNLKIEDDCA@B@B@B@B@@B@BB@B?CWd[YZfc`_a_`k{ rlkjf`cftti[UQUaq xmdaednwwp_SPRbo"ujbacjtxeXTVcoٓ!rha_blq]ha_^beeb\XWWVWWX\bee^YTTWJO__pnldaa`]WQOQW]`^YXVVUU.?wf`]\XPGDEDEDGPX\[USOQUG*vfc`][QIGHF HGIQ[]]YSQUUE ?j`^\ZPFDF PZ\\XPJONUU?3KHJJ1)1)1JJFE/'?8t8mk@  !.39EVowx{~x`OC?<4100//2;QZezҨwni[VTT558B]gr~xhb``??CMisǫtmkkHHLWvϷywwmmrҶ{{ʾßɻZZb{_UU00:Yc #import #import "sendmsg.h" #define RABBIT "" //"/opt/rabbit/bin/rabbitvcs_osx " void sendCommand(NSArray* selectedFiles, int commandid) { bool acceptsFiles = YES; NSMutableArray* arguments = [[NSMutableArray alloc] initWithCapacity:32]; switch (commandid) { case ADD: [arguments addObject:@"add"]; break; case ANNOTATE: [arguments addObject:@"annotate"]; break; case CHECK_FOR_MODS: [arguments addObject:@"checkmods"]; break; case CHECKOUT: [arguments addObject:@"checkout"]; break; case CLEANUP: [arguments addObject:@"cleanup"]; break; case COMMIT: [arguments addObject:@"commit"]; break; case DELETE: [arguments addObject:@"delete"]; break; case EXPORT: [arguments addObject:@"export"]; break; case DIFF_RAW: [arguments addObject:@"diff"]; break; case DIFF_GUI: [arguments addObject:@"diff"]; [arguments addObject:@"-s"]; break; case IGNORE: [arguments addObject:@"ignore"]; break; case LOG: [arguments addObject:@"log"]; break; case MARK_RESOLVED: [arguments addObject:@"markresolved"]; break; case PROPERTIES: [arguments addObject:@"properties"]; break; case REVERT: [arguments addObject:@"revert"]; break; case RENAME: [arguments addObject:@"rename"]; break; case UPDATE: [arguments addObject:@"update"]; break; case UPDATE_TO: [arguments addObject:@"updateto"]; break; case BRANCH: [arguments addObject:@"branch"]; break; case MERGE: [arguments addObject:@"merge"]; break; case RELOCATE: [arguments addObject:@"relocate"]; break; case REPO_BROWSER: [arguments addObject:@"browser"]; break; case SWITCH: [arguments addObject:@"switch"]; break; case LOCK: [arguments addObject:@"lock"]; break; case UNLOCK: [arguments addObject:@"unlock"]; break; case CREATE_PATCH: [arguments addObject:@"createpatch"]; break; case APPLY_PATCH: [arguments addObject:@"applypatch"]; break; case SETTINGS: [arguments addObject:@"settings"]; acceptsFiles = NO; break; case ABOUT: [arguments addObject:@"about"]; acceptsFiles = NO; break; default: fprintf(stderr, "Unknown command %i\n", commandid); return; } NSTask* task = [[NSTask alloc] init]; [task setLaunchPath: @"/opt/rabbit/bin/rabbitvcs_osx"]; if (acceptsFiles) { NSLog(@"%i selected files\n", [selectedFiles count] ); for (NSString* curr in selectedFiles) { NSLog(@" - %@\n", curr); } [arguments addObjectsFromArray: selectedFiles]; } [task setArguments:arguments]; [task launch]; } rabbitvcs-0.18/clients/pluma/000077500000000000000000000000001362112712700162025ustar00rootroot00000000000000rabbitvcs-0.18/clients/pluma/README000066400000000000000000000015011362112712700170570ustar00rootroot00000000000000RabbitVCS Pluma Plugin This plugin is meant to be used with the Pluma Text Editor. It provides the familiar RabbitVCS Context menu in the Tools menu as well as in various context menus. Requirements: * pluma * (all other RabbitVCS requirements) Installation: To install for all users, copy rabbitvcs-plugin.py and rabbitvcs-pluma.plugin to: /usr/lib{64}/pluma/plugins To install for a single user, copy rabbitvcs-plugin.py and rabbitvcs-pluma.plugin to: ~/.local/share/pluma/plugins Troubleshooting: If Pluma supports Python 3 but not Python 2, edit installed file rabbitvcs-pluma.plugin and change line Loader=python to Loader=python3 See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/pluma/rabbitvcs-plugin.py000066400000000000000000001031251362112712700220310ustar00rootroot00000000000000from __future__ import absolute_import # # This is a Pluma plugin to allow for RabbitVCS integration in the Pluma # text editor. # # Copyright (C) 2008-2011 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from gettext import gettext as _ import os import gi from rabbitvcs.util import helper gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk sa.restore() from gi.repository import Pluma, GObject, Peas from rabbitvcs.vcs import create_vcs_instance from rabbitvcs.util.contextmenu import GtkFilesContextMenuConditions, \ GtkFilesContextMenuCallbacks, MainContextMenu, MainContextMenuCallbacks, \ MenuBuilder, GtkContextMenuCaller from rabbitvcs.util.contextmenuitems import * # Menu item, insert a new item on the menu bar. ui_str = """ """ class RabbitVCSWindowHelper(GtkContextMenuCaller): _menu_paths = [ # "/MenuBar/RabbitVCSMenu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Commit", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Update", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Checkout", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Diff_Menu/RabbitVCS::Show_Changes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Show_Log", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Repo_Browser", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Check_For_Modifications", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_Filename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_File_Extension", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Update_To_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Rename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Delete", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Revert", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Edit_Conflicts", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Mark_Resolved", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Get_Lock", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Unlock", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Cleanup", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Annotate", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Export", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Create_Repository", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Import", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Branch_Tag", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Switch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Merge", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Apply_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Create_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Svn/RabbitVCS::Properties", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Update", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Commit", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Push", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Clone", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Initialize_Repository", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Diff_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Previous_Revision", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Compare_Tool_Multiple", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Diff_Menu/RabbitVCS::Show_Changes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Show_Log", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Stage", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Unstage", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_Filename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Add_To_Ignore_List/RabbitVCS::Ignore_By_File_Extension", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Rename", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Delete", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Revert", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Edit_Conflicts", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Clean", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Reset", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Checkout", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Branches", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Tags", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Remotes", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Export", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Merge", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Annotate", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Apply_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::RabbitVCS_Git/RabbitVCS::Create_Patch", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::Settings", "/MenuBar/ExtraMenu_1/RabbitVCSMenu/RabbitVCS::About" ] _default_base_dir = os.path.expanduser("~") def __init__(self, plugin, window): self._window = window self._plugin = plugin self.base_dir = self._default_base_dir self._menubar_menu = None self._menu_action = None self.vcs_client = create_vcs_instance() # Insert menu items self._insert_menu() def deactivate(self): # Remove any installed menu items self._remove_menu() self._window = None self.base_dir = None self._plugin = None self._menubar_menu = None self._action_group = None def _insert_menu(self): # Get the GtkUIManager manager = self._window.get_ui_manager() self._menubar_menu = PlumaMenu(self, self.vcs_client, self.base_dir, [self._get_document_path()]) self._menu_action = Gtk.Action(name="RabbitVCSMenu", label="RabbitVCS", tooltip=_("Excellent Version Control"), stock_id=None) self._action_group = Gtk.ActionGroup("RabbitVCSActions") self._action_group = self._menubar_menu.get_action_group(self._action_group) self._action_group.add_action( self._menu_action ) # Insert the action group manager.insert_action_group(self._action_group, 0) # Merge the UI self._ui_id = manager.add_ui_from_string(ui_str) def _remove_menu(self): # Get the GtkUIManager manager = self._window.get_ui_manager() # Remove the ui manager.remove_ui(self._ui_id) # Remove the action group manager.remove_action_group(self._action_group) # Make sure the manager updates manager.ensure_update() def update_ui(self): self.update_base_dir() document = self._window.get_active_document() self._action_group.set_sensitive(document != None) if document != None: manager = self._window.get_ui_manager() manager.get_widget("/MenuBar/ExtraMenu_1/RabbitVCSMenu").set_sensitive(True) self._menubar_menu.set_paths([self._get_document_path()]) self._determine_menu_sensitivity([self._get_document_path()]) def connect_view(self, view, id_name): handler_id = view.connect("populate-popup", self.on_view_populate_popup) setattr(view, id_name, [handler_id]) def disconnect_view(self, view, id_name): view.disconnect(getattr(view, id_name)[0]) def on_view_populate_popup(self, view, menu): separator = Gtk.SeparatorMenuItem() menu.append(separator) separator.show() context_menu = PlumaMainContextMenu(self, self.vcs_client, self.base_dir, [self._get_document_path()]).get_menu() for context_menu_item in context_menu: menu.append(context_menu_item) def _get_document_path(self): document = self._window.get_active_document() path = self.base_dir if document: tmp_path = document.get_uri_for_display() if os.path.exists(tmp_path): path = tmp_path return path def update_base_dir(self): document = self._window.get_active_document() if document: path = document.get_uri_for_display() if os.path.exists(path): self.base_dir = os.path.dirname(path) else: self.base_dir = self._default_base_dir self._menubar_menu.set_base_dir(self.base_dir) def _determine_menu_sensitivity(self, paths): self._menubar_menu.update_conditions(paths) manager = self._window.get_ui_manager() for menu_path in self._menu_paths: # Gtk3 changes how we access a widget's action. Get it from the # UI Manager instead of the widget directly if hasattr(manager, "get_action"): action = manager.get_action(menu_path) else: widget = manager.get_widget(menu_path) action = widget.get_action() self._menubar_menu.update_action(action) # Menu activate handlers def reload_settings(self, proc): self.update_ui() def on_context_menu_command_finished(self): self.update_ui() class RabbitVCSPlumaPlugin(GObject.Object, Peas.Activatable): __gtype_name__ = "RabbitVCSPlumaPlugin" object = GObject.property(type=GObject.Object) def __init__(self): GObject.Object.__init__(self) self._instances = {} self.id_name = "RabbitVCSContextMenuID" def do_activate(self): self._instances[self.object] = RabbitVCSWindowHelper(self, self.object) handler_ids = [] for signal in ('tab-added', 'tab-removed'): method = getattr(self, 'on_window_' + signal.replace('-', '_')) handler_ids.append(self.object.connect(signal, method)) setattr(self.object, self.id_name, handler_ids) if self.object in self._instances: for view in self.object.get_views(): self._instances[self.object].connect_view(view, self.id_name) def do_deactivate(self): widgets = [self.object] + self.object.get_views() for widget in widgets: handler_ids = getattr(widget, self.id_name) if handler_ids is not None: for handler_id in handler_ids: widget.disconnect(handler_id) setattr(widget, self.id_name, None) if self.object in self._instances: self._instances[self.object].deactivate() del self._instances[self.object] def do_update_state(self): self.update_ui() def update_ui(self): if self.object in self._instances: self._instances[self.object].update_ui() def on_window_tab_added(self, window, tab): if window in self._instances: self._instances[window].connect_view(tab.get_view(), self.id_name) def on_window_tab_removed(self, window, tab): if window in self._instances: self._instances[window].disconnect_view(tab.get_view(), self.id_name) class MenuIgnoreByFilename(MenuItem): identifier = "RabbitVCS::Ignore_By_Filename" label = _("Ignore by File Name") tooltip = _("Ignore item by filename") class MenuIgnoreByFileExtension(MenuItem): identifier = "RabbitVCS::Ignore_By_File_Extension" label = _("Ignore by File Extension") tooltip = _("Ignore item by extension") class PlumaMenuBuilder(object): """ Generalised menu builder class. Subclasses must provide: make_menu_item(self, item, id_magic) - create the menu item for whatever toolkit (usually this should be just call a convenience method on the MenuItem instance). attach_submenu(self, menu_node, submenu_list) - given a list of whatever make_menu_item(...) returns, create a submenu and attach it to the given node. top_level_menu(self, items) - in some circumstances we need to treat the top level menu differently (eg. Nautilus, because Xenu said so). This processes a list of menu items returned by make_menu_item(...) to create the overall menu. """ def __init__(self, structure, conditions, callbacks, action_group): """ @param structure: Menu structure @type structure: list Note on "structure". The menu structure is defined in a list of tuples of two elements each. The first element is a class - the MenuItem subclass that defines the menu interface (see below). The second element is either None (if there is no submenu) or a list of tuples if there is a submenu. The submenus are generated recursively. FYI, this is a list of tuples so that we retain the desired menu item order (dicts do not retain order) Example: [ (MenuClassOne, [ (MenuClassOneSubA, (MenuClassOneSubB ]), (MenuClassTwo, (MenuClassThree ] """ self.action_group = action_group for item_class in structure: item = item_class(conditions, callbacks) default_name = MenuItem.make_default_name(item.identifier) action = Gtk.Action(item.identifier, item.label, item.tooltip, item.icon) if item.icon and hasattr(action, "set_icon_name"): action.set_icon_name(item.icon) if item.callback: if item.callback_args: action.connect("activate", item.callback, item.callback_args) else: action.connect("activate", item.callback) action.set_property("visible", item.show()) setattr(action, "item", item) self.action_group.add_action(action) def _get_function(self, object, name): function = None if hasattr(object, name): attr = getattr(object, name) if callable(attr): function = attr return function class PlumaMenu(object): def __init__(self, caller, vcs_client, base_dir, paths): """ @param caller: The calling object @type caller: RabbitVCS extension @param vcs_client: The vcs client @type vcs_client: rabbitvcs.vcs @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.paths = paths self.base_dir = base_dir self.vcs_client = vcs_client self.conditions = GtkFilesContextMenuConditions(self.vcs_client, self.paths) self.callbacks = GtkFilesContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, self.paths ) self.structure = [ MenuRabbitVCSSvn, MenuRabbitVCSGit, MenuCheckout, MenuUpdate, MenuCommit, MenuPush, MenuInitializeRepository, MenuClone, MenuRabbitVCS, MenuDiffMenu, MenuDiff, MenuDiffPrevRev, MenuDiffMultiple, MenuCompareTool, MenuCompareToolPrevRev, MenuCompareToolMultiple, MenuShowChanges, MenuShowLog, MenuRepoBrowser, MenuCheckForModifications, MenuAdd, MenuStage, MenuUnstage, MenuAddToIgnoreList, MenuUpdateToRevision, MenuRename, MenuDelete, MenuRevert, MenuEditConflicts, MenuMarkResolved, MenuRelocate, MenuGetLock, MenuUnlock, MenuClean, MenuReset, MenuCleanup, MenuExport, MenuCreateRepository, MenuImport, MenuBranches, MenuTags, MenuRemotes, MenuBranchTag, MenuSwitch, MenuMerge, MenuAnnotate, MenuCreatePatch, MenuApplyPatch, MenuProperties, MenuHelp, MenuSettings, MenuAbout, MenuIgnoreByFilename, MenuIgnoreByFileExtension ] def set_paths(self, paths): self.paths = paths self.conditions.paths = paths self.callbacks.paths = paths def set_base_dir(self, base_dir): self.base_dir = base_dir self.callbacks.base_dir = base_dir self.conditions.base_dir = base_dir def get_action_group(self, action_group): return PlumaMenuBuilder(self.structure, self.conditions, self.callbacks, action_group).action_group def update_conditions(self, paths): self.conditions.generate_statuses(paths) self.conditions.generate_path_dict(paths) def update_action(self, action): action.set_property("visible", action.item.show()) class PlumaContextMenu(MenuBuilder): """ Provides a standard Gtk context menu (ie. a list of Gtk.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): return item.make_gtk3_menu_item(id_magic) def attach_submenu(self, menu_node, submenu_list): submenu = Gtk.Menu() menu_node.set_submenu(submenu) [submenu.append(item) for item in submenu_list] def top_level_menu(self, items): return items class PlumaMainContextMenu(MainContextMenu): def __init__(self, caller, vcs_client, base_dir, paths=[], conditions=None, callbacks=None): """ @param caller: The calling object @type caller: RabbitVCS extension @param vcs_client: The vcs client @type vcs_client: rabbitvcs.vcs @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.paths = paths self.base_dir = base_dir self.vcs_client = vcs_client self.conditions = conditions if self.conditions is None: self.conditions = GtkFilesContextMenuConditions(self.vcs_client, paths) self.callbacks = callbacks if self.callbacks is None: self.callbacks = MainContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, paths ) ignore_items = get_ignore_list_items(paths) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuUpdate, None), (MenuCommit, None), (MenuPush, None), (MenuRabbitVCSSvn, [ (MenuCheckout, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuRepoBrowser, None), (MenuCheckForModifications, None), (MenuSeparator, None), (MenuAdd, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuUpdateToRevision, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuEditConflicts, None), (MenuMarkResolved, None), (MenuRelocate, None), (MenuGetLock, None), (MenuUnlock, None), (MenuCleanup, None), (MenuSeparator, None), (MenuExport, None), (MenuCreateRepository, None), (MenuImport, None), (MenuSeparator, None), (MenuBranchTag, None), (MenuSwitch, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuProperties, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]), (MenuRabbitVCSGit, [ (MenuClone, None), (MenuInitializeRepository, None), (MenuSeparator, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuStage, None), (MenuUnstage, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuEditConflicts, None), (MenuClean, None), (MenuReset, None), (MenuCheckout, None), (MenuSeparator, None), (MenuBranches, None), (MenuTags, None), (MenuRemotes, None), (MenuSeparator, None), (MenuExport, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]) ] def get_menu(self): return PlumaContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/clients/pluma/rabbitvcs-pluma.plugin000066400000000000000000000003351362112712700225160ustar00rootroot00000000000000[Plugin] Loader=python Module=rabbitvcs-plugin IAge=2 Name=RabbitVCS Description=RabbitVCS plugin for Pluma Authors=Adam Plumb Copyright=Copyright © 2011 Adam Plumb Website=http://www.rabbitvcs.org rabbitvcs-0.18/clients/thunar/000077500000000000000000000000001362112712700163655ustar00rootroot00000000000000rabbitvcs-0.18/clients/thunar/README000066400000000000000000000021461362112712700172500ustar00rootroot00000000000000RabbitVCS Thunar Gtk+3 Extension This extension is meant to be used with the Thunar File Manager v1.7 or higher. As of the v1.7 release, Thunar requires Gtk+3 and allows for Python3, so this client makes sure it can work with both. Bear in mind that Thunar's extension framework still does not allow the setting of emblems so file statuses will not be overlayed like they do on Nautilus. Requirements: * thunar (>= v1.7) * thunarx-python (>= v0.5.0) * dbus-python (>= 0.80) * (all other RabbitVCS requirements) To install: Copy RabbitVCS.py to one of: 1. $XDG_DATA_HOME/thunarx-python/extensions (i.e. ~/.local) 2. thunar_prefix/share/thunarx-python/extensions (i.e. ~/Development/Thunar) 3. $XDG_DATA_DIRS/thunarx-python/extensions (i.e. /usr/share) 4. THUNARX_EXTENSION_DIR/python (i.e. /usr/lib64/thunarx-3/python) In both cases, you may need to create the python folder. Some systems like Fedora use /usr/lib64 on 64-bit systems. Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.18/clients/thunar/RabbitVCS.py000066400000000000000000000270161362112712700205240ustar00rootroot00000000000000# # This is an extension to the Thunar file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2008-2008 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Our module for everything related to the Thunar extension. """ from __future__ import with_statement from __future__ import absolute_import import copy import os.path from os.path import isdir, isfile, realpath, basename import datetime import time import threading from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import GObject, Gtk, Thunarx sa.restore() from rabbitvcs.vcs.svn import SVN import os import rabbitvcs.ui import rabbitvcs.ui.property_page from rabbitvcs.util.helper import launch_ui_window, launch_diff_tool from rabbitvcs.util.helper import get_file_extension, get_common_directory from rabbitvcs.util.helper import pretty_timedelta from rabbitvcs.util.strings import S from rabbitvcs.util.decorators import timeit, disable from rabbitvcs.util.contextmenu import MenuBuilder, MainContextMenu, SEPARATOR from rabbitvcs.util.log import Log, reload_log_settings log = Log("rabbitvcs.util.extensions.thunarx.RabbitVCS") from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.settings import SettingsManager settings = SettingsManager() import rabbitvcs.services.service from rabbitvcs.services.checkerservice import StatusCheckerStub as StatusChecker class RabbitVCS(GObject.GObject, Thunarx.MenuProvider, Thunarx.PropertyPageProvider): """ This is the main class that implements all of our awesome features. """ #: Maps statuses to emblems. #: TODO: should probably be possible to create this dynamically EMBLEMS = rabbitvcs.ui.STATUS_EMBLEMS #: A list of statuses which count as modified (for a directory) in #: TortoiseSVN emblem speak. MODIFIED_STATUSES = [ SVN.STATUS["added"], SVN.STATUS["deleted"], SVN.STATUS["replaced"], SVN.STATUS["modified"], SVN.STATUS["missing"] ] MODIFIED_TEXT_STATUSES = [ "added", "deleted", "replaced", "modified", "missing" ] #: This is our lookup table for C{NautilusVFSFile}s which we need for attaching #: emblems. This is mostly a workaround for not being able to turn a path/uri #: into a C{VFSFile}. It looks like::: #: #: VFSFile_table = { #: "/foo/bar/baz": #: #: } #: #: Keeping track of C{NautilusVFSFile}s is a little bit complicated because #: when an item is moved (renamed) C{update_file_info} doesn't get called. So #: we also add C{NautilusVFSFile}s to this table from C{get_file_items} etc. VFSFile_table = {} #: Without an actual status monitor it's not possible to just keep #: track of stuff that happens (e.g. a commit happens, files are added, #: such things). So at the moment we just add all interesting items #: to this list. monitored_files = [] #: This is in case we want to permanently enable invalidation of the status #: checker info. We put a path here before we invalidate the item, so that #: we don't enter an endless loop when updating the status. #: The callback should acquire this lock when pushing the path to this. always_invalidate = True #: When we get the statuses from the callback, but them here for further #: use. There is a possible memory problem here if we put a lot of data in #: this - even when it's removed, Python may not release the memory. I do #: not know this for sure. #: This is of the form: [("path/to", {...status dict...}), ...] paths_from_callback = [] paths_last_lookup = {} paths_lookup_timeout = 30 #: It appears that the "update_file_info" call that is triggered by the #: "invalidate_extension_info" in the callback function happens #: synchronously (ie. in the same thread). However, given the nature of the #: python/nautilus extensions module, I'm not sure how reliable this is. #: It's certainly supported by debugging statements, but maybe it will #: change in the future? Who knows. This should work for both the current #: situation, and the possibility that they are asynchronous. callback_paths_lock = threading.RLock() #: A list of statuses that we want to keep track of for when a process #: might have done something. STATUSES_TO_MONITOR = copy.copy(MODIFIED_TEXT_STATUSES) STATUSES_TO_MONITOR.extend([ "unversioned", # When doing a checkout Nautilus will notice a directory being # added and call update_file_info, but at that stage the # checkout likely hasn't completed yet and the status will be: "incomplete" ]) def __init__(self): threading.currentThread().setName("RabbitVCS extension thread") self.status_checker = StatusChecker() def get_local_path(self, item): if item.get_uri_scheme() != "file": return None return item.get_location().get_path() #~ @disable # @timeit def get_file_menu_items(self, window, items): """ Menu activated with items selected. Nautilus also calls this function when rendering submenus, even though this is not needed since the entire menu has already been returned. Note that calling C{nautilusVFSFile.invalidate_extension_info()} will also cause get_file_items to be called. @type window: NautilusNavigationWindow @param window: @type items: list of NautilusVFSFile @param items: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ paths = [] for item in items: if self.valid_uri(item.get_uri()): path = realpath(S(self.get_local_path(item))) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] return ThunarxMainContextMenu(self, window.base_dir, paths).get_menu() #~ @disable @timeit def get_folder_menu_items(self, window, item): """ Menu activated on entering a directory. Builds context menu for File menu and for window background. @type window: NautilusNavigationWindow @param window: @type item: NautilusVFSFile @param item: @rtype: list of MenuItems @return: The context menu entries to add to the menu. """ if not self.valid_uri(item.get_uri()): return path = realpath(S(self.get_local_path(item))) self.VFSFile_table[path] = item # log.debug("get_background_items() called") window.base_dir = path return ThunarxMainContextMenu(self, path, [path]).get_menu() # # Helper functions # def valid_uri(self, uri): """ Check whether or not it's a good idea to have RabbitVCS do its magic for this URI. Some examples of URI schemes: x-nautilus-desktop:/// # e.g. mounted devices on the desktop """ if not uri.startswith("file://"): return False return True # # Some methods to help with keeping emblems up-to-date # def rescan_after_process_exit(self, proc, paths): """ Rescans all of the items on our C{monitored_files} list after the process specified by C{proc} completes. Also checks the paths that were passed. TODO: the monitored_files list could grow quite large if somebody browses a lot of working copies. It probably won't affect anything (most importantly performance) all that negatively. """ def do_check(): # We'll check the paths first (these were the paths that # were originally passed along to the context menu). # # This is needed among other things for: # # - When a directory is normal and you add files inside it # for path in paths: # We're not interested in the result now, just the callback self.status_checker.check_status(path, recurse=True, invalidate=True, summary=True) self.execute_after_process_exit(proc, do_check) def execute_after_process_exit(self, proc, func=None): def is_process_still_alive(): log.debug("is_process_still_alive() for pid: %i" % proc.pid) # First we need to see if the commit process is still running retval = proc.poll() log.debug("%s" % retval) still_going = (retval is None) if not still_going and callable(func): func() return still_going # Add our callback function on a 1 second timeout GObject.timeout_add_seconds(1, is_process_still_alive) # # Some other methods # def reload_settings(self, proc): """ Used to re-load settings after the settings dialog has been closed. FIXME: This probably doesn't belong here, ideally the settings manager does this itself and make sure everything is reloaded properly after the settings dialogs saves. """ def do_reload_settings(): globals()["settings"] = SettingsManager() globals()["log"] = reload_log_settings()("rabbitvcs.util.extensions.thunar") log.debug("Re-scanning settings") self.execute_after_process_exit(proc, do_reload_settings) def get_property_pages(self, items): paths = [] for item in items: if self.valid_uri(item.get_uri()): path = realpath(S(self.get_local_path(item))) paths.append(path) self.VFSFile_table[path] = item if len(paths) == 0: return [] label = rabbitvcs.ui.property_page.PropertyPageLabel().get_widget() page = rabbitvcs.ui.property_page.PropertyPage(paths).get_widget() ppage = Thunarx.PropertyPage.new("") ppage.set_label_widget(label) ppage.add(page) return [ppage] from rabbitvcs.util.contextmenuitems import * class ThunarxContextMenu(MenuBuilder): """ Provides a standard Thunar context menu (ie. a list of "Thunarx.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): return item.make_thunarx_menu_item(id_magic) def attach_submenu(self, menu_node, submenu_list): submenu = Thunarx.Menu() menu_node.set_menu(submenu) [submenu.append_item(item) for item in submenu_list] def top_level_menu(self, items): return items class ThunarxMainContextMenu(MainContextMenu): def get_menu(self): return ThunarxContextMenu(self.structure, self.conditions, self.callbacks).menu rabbitvcs-0.18/data/000077500000000000000000000000001362112712700143345ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/000077500000000000000000000000001362112712700154475ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/000077500000000000000000000000001362112712700171065ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/16x16/000077500000000000000000000000001362112712700176735ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/16x16/actions/000077500000000000000000000000001362112712700213335ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/16x16/actions/rabbitvcs-push.png000066400000000000000000000011051362112712700247720ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAT8c?%" ,0F?ԅ|ɾB$DTIo^m?~d{ff^x} 7k޼/ 6I_n׀qJ333ךe/````arNC@ELI ';ćw^}i#,-VˏP|/'+ 'ý_n<Ġ(*͐۷9L.gPfþ/vp' |`xCSsŸ.f矊(  B\, }32^\ :axT021&W!͑ *b\·9'6I]綾_$ue6j&e66`?N PI R-IENDB`rabbitvcs-0.18/data/icons/hicolor/index.theme000066400000000000000000000533531362112712700212520ustar00rootroot00000000000000[Icon Theme] Name=Hicolor Comment=Fallback icon theme Hidden=true Directories=16x16/actions,16x16/animations,16x16/apps,16x16/categories,16x16/devices,16x16/emblems,16x16/emotes,16x16/filesystems,16x16/intl,16x16/mimetypes,16x16/places,16x16/status,16x16/stock/chart,16x16/stock/code,16x16/stock/data,16x16/stock/form,16x16/stock/image,16x16/stock/io,16x16/stock/media,16x16/stock/navigation,16x16/stock/net,16x16/stock/object,16x16/stock/table,16x16/stock/text,22x22/actions,22x22/animations,22x22/apps,22x22/categories,22x22/devices,22x22/emblems,22x22/emotes,22x22/filesystems,22x22/intl,22x22/mimetypes,22x22/places,22x22/status,22x22/stock/chart,22x22/stock/code,22x22/stock/data,22x22/stock/form,22x22/stock/image,22x22/stock/io,22x22/stock/media,22x22/stock/navigation,22x22/stock/net,22x22/stock/object,22x22/stock/table,22x22/stock/text,24x24/actions,24x24/animations,24x24/apps,24x24/categories,24x24/devices,24x24/emblems,24x24/emotes,24x24/filesystems,24x24/intl,24x24/mimetypes,24x24/places,24x24/status,24x24/stock/chart,24x24/stock/code,24x24/stock/data,24x24/stock/form,24x24/stock/image,24x24/stock/io,24x24/stock/media,24x24/stock/navigation,24x24/stock/net,24x24/stock/object,24x24/stock/table,24x24/stock/text,32x32/actions,32x32/animations,32x32/apps,32x32/categories,32x32/devices,32x32/emblems,32x32/emotes,32x32/filesystems,32x32/intl,32x32/mimetypes,32x32/places,32x32/status,32x32/stock/chart,32x32/stock/code,32x32/stock/data,32x32/stock/form,32x32/stock/image,32x32/stock/io,32x32/stock/media,32x32/stock/navigation,32x32/stock/net,32x32/stock/object,32x32/stock/table,32x32/stock/text,36x36/actions,36x36/animations,36x36/apps,36x36/categories,36x36/devices,36x36/emblems,36x36/emotes,36x36/filesystems,36x36/intl,36x36/mimetypes,36x36/places,36x36/status,36x36/stock/chart,36x36/stock/code,36x36/stock/data,36x36/stock/form,36x36/stock/image,36x36/stock/io,36x36/stock/media,36x36/stock/navigation,36x36/stock/net,36x36/stock/object,36x36/stock/table,36x36/stock/text,48x48/actions,48x48/animations,48x48/apps,48x48/categories,48x48/devices,48x48/emblems,48x48/emotes,48x48/filesystems,48x48/intl,48x48/mimetypes,48x48/places,48x48/status,48x48/stock/chart,48x48/stock/code,48x48/stock/data,48x48/stock/form,48x48/stock/image,48x48/stock/io,48x48/stock/media,48x48/stock/navigation,48x48/stock/net,48x48/stock/object,48x48/stock/table,48x48/stock/text,64x64/actions,64x64/animations,64x64/apps,64x64/categories,64x64/devices,64x64/emblems,64x64/emotes,64x64/filesystems,64x64/intl,64x64/mimetypes,64x64/places,64x64/status,64x64/stock/chart,64x64/stock/code,64x64/stock/data,64x64/stock/form,64x64/stock/image,64x64/stock/io,64x64/stock/media,64x64/stock/navigation,64x64/stock/net,64x64/stock/object,64x64/stock/table,64x64/stock/text,72x72/actions,72x72/animations,72x72/apps,72x72/categories,72x72/devices,72x72/emblems,72x72/emotes,72x72/filesystems,72x72/intl,72x72/mimetypes,72x72/places,72x72/status,72x72/stock/chart,72x72/stock/code,72x72/stock/data,72x72/stock/form,72x72/stock/image,72x72/stock/io,72x72/stock/media,72x72/stock/navigation,72x72/stock/net,72x72/stock/object,72x72/stock/table,72x72/stock/text,96x96/actions,96x96/animations,96x96/apps,96x96/categories,96x96/devices,96x96/emblems,96x96/emotes,96x96/filesystems,96x96/intl,96x96/mimetypes,96x96/places,96x96/status,96x96/stock/chart,96x96/stock/code,96x96/stock/data,96x96/stock/form,96x96/stock/image,96x96/stock/io,96x96/stock/media,96x96/stock/navigation,96x96/stock/net,96x96/stock/object,96x96/stock/table,96x96/stock/text,128x128/actions,128x128/animations,128x128/apps,128x128/categories,128x128/devices,128x128/emblems,128x128/emotes,128x128/filesystems,128x128/intl,128x128/mimetypes,128x128/places,128x128/status,128x128/stock/chart,128x128/stock/code,128x128/stock/data,128x128/stock/form,128x128/stock/image,128x128/stock/io,128x128/stock/media,128x128/stock/navigation,128x128/stock/net,128x128/stock/object,128x128/stock/table,128x128/stock/text,192x192/actions,192x192/animations,192x192/apps,192x192/categories,192x192/devices,192x192/emblems,192x192/emotes,192x192/filesystems,192x192/intl,192x192/mimetypes,192x192/places,192x192/status,192x192/stock/chart,192x192/stock/code,192x192/stock/data,192x192/stock/form,192x192/stock/image,192x192/stock/io,192x192/stock/media,192x192/stock/navigation,192x192/stock/net,192x192/stock/object,192x192/stock/table,192x192/stock/text,scalable/actions,scalable/animations,scalable/apps,scalable/categories,scalable/devices,scalable/emblems,scalable/emotes,scalable/filesystems,scalable/intl,scalable/mimetypes,scalable/places,scalable/status,scalable/stock/chart,scalable/stock/code,scalable/stock/data,scalable/stock/form,scalable/stock/image,scalable/stock/io,scalable/stock/media,scalable/stock/navigation,scalable/stock/net,scalable/stock/object,scalable/stock/table,scalable/stock/text [16x16/actions] Size=16 Context=Actions Type=Threshold [16x16/animations] Size=16 Context=Animations Type=Threshold [16x16/apps] Size=16 Context=Applications Type=Threshold [16x16/categories] Size=16 Context=Categories Type=Threshold [16x16/devices] Size=16 Context=Devices Type=Threshold [16x16/emblems] Size=16 Context=Emblems Type=Threshold [16x16/emotes] Size=16 Context=Emotes Type=Threshold [16x16/filesystems] Size=16 Context=FileSystems Type=Threshold [16x16/intl] Size=16 Context=International Type=Threshold [16x16/mimetypes] Size=16 Context=MimeTypes Type=Threshold [16x16/places] Size=16 Context=Places Type=Threshold [16x16/status] Size=16 Context=Status Type=Threshold [16x16/stock/chart] Size=16 Context=Stock Type=Threshold [16x16/stock/code] Size=16 Context=Stock Type=Threshold [16x16/stock/data] Size=16 Context=Stock Type=Threshold [16x16/stock/form] Size=16 Context=Stock Type=Threshold [16x16/stock/image] Size=16 Context=Stock Type=Threshold [16x16/stock/io] Size=16 Context=Stock Type=Threshold [16x16/stock/media] Size=16 Context=Stock Type=Threshold [16x16/stock/navigation] Size=16 Context=Stock Type=Threshold [16x16/stock/net] Size=16 Context=Stock Type=Threshold [16x16/stock/object] Size=16 Context=Stock Type=Threshold [16x16/stock/table] Size=16 Context=Stock Type=Threshold [16x16/stock/text] Size=16 Context=Stock Type=Threshold [22x22/actions] Size=22 Context=Actions Type=Threshold [22x22/animations] Size=22 Context=Animations Type=Threshold [22x22/apps] Size=22 Context=Applications Type=Fixed [22x22/categories] Size=22 Context=Categories Type=Threshold [22x22/devices] Size=22 Context=Devices Type=Threshold [22x22/emblems] Size=22 Context=Emblems Type=Threshold [22x22/emotes] Size=22 Context=Emotes Type=Threshold [22x22/filesystems] Size=22 Context=FileSystems Type=Threshold [22x22/intl] Size=22 Context=International Type=Threshold [22x22/mimetypes] Size=22 Context=MimeTypes Type=Threshold [22x22/places] Size=22 Context=Places Type=Threshold [22x22/status] Size=22 Context=Status Type=Threshold [22x22/stock/chart] Size=22 Context=Stock Type=Threshold [22x22/stock/code] Size=22 Context=Stock Type=Threshold [22x22/stock/data] Size=22 Context=Stock Type=Threshold [22x22/stock/form] Size=22 Context=Stock Type=Threshold [22x22/stock/image] Size=22 Context=Stock Type=Threshold [22x22/stock/io] Size=22 Context=Stock Type=Threshold [22x22/stock/media] Size=22 Context=Stock Type=Threshold [22x22/stock/navigation] Size=22 Context=Stock Type=Threshold [22x22/stock/net] Size=22 Context=Stock Type=Threshold [22x22/stock/object] Size=22 Context=Stock Type=Threshold [22x22/stock/table] Size=22 Context=Stock Type=Threshold [22x22/stock/text] Size=22 Context=Stock Type=Threshold [24x24/actions] Size=24 Context=Actions Type=Threshold [24x24/animations] Size=24 Context=Animations Type=Threshold [24x24/apps] Size=24 Context=Applications Type=Threshold [24x24/categories] Size=24 Context=Categories Type=Threshold [24x24/devices] Size=24 Context=Devices Type=Threshold [24x24/emblems] Size=24 Context=Emblems Type=Threshold [24x24/emotes] Size=24 Context=Emotes Type=Threshold [24x24/filesystems] Size=24 Context=FileSystems Type=Threshold [24x24/intl] Size=24 Context=International Type=Threshold [24x24/mimetypes] Size=24 Context=MimeTypes Type=Threshold [24x24/places] Size=24 Context=Places Type=Threshold [24x24/status] Size=24 Context=Status Type=Threshold [24x24/stock/chart] Size=24 Context=Stock Type=Threshold [24x24/stock/code] Size=24 Context=Stock Type=Threshold [24x24/stock/data] Size=24 Context=Stock Type=Threshold [24x24/stock/form] Size=24 Context=Stock Type=Threshold [24x24/stock/image] Size=24 Context=Stock Type=Threshold [24x24/stock/io] Size=24 Context=Stock Type=Threshold [24x24/stock/media] Size=24 Context=Stock Type=Threshold [24x24/stock/navigation] Size=24 Context=Stock Type=Threshold [24x24/stock/net] Size=24 Context=Stock Type=Threshold [24x24/stock/object] Size=24 Context=Stock Type=Threshold [24x24/stock/table] Size=24 Context=Stock Type=Threshold [24x24/stock/text] Size=24 Context=Stock Type=Threshold [32x32/actions] Size=32 Context=Actions Type=Threshold [32x32/animations] Size=32 Context=Animations Type=Threshold [32x32/apps] Size=32 Context=Applications Type=Threshold [32x32/categories] Size=32 Context=Categories Type=Threshold [32x32/devices] Size=32 Context=Devices Type=Threshold [32x32/emblems] Size=32 Context=Emblems Type=Threshold [32x32/emotes] Size=32 Context=Emotes Type=Threshold [32x32/filesystems] Size=32 Context=FileSystems Type=Threshold [32x32/intl] Size=32 Context=International Type=Threshold [32x32/mimetypes] Size=32 Context=MimeTypes Type=Threshold [32x32/places] Size=32 Context=Places Type=Threshold [32x32/status] Size=32 Context=Status Type=Threshold [32x32/stock/chart] Size=32 Context=Stock Type=Threshold [32x32/stock/code] Size=32 Context=Stock Type=Threshold [32x32/stock/data] Size=32 Context=Stock Type=Threshold [32x32/stock/form] Size=32 Context=Stock Type=Threshold [32x32/stock/image] Size=32 Context=Stock Type=Threshold [32x32/stock/io] Size=32 Context=Stock Type=Threshold [32x32/stock/media] Size=32 Context=Stock Type=Threshold [32x32/stock/navigation] Size=32 Context=Stock Type=Threshold [32x32/stock/net] Size=32 Context=Stock Type=Threshold [32x32/stock/object] Size=32 Context=Stock Type=Threshold [32x32/stock/table] Size=32 Context=Stock Type=Threshold [32x32/stock/text] Size=32 Context=Stock Type=Threshold [36x36/actions] Size=36 Context=Actions Type=Threshold [36x36/animations] Size=36 Context=Animations Type=Threshold [36x36/apps] Size=36 Context=Applications Type=Threshold [36x36/categories] Size=36 Context=Categories Type=Threshold [36x36/devices] Size=36 Context=Devices Type=Threshold [36x36/emblems] Size=36 Context=Emblems Type=Threshold [36x36/emotes] Size=36 Context=Emotes Type=Threshold [36x36/filesystems] Size=36 Context=FileSystems Type=Threshold [36x36/intl] Size=36 Context=International Type=Threshold [36x36/mimetypes] Size=36 Context=MimeTypes Type=Threshold [36x36/places] Size=36 Context=Places Type=Threshold [36x36/status] Size=36 Context=Status Type=Threshold [36x36/stock/chart] Size=36 Context=Stock Type=Threshold [36x36/stock/code] Size=36 Context=Stock Type=Threshold [36x36/stock/data] Size=36 Context=Stock Type=Threshold [36x36/stock/form] Size=36 Context=Stock Type=Threshold [36x36/stock/image] Size=36 Context=Stock Type=Threshold [36x36/stock/io] Size=36 Context=Stock Type=Threshold [36x36/stock/media] Size=36 Context=Stock Type=Threshold [36x36/stock/navigation] Size=36 Context=Stock Type=Threshold [36x36/stock/net] Size=36 Context=Stock Type=Threshold [36x36/stock/object] Size=36 Context=Stock Type=Threshold [36x36/stock/table] Size=36 Context=Stock Type=Threshold [36x36/stock/text] Size=36 Context=Stock Type=Threshold [48x48/actions] Size=48 Context=Actions Type=Threshold [48x48/animations] Size=48 Context=Animations Type=Threshold [48x48/apps] Size=48 Context=Applications Type=Threshold [48x48/categories] Size=48 Context=Categories Type=Threshold [48x48/devices] Size=48 Context=Devices Type=Threshold [48x48/emblems] Size=48 Context=Emblems Type=Threshold [48x48/emotes] Size=48 Context=Emotes Type=Threshold [48x48/filesystems] Size=48 Context=FileSystems Type=Threshold [48x48/intl] Size=48 Context=International Type=Threshold [48x48/mimetypes] Size=48 Context=MimeTypes Type=Threshold [48x48/places] Size=48 Context=Places Type=Threshold [48x48/status] Size=48 Context=Status Type=Threshold [48x48/stock/chart] Size=48 Context=Stock Type=Threshold [48x48/stock/code] Size=48 Context=Stock Type=Threshold [48x48/stock/data] Size=48 Context=Stock Type=Threshold [48x48/stock/form] Size=48 Context=Stock Type=Threshold [48x48/stock/image] Size=48 Context=Stock Type=Threshold [48x48/stock/io] Size=48 Context=Stock Type=Threshold [48x48/stock/media] Size=48 Context=Stock Type=Threshold [48x48/stock/navigation] Size=48 Context=Stock Type=Threshold [48x48/stock/net] Size=48 Context=Stock Type=Threshold [48x48/stock/object] Size=48 Context=Stock Type=Threshold [48x48/stock/table] Size=48 Context=Stock Type=Threshold [48x48/stock/text] Size=48 Context=Stock Type=Threshold [64x64/actions] Size=64 Context=Actions Type=Threshold [64x64/animations] Size=64 Context=Animations Type=Threshold [64x64/apps] Size=64 Context=Applications Type=Threshold [64x64/categories] Size=64 Context=Categories Type=Threshold [64x64/devices] Size=64 Context=Devices Type=Threshold [64x64/emblems] Size=64 Context=Emblems Type=Threshold [64x64/emotes] Size=64 Context=Emotes Type=Threshold [64x64/filesystems] Size=64 Context=FileSystems Type=Threshold [64x64/intl] Size=64 Context=International Type=Threshold [64x64/mimetypes] Size=64 Context=MimeTypes Type=Threshold [64x64/places] Size=64 Context=Places Type=Threshold [64x64/status] Size=64 Context=Status Type=Threshold [64x64/stock/chart] Size=64 Context=Stock Type=Threshold [64x64/stock/code] Size=64 Context=Stock Type=Threshold [64x64/stock/data] Size=64 Context=Stock Type=Threshold [64x64/stock/form] Size=64 Context=Stock Type=Threshold [64x64/stock/image] Size=64 Context=Stock Type=Threshold [64x64/stock/io] Size=64 Context=Stock Type=Threshold [64x64/stock/media] Size=64 Context=Stock Type=Threshold [64x64/stock/navigation] Size=64 Context=Stock Type=Threshold [64x64/stock/net] Size=64 Context=Stock Type=Threshold [64x64/stock/object] Size=64 Context=Stock Type=Threshold [64x64/stock/table] Size=64 Context=Stock Type=Threshold [64x64/stock/text] Size=64 Context=Stock Type=Threshold [72x72/actions] Size=72 Context=Actions Type=Threshold [72x72/animations] Size=72 Context=Animations Type=Threshold [72x72/apps] Size=72 Context=Applications Type=Threshold [72x72/categories] Size=72 Context=Categories Type=Threshold [72x72/devices] Size=72 Context=Devices Type=Threshold [72x72/emblems] Size=72 Context=Emblems Type=Threshold [72x72/emotes] Size=72 Context=Emotes Type=Threshold [72x72/filesystems] Size=72 Context=FileSystems Type=Threshold [72x72/intl] Size=72 Context=International Type=Threshold [72x72/mimetypes] Size=72 Context=MimeTypes Type=Threshold [72x72/places] Size=72 Context=Places Type=Threshold [72x72/status] Size=72 Context=Status Type=Threshold [72x72/stock/chart] Size=72 Context=Stock Type=Threshold [72x72/stock/code] Size=72 Context=Stock Type=Threshold [72x72/stock/data] Size=72 Context=Stock Type=Threshold [72x72/stock/form] Size=72 Context=Stock Type=Threshold [72x72/stock/image] Size=72 Context=Stock Type=Threshold [72x72/stock/io] Size=72 Context=Stock Type=Threshold [72x72/stock/media] Size=72 Context=Stock Type=Threshold [72x72/stock/navigation] Size=72 Context=Stock Type=Threshold [72x72/stock/net] Size=72 Context=Stock Type=Threshold [72x72/stock/object] Size=72 Context=Stock Type=Threshold [72x72/stock/table] Size=72 Context=Stock Type=Threshold [72x72/stock/text] Size=72 Context=Stock Type=Threshold [96x96/actions] Size=96 Context=Actions Type=Threshold [96x96/animations] Size=96 Context=Animations Type=Threshold [96x96/apps] Size=96 Context=Applications Type=Threshold [96x96/categories] Size=96 Context=Categories Type=Threshold [96x96/devices] Size=96 Context=Devices Type=Threshold [96x96/emblems] Size=96 Context=Emblems Type=Threshold [96x96/emotes] Size=96 Context=Emotes Type=Threshold [96x96/filesystems] Size=96 Context=FileSystems Type=Threshold [96x96/intl] Size=96 Context=International Type=Threshold [96x96/mimetypes] Size=96 Context=MimeTypes Type=Threshold [96x96/places] Size=96 Context=Places Type=Threshold [96x96/status] Size=96 Context=Status Type=Threshold [96x96/stock/chart] Size=96 Context=Stock Type=Threshold [96x96/stock/code] Size=96 Context=Stock Type=Threshold [96x96/stock/data] Size=96 Context=Stock Type=Threshold [96x96/stock/form] Size=96 Context=Stock Type=Threshold [96x96/stock/image] Size=96 Context=Stock Type=Threshold [96x96/stock/io] Size=96 Context=Stock Type=Threshold [96x96/stock/media] Size=96 Context=Stock Type=Threshold [96x96/stock/navigation] Size=96 Context=Stock Type=Threshold [96x96/stock/net] Size=96 Context=Stock Type=Threshold [96x96/stock/object] Size=96 Context=Stock Type=Threshold [96x96/stock/table] Size=96 Context=Stock Type=Threshold [96x96/stock/text] Size=96 Context=Stock Type=Threshold [128x128/actions] Size=128 Context=Actions Type=Threshold [128x128/animations] Size=128 Context=Animations Type=Threshold [128x128/apps] Size=128 Context=Applications Type=Threshold [128x128/categories] Size=128 Context=Categories Type=Threshold [128x128/devices] Size=128 Context=Devices Type=Threshold [128x128/emblems] Size=128 Context=Emblems Type=Threshold [128x128/emotes] Size=128 Context=Emotes Type=Threshold [128x128/filesystems] Size=128 Context=FileSystems Type=Threshold [128x128/intl] Size=128 Context=International Type=Threshold [128x128/mimetypes] Size=128 Context=MimeTypes Type=Threshold [128x128/places] Size=128 Context=Places Type=Threshold [128x128/status] Size=128 Context=Status Type=Threshold [128x128/stock/chart] Size=128 Context=Stock Type=Threshold [128x128/stock/code] Size=128 Context=Stock Type=Threshold [128x128/stock/data] Size=128 Context=Stock Type=Threshold [128x128/stock/form] Size=128 Context=Stock Type=Threshold [128x128/stock/image] Size=128 Context=Stock Type=Threshold [128x128/stock/io] Size=128 Context=Stock Type=Threshold [128x128/stock/media] Size=128 Context=Stock Type=Threshold [128x128/stock/navigation] Size=128 Context=Stock Type=Threshold [128x128/stock/net] Size=128 Context=Stock Type=Threshold [128x128/stock/object] Size=128 Context=Stock Type=Threshold [128x128/stock/table] Size=128 Context=Stock Type=Threshold [128x128/stock/text] Size=128 Context=Stock Type=Threshold [192x192/actions] Size=192 Context=Actions Type=Threshold [192x192/animations] Size=192 Context=Animations Type=Threshold [192x192/apps] Size=192 Context=Applications Type=Threshold [192x192/categories] Size=192 Context=Categories Type=Threshold [192x192/devices] Size=192 Context=Devices Type=Threshold [192x192/emblems] Size=192 Context=Emblems Type=Threshold [192x192/emotes] Size=192 Context=Emotes Type=Threshold [192x192/filesystems] Size=192 Context=FileSystems Type=Threshold [192x192/intl] Size=192 Context=International Type=Threshold [192x192/mimetypes] Size=192 Context=MimeTypes Type=Threshold [192x192/places] Size=192 Context=Places Type=Threshold [192x192/status] Size=192 Context=Status Type=Threshold [192x192/stock/chart] Size=192 Context=Stock Type=Threshold [192x192/stock/code] Size=192 Context=Stock Type=Threshold [192x192/stock/data] Size=192 Context=Stock Type=Threshold [192x192/stock/form] Size=192 Context=Stock Type=Threshold [192x192/stock/image] Size=192 Context=Stock Type=Threshold [192x192/stock/io] Size=192 Context=Stock Type=Threshold [192x192/stock/media] Size=192 Context=Stock Type=Threshold [192x192/stock/navigation] Size=192 Context=Stock Type=Threshold [192x192/stock/net] Size=192 Context=Stock Type=Threshold [192x192/stock/object] Size=192 Context=Stock Type=Threshold [192x192/stock/table] Size=192 Context=Stock Type=Threshold [192x192/stock/text] Size=192 Context=Stock Type=Threshold [scalable/actions] MinSize=1 Size=128 MaxSize=256 Context=Actions Type=Scalable [scalable/animations] MinSize=1 Size=128 MaxSize=256 Context=Animations Type=Scalable [scalable/apps] MinSize=1 Size=128 MaxSize=256 Context=Applications Type=Scalable [scalable/categories] MinSize=1 Size=128 MaxSize=256 Context=Categories Type=Scalable [scalable/devices] MinSize=1 Size=128 MaxSize=256 Context=Devices Type=Scalable [scalable/emblems] MinSize=1 Size=128 MaxSize=256 Context=Emblems Type=Scalable [scalable/emotes] MinSize=1 Size=128 MaxSize=256 Context=Emotes Type=Scalable [scalable/filesystems] MinSize=1 Size=128 MaxSize=256 Context=FileSystems Type=Scalable [scalable/intl] MinSize=1 Size=128 MaxSize=256 Context=International Type=Scalable [scalable/mimetypes] MinSize=1 Size=128 MaxSize=256 Context=MimeTypes Type=Scalable [scalable/places] MinSize=1 Size=128 MaxSize=256 Context=Places Type=Scalable [scalable/status] MinSize=1 Size=128 MaxSize=256 Context=Status Type=Scalable [scalable/stock/chart] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/code] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/data] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/form] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/image] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/io] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/media] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/navigation] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/net] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/object] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/table] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable [scalable/stock/text] MinSize=1 Size=128 MaxSize=256 Context=Stock Type=Scalable rabbitvcs-0.18/data/icons/hicolor/scalable/000077500000000000000000000000001362112712700206545ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/scalable/actions/000077500000000000000000000000001362112712700223145ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-about.svg000066400000000000000000000323261362112712700261320ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-add.svg000066400000000000000000000346361362112712700255560ustar00rootroot00000000000000 image/svg+xml Add 2006-01-04 Andreas Nilsson http://tango-project.org add plus rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-annotate.svg000066400000000000000000000371111362112712700266260ustar00rootroot00000000000000 image/svg+xml System-log-out 2007-08-27 Lapo Calamandrei Kalle Persson logout exit man sign running rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-applypatch.svg000066400000000000000000000255171362112712700271710ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-asynchronous.svg000066400000000000000000000777021362112712700275620ustar00rootroot00000000000000 image/svg+xml Send and Receive Mail Jakub Steiner Andreas Nilsson, Garrett LeSage mail e-mail send receive rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-branch.svg000066400000000000000000000264321362112712700262560ustar00rootroot00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-bug.svg000066400000000000000000000370061362112712700255750ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-cancel.svg000066400000000000000000000243011362112712700262370ustar00rootroot00000000000000 image/svg+xml Cancel 2005-10-16 Andreas Nilsson Cancel Jakub Steiner rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-changes.svg000066400000000000000000000245261362112712700264330ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-checkmods.svg000066400000000000000000001105471362112712700267620ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Call Start receiver phone call start answer rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-checkout.svg000066400000000000000000001024311362112712700266200ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-cleanup.svg000066400000000000000000000400571362112712700264470ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-clear.svg000066400000000000000000000400571362112712700261060ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-commit.svg000066400000000000000000000212251362112712700263040ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-compare.svg000066400000000000000000000432661362112712700264530ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-createpatch.svg000066400000000000000000000162001362112712700272740ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-dbus.svg000066400000000000000000000267161362112712700257630ustar00rootroot00000000000000 image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-delete.svg000066400000000000000000001326551362112712700262700ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Trashbin 2006-04-19 delete remove trashbin trashcan rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-diff.svg000066400000000000000000001050241362112712700257240ustar00rootroot00000000000000 image/svg+xml Edit Find edit find locate search Steven Garrity Jakub Steiner rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-drive.svg000066400000000000000000000564751362112712700261440ustar00rootroot00000000000000 image/svg+xml Drive - Hard Disk Jakub Steiner hdd hard drive fixed media solid http://jimmac.musichall.cz rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-editconflicts.svg000066400000000000000000000401341362112712700276460ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Paste edit paste rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-editprops.svg000066400000000000000000000565331362112712700270370ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Properties edit properties rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-emblems.svg000066400000000000000000003557161362112712700264570ustar00rootroot00000000000000 image/svg+xml Photos 2006-06-11 Lapo Calamandrei rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-export.svg000066400000000000000000000563541362112712700263500ustar00rootroot00000000000000 image/svg+xml Folder Drag Accept Jakub Steiner http://jimmac.musichall.cz/ folder directory storage drag accept rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-help.svg000066400000000000000000000317131362112712700257470ustar00rootroot00000000000000 image/svg+xml Help Browser 2005-11-06 Tuomas Kuosmanen help browser documentation docs man info Jakub Steiner, Andreas Nilsson http://tigert.com rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-import.svg000066400000000000000000001330331362112712700263270ustar00rootroot00000000000000 image/svg+xml Jakub Steiner, Lapo Calamandrei Drive Harddisk hdd drive hard fixed media rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-lock.svg000066400000000000000000000507461362112712700257560ustar00rootroot00000000000000 image/svg+xml Lock Screen Jakub Steiner video display lock screen password session screensaver http://jimmac.musichall.cz/ rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-merge.svg000066400000000000000000000432661362112712700261240ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-monkey.svg000066400000000000000000000577461362112712700263370ustar00rootroot00000000000000 image/svg+xml face-monkey Ulisse Perusin based on the work of someone who didn't fill the metadata... emotes monkey rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-no.svg000066400000000000000000000157661362112712700254450ustar00rootroot00000000000000 image/svg+xml No 2005-10-16 Andreas Nilsson No Jakub Steiner rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-ok.svg000066400000000000000000000232501362112712700254250ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz OK ok Ricardo 'Rick' González rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-properties.svg000066400000000000000000000614211362112712700272120ustar00rootroot00000000000000 image/svg+xml Document Properties document settings preferences properties tweak Jakub Steiner http://jimmac.musichall.cz rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-refresh.svg000066400000000000000000000423101362112712700264500ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz View Refresh reload refresh view Ricardo 'Rick' González rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-relocate.svg000066400000000000000000000220211362112712700266050ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-rename.svg000066400000000000000000000315051362112712700262650ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Text Editor rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-reset.svg000066400000000000000000000752441362112712700261500ustar00rootroot00000000000000 image/svg+xml Document Revert document revert Lapo Calamandrei 2007-02-15 rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-resolve.svg000066400000000000000000000400571362112712700264770ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-revert.svg000066400000000000000000000214311362112712700263220ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-run.svg000066400000000000000000001073761362112712700256340ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei System Run run launch exec rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-settings.svg000066400000000000000000000650041362112712700266570ustar00rootroot00000000000000 image/svg+xml System Preferences Andreas Nilsson category system preferences settings control center Jakub Steiner Ulisse Perusin image/svg+xml Preferences Andreas Nilsson Lapo Calamandrei, Ulisse Perusin, Jakub Steiner category system preferences settings control center rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-show_log.svg000066400000000000000000000762411362112712700266450ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Log Viewer log viewer inspect system utility 3 set 2006 rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-stop.svg000066400000000000000000000274071362112712700260110ustar00rootroot00000000000000 image/svg+xml Stop 2005-10-16 Andreas Nilsson stop halt error Jakub Steiner rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-switch.svg000066400000000000000000000176331362112712700263250ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Jump go jump seek arrow pointer rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-unlock.svg000066400000000000000000000746051362112712700263210ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Ulisse Perusin Keys keys key password authentication rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-unstage.svg000066400000000000000000000203311362112712700264570ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-update.svg000066400000000000000000000217401362112712700263000ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.18/data/icons/hicolor/scalable/actions/rabbitvcs-yes.svg000066400000000000000000000172651362112712700256250ustar00rootroot00000000000000 image/svg+xml Yes 2005-10-16 Andreas Nilsson Yes Jakub Steiner rabbitvcs-0.18/data/icons/hicolor/scalable/apps/000077500000000000000000000000001362112712700216175ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/scalable/apps/rabbitvcs-small.svg000066400000000000000000000215201362112712700254250ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/apps/rabbitvcs.svg000066400000000000000000000307631362112712700243300ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/000077500000000000000000000000001362112712700223005ustar00rootroot00000000000000rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/README000066400000000000000000000004601362112712700231600ustar00rootroot00000000000000TortoiseSVN - SVG emblems/overlays Licensed under: GPL v2 or later Except: emblem-rabbitvcs-calculating.svg: (C) 2009 Bruce van der Kooij emblem-rabbitvcs-error.svg: (C) 2009 Jason Heeris Licensed under: GPL v2 or later rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-added.svg000066400000000000000000000061151362112712700273010ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-calculating.svg000066400000000000000000000374731362112712700305410ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Clock clock time date rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-complicated.svg000066400000000000000000000101741362112712700305240ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-conflicted.svg000066400000000000000000000101741362112712700303520ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-deleted.svg000066400000000000000000000066321362112712700276520ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-error.svg000066400000000000000000000212531362112712700273710ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-ignored.svg000066400000000000000000000072151362112712700276710ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-locked.svg000066400000000000000000000325511362112712700275040ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-modified.svg000066400000000000000000000076141362112712700300250ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-normal.svg000066400000000000000000000070361362112712700275330ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-obstructed.svg000066400000000000000000000101741362112712700304160ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-read_only.svg000066400000000000000000000070251362112712700302150ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-unversioned.svg000066400000000000000000000165661362112712700306140ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.18/extension/000077500000000000000000000000001362112712700154375ustar00rootroot00000000000000rabbitvcs-0.18/extension/RabbitVCS.py000077700000000000000000000000001362112712700254342../clients/nautilus/RabbitVCS.pyustar00rootroot00000000000000rabbitvcs-0.18/locale/000077500000000000000000000000001362112712700146625ustar00rootroot00000000000000rabbitvcs-0.18/locale/ca/000077500000000000000000000000001362112712700152455ustar00rootroot00000000000000rabbitvcs-0.18/locale/ca/LC_MESSAGES/000077500000000000000000000000001362112712700170325ustar00rootroot00000000000000rabbitvcs-0.18/locale/ca/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000030051362112712700211440ustar00rootroot00000000000000L  !&-6Tn #   $2';c~$    AuthorBranch/tagCompletedCompleted Branch/tagCompleted RenameCompleted UpdateDateEnglishLineRenameRevisionRunning Branch/tag Command...Running Rename Command...Select a programThe new name field is requiredUpdate To RevisionUpdating...You must supply a destination path.Project-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-01-27 10:44-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Catalan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-11-26 14:08+0000 X-Generator: Launchpad (build Unknown) AutorBranca/tagS'ha acabatS'ha acabat la branca/tagS'ha canviat el nomS'ha acabat l'actualitzacióDataAnglèsLíniaCanvia el nomRevisióS'està executant la comanda branca/tagS'està canviant el nom...Seleccioneu un programaEl nou nom és necessariActualitza a la revisióS'està actualitzant...Heu d'especificar un camí de destírabbitvcs-0.18/locale/cs/000077500000000000000000000000001362112712700152675ustar00rootroot00000000000000rabbitvcs-0.18/locale/cs/LC_MESSAGES/000077500000000000000000000000001362112712700170545ustar00rootroot00000000000000rabbitvcs-0.18/locale/cs/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000221221362112712700211670ustar00rootroot00000000000000    *AScH~-   &4 GU e q?{65"(K"Z}     '/&6 ] gu   #1 9F MY b n |     !(,5=DMT \f{       )08G P \h oy  4? Ucs  -$)*Ny  #) 0 :DH] 4F b o } >-4bu   30*P{       +5Ke nx  3>DJ Q^e w     "&.?DINU e p{   #   * . 5 C L V f m s       ! ! '! 4!?!&]!!!!! !!"" +"9"J" Z" e" r" """ """" """(#"G#j#n# r#}# # ###### ##$ $ $!$5$9$fa^2xto<FRWEJ1DH3%Z/`gjh-@ {7P'|~n+K=;9C*I6m,Y.)"i>:SceAz_( wO 0QdBVyUk 8vM?#[&Tb }G$p4LrulN \!q5Xs]%s - Finished(no author)Add MessageCommit to:Files to lockFrom URLLinksOptionsPrevious MessagesProperties for:RepositoryRevisionVersion InformationAre you sure you want to delete %item%?RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAnnotate - %sAnnotate a fileAnnotate...AnnotatedAre you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse toBrowse...BugsCancelledCannot annotate a directoryChangedCheck CertificateCheck out a working copyCleaning Up...CleanupCommitCommit modifications to the repositoryCompletedCompleted AddCompleted Branch/tagCompleted CleanupCompleted RelocateCompleted RenameCompleted UpdateConfirmationDBusDateDebugDebug RevertDeleteDelete ConfirmationDenyEdit...Empty MessageEnglishExit ServiceExportExport - %sExternalFailed LockFailed UnlockFingerprint:FinishedFound %d item(s)From:GeneralGenerating Annotation...HEADHelpHost:ImportImport - %sInvalidateIssuer:Language:Limit:LineLoading...LockedLogLog - %sLoggingLogin:Merge...MergedMessageMime TypeMinimum level to logMissingModifiedN/ANameNew Name:New...OpenOpen ShellPassword:PathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty:RabbitVCSRealm:RefreshRefresh StatusRelocateRelocate...Remove LockRenameRename...ReplacedRepository paths clearedRepository successfully createdRestoreRevisionRunning Branch/tag Command...Running Relocate Command...Running Rename Command...Save AuthenticationSaved DataSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow logSkippedStart/Restart ServiceSwitchSwitch...Test AsynchronicityTextText StatusThanks:The from and to url fields are both required.The from revision field is required.The from revision field must be an integerThe new name field is requiredTo:Type:URL/Path:URL:UnknownUnlockedUpdateUpdate To RevisionUpdate a working copyUpdate to revision...UpdatedUpdating...Valid:ValueValue:View DiffView helpYesthe selected item(s)Project-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-03-04 14:35-0500 PO-Revision-Date: 2009-03-27 10:34+0000 Last-Translator: Ladislav Prskavec Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-09-24 13:44+0000 X-Generator: Launchpad (build Unknown) %s - Dokončeno(autor neznámý)Přidat zprávuCommit do:Soubory k uzamknutíZ URLOdkazyVolbyPředchozí zprávyVlastnosti pro:RepozitoryRevizeInformace o verziOpravdu chcete smazat %item%?RabbitVCSPřijmout natrvaloPřijmout jednouAkcePřidatPřidat emblemPřidat emblemPřídat na ignore listAnotace - %sAnotace souboruAnotace...AnotovánoOpravdu chcete vymazat vaše autentikační údaje?Opravdu chcete vymazat zprávy?Opravdu chcete vymazat cesty k repozitory?Opravdu chcete pokračovat?AuthentikaceAutentikační údaje vymazány.AutorAutoři:Branch/tagBranch/tagProcházetProcházet...BugyZrušenoNemohu anotovat adresářZměněnoKontrola certifikátuCheck out pracovní kopieČistímVyčistitCommitCommit změn do repozitoryDokončenoPřidání dokončenoBranch/tag dokončen.Čištění dokončenoPřesunutí dokončenoPřejmenování dokončeno.Aktualizace dokončena.PotvrzeníDBus:DatumDebug:Debug RevertSmazatSmazat potvrzeníZakázanéUpravit...Prázdná zprávaAnglickyExit ServiceExportExportovat - %sExterníZámek selhalOdemčení selhaloFingerprint:DokončenoNašel %d položekOd:ObecnéGeneruji anotaciHEADHelpHostImportImportovat - %sNevalidníVydavatel:Jazyk:Limit:ŘádekNahrávám...ZamčenoLogLog - %sLogováníJméno:Merge...SpojenoZprávaMime TypeMinimální úroveň pro logováníChybějícíModifikovánoN/AJménoNové jméno:Nový...OtevřítOtevřít shellHeslo:CestaPředchozí zprávyZprávy vymazány.VlastnostiVlastnosti - %sVlastnostVlastnost:RabbitVCSRealmObnovitObnovit statusPřesunutíRelocate...Odstranit zámekPřejmenovatPřejmenovatPřepsánoCesty k repozitory vymazány.Repozitory bylo úspěšně vytvořenoObnovitRevizeSpuštím příkaz branch/tagSpouštím příkaz PřesunutíSpouštím příkaz PřejmenovatUložit autentikaciUložená dataVybrat / zrušit všeZvolit souborZvolit adresářVyberte programNastaveníZobrazit logZobrazit logPřeskočenoStart/Restart ServiceSwitchSwitch...Test AsynchronicityTestStatusDěkujeme:Políčka z a url jsou povinnáPolíčko z revize je povinné.Políčko revize musí obsahovat čísloPolíčko nové jméno je povinnéDo:TypURL/cesta:URL:NeznáméOdemčenoUpdateAktualizace na reviziUpdate pracovní kopieUpdate na revizi...AktualizovánoAktualizujiPlatné:HodnotaHodnota:Zobrazit DiffZobrazit nápověduAnozvolené(á) položky(a)rabbitvcs-0.18/locale/de/000077500000000000000000000000001362112712700152525ustar00rootroot00000000000000rabbitvcs-0.18/locale/de/LC_MESSAGES/000077500000000000000000000000001362112712700170375ustar00rootroot00000000000000rabbitvcs-0.18/locale/de/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000521751362112712700211650ustar00rootroot00000000000000>   13/e(? Ubv-6*)$Ty&@SlH-&FL\ kw~     ?61 5h "  "   ! ! ! &!0! 5!?!0[!!!!! !p!VG""""2"%"$#&+# R# \#j######### $$/$A$R$c$t$ $ $$$$2$$%%2%I%i%n%s% y%%%%% %% %%%%& &+& 2&B>& &&& & & & &&)&''%'-'F' O'['`'e'$k'''' ' ' ''( #(.( 6(@(G( L(W( j(u(|(((("((((())) )()=)E)N)R) W)a)h)~)) )))) ) )*** 3*>*N*W* g* q*{* ******* * *+ ++!+:+Z+b+k+s+|++&+++++ ,*,F,`,z,,,,,, -&-@-Z-t- -.-2-0-&. <.J.Z.k.t.}.."...../ /,/ 3/=/ Q/\/ a/m/-u/$/*/$/*0C0Ab0%0,0s0Qk111 11 111111$272M2c2 k2w2r3y33 3 3!3%334#4)4>4A45 555636L61f6B666%757Q7e72v77 7777 8>8=\8838"89)9:9O9g9w999399/9+:G:d:Ex:-:!:;;$;:;M; T;`;s;-; ; ;;;; < &<B0<7s<4<< =) =4=:= C= M= Z=d=s= x= =;= === >&>6>k>:? R? `?>k?"? ?,? @@".@Q@d@}@@@@@ @A!A:A RAsAAA A AAAA9B@BOBbByB+BBBB BBB C CC !C/C@CTC*oCC C CCOC D)D0DBD"YD|DD D6DDE EE'E /E:E?EEE.ME|EEE E+EEEF6F GFSF\FcFiFqFFFFFF F6FF G&!G(HGqGG GGGG GGG GG GG"H 4H?H"WHzH H HHHH HH HH I I*I3I NQNgN{NN N N5N)N/O*@O;kO#O@O, P19PnkPvPQQVQ [QeQ jQ wQ Q Q QQ4QQR (R5R/ERuS~SSS S1S0S'T8T#;T_TyT=tF;"(dx&8.-V6 D<!,u|i-07=mB/E*:4s L`%1\,WlT2UK8PhR)7?by5n Z4z" wG>9$v.! 03j+2{/opf~SO(Y#;*%]1'a   #q+XIH_k}6)N^5'eJ[g r$:c>& < @Q 39MCA%s - Finished(no author)100Add MessageAffected File(s)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to see diff)Commit to:Create copy fromEdit Property DetailsFiles to lockFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to browse repositoriesProgram used to compare filesProperties for:RabbitVCSRepositoryRevision RangeRevisionRevisions TableSwitch DetailsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromUpdate DepthVersion InformationWorking CopyAre you sure you want to delete %item%?RabbitVCSA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAddedAnnotateAnnotate - %sAnnotate a fileAnnotate...AnnotatedAre you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse toBrowse...BugsCancelledCannot annotate a directoryChange the repository location of a working copyChangedCheck CertificateCheck out a working copyCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompletedCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationConflictedCopiedCopy From PathCopy From RevisionCopy an item to another location in the repositoryCopy from HEADCopy from revisionCopy from working copyCreate Repository hereCreate a repository in a folderDBusDateDebugDebug RevertDeleteDelete ConfirmationDeletedDenyDestination:Edit...Empty MessageEnable emblemsEnable file attributesEnable recursive status checksEnglishExit ServiceExportExport - %sExport a working copy or repository with no versioning informationExtensionExternalExternal ProgramsFailed LockFailed RevertFailed UnlockFingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGenerating Annotation...Get LockGet Lock...HEADHelpHost:Ignore all files with this extensionIgnore an itemIgnore ancestryImportImport - %sImport an item into a repositoryInapplicableInclude ignored filesInvalid revision informationInvalidateIssuer:Language:Limit:LineLoading...Locally lock itemsLock FilesLockedLogLog - %sLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MergedMessageMime TypeMinimum level to logMissingModifiedN/ANameNew Name:New...Notification MessagesNumber of URLs to rememberNumber of messages to rememberObstructedOmit ExternalsOnly record the mergeOpenOpen ShellPassword:PathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty StatusProperty:RabbitVCSRealm:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remove LockRenameRename...ReplacedRepository paths clearedRepository successfully createdResolveResolvedRestoreRestoredRetrieving Log Information...RevertRevert an item to its unmodified stateRevertedReverts everything it seesRevisionRunning Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save AuthenticationSaved DataSchedule an item to be added to the repositorySchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow a file's log informationShow logShow new version on the right sideShow unversioned filesShowing Revisions:SkippedStart/Restart ServiceSteal the locksStop on copySwitchSwitch...Test AsynchronicityTest MergeTextText StatusThanks:The from and to url fields are both required.The from revision field is required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There have been modifications to your working copy. If you copy from the HEAD revision you will lose your changes.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:UnchangedUnknownUnlockUnlockedUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...UpdatedUpdating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View DiffView helpView or change RabbitVCS settingsView the modifications made to a fileView the properties of an itemYesYou must supply a destination path.the selected item(s)toProject-Id-Version: neu Report-Msgid-Bugs-To: POT-Creation-Date: 2009-03-04 14:35-0500 PO-Revision-Date: 2009-03-19 09:59+0000 Last-Translator: Steve Markgraf Language-Team: German <> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-09-24 13:44+0000 X-Generator: Launchpad (build Unknown) X-Poedit-Basepath: ../ %s - abgeschlossen(kein Autor)100Logmeldung hinzufügenBetroffene Datei(en)AuthentifizierungZertifikatsdetailsDas Projektarchiv der Arbeitskopie ändernGeänderte Dateien (Doppelklick um Unterschiede anzuzeigen)Übernehmen nach:Kopie erstellen vonEigenschaftsdetails bearbeitenZu sperrende DateienVon RevisionQuell-URLVon: (URL und zusammenzuführende Revision)Import-LogmeldungLinksLogmeldungenLogging-OptionenLogmeldungOptionenBitte geben Sie Ihre Authentifizierungsinformationen anBitte beschreiben Sie, warum Sie diese Dateien sperrenFrühere LogmeldungenProgramm zum Durchsuchen von ProjektarchivenProgramm zum DateivergleichEigenschaften für:RabbitVCSProjektarchivRevisionsbereichRevisionRevisionenUmstelldetailsBis RevisionNach: (URL und zusammenzuführende Revision)URL-HistorieURL von der zusammengeführt werden sollAktualisierungstiefeVersionsinformationenArbeitskopieWollen Sie wirklich %item% löschen?RabbitVCSEin Assistent zum ZusammenführenÜberÜber RabbitVCSDauerhaft akzeptierenEinmal akzeptierenAktionHinzufügenEmblem hinzufügenEin Emblem hinzufügenZur Liste der ignorierten Dateien hinzufügenHinzugefügtAnnotierenAnnotiere - %sAutoren- und Revisionsinformationen zu einer Datei anzeigenAnnotierenAnnotiertWollen Sie wirklich Ihre Authentifizierungsinformationen löschen?Wollen Sie wirklich die früheren Nachrichten löschen?Wollen Sie wirklich die Projektarchivpfade löschen?Wollen Sie wirklich fortfahren?AnmeldungAuthentifizierungsinformationen gelöschtAutorAutoren:Zweig/TagZweig/Tag...DursuchenDurchsuchen...BugsAbgebrochenKann kein Verzeichnis annotierenDen Ort des Projektarchivs für eine Arbeitskopie umstellenGeändertZertifikat prüfenEine Arbeitskopie auscheckenAuscheckenAuschecken - %sWählen Sie diese Methode, wenn Sie Änderungen an einem Zweig vorgenommen haben und Ihre Änderungen mit einem anderen Zweig zusammenführen möchten.Wählen Sie diese Methode, wenn Sie zwei verschiedene Zweige in Ihre Arbeitskopie zusammenführen möchten.Arbeitskopie aufräumenRäume auf...AufräumenAufräumen angefragt... Aufräumen der Arbeitskopie beginnen?Ihre Anmeldeinformationen löschenÜbernehmenÄnderungen in das Projektarchiv übertragenAbgeschlossenHinzufügen abgeschlossenZweig/Tag-Erstellung abgeschlossenAuschecken beendetAufräumen abgeschlossenÜbernehmen abgeschlossenExport abgeschlossenImport abgescholssenSperren abgeschlossenZusammenführen abgeschlossenZusammenfüUmstellen der URL abgeschlossenUmbenennen abgeschlossenAuflösen abgeschlossenRückgängigmachen abgeschlossenZweig/Tag gewechseltEntsperren abgeschlossenAktualisierung abgeschlossen.BestätigungIm KonfliktKopiertKopiert von PfadKopiert von RevisionEin Objekt zu einem anderen Ort im Projektarchiv kopierenKopie von HEADKopie von RevisionKopie von ArbeitskopieProjektarchiv hier erstellenEin Projektarchiv in einem Ordner erstellenDBusDatumDebugDebug RevertLöschenBestätigung zum LöschenGelöschtVerweigernZielort:Bearbeiten...Leere LogmeldungEmbleme einschaltenDateiattribute einschaltenRekursive Statusüberprüfungen aktivierenenglischExit ServiceExportierenExportieren - %sEine Arbeitskopie oder ein Projektarchiv ohne Versionsinformationen exportierenErweiterungExternExterne ProgrammeSperren fehlgeschlagenRückgängig machen fehlgeschlagenEntsperren fehlgeschlagenFingerabdruck:AbgeschlossenEinen Aufruf von invalidate_extension_info() forcieren%d Objekt(e) gefundenVon:AllgemeinErzeuge Annotationen...SperrenSperren...HEADHilfeServer:Alle Dateien mit dieser Erweiterung ignorierenEin Objekt ignorierenAbstammung ignorierenImportImport - %sEin Objekt in ein Projektarchiv importierenNicht anwendbarIgnorierte Dateien einbeziehenUngültige RevisionsinformationUngültig machenAussteller:Sprache:Limit:ZeileLade...Objekte lokal sperrenDateien sperrenGesperrtLogLog - %sLoggingBenutzername:Ein in Konflikt stehendes Objekt als gelöst markierenZusammenführenZusammenführassistentEinen Revisionsbereich zusammenführenZwei verschiedene Bäume zusammenführenZusammenführen...ZusammengeführtLogmeldungMIME-TypMinimaler LoglevelFehlendGeändertn/vNameNeuer Name:Neu...NachrichtenZahl der zu merkenden URLsZahl der zu merkenden LogmeldungenVerhindertIgnoriere Externe LinksNur als zusammengeführt markierenÖffnenOpen ShellPasswort:PfadFrühere LogmeldungenFrühere Logmeldungen gelöschtEigenschaftenEigenschaften - %sEigenschaftEigenschaftenstatusEigenschaft:RabbitVCSBereich:RekursivAktualisierenRefresh StatusSperre aufheben...Sperre für Objekte aufhebenZweig/Tag wechselnURL des Projektarchivs umstellenURL umstellenSperre aufhebenUmbenennenUmbenennen...ErsetztProjektarchivpfade gelöschtProjektarchiv erfolgreich erstelltAuflösenAufgelöstWiederherstellenWiederhergestelltErmittle Logmeldungen...Rückgängig machenEin Objekt in seinen unveränderten Zustand rückversetzenRückgängig gemachtReverts everything it seesRevisionFüge hinzu...Erstelle Zweig/Tag...Checke aus...Übernehme ins Projektarchiv...ExportiereImportiere...Sperre...Führe zusammen...Zusammenführen testenStelle URL um...Benenne um...Löse Konflikte auf...Mache rückgängig...Wechsele Zweig/Tag...Entsperre...Anmeldeinformationen speichernGespeicherte DatenEin Objekt zum Hinzufügen zum Projektarchiv vormerkenEin Objekt zum Löschen aus dem Projektarchiv vomerkenEin Objekt zum Umbenennen im Projektarchiv vormerkenAlle aus-/abwählenDatei wählenOrdner wählenEin Programm auswählenEinstellungenLog anzeigenLogmeldungen einer Datei zeigenLog anzeigenNeue Version auf der rechten Seite zeigenNicht versionierte Dateien anzeigenZeige Revisionen:ÜbersprungenStart/Restart ServiceExistierende Sperren brechenBei Kopie anhaltenZweig/Tag wechselnZweig/Tag wechseln...Test AsynchronicityZusammenführen testenTextTextstatusDanksagungen:Die Ursprungs- und Ziel-URL müssen angegeben werden.Sie müssen die Ausgangsrevision angeben.Die Ausgangsrevision muss eine ganze Zahl sein.Der angegebene Pfad ist keine ArbeitskopieDas Objekt/Die Objekte werden in den Mülleimer verschoben.Der neue Name muss angegeben werdenDie Projektarchiv-URL und der Zielpfad müssen angegeben werden.Die Projektarchiv-URL muss angegeben werden.Der Ort des Projektarchivs muss angegeben werden.Ihre Arbeitskopie wurde verändert. Wenn Sie von der HEAD-Revision kopieren, gehen diese Änderungen verloren.Beim Erstellen des Projektarchivs ist ein Fehler aufgetreten. Stellen Sie sicher, dass der angegebene Ordner leer ist.Auf:Typ:URL/Pfad:URL:UnverändertUnbekanntEntsperrenEntsperrtAktualisierenAktualisiere auf RevisionEine Datei auf eine bestimmte Revision aktualisierenEine Arbeitskopie aktualisierenAktualisieren auf...AktualisiertAktualisiere...Benutzen Sie den Log-Dialog, um die Revisionen zum Zusammenführen auszuwählen. Oder geben Sie die Revisionen per Hand an, durch Komma getrennt. Sie können einen Revisionsbereich mit dem Bindestrich angeben. Beispiel: 4-7, 9,11,15-HEAD Lassen Sie das Feld leer, um alle Revisionen zusammenzuführen.Gültig:WertWert:Unterschiede anzeigenHilfe ansehenEinstellungen von RabbitVCS sehen oder bearbeitenDie an einer Datei vorgenommen Änderung ansehenDie Eigenschaften eines Objekts ansehenJaSie müssen einen Zielpfad angeben.die ausgewählten Objektebisrabbitvcs-0.18/locale/en_GB/000077500000000000000000000000001362112712700156345ustar00rootroot00000000000000rabbitvcs-0.18/locale/en_GB/LC_MESSAGES/000077500000000000000000000000001362112712700174215ustar00rootroot00000000000000rabbitvcs-0.18/locale/en_GB/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000675261362112712700215550ustar00rootroot00000000000000\ 9######## $ $$$;1$m$$1$8$ %%63%j%% %%%%(% & !&.&B&Y&h&&-&6&'1]''*'$''( (3(E([(k((((&((( )!)<)Q)7e)H)-):*O*o*u** *** ** *** *+++ ++ + +/+ ,",>,M,h,?,6,5,",-O-"^--- - -- -- ---.0.K.S.[.m...... . .p /V|////20%30Y0l0&s0000)0141H1Ag11 1 11122&272H2W2g2|2222222 2 333$3732M3 33 333335474N4S4 Y4f4m4444 444 4 4g 5 t5555555556%6 ,6B86 {6 666 6 6 6"6 67) 757F7L7T7 ]7i7n7s7y7777 7 7 78 8!8 )838:8?8 Z8 g8r8 8888 888"88889-969=9 E9O9d9l9u9 999 9 9999999 ::,:B: G: R:^:w: : :::::::: ;;(;1;A;Q; a; k;u;; ;;;;;;;< < (<4< ;<E<N<a<z<<<<<<<<&< ==*6=6a==== ===> >:>T>n>>>>>>??4?N? g?r? ?2?0?,?"@ 8@F@V@g@p@@@@(@@#A2A";A^AuAAAAA AA A AA A AAAA-oSoJ(zc Uo{m!B4g$"d'6-uxkxo  >iU0nzYQX3WNAq)H^jD9*5EYFN%(\PW,cb1FbS[ZP@}D8/mvv%7I.j2#y~?9@:H/kg" 0\^LaVe ]t<#T,6`_MBlhRei*s+O`VE w dq ~S);u}4arp<pQ;]{53ZnGK8$>1CC7  _I|&!T[f.=&Ay? -R2rLM|GKsXf=hO:+Jw lt'%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished(no author)100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Create copy fromDifferences (double-click to compare with base)Edit Property DetailsFiles to lockFirst:Folder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to browse repositoriesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableSecond:Switch DetailsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromUpdate DepthVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAddedAdded a folder to the repositoryAgeAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...AnnotatedApplies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyChangedChangesCheck CertificateCheck for ModificationsCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompletedCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationConflictedCopiedCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DeletedDenyDestination:Diff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternalExternal ProgramsFailed LockFailed RevertFailed UnlockFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInapplicableInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MergedMessageMime TypeMinimum level to logMissingModifiedMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberObstructedOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch FailedPatch File AppliedPatch File CreatedPatchedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Rejected PatchRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...ReplacedRepository BrowserRepository paths clearedRepository successfully createdReservedResolveResolvedRestoreRestore a missing itemRestoredRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)RevertedReverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow changes from previous revisionShow logShow new version on the right sideShow unversioned filesShowing Revisions:SizeSkippedStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URLURL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnchangedUnknownUnlockUnlockedUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...UpdatedUpdating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-01-27 10:44-0500 PO-Revision-Date: 2010-04-05 19:46+0000 Last-Translator: Jonathon Fernyhough Language-Team: English (United Kingdom) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-11-26 14:08+0000 X-Generator: Launchpad (build Unknown) %i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished(no author)100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Create copy fromDifferences (double-click to compare with base)Edit Property DetailsFiles to lockFirst:Folder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to browse repositoriesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableSecond:Switch DetailsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromUpdate DepthVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAddedAdded a folder to the repositoryAgeAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...AnnotatedApplies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyChangedChangesCheck CertificateCheck for ModificationsCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialogue.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompletedCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationConflictedCopiedCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DeletedDenyDestination:Diff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternalExternal ProgramsFailed LockFailed RevertFailed UnlockFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInapplicableInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MergedMessageMime TypeMinimum level to logMissingModifiedMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberObstructedOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch FailedPatch File AppliedPatch File CreatedPatchedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Rejected PatchRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...ReplacedRepository BrowserRepository paths clearedRepository successfully createdReservedResolveResolvedRestoreRestore a missing itemRestoredRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)RevertedReverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow changes from previous revisionShow logShow new version on the right sideShow unversioned filesShowing Revisions:SizeSkippedStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to URL fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be moved to Deleted Items.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URLURL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnchangedUnknownUnlockUnlockedUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...UpdatedUpdating...Use the log dialogue to select the revisions that you wish to merge. Alternatively write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)torabbitvcs-0.18/locale/es/000077500000000000000000000000001362112712700152715ustar00rootroot00000000000000rabbitvcs-0.18/locale/es/LC_MESSAGES/000077500000000000000000000000001362112712700170565ustar00rootroot00000000000000rabbitvcs-0.18/locale/es/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000665111362112712700212030ustar00rootroot00000000000000~   & 9 N _ p ~  ;   1!84!m!!!!!!(!" ("5"I"`"o""-"6-#1d##$####$!$7$G$^$&q$$$$$$7%H@%-%:%%&&(& 7&C&J& N&Y& m&{& &&B' K'Y' i'/u' '''''?(6N(5("(("()) ) +)9) R)\) w))))0))).*6*O* X* f*pr*V*:+P+_+2g+%+++&+,,),)>,h,4z,,A,- *-8-M-`-r---------. .1.B. S.`.o..2. .. ..//;/5L//// ////// 000 50gB0 0000011141S1[1 b1Bn1 1 11"1 12)2:2K2Q2Y2 b2n2s2x2~2222 2 22 33 !3+32373 R3 _3j3 }3333 333"3333 4%4.4 64@4U4 e4p4t4 y4 4444444455 5 '535L5 f5p555555 555566 !6 +656E6 L6V6^6m66666 66 66 7"7B7K7S7[7r7&y777*767.8I8 R8\8s8888889)9<9X9r99999 99 :2:0Q:,:: ::::: ;;5;(S;|;;;;;;; ;; ; << < $<0<A8<-z<*<$<*<#=AB=%=,=+=Q>U>Y> _>i>"n>%>>>>>$>?? 1?=?8@?@E@L@#c@@$@@@ A!A&3A%ZA;AAA(A(B ?BLB#PBtBBBgDxDDDDDDDDDEE\E!rE4EEEF##FGF`FyFF)FFFF G'G6GG7GMH/jHH,HHH II0INI_IzI%IIII J"JE:JNJ-J=J#;K _KiKyKKKKKKKK)L/LL LL L6L4MCMcM uMMGM=M@;N'|NN&NNN NN$O -O8O QO\O dOO:OO"O1P3P PP]P vPcPPP8Q QQ^QFfQ)QQ Q'QR:RNR0lRRLRRZSvS$SSSSST,TDTXTjTTTTTTTU -U;UPUjU6U UU UUU#V8V=IVVVVVVV#VWW#.WRWZWkW WW X$X%BX hXrXX+XXX XJX 6Y BYMY.`YY Y2YYYY Y ZZZ!Z)Z+;Z'gZZ Z&ZZ ZZZ[ [![4[ F[R[o[ [[ [[[[,[[["\6\ V\a\ i\s\\ \\\\ \\\\\]]<]L]f]l]{] ] ] ]]] ^^^+^ H^T^ e^o^^^ ^ ^^^ ^ ^^ _ "_0_ H_T_ n_ z_ ____ __ _`#`.,`[`n`,`8`` a a#a'Baja$aaaabb#:b#^bb!bb$bc$c4cKc8[c;c4cd%d;dRd jdwdd4d.d(d (eIeZezeeeeee eeeee fIf,hf%f0f;f$(g8Mg3g6g3g[%hhh hh*h7h h i i!i08iiiii&ijjjj!k $kEk ckk k+k&k.k:*l"ell%l&lll&l"$mGmJtbz<n,FA?hlE>_UZ@A,NCRwIDx`y%T{2b4v"ovpD4Q'.]&*_s%\ HGMo;{$?Rx $|y}S^S/ (w9k7:![>3caZ = W3V\t#js7(k~E5c); BQ eT. 0}rfgVWMzK|ui HXhq#0]U*rd+ lL5 a:P-qmB)'CJ`PF<iNO8L&m^!YI6pd-=fYX~K+1Gj9/g" u@6O1n8e[2%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-03-19 15:25+0000 Last-Translator: Raúl Ricardo Amaya Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i día%i días%i hora%i horas%i minuto%i minutos%i mes%i meses%i segundo%i segundos%i semana%i semanas%i año%i años%s - Finalizado100Añadir mensajeArchivos afectados (pulse dos veces para comparar con la base)AutenticaciónDetalles de certificaciónCambiar el repositorio de su copia de trabajoArchivos cambiados (pulse dos veces para comparar con el base)Confirmar a:Editar detalles de propiedadArchivos a cerrarNombre de carpetaDe revisiónDesde URLDesde: (URL y revisión a mezclar)Importar mensajeEnlacesMensajes de registroOpciones de registroMensajeNota: los cambios en las propiedades se aplican instantáneamente. Puede revisar y deshacer los cambios usando el menú de contexto de cada elemento. OpcionesPor favor, añada sus detalles de autenticaciónPor favor, describa el motivo por el que está cerrando estos archivosIntroduzca su archivo certificación SSLMensajes anterioresPrograma usado para comparar archivosPropiedades de:RabbitVCSURI remota:RepositorioIntervalo de revisiónRevisiónTabla de revisionesA revisiónA: (URL y revisión a mezclar)Histórico de URLsURL a la que mezclarInformación de versiónCopia de trabajo:Copia de trabajoLas propiedades seleccionadas serán aplicadas recursivamente.¿Está seguro de que quiere eliminar %item%?RabbitVCSError de RabbitVCSUn asistente con pasos para mezclarAcerca deSobre RabbitVCSAceptar siempreAceptar una vezAcciónAñadirAñadir emblemaAñadir nueva propiedad.Añadir un emblemaAñadir a la lista de ignoradosSe ha añadido una carpeta al repositorioHa ocurrido un error en el complemento RabbitVCS de Nautilus. Contacte con el equipo de RabbitVCS con los detalles de error listados debajo:AnotarAnotado - %sAnotar un archivoAnotar...Aplica un archivo diff unificado a una copia funcionalAplicar parcheAplicar parche al directorio...Aplicar parche...Aplicar propiedad recursivamenteAplicando archivo de parche...¿Está seguro de que quiere limpiar su información de autenticación?¿Está seguro de que quiere limpiar sus mensajes anteriores?¿Está seguro de que quiere borrar las rutas de su repositorio?¿Está seguro de que quiere continuar?AutenticaciónInformación de autenticación borradaAutorAutores:Rama/etiquetaRama/etiqueta...Navegar por un árbol de repositorioNavegar enBuscar archivo o carpetaNavegar...ErroresNo se puede anotar un directorioCambiarCambiar la ubicación de un repositorio de una copia localComprobar certificadoComprobar si hay modificaciones...Comprobar si hay modificaciones en el repositorioObtener una copia de trabajoObtener rep.Obtener repositorio - %sComprobar...Elija este método si ha hecho algunos cambios a la rama y desea mezclar sus cambios con otra rama.Elija este método si desea mezclar dos ramas diferentes en su copia de trabajo.Limpiar copia de trabajoLimpiando...LimpiarPetición de limpieza realizada... ¿Empezar limpieza de copia local?Limpiar su información de autenticaciónCerrar este diálogo.ConfirmarConfirmar modificaciones al repositorioComparar archivos/carpetasComparar revisionesComparar uno al lado del otroComparar las diferencias entre los dos elementosComparar con baseComparar con base usando la herramienta de comparación uno al lado del otroComparar con versión anteriorComparar con revisión anterior usando la herramienta de comparación uno al lado del otroComparar con copia de trabajoLa orden de añadir se ha completadoRama/etiqueta completadaObtención completadaLimpieza completadaConfirmación competadaExportación completadaImportación completadaClausura completadaMezcla completadaPrueba de mezcla completadaRelocalización completadaRenombrado completadoResolución completadaReversión completadaCambio completoApertura de cerrojo completadaActualización completadaConfirmaciónCopiar desde la rutaCopiar desde la revisiónCopiar el URL al portapapelesCopiar un elemento a otra ubicación en el repositorioCopiar a...Crear carpeta...Crear parcheCrear parche...Crear aquí un repositorioCrear un repositorio en una carpetaCrear carpeta...Crea un archivo diff unificado con todos los cambios que hizoCreando fichero parcheFechaDepurarDepurar reversiónEliminarEliminar confirmaciónEliminar propiedades recursivamenteEliminar propiedadEliminar esta propiedadEliminar esta propiedad (recursivo)DenegarMenú de Diff...¿Quiere eliminar las propiedades seleccionadas de todos los archivos y subdirectorios que estén por debajo de este directorio?Editar autorEditar autor...Editar mensaje de registroEditar mensaje de registro...Editar propiedades de la revisión...Editar...Activar emblemasActivar atributos de archivoActivar comprobaciones recursivas de estadoInglésExportarExportar - %sExportar una copia de trabajo o repositorio sin información de versionadoExportar...ExtensiónProgramas externosEl archivo no está bajo control de versiones.Huella:FinalizadoForzar a una llamada a invalidate_extension_info()%d elemento(s) encontradosDesde:GeneralTomar cerrojoBloquearHEADAyudaEquipo:Ignorar ancestrosIgnorar elementos por extensión de archivoIgnorar elementos por nombre de archivoImportarImportar - %sImportar un elemento en un repositorioIncluir archivos ignoradosInvalidarEmisor:Idioma:Límite:LíneaLista de opciones de comparaciónCargar/actualizarCargando...Elementos locales bloqueadosArchivos cerradosBloqueadoRegistroRegistro - %sMensaje de registroRegistroUsuario:Marcar un elemento conflictivo como resueltoMezclarAsistente de mezcladoMezclar un intervalo de revisionesMezclar dos árboles diferentesMezclar...MensajeTipo MIMENivel mínimo de registroMás acciones...Mover a...N/ANombreNueva ubicación:Nuevo nombre:Nuevo...NoMensajes de notificaciónNúmeroNúmero de URLs a recordarNúmero de mensajes a recordarOmitir externosRegistrar sólo la mezclaAbrirAbrir terminalAbrir un archivoAbrir desde la primera revisiónAbrir desde la segunda revisiónContraseña:Archivo de parche aplicadoFichero parche creadoRutaRuta:Mensajes anterioresMensajes anteriores borradosPropiedadesPropiedades - %sPropiedadCambiar propiedadEditor de propiedadesEstado de propiedadPropiedad:RabbitVCSError de RabbitVCSReino:RecursivoActualizarActualizar estadoActualizar lista de propiedades.Desblouear...Desbloquear un elementoRelocalizarReubicar copia de trabajoReubicar...RenombrarRenombrar...Navegador de repositorioRutas de repositorio borradasRepositorio creado con éxitoReservadoResolverRestaurarRestaurar un elemento que faltaRevertirRevertir un elemento a su estado no modificadoRevertir propiedadRevertir propiedad (recusivo)Revertir esta propiedad a su estado originalRevertir esta propiedad a su estado original (recursivo)Revertir todo lo que se veaRevisiónRevisión:Ejecutando orden de añadir...Ejecutando la orden de Rama/Etiqueta...Obteniendo repositorio...Ejecutando orden de confirmación...Ejecutando orden de exportar...Ejecutando importación...Ejecutando orden de cerrar...Ejecutando orden de mezclarEjecutando prueba de mezclaEjecutando orden de relocalizaciónEjecutando la orden de renombrar...Ejecutando orden de resolver...Ejecutando orden de reversión...Ejecutando comando de cambioEjecutando orden de abrir cerrojo...Certificación de cliente SSLGuardar como…Guardar autenticaciónDatos guardadosPlanificar que un elemento sea eliminado del repositorioPlanificar que un elemento sea renombrado en el repositorioGestionar elementos que se añadirán al repositorioSeleccionar/Deseleccionar todosSeleccione un archivoSeleccione una carpetaSeleccionar un programaPreferenciasMostrar cambios...Mostrar registroMostrar las herramientas de depuración de RabbitVCSMostrar información de registro de un archivoMostrar cambios entre rutas y revisionesMostrar cambios entre revisionesMostrar registroMostrar archivos no versionadosMostrando revisiones:TamañoEstadoRobar los cerrojosParar al copiarCambiarCambiar...Comprobar mezclaTextoCambio de textoEstado del textoAgradecimientos:El menú de depuración es usado para diagnosticar problemas en RabbitVCSSe requieren los campos de origen y destino.El campo revisión debe ser un enteroLa ruta proporcionada no es una copia de trabajoEl/los elemento(s) se enviarán a la papelera de reciclaje.Se necesita el campo de nuevo nombreSe requiere la URL del repositorio y la ruta de destino.Se necesita el campo de dirección del repositorio.La ubicación del repositorio es un campo obligatorio.Ha ocurrido un problema al guardar sus propiedades.Ha habido un error al crear el repositorio. Asegúrese de que la carpeta dada está vacía.A:Tipo:URL/ruta:URL:No se pudo obtener la lista de propiedadesNo se puedo establecer un nuevo valor a esta propiedad.DesconocidoAbrir cerrojoActualizarActualizar a revisiónActualizar un archivo a una versión específicaActualizar una copia de trabajoActualizar a revisión...Actualizando...Use el diálogo de registro para seleccionar las revisiones que desea mezclar. O escriba las revisiones manualmente, cada una separada por una coma. Puede especificar un intervalo de revisiones con un guión. Ejemplo: 4-7,9,11,15-HEAD Para mezclar todas las revisiones, deje el campo vacío.Válido:ValorValor:Ver diff con baseVer diff con la versión anteriorVer diff con la copia de trabajoVer diff uno al lado del otroVer diff entre archivos/carpetasVer diff entre revisionesVer ayudaVer o cambiar las preferencias de RabbitVCSVer las diferencias entre dos archivosVer las modificaciones realizadas a un archivoVer las modificaciones del archivo desde el último cambioVer las propiedades de un elementoVer diff unificado¿Dónde quiere copiar la selección?¿A dónde quiere mover la selección?Copia de trabajoSíDebe proporcionar una ruta de destino.el/los elemento(s) seleccionado(s)arabbitvcs-0.18/locale/es_CL/000077500000000000000000000000001362112712700156475ustar00rootroot00000000000000rabbitvcs-0.18/locale/es_CL/LC_MESSAGES/000077500000000000000000000000001362112712700174345ustar00rootroot00000000000000rabbitvcs-0.18/locale/es_CL/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000470221362112712700215550ustar00rootroot00000000000000*l    6L1g/%:(Js-67*P${&/ViH.4D S_f j u   ?65P""    0%V^p ypVO e t 2| %  & ! !!0!C!U!f!w!!!!!!!!""%" 6" C"N"U"d"2w""""""## %#2#9#M#U# Z#g# o#}#### ## #B# -$7$@$ R$ ^$ l$ z$$$$$$$ $$$$%%&% -% 9% Z%g%}% %% %%% %% %%%%&&"&2&8&H&c&}&&& &&&&& &&&&& '%'4'J' O' Z'd'i'{' '''' ' ''''((%( @( L(X( _(i(r((((((((&()")=)F)]){))))))*&*B*\*w**** *.*2+0F+w+ +++++++"+,/,B,J,`, p,}, ,, ,,-,$,*-$3-*X--A-%-, .s7.Q../ / //#/*/3/:/$M/r/// /// / /!/%/0:0#>0b0w0bz01 112*2@24`2C222)313L3e3)y33333 464CQ4474-45/5B5\5l555)55!5' 6"H6k6D6$6 66 7#757=7E7U7h777 77 77D78 8CC8$88(888 8 9 99=59s9|999b9S&:z: ::M:*:$;$3; X;b;u; ;;;;; <<,-<Z<s<< <<<< = ==#=5=;K=== ==#=>!>)>8>A> X>b>j> s>}>>>)>>>> ?M? c?n?v????? ????@@"@7@-=@k@@@ @"@ @@*@ A*A9AAAJA QA]A{A A AA AA-AABB 8B YB eBoB wBB BBB BBBBB CC,CGC MC [ChCmCC CC CC CC CCD$D DDPD mDyDDD D$DDDE E E(#ELE3dE EEE E EEF "F 0F >F LF ZFfF)FFFFFFG,$G3QG7GGGGHH)H5;HqH)H/HHHHI%I;I!QIsIyII2I'I3I;*J+fJ$JDJ0J7-KgeK^K,L3L 9L CL OL [L gL tLL4LL L MM(M.M5M EM.OM*~MMM#MM N #O(5p]c(=!oM,+7_r!sZ6/ .E{>B))"A^0d%2j;NiK 9 @C&P~v?-}x G\HqF&Xl kzf|D w3 U$T4R:aJ"h1y# '`*['YQI be$WV<%*tL8nuSgm %s - Finished(no author)Add MessageAffected File(s)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to see diff)Commit to:Create copy fromEdit Property DetailsFiles to lockFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to browse repositoriesProgram used to compare filesProperties for:RepositoryRevision RangeRevisionRevisions TableSwitch DetailsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromUpdate DepthVersion InformationWorking CopyAre you sure you want to delete %item%?A wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAddedAnnotateAnnotate - %sAnnotate a fileAnnotate...AnnotatedAre you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Browse toBrowse...CancelledCannot annotate a directoryChange the repository location of a working copyChangedCheck CertificateCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompletedCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationConflictedCopiedCopy From PathCopy From RevisionCopy an item to another location in the repositoryCopy from HEADCopy from revisionCopy from working copyCreate Repository hereCreate a repository in a folderDateDebugDebug RevertDeleteDelete ConfirmationDeletedDenyDestination:Edit...Empty MessageEnable emblemsEnable file attributesEnable recursive status checksEnglishExit ServiceExportExport - %sExport a working copy or repository with no versioning informationExtensionExternalExternal ProgramsFailed LockFailed RevertFailed UnlockFingerprint:FinishedFound %d item(s)From:GeneralGenerating Annotation...Get LockGet Lock...HelpIgnore all files with this extensionIgnore an itemIgnore ancestryImportImport - %sImport an item into a repositoryInapplicableInclude ignored filesInvalid revision informationInvalidateIssuer:Language:Limit:LineLoading...Locally lock itemsLock FilesLockedLogLog - %sLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MergedMessageMime TypeMissingModifiedN/ANameNew Name:New...Notification MessagesNumber of URLs to rememberNumber of messages to rememberObstructedOmit ExternalsOnly record the mergeOpenOpen ShellPassword:PathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty StatusProperty:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remove LockRenameRename...ReplacedRepository paths clearedRepository successfully createdResolveResolvedRestoreRestoredRetrieving Log Information...RevertRevert an item to its unmodified stateRevertedReverts everything it seesRevisionRunning Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save AuthenticationSaved DataSchedule an item to be added to the repositorySchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow a file's log informationShow logShow new version on the right sideShow unversioned filesShowing Revisions:SkippedStart/Restart ServiceSteal the locksStop on copyTest AsynchronicityTest MergeTextText StatusThanks:The from and to url fields are both required.The from revision field is required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There have been modifications to your working copy. If you copy from the HEAD revision you will lose your changes.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:UnchangedUnknownUnlockUnlockedUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...UpdatedUpdating...ValueValue:View DiffView helpView or change RabbitVCS settingsView the modifications made to a fileView the properties of an itemYesYou must supply a destination path.the selected item(s)toProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-03-04 14:35-0500 PO-Revision-Date: 2009-04-01 00:36-0300 Last-Translator: Camilo Flores Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); %s - Finalizado(sin autor)Agregar MensajeArchivos afectadosAutenticaciónDetalles del CertificadoCambiar el repositorio de tu copia de trabajoArchivos Modificados (doble click para comparar diferencias)Enviar hacia:Crear copia desdeEdita los detalles de la propiedadArchivos a bloquearDesde la versiónDesde la URLDesde: (URL y versión a fusionar)Importar mensajeMensajes de la bitácoraOpciones de la bitácoraMensajeOpcionesPor favor agrega tus detalles de autenticaciónPor favor describe por qué estás bloqueando estos archivosMensajes anterioresPrograma a usar para navegar en los repositoriosPrograma a usar para comparar archivosPropiedades para:RepositorioRango de versionesVersiónTabla de versionesDetalles del SwitchHasta la versiónDesde: (URL y versión a fusionar)Historia de la URLURL desde la cual fusionarProfundidad de la actualizaciónInformación de la versiónCopia de trabajo¿Estás seguro de eliminar %item%?Un asistente con pasos para fusionarAcerca deAcerca de RabbitVCSAceptar permanentementeAceptar por ahoraAcciónAñadirAgregar EmblemaAgregar un emblemaAñadir a lista de ignoradosAñadidoAnotarAnotar - %sAnotar un archivoAnotar...Anotado¿Estas seguro de querer eliminar tu información de autenticación?¿Estás seguro de querer eliminar tus mensajes previos?¿Estás seguro de querer reestablecer las rutas de tu repositorio?¿Estás seguro de querer continuar?AutenticaciónInformación de autenticación eliminadaAutorAutores:Navegar haciaNavegar...CanceladoImposible anotar el directorioCambiar la ubicación del repositorio de una copia de trabajoCambiadoComprobar certificadoDescargar repositorioDescargar repositorio - %sEscoge este método si has hecho cambios a un branch y deseas fusionar tus cambios con otro branchEscoge este método si deseas fusionar dos branch diferentes en tu copia de trabajoLimpiar tu copia de trabajoLimpiando...LimpiarLimpieza Solicitada... ¿Deseas comenzar la limpieza de tu copia de trabajo?Eliminar tu información de autenticaciónEnviar cambiosEnviar modificaciones al repositorioCompleto.Añadir CompletadoComando Branch/tag exitoso.Descarga de repositorio completaLimpieza CompletaEnvío de cambios completadoExportar CompletadoImportar CompletadoBloqueo CompletadoFusión completaPrueba de factibilidad de fusión completadoRelocalización CompletaCambio de nombre exitoso.Resolver CompletadoReversión de cambios completadaSwitch CompletadoDesbloqueo CompletoActualización exitosa.ConfirmaciónEn conflictoCopiadoCopiar desde rutaCopiar desde versiónCopiar un elemento a otra ubicación dentro del repositorioCopiar desde versión HEADCopiar desde la versiónCopiar desde la copia de trabajoCrear un repositorio aquíCrear un repositorio en una carpetaFechaDepurarRevertir DebugEliminarEliminar confirmaciónEliminadoDenegarDestino:Editar...Mensaje vacíoActivar emblemasActivar atributos de archivoActivar comprobación de estado recursivaInglésTerminar ServicioExportarExportar - %sExportar tu copia de trabajo o repositorio sin información de versionamientoExtensiónExternoProgramas ExternosBloqueo fallidoRevertir fallidoDesbloqueo fallidoHuella digital:FinalizadoEncontrado %d elemento(s)Desde:GeneralGenerando Anotación...BloquearSolicitar bloqueo...AyudaIgnorar todos los archivos con esta extensionIgnorar un elementoIgnorar antecesoresImportarImportar - %sImportar elemento a un repositorioNo aplicableIncluir archivos ignoradosInformación no válida sobre la versión.InvalidarReportado por:Idioma:Límite:LíneaCargando...Bloquear elementos localmenteBloquear ArchivosBloqueadoBitácoraBitácora - %sBitácoraNombre de usuario:Marcar un elemento en conflicto como resueltoFusionarAsistente de FusiónFusionar un rango de versionesFusionar dos árboles diferentesFusionar...FusionadoMensajeTipo MIMEFaltanteModificadoN/DNombreNuevo nombre:Nuevo...Mensajes de notificaciónCantidad de URLs a recordarCantidad de mensajes a recordarObstruídoOmitir los ExternosRegistrar sólo la fusiónAbrirAbrir ConsolaContraseña:RutaMensajes anterioresMensajes previos eliminadosPropiedadesPropiedades - %sPropiedadEstado de la PropiedadPropiedad:RecursivamenteRefrescarRefrescar EstadoLevantar bloqueo...Levantar bloqueo de un elementoRelocalizarReubicar tu copia de trabajoReubicar...Levantar BloqueoCambiar nombreCambiar nombre...ReemplazadoRutas del repositorio reestablecidasRepositorio creado exitosamenteResolverResueltoRestaurarRestauradoRecuperando información de la bitácoraRevertir modificacionesRevertir un elemento a un estado sin modificacionesRevertidoRevertir todo lo que veaVersiónAñadiendo...Ejecutando el comando Branch/tagDescargando repositorio...Enviando cambios...Exportando...Importando...Bloqueando...Fusionando...Ejecutando Ejecutando relocalización...Ejecutando comando de cambio de nombre...Resolviendo...Revirtiendo cambios...Ejecutando SwitchDesbloqueando...Guardar autenticaciónInformación guardadaAgendar un elemento a añadir al repositorioAgendar eliminación de un elemento del repositorioAgendar cambio de nombre de un elemento del repositorioSeleccionar / Descartar todosSelecciona un archivoSelecciona una carpetaElije el programaConfiguraciónMostrar bitácoraMostrar la información de la bitácora de un archivoMostrar historialMostrar la nueva versión al lado derechoMostrar archivos fuera del control de versionesMostrar versiones:OmitidoIniciar/Detener ServicioRomper los bloqueosDetenerse en la copiaProbar AsincronicidadComprobar factibilidad de fusiónTextoEstado del TextoAgradecimientos:Son necesarios los campos "desde" y "hasta" la urlEs necesario el campo "desde versión".El campo "desde version" debe ser un número enteroLa ruta proporcionada no corresponde a una copia de trabajoLos elementos serán enviados a la PapeleraEs necesario el campo "nuevo nombre"Se necesita el campo de la URL del repositorio y la ruta de destino.Es necesario el campo de la URL del repositorio.Es necesario el campo de la ubicación del repositorio.Se han detectado cambios en tu copia local. Si actualizas desde la versión HEAD perderás los cambios.Hubo un error al crear el repositorio. Asegúrate de que la carpeta especificada esté vacía.Hasta:Tipo:URL/Ruta:Sin cambiosDesconocidoDesbloquearDesbloqueadoActualizarActualizar según versiónActualizar un archivo según una versión particularActualizar copia de trabajoActualizar según la versión...ActualizadoActualizando...ValorValor:Ver DiferenciasVer ayudaVer o modificar la configuración de RabbitVCSVer las modificaciones hechas a un archivoVer propiedades de un elementoSíDebes ingresar una ruta de destino.los elementos seleccionadoshaciarabbitvcs-0.18/locale/fa/000077500000000000000000000000001362112712700152505ustar00rootroot00000000000000rabbitvcs-0.18/locale/fa/LC_MESSAGES/000077500000000000000000000000001362112712700170355ustar00rootroot00000000000000rabbitvcs-0.18/locale/fa/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000024541362112712700211560ustar00rootroot00000000000000x y      # *,Wgv +    %s - FinishedRepositoryVersion InformationCompleted UpdateEdit...EnglishLoading...Mime TypeNew Name:New...PathPropertiesRenameSizeUpdating...Project-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-03-14 15:29+0000 Last-Translator: Hamed Nemati Language-Team: Persian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %s - پایان یافتهمخزناطلاعات نسخهبه‌هنگام‌سازی کامل شدویرایش...انگلیسیدر حال بارگذاری...نوع مایمنام جدید:جدید...مسیرمشخصه‌هاتغییر ناماندازه‌در حال به‌هنگام‌سازی...rabbitvcs-0.18/locale/fi/000077500000000000000000000000001362112712700152605ustar00rootroot00000000000000rabbitvcs-0.18/locale/fi/LC_MESSAGES/000077500000000000000000000000001362112712700170455ustar00rootroot00000000000000rabbitvcs-0.18/locale/fi/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000036211362112712700211630ustar00rootroot00000000000000",/<  / :GXo v       "27<@C!'/ JTgx      !'8@Ufx} " ! ActionAddAuthorChangeCommitCopy URL to clipboardCopy to...Create PatchCreate folder...Creating Patch File...ExportExtensionFinishedLineLoading...MessageMime TypeMore Actions...Move to...New Location:New Name:NoPatch File CreatedPathRenameRevisionSave As...Select a FileSelect a FolderSizeTextYestoProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-09-02 20:14+0000 Last-Translator: Jani Välimaa Language-Team: Finnish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) ToimintoLisääTekijäMuutaToimitaKopioi URL leikepöydälleKopioi...Luo paikkatiedostoLuo hakemisto...Luodaan paikkatiedosto...VieLaajennusValmisRiviLadataan...ViestiMIME-tyyppiLisää toimintoja...Siirrä ...Uusi sijainti:Uusi nimi:EiLuotiin paikkatiedostoPolkuNimeä uudelleenRevisioTallenna nimellä...Valitse tiedostoValitse hakemistoKokoTekstiKylläkohderabbitvcs-0.18/locale/fr/000077500000000000000000000000001362112712700152715ustar00rootroot00000000000000rabbitvcs-0.18/locale/fr/LC_MESSAGES/000077500000000000000000000000001362112712700170565ustar00rootroot00000000000000rabbitvcs-0.18/locale/fr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000001115771362112712700212060ustar00rootroot00000000000000<)) )))))**)*<*Q*b* s* **2***;* +6+1Q+8++++,9,V,#s,,,,,(,2 -@-V-f-z-----O.^. w.6.1../$/=/T/e//////// 00&00W0j0000W0#17172rP2H2: 3G3g3m3}3 3 3 333 33 3 33 4(44 44 4/45-5H54]5?5655 6"?6#b6"6666 6666 67 7&7+7270N777.7778 8p8V8F8+919G9V9^9%d99999&999)9):4;:p:A:: :: ;;.;>;O;`;q;;;;;;;;<<(<9<K<\< w< <<<<<2< =2= Q=\=m=}===5==>> >> >4>R>b>~> >> >g>.?6? E?Q?`? o?|???? ????@&@ -@B9@ |@ @@@ @"@ @@@)AA-AoAAAA AAAAAAAAA AABB #B /BPBfB |BBBBB BB BB BBB CC C"&CICZC`CpCCCCCC CC CDD DD D .D8DIDNDdDkDDDDD D DDDDE E(E8EAEQEaE rE|E EE E E EE EEEEF F5FEF]FfF FFFFFF,F#G *G4GGGVGoG GGG&GGGGG H&H!7HYHiH*H6HHI II%*IPI`IwIIIIIIJ%J>JQJmJJJJJJ K$K=K BKMKaK jK2uK0K,KL L*L:LKLdLmL}LLLL&L( M2MQMdM!mMMMMMMMMM"M! NBN_N uN N NN NNN NN NAN-O*BO*mOOAO%O,P+LPAxPQP QQQ"Q%>QdQlQ sQ~QQQ$QQ7Q)R=RSR kRwRSTTTTT#TT$T$UDU `U!jU&U%U;UV-4V(bV(V VVJVWWW%W-W6W?WDWLWPWTWZWcWiWqWvWWWW=YCYLYRY[YoYYYYYYY Y ZZ;ZWZqZPZZZ3[MB[[[[[4[-0\)^\\\\\.\7]S]p]] ]]]] ^^"^ _?_8Y__ _4_``0`I`_`#n````` ``,aBa\a(zaaaia?bRcSUccL+d;xd!d ddde!e9eJeQeYe meee'e eef ff f7fg'3g%[gKgHg>h;Uh%h*h*h iii %i 3i=iFibi&qi iiii,iij77jojjjjjmPkSkll ;lHlQl,Yl l lll%l!l m-!mOm$em'm6m!m nn,n?nRncnrnnnnnnn oo.oGo\okooo!oo oo p"p"=p9`ppFpp q"q9q!OqqqJqqqqq qq)rEr'^rr*rrrr oszsssssss*tDt MtYtlt t2tt tKt9u BuLu0`u uu uuu.u\vdv{v vvvvvvvvvvvv) w'6w^wgw!xwww w www!wx (x 3xAxax zx xxxx-xx yy!-y Oy!py yyy yyyyy yyz z&z 1 ;G0^$)ʀ&$*@*k,#Á&..)]"%/Ђ"/#$Sx Ѓ310b"uʄ  -1-_3'<-&Tr&$ӆ&*>*i!χ  %05FLY[)*߈+ "6CY%0ÉAM6i6?8x  3Ӌ#G+9s!!όHEJ">Ϗ!+01\*2ʐ),'LT%-Ǒ&)FW^[ ǒВ ؒ    ,9H MZzE}4~8kpJn5L !_r[RUL-<]tjG CoX am9Yq@6 aib;tO*D"pOPu13^7i`l+Q/Vh&"y`S'efVMTj=m^|1dH>z0[u; gK(UXSvT{8>:J=]GA)% K# gPCEQ@MW}Fw_|\&y2{6rwN~!q.(.*Zs'%Axb)v? D3/?n7cH5#h$+xWo -z,FB dIl:B$ IfR 09ZN4cs<\eY,k2%I:%M%P%a %I:%M%p%b %d%b %d %Y%d minute(s) ago%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished(no date)100A conflict was found in the following file:Add MessageAdd TagAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Checker type:Clean your RepositoryCommit to:Configuration EditorConfigure the program to resolve conflicted files.Edit Property DetailsEnter Name and Email DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Ignore and exclude files from being trackedImport MessageLocale: Log MessagesLogging OptionsMark Conflict AsMemory usage: MessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsOther InformationPathPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProcess ID:Program used to compare filesProperties for:RabbitVCSRemote RepositoriesRemote URI:RepositoryReset your RepositoryRevision RangeRevisionRevisions TableTag DetailTagsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion Control SystemsWorking Copy:Working CopyHard - Matches the working tree and index to that of the tree being switched toMerge - Resets the index to match the tree recorded by the named commit, and updates the files that are different between the named commit and the current commit in the working treeMixed - Reset the index but not the working treeSelected properties will be applied recursively.Soft - Does not touch the index file or working tree at all, but requires them to be in good working orderAre you sure you want to delete %item%?RabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept MineAccept OnceAccept TheirsActionAddAdd EmblemAdd a new property.Add an emblemAdd line:Add to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply Patch...Apply property recursivelyApply remote changesApply remote changes prior to local changes (rebase)Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?Are you sure you want to delete %s?Authentication information clearedAuthorAuthor:BranchBranch/tag...Branch:BranchesBrowse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCancelCannot annotate a directoryChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyChecking out %s...CheckoutCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Choose this method if you wish to reintegrate a branch into the trunk.CleanClean up working copyCleaning Up...CleanupClearClear your authentication informationCloneClose this dialog.ColorCommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted CheckoutCompleted CleanCompleted CleanupCompleted CloneCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted Mark as ResolvedCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResetCompleted RevertCompleted RollbackCompleted StageCompleted UnlockCompleted UnstageCompleted UpdateCompleted repository setupConfig file:ConfirmationContent status:Copy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to clipboardCopy to clipboard the full data of these revisionsCopy to...Create Folder...Create Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeDateDate:DebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete property (recursive)Delete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Dry runEdit ConflictsEdit authorEdit author...Edit conflictsEdit detailsEdit log messageEdit log message...Edit revision properties...Email:Enable GitEnable SubversionEnable emblemsEnable file attributesEnable recursive status checksExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFetch from all remotesFetch/PullFile is not under version control.Fingerprint:FinishedForceForce an invalidate_extension_info() callFound %(changed)d changed and %(unversioned)d unversioned item(s)Found %d item(s)From:GeneralGet LockGet Lock...GitGraphHEADHelpHostHost:IgnoreIgnore ancestryIgnore file:Ignore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInitialize RepositoryInvalidateIssuer:Limit:LineList of comparison optionsLoad/RefreshLoadingLoading...Locally lock itemsLock FilesLockedLog - %sLog MessageLoggingMark ResolvedMark a conflicted item as resolvedMark as ResolvedMergeMerge AssistantMerge a range of revisionsMerge into local branchMerge two different treesMerge...MessageMessage:Mime TypeMinimum level to log:Move to...N/ANameName and EmailName:New Location:New Name:No active branchNoneNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a filePathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty EditorProperty StatusProperty status:Property:PushRabbitVCSRabbitVCS ErrorRabbitVCS GitRabbitVCS HgRabbitVCS SVNRealm:RecursiveRefreshRefresh InformationRefresh StatusRefresh the list of properties.Reintegrate a branchRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remote Repository ManagerRemotesRemove directoriesRemove ignored files, tooRemove only ignored filesRemove untracked files from the working treeRenameRename...Repository BrowserRepository URLRepository paths clearedRepository successfully createdRepository:ReservedResetReset current HEAD to specified state.ResolvedRestart CheckerRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert changes from this revisionRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Rollback To RevisionRollback to specified revision numberRolling Back...Running Add Command...Running Clean Command...Running Clone Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge Command...Running Merge TestRunning Relocate Command...Running Rename Command...Running Reset Command...Running Resolved Command...Running Revert Command...Running Stage Command...Running Unlock Command...Running Unstage Command...SSL Client CertificationSaveSave As...Save AuthenticationSave _AsSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSetting up repository...SettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow and edit property detailsShow changes against previous revisionShow changes between paths and revisionsShow changes between revisionsShow ignored filesShow logShow new version on the left sideShow unversioned filesShowing Revisions:SizeStageStatusStatus CheckerSteal the locksStep 1: Merge TypeStep 2: Merge a Range of RevisionsStep 2: Merge two different treesStep 2: Reintegrate a BranchStep 3: Final OptionsStop CheckerStop on copySwitch...TagTag ManagerTagger:TagsTest MergeTextText StatusThe debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The requested file or folder does not exist.There was a problem saving your properties.There was an error communicating with the status checker service.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUnresolvedUnstageUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate the selected path by reverse merging the changesUpdate the selected path to this revisionUpdate to revision...Update to this revisionUpdating...Use the following macros to configure the merge tool: %base - The common ancestor of the two files to be merged. %mine - The file you modified in your working copy. %theirs - The file being merged into your working copy. %merged - The file to store the merged result.Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.VCS:Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemWhat revision/branch do you want to checkout?Where do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must specify a version control system using the --vcs [svn|git] option_Back_Cancel_Close_Delete_Edit..._Forward_New_New..._No_OK_Open_Refresh_Save_Select_Yesjust nowthe selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: POT-Creation-Date: 2019-06-14 01:58+0200 PO-Revision-Date: 2019-06-14 13:08+0200 Last-Translator: Patrick Monnerat <.> Language-Team: French <.> Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1) X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Gtranslator 3.30.1 %H:%M%a %H:%M%d %b%d %b %YIl y a %d minute(s)%i jour%i jours%i heure%i heures%i minute%i minutes%i mois%i mois%i seconde%i secondes%i semaine%i semaines%i année%i années%s - Terminé(pas de date)100Un conflit a été trouvé dans le fichier suivant :Ajouter un messageAjouter un TagFicher(s) affecté(s) (double-clic pour comparer avec la version de base)AuthentificationDétails du certificatChanger le dépôt de votre copie de travailFichiers modifiés (double-clic pour comparer avec la version de base)Type de vérificateur:Nettoyer votre dépôtEnvoyer vers :Editeur de configurationConfigurer le programme pour résoudre les conflits.Éditer les détails de la propriétéVeuillez saisir votre nom et emailFichiers à verrouillerNom du dossierDepuis la révisionDepuis l'URLDepuis: (URL et révision à fusionner)Ignorer et exclure les fichiers à ne pas suivreMessage d'importationLocalisation: Messages du journalOptions de journalisationMarquer le conflit commeMémoire occupée : MessageRemarque : les modifications apportées aux propriétés sont appliquées immédiatement. Vous pouvez vérifier et annuler les modifications en utilisant le menu contextuel pour chaque élément. OptionsInformation complémentaireCheminMerci de décrire pourquoi vous verrouillez ces fichiersMerci de fournir vos fichier de certification sslMessages précédentsIdentifiant de processus;Programme utilisé pour comparer des fichiersPropriétés pour:RabbitVCSDépôts distantsURI distante :DépôtRéinitialiser votre dépôtGamme de révisionRévisionTableau de révisionsDétail du TagTagsVers la révisionVers: (URL et révision à fusionner)Historique des URLFusionner depuis l'URLSystèmes de contrôle de versionCopie de travail :Copie de travailFort - Faire correspondre les fichiers et l'index de la copie de travail à l'arborescence cibléeFusion - Réinitialiser l'index pour correspondre à l'arborescence enregistrée dans le commit sélectionné et mettre à jour les fichiers de la copie de travail à partir de ce dernierMixte - Réinitialiser l'index mais pas les fichiers de la copie de travailLes propriétés sélectionnées seront appliquées de manière récursive.Léger - Ne pas altérer l'index et les fichiers de la copie de travail, mais exiger qu'il soit en état de fonctionnementÊtes vous sur de vouloir supprimer %item%?Erreur RabbitVCSUn assistant de fusion en étapesÀ proposÀ propos de RabbitVCSAccepter définitivementAccepter le mienAccepter temporairementAccepter le leurActionAjouterAjouter un emblèmeAjouter une nouvelle propriétéAjouter un emblèmeAjouter une ligne :Ajouter à la liste de fichier ignorésAjouter un répertoire au dépotUne erreur s'est produite dans l'extension RabbitVCS de Nautilus. Merci de contacter l'équipe RabbitVCS en précisant les détails de l'erreur ci-dessous :AnnoterAnnoter - %sAnnoter un fichierAnnoter...Applique un fichier diff unifié de la copie de travailAppliquer le correctif...Appliquer la propriété récursivementAppliquer les modifications distantesAppliquer les modifications distantes avant les changements locaux (rebase)Êtes vous sur de vouloir nettoyer vos informations d'authentification ?Êtes vous sur de vouloir nettoyer les messages précédents ?Êtes vous sur de vouloir nettoyer les chemins du dépôt ?Êtes vous sur de vouloir continuer ?Êtes-vous sûr de vouloir supprimer %s ?Informations d'authentification nettoyéesAuteurAuteur :BrancheBranch/tag...Branche :BranchesNavigateur de référentielParcourir dansNaviguez vers un fichier ou un dossierParcourir...BugsAnnulerImpossible d'annoter le dossierChanger l'emplacement d'une copie de travailVérifier le certificatVérifier les modifications ...Vérifiez les modifications apportées au référentielObtenir une copie de travailMise à jour %s...CheckoutMettre à jourChoisissez cette méthode si vous avez effectué des changements sur une branche et que vous souhaitez fusionner ces changements avec une autre branche.Choisissez cette méthode si vous souhaitez fusionner deux branches différentes dans votre copie de travail.Choisissez cette méthode si vous souhaitez réintégrer une branche dans le tronc.NettoyerNettoyer votre copie de travailNettoyage...NettoyerEffacerNettoyer vos informations d'authentificationDupliquerFermer cette boîte de dialogue.CouleurEnvoyerEnvoyer les modifications au dépôt.Comparer des fichiers ou dossiersComparer les révisionsComparer les différences entre deux fichiersComparer avec la baseComparer côte à côte avec la baseComparer avec la révision précédenteComparer côte à côte avec la révision précédenteComparer avec la copie de travailAjout terminéCheckout terminéNettoyage terminéNettoyage terminéClonage terminéEnvoi terminéExportation terminéeImportation terminéeVerrouillage terminéRésolution terminéeFusion terminéeTest de fusion terminéRelocalisation terminéeRenommage terminéReset terminéRétablissement terminéAnnulation terminéeStage terminéDéverrouillage terminéUnstage terminéMise à jour terminéeMise en place du dépot terminéeFichier de configuration :ConfirmationStatut du contenu :Copier depuis le cheminCopier depuis la révisionCopier l'URL dans le presse-papierCopier un objet vers un autre emplacement dans le dépôtCopier dans le presse-papierCopier les données complètes de ces révisions dans le presse-papierCopier vers...Créer un dossier…Créer un correctif...Créer un dépôt iciCréer un dépôt dans un dossierCréer un dossier...Crée un fichier diff unifié avec tous les changements que vous avez faitDateDate :DebugDebug inverséSupprimerConfirmation de la suppressionSupprimer les propriétés récursivementSupprimer la propriétéSupprimer récursivement la propriétéSupprimer cette propriétéSupprimer récursivement cette propriétéRefuserMenu des différences...Voulez-vous supprimer les propriétés sélectionnées de l'ensemble des fichiers et des sous-répertoires sous ce répertoire ?SimulationEditer les conflitsEditer l'auteurEditer l'auteur...Modifier les confitsModifier les détailsEditer le message de journalEditer le message de journal...Editer les propriétés de la révision...E-mail :Activer GitActiver SubversionActiver les emblèmesActiver les attributs de fichierActiver les vérifications récursives des statutsExporterExporter - %sExporter une copie de travail ou un dépôt sans information de versionnageExporterExtensionProgrammes externesAller chercher dans toutes les sources distantesFetch/PullLe fichier n'est pas versionnéEmpreinte :TerminéForcerForcer un appel à invalidate_extension_info()%(changed)d éléments modifiés et %(unversioned)d éléments non-inclus ont été trouvés%d objet(s) trouvé(s)Depuis :GénéralObtenir le verrouObtenir le verrou...GitGrapheHEADAideHôteHôte :IgnorerIgnorer l'ascendanceIgnorer les fichiers :Ignorer un élément par extension du nomIgnorer un élément par nom de fichierImporterImportation - %sImporter un objet dans un dépôtInclure les fichiers ignorésInitialiser le dépotInvaliderÉmetteur :Limite:LigneListe des options de comparaisonsCharger/RafraîchirChargementChargement...Verrouiller localement un objetVerrouiller les fichiersVerrouilléJournal - %sMessage du journalJournalisationMarquer comme RésoluMarquer un conflit sur un objet comme résoluMarquer comme RésoluFusionnerAssistant de fusionFusionner une gamme de révisionsFusionner dans la branche localeFusionner deux arbres différentsFusion...MessageMessage:Type MIMENiveau minimum à journaliser:Déplacer vers...N/ANomNom et E-mailNom:Nouvel emplacement :Nouveau nom :Pas de branche activeAucunMessages de notificationNuméroNombre d'URL à retenirNombre de messages à retenirOmettre les externesEnregistrer seulement la fusionOuvrirOuvrir un terminalOuvrir un fichierRépertoireChemin :Messages précédentsMessages précèdents nettoyésPropriétésPropriétés - %sPropriétéÉditeur de propriétéÉtat de la propriétéEtat de la propriété:Propriété :PushRabbitVCSErreur RabbitVCSRabbitVCS GitRabbitVCS HgRabbitVCS SVNDomaine:RécursifRafraîchirActualiser les informationsRafraîchir le statutRafraîchir la liste de propriétés.Réintégrer une brancheRelâcher le verrou...Relâcher le verrou d'un objetRelocaliserRelocaliser votre copie de travailRelocalisation…Gestionnaire de Dépôts à distanceDistantsEnlever les répertoiresEnlever aussi les fichiers ignorésN'enlever que les fichiers ignorésEnlever les fichiers non-versionnés de la copie de travailRenommerRenommer...Navigateur de dépôtURL du dépôtChemins du dépôt nettoyésDépôt créé avec succèsDépôt :RéservéResetRétablir l'état de la tête (HEAD) à l'état spécifié.RésoluRedémarrer le vérificateurRestaurerRestaurer un fichier manquantRétablirRétablir un objet à son état non modifiéDéfaire les modifications à partir de cette révisionRétablir la propriétéRétablir la propriété (récursive)Rétablir la propriété à son état d'origineRétablir récursivement la propriété à son état d'origineRétablir tout ce qu'on voitRévisionRévision :Retour à la RévisionRetour en arrière vers la révision spécifiéeRetour en arrière...Exécution de la commande d'Ajout...Exécution de la commande de nettoyage...Execution de la commande de clonage...Exécution de la commande d'Envoi...Exécution de la commande d'exportation...Exécution de la commande d'importation...Exécution de la commande de verrouillage...Exécution de la commande de fusionExécution de la commande de fusion...Exécution du test de fusion...Exécution de la commande de relocalisation...Exécution de la commande de renommage...Exécution de la commande Reset...Exécution de la commande Resolved...Exécution de la commande de rétablissement...Exécution de la commande Stage...Exécution de la commande de déverrouillage...Exécution de la commande Unstage...SSL Client CertificationSauvegarderEnregistrer sous...Sauvegarder l'authentificationEnregistrer _Sous...Données sauvegardéesPlanifier la suppression d'un objet dans le dépôtPlanifier le renommage d'un objet dans le dépôtAjouter au dépôtTous sélectionner/déselectionnerSélectionnez un fichierSélectionnez un dossierSélectionnez un programmeMise en place du dépot...ParamètresVoir le journalConsulter le journalAfficher les outils de débogage de RabbitVCSMontrer le journal d'information d'un fichierAfficher et modifier les détails de la propriétéComparer avec la révision précédenteAfficher les changements entre les chemins et les révisionsMontrer les différences entre les révisionsMontrer les fichiers ignorésConsulter le journalAfficher la nouvelle version à gaucheMontrer les fichiers non versionnésConsulter une révisions:TailleStageÉtatVérificateur d'étatVoler le verrouEtape 1: Type de fusionEtape 2: Fusionner une gamme de révisionsEtape 2: Fusionner deux arbres différentsEtape 2: Réintégrer une brancheEtape 3: Options finalesArrêter le vérificateurStopper à la copieBasculement...TagGestionnaire de TagsEtiquetterTagsTester la fusionTexteÉtat du texteLe menu Déboger est utilisé pour diagnostiquer des problèmes avec RabbitVCS elle-mêmeLes champs 'depuis' et 'URL' sont requis.Le champ 'depuis la révision' est requis.Les objets seront envoyés à la corbeille.Le champ 'nouveau nom' est requit.Les champs 'URL du dépôt' et 'chemin de destination' sont requis.Le champ 'URL du dépôt' est requit.Le fichier ou répertoire demandé n'existe pas.Une erreur est survenue durant la sauvegarde de vos propriétés.Il y a eu une erreur de communication avec le service vérificateur d'états.Une erreur c'est produite durant la création du dépôt. Veuillez vérifier que le répertoire est vide.Vers :Type:URL :Impossible de récupérer les propriétés de la listeImpossible de définir une nouvelle valeur pour la propriété.InconnuDéverrouillerNon-résoluUnstageMettre à jourMettre à jour vers la révisionMettre à jour un fichier vers une version préciseMettre à jour une copie de travailMise à jour du chemin sélectionné par fusion inverse des changementsMise à jour du chemin sélectionné vers cette révisionMettre à jour à la révision...Mise à jour vers cette révisionMise à jour...Utiliser lea macros suivants pour configurer l'outil de fusion: %base - L'ancêtre commun aux deux fichiers à fusionner. %mine - Le ficher modifié dans votre copie de travail. %theirs - Le fichier à fusionner avec votre copie de travail. %merged - Le fichier dans lequel stocker le résultat de la fusion.Utilisez le journal de dialogue pour sélectionner la/les révision(s) que vous souhaitez fusionner. Ou écrivez la/les révision(s) manuellement, séparée(s) par des virgules. Vous pouvez spécifier une gamme de révision par un tiret. Example: 4-7,9,11,15-HEAD Pour fusionner toute les révisions, laissez le champ vide.VCS:Valide:ValeurValeur:Voir les différences avec la baseVoir les différences par rapport à la révision précédenteComparer avec la copie de travailVoir une comparaison côte à côte du diffVoir les différences entre les fichiers/dossiersVoir les différences entre les révisionsConsulter l'aideConsulter ou modifier les paramètres de RabbitVCSVoir les différences entre deux fichiersVoir les modifications faites sur un fichierVoir les modifications apportées à un fichier depuis le dernier changementConsulter les propriétés d'un objetQuelle branche/révision voulez-vous copier ?Où voulez-vous copier la sélection ?Où voulez-vous déplacer la sélection ?Copie de travailOuiVous devez définir un système de contrôle de versions en utilisant l'option --vcs [svn|git]En A_rriére_Annuler_Fermer_Supprimer_Éditer...En A_vant_Nouveau_Nouveau..._Non_OK_Ouvrir_Rafraîchir_Sauvegarder_Sélectionner_OuiÀ l'instantle(s) objet(s) sélectionné(s)versrabbitvcs-0.18/locale/he/000077500000000000000000000000001362112712700152565ustar00rootroot00000000000000rabbitvcs-0.18/locale/he/LC_MESSAGES/000077500000000000000000000000001362112712700170435ustar00rootroot00000000000000rabbitvcs-0.18/locale/he/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000115671362112712700211710ustar00rootroot00000000000000Ida0 1?FJ ]?k65"; BLhw   *AFMU \ hr{    $ , 4 = T n       ) : C H $T y %  #    + U Wq S "@ I0W   *"Dg      (C JUen~  $   # .!;!]!!!*&7Wk0!& @NSrDB);-F=6. C7&+ ,(%>153H'?0 8 @E#$< 2"G:9 *!A/I4%s - FinishedActionAddAdd to ignore listAnnotate - %sAre you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Authentication information clearedAuthorBrowse toCannot annotate a directoryCleaning Up...CleanupCommitCompleted AddCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted RelocateCompleted RenameCompleted UpdateCreate PatchCreating Patch File...DateDeleteEnglishExportExport - %sExtensionFinishedFound %d item(s)Get LockImportImport - %sLineLoading...LockedMessageOpenPathPrevious messages clearedProperty StatusRelocateRenameRepository paths clearedResolveRestoreRevisionRunning Add Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Relocate Command...Running Rename Command...Running Resolve Command...Select a FileSelect a FolderSelect a programShow logTextText StatusThe given path is not a working copyThe new name field is requiredThe repository URL field is required.Updating...YesYou must supply a destination path.toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %s - הסייםפעולההוספההוספה אל רשימת ההתעלמותהערה - %sהאם אתה בטוח שבצרונך למחוק את נתוני האימות שלך?האם אתה בטוח שברצונך למחוק את ההודעה הקודמת שלך?האם אתה בטוח שברצונך למחוק את נתיבי המאגר שלך?נתוני האימות נמחקויוצרסייר אללא ניתן לכתוב הערה לספרייהמנקה...ניקיוןשליחהההוספה הסתיימההניקיון הסתייםשליחה הושלמהייצוא הושלםייבוא הסתייםנעילה הסתיימההמיקום מחדש הסתייםשינוי השם הושלםהעדכון הושלםיצירת תיקוןיוצר קובץ תיקון...תאריךמחיקהאנגליתייצואייצוא - %sסיומתהסתייםנמצאו %d פריטיםנעלייבואייבוא - %sשורהבטעינה...נעולהודעהפתיחהנתיבההודעה הקודמת נמחקהמצב הגדרהמקם מחדששנה שםנתיבי המאגר נמחקופתורשחזורמהדורהמריץ פקודת הוספה...מרית פקודת שליחה...מריץ פקודת ייצוא...מריץ פקודת ייבוא...מריץ פקודת נעילה...מריץ פקודת מיקום מחדש...מריץ פקודת שינוי שם...מריץ פקודת פתור...בחירת קובץבחירת ספרייהבחירת תוכנההצגת דיווחטקסטמצב טקסטהנתיב שניתן אינו העתק פועלשדה השם הינו הכרחישדה כתובת המקור נדרש.מעדכן...כןיש לספק נתיב יעד.אלrabbitvcs-0.18/locale/hr/000077500000000000000000000000001362112712700152735ustar00rootroot00000000000000rabbitvcs-0.18/locale/hr/LC_MESSAGES/000077500000000000000000000000001362112712700170605ustar00rootroot00000000000000rabbitvcs-0.18/locale/hr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000645301362112712700212040ustar00rootroot00000000000000~   & 9 N _ p ~  ;   1!84!m!!!!!!(!" ("5"I"`"o""-"6-#1d##$####$!$7$G$^$&q$$$$$$7%H@%-%:%%&&(& 7&C&J& N&Y& m&{& &&B' K'Y' i'/u' '''''?(6N(5("(("()) ) +)9) R)\) w))))0))).*6*O* X* f*pr*V*:+P+_+2g+%+++&+,,),)>,h,4z,,A,- *-8-M-`-r---------. .1.B. S.`.o..2. .. ..//;/5L//// ////// 000 50gB0 0000011141S1[1 b1Bn1 1 11"1 12)2:2K2Q2Y2 b2n2s2x2~2222 2 22 33 !3+32373 R3 _3j3 }3333 333"3333 4%4.4 64@4U4 e4p4t4 y4 4444444455 5 '535L5 f5p555555 555566 !6 +656E6 L6V6^6m66666 66 66 7"7B7K7S7[7r7&y777*767.8I8 R8\8s8888889)9<9X9r99999 99 :2:0Q:,:: ::::: ;;5;(S;|;;;;;;; ;; ; << < $<0<A8<-z<*<$<*<#=AB=%=,=+=Q>U>Y> _>i>"n>%>>>>>$>?? 1?=?8@?@E@L@#c@@$@@@ A!A&3A%ZA;AAA(A(B ?BLB#PBtBBBDDDD E5EUEsEEE<EEE+ F=9FwF F!FFFF'G(G;GLGcG GGH61H7hH4HH$HI&I7ILI^IuIII'IIIJ%J:J9NJGJ-J<J!;K ]KhK}KKKK KKKKLtL L LL L:L MM8MKMhM>{M=M8M 1NRN"ZN}NN NNN NN NNN O,#OPOdO)xOOOO OfOUBPPPP@P%Q+QQRT UU#U4UPUXUiUUU UUUXU @VMV]VsVVVVV#VVW W>WXW aWmW,~W W W+WWX X X X ,X6X =XJX]X|XX XXXX XX YYY-Y6YEY`Y tYY YYYY%YYYZZ2Z;ZBZKZeZ uZZZZ ZZZZZZZ["[;[B[Z[j[[[[[[[[[\ \\(\:\M\ ]\ g\q\ \ \\\\ \\ \,\ ]-]=]N]d] ] ] ]]] ])] ^&%^'L^3t^$^^ ^ ^^__3_E_^_p______`!`<` U`c`x`1`.`*`a6a GaTafaoaa:a,a*a!'bIbZbxb bbbbb b bbb b cAcWc%rc c(cc4d!5d&Wd ~d^dde ee)e1Ae se }e ee'eee ef g g g!g#?g)cgg&g!gg)h'*hRh.lhhhh"h ii"i?iUiJtbz<n,FA?hlE>_UZ@A,NCRwIDx`y%T{2b4v"ovpD4Q'.]&*_s%\ HGMo;{$?Rx $|y}S^S/ (w9k7:![>3caZ = W3V\t#js7(k~E5c); BQ eT. 0}rfgVWMzK|ui HXhq#0]U*rd+ lL5 a:P-qmB)'CJ`PF<iNO8L&m^!YI6pd-=fYX~K+1Gj9/g" u@6O1n8e[2%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-04-10 08:37+0000 Last-Translator: Vedran Miletić Language-Team: Croatian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i dan%i dana%i dana%i sat%i sati%i sati%i minuta%i minute%i minuta%i mjesec%i mjeseci%i mjeseci%i sekunda%i sekunda%i sekundi%i tjedan%i tjedana%i tjedana%i godina%i godina%i godina%s - Završeno100Dodaj porukuDatoteka(e) promjene (dvoklik za usporedbu s osnovom)Prijava korisnikaDetalji o certifikatuPromijeni skladište za radnu kopijuPromijenjene datoteke (dvoklik za usporedbu s osnovom)Pohrani u:Uredi vrijednost svojstvaDatoteke za zaključavanjeIme mapeOd inančiceOd URL-aDo: (URL i inačica za stapanje)Uvoz porukePoveznicePoruke dnevnikaMogućnosti dnevnikaPorukaNapomena: promjene svojstava se primjenjuju odmah. Možete provjeriti i poništiti promjene koristeći skočni izbornik za svaku stavku. MogućnostiMolim dopunite svojim autentikacijskim podacimaMolim opišite zašto zaključavate ove datotekeMolimo, postavite dateteku s ssl certifikatomPrethodne porukeProgram za usporedbu datotekaSvojstva za:RabbitVCSUdaljeni URI:SkladišteRaspon inačicaInačicaTablica inačicaDo inačiceDo: (URL i inačica za stapanje)URL PovijestURL od kojeg stapamoInformacija o verzijiRadna kopija:Radna kopijaOdabrana svojstva biti će primijenjena ponirući.Da li sigurno želite obrisati %item%?RabbitVCSRabbitVCS greškaČarobnjak s koracima za stapanjeO programuO RabiitVCS programuPrihvati za stalnoPrihvati za ovaj putAkcijaDodajDodaj oznakuDodaj novo svojstvoDodaje oznaku ikoneDodaj na listu zanemarenihMapa je dodana u skladišteDogodila se greška u RabbitVCS Nautilus proširenju. Molimo javite RabbitVCS timu detalje greške:PribilježiOznači - %sDodaj bilješke datoteciOznači...Primijenjuje datoteku objedinjenih razlika na radnu kopijuPrimijeni zakrpuPrimijeni zakrpu na mapu...Primjeni zakrpu...Primijeni svojstvo ponirućiPrimjena zakrpe...Da li sigurno želite očistiti vaše autentikacijske podatke?Da li se sigruni da želite očistiti vaše prethodne poruke?Da li ste sigurni da želite očistiti staze skladišta?Da li sigurno želite nastaviti?PrijavaAutentikacijski podaci očišćeniAutorAutori:Grana/oznakaGrana/oznaka...Pregledaj stablo skladištaPregledajPregledaj datoteku ili mapuPregledaj...GreškeNe možete označiti mapuPromijeniZamijeni sidrište radne kopije u skladištuProvjeri certifikatProvjeri izmjene...Provjeri izmjene napravljene u skladištuPreuzmi radnu kopijuPreuzmiPreuzimanje - %sPreuzmi..-Odaberite ovu metodu ako imate neke promjene u grani i želite stopiti svoje promjene s drugom granom.Odaberite ovu metodu ako želite stopiti dvije različite grane u vašu radnu kopiju.Očisti radnu kopijuČišćenje...OčistiPotrebno je čišćenje... Da li želite pokrenuti čišćenje?Izbriši podatke za prijavu korisnikaZatvori dijalog.PohraniPohrani izmjene u skladišteUsporedi datoteke/mapeUsporedi inačiceUsporedi jedno do drugogUsporedi razlike između dvije stavkeUsporedi s osnovnomUsporedi s osnovom koristeći usporedni alat (jedan do drugog)Usporedi s prethodnom inačicomUsporedi s prošlom revizijomUsporedi s radnom kopijlomZavršeno dodavanjeZavršena izrada grane/oznakePreuzimanje završenoZavršeno čišćenjePohrana završenaIzvoz završenZavršen uvozZaključanoStapanje završenoZavršen test stapanjaZavršeno premještanjePromjena naziva završenaRazriješavanje završenoVraćanje završenoZamjena izvršenaOtključavanje završenoAžuriranje završenoPotvrdaKopiraj sa stazeKopiraj iz inačiceKopiraj URL u spremnikKopiraj stavku na drugo mjesto unutar skladištaKopiraj u...Izradi mapu...Izradi zakrpuNapravi zakrpu...Ovdje napravi skladišteNapravi skladište u mapiNapravi mapu...Napravi objedinjenu datoteku razlika sa svim vašim promjenamaIzrada zakrpe...DatumPronađi greškuPronađi greške u povratkuObrišiPotvrda brisanjaObriši svojstva ponirućiObriši svojstvoObriši ovo svojstvoObriši ovo svojstvo (poniruće)UskratiIzbornik razlika...Želite li obrisati označena svojstva iz svih datatoteka i poddirektorija u ovoj mapi?Uredi autoraUredi autora...Uredi poruku dnevnikaUredi poruku dnevnika...Uredi svojstva revizije...Uredi...Omogući oznakeOmogući svojstva datotekaOmogući poniruću provjeru statusaEngleskiIzvozIzvoz - %sIzvezi radnu kopiju ili skladište bez informacije o verzijamaIzvoz…ProširenjeVanjski programiDatoteka nije pod sustavom kontrola verzija.Otisak prsta:ZavršenoPrinudno pozovi invalidate_extension_info()Pronađeno %d stavakaOd:OpćenitoZaključajZaključaj...najnovijePomoćPoslužiteljZanemari porijekloZanemari stavku prema nastavkuZanemari predmet po imenuUveziUvezi - %sUvezi stavku u skladišteUključi zanemarene datotekeUčini nevažećimIzdavač:Jezik:Ograničenje:RedakPopis opcija usporedbeOsvježiUčitavanje...Lokalno zaključava stavkeZaključaj datotekeZaključanoDnevnikDnevnik - %sKomentar za dnevnikPisanje dnevnikaLogin:Označi razriješenom stavku u sukobuStopiPomoćnik stapanjaStopi raspon inačicaStopi dva različita stablaStopi...PorukaMime tipNajmanja razina logiranjaViše akcija...Premjesti...Nije primjenjivoNazivNova lokacija:Novo ime:Novo...NeObavijesne porukeBrojBroj zapamćenih URL-ovaBroj spremljenih porukaPreskoči vanjska skladištaSamo zabilježi stapanjeOtvoriOtvori komandni prozorOtvori datotekuOtvori iz prve revizijeOtvori iz druge revizijeZaporka:Zakrpa primijenjenaZakrpa napravljenaStazaPutanja:Prethodne porukePrethodne poruke očišćeneSvojstvaSvojstva - %sSvojstvoPromjena svojstvaEditor za svojstvaStatus svojstvaSvojstvo:RabbitVCSRabbitVCS greškaPodručje:PonirućiOsvježiOsvježi statusOsvježi popis svojstava.Oslobodi...Otključaj stavkuPremjestiPremjesti radnu kopiju na drugi poslužiteljPremjesti...Promijeni nazivPromijeni ime...Preglednik skladištaSkladišne staze očišćeneSkladište uspješno napravljenoRezerviranoRazriješiVratiVrati nedostajećeVrati izvornoVrati na staro stavku - poništi promjenePoništi promjene svojstvaPoništi promjene svojstva (poniruće)Vrati vrijednost svojstva na originalnuVrati vrijednost svojstva na originalnu (poniruće)Povrati na staro sve što pronađešInačicaRevizija:Dodavanje...Izrada grane/oznakePreuzimanje u tijeku...Pohranjivanje u tijeku...Izvoz u tijeku...Izrada uvoza u tijeku...Zaključavanje...Izvršavanje stapanjaTestiranje stapanjaIzvršava se premještanje...Promjena naziva u tijeku...Izvršavanje razriješavanja...Izvršavanje vraćanja....Zamijena u tijekuOtključavanje u tijeku...SSL Client CertificationSpremi kao...Spremi autentikacijuSpremljeni podaciPripremi stavku kako bi se obrisala iz skladištaPriloži stavku za promjenu imena u skladištuRasporedi stavke za dodavanje u skladišteOznači sve / Makni sve oznakeOdaberi datotekuOdaberi mapuOdaberite programPostavkePokaži promjene...Prikaži dnevnikPrikaži RabbitVCS alate za traženje grešaka (debugging)Pokazuje informacije iz dnevnika za datotekuPrikaži promjene između staza i revizijaPogledaj razlike između revizijaPrikaži dnevnikPrikaži datoteke bez verzijePrikazuje inačice:VeličinaStatusPreuzmi lokoteZaustavi se na kopiranjuZamijeniZamijeni...Test stapanjaTekstPromjena tekstaStatus tekstaZahvale:Debug izbornik se koristi za traženje grešaka unutar RabbitVCSaPolja url-ova su obavezna.Polje inačice treba sadržavati brojOdabrana staza nije radna kopijaStavke će biti biti prebačeni u smećePolje novog imena je obaveznoURL skladišta i odredišna staza su obavezna polja.URL skladišta je obavezno polje.Lokacija skladišta je obavezno polje.Snimanje svojstava nije uspjelo.Dogodila se pogreška prilikom kreiranja skladišta. Provjerite da li je odabrana mapa prazna.Do:Tip:URL staza:URL:U nemogućnosti pribaviti popis svojstavaNije moguće postaviti novu vrijednost stvojstva.NapoznatoOtključajAžurirajAžuriraj na inačicuObnavlja datoteku na određenu revizijuObnovi radnu kopijuObnovi na reviziju...Ažuriram...Koristite dnevnik za odabir revizija koje želite stopiti. Možete i upisati revizije odvojene zarezima, a raspon revizija je moguće upisati koristeći crticu '-'. Primjer: 4-7,9,11,15-HEAD Za stapanje svih revizija, polje ostavite nepopunjeno.Ispravno:VrijednostVrijednost:Prikaži razliku prema osnoviPogedaj razliku od prošle inačicePogledaj razliku u odnosu na radnu kopijuPogedaj razliku usporednoPogledaj razlike između datoteka/mapaPogledaj razliku između inačicaPogledaj pomoćPogledaj ili promijeni RabiitVCS postavkePogledaj razliku između dvije datotekePogledaj izmjene datotekePogledaj izmjene u datoteci od zadnje promjenePogledaj svojstva stavkeVidi ukupnu razlikuGdje želite kopirati odabrano?Gdje želite premjestiti odabrano?Radna verzijaDaTrebate odabrati odredišnu stazu.odabrana(e) stavka(e)dorabbitvcs-0.18/locale/hu/000077500000000000000000000000001362112712700152765ustar00rootroot00000000000000rabbitvcs-0.18/locale/hu/LC_MESSAGES/000077500000000000000000000000001362112712700170635ustar00rootroot00000000000000rabbitvcs-0.18/locale/hu/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000643011362112712700212030ustar00rootroot00000000000000  0 1 B Q b w      !!+!!! !!" """" &" 1" ?"I"\" b"" #$# 4# @#/J# z####?#6$5?$"u$#$"$$$$$ % %%%%.% G%Q%l%q%%0%%%.%&0&C& L& Z&f&l&&&& &&&&&&&')'G'4Y''A'' ( (!(6(I(Y(k({(((((((( ))0)@)Q)d)t))))) ) )))**2+*^*2p* * ****+5+I+`+e+k+ q+~++++ ++ +g+ d,p,, ,,,,, ,B, 2- <-F- O- [- i- w-"--)--- --. ....2. F.S.l... . . .. .//#/ >/I/\/c/ l/"x/////// //// / 0 00 0 &00030D0U0 \0g0 l0 w000 000000 11+1;1K1P1 Y1 e1 s1 1 1 1 111111 22 12=2W2_2 f2p2y2222 2222233 3&'3!N3p33*36334"4 +454J4Z4q4444445+5C5Y5r5555556"6;6U6o66 62606,6+7 27@7P7a7v777777&7(8>8]8s8x88 888 88 8888 8-8*9$29W95v9A9%9,:,A:+n:A:Q:".;%Q; w;;;;;;;$;;7;).<X<n<< <<<#<<$<=?= [=!e=&=%=;=>/>A>-V>(>(> >>J>#2?V?_?t?w?A AAAA AA AAB B!B9BUB kBxBC6COC_CtC}CC CCCC)C D#D>D DD DEBEbE)}EE"E=E5&F6\FF&F%FFGG GG0GBGGGMG gG!tG G*G G8G HH4>HsHH HHH HHH I I I+I 1I%MdM yM MMMM1MNA-N oN|NNN'NNRO"aOOO OOOO$OO)P DPNPjiPPPQQ7QTQ)tQQ QKQ Q RRR2RNR cR(nR RLRR S SS S%S,S1S%7S]SzS(S.S%S T T%TDTVTrT!TT&T TTT U U:UZU vUU UUU U U UUUUUU V VVV.VBVHV]VeV}VV VVV W)W>WGWaWpWWWW W W W W W W X X"X5XJXeX$|X XXXXX YY Y)Y ?YLYhYY Y YYY"YYY?Z1DZvZ.Z(ZJZ8[H[ g[ q[|[[[[[[\5\O\k\\\\\\\]4]O]g]]]]]]]+].'^.V^ ^^^^^^ __5_#F_,j_0_;_.`3`R`Y`b` h`t` }``` ` ````4`*a+;aga2aAaa,b&Ab0hbNbLb*5c5`c c cccc cc-c"dD>d3ddd dde$e04e,ee=e3e,f1f9Hf,f)f@f*g"Eg"hg-g%g(ghhTh$qh hhh3*)M&JfYKZ:=F}O9L1 ~U@8$3>d_l>iN4!6I8A[KVT,H%U\X`2oY.xy?#ezc,.B "6}p"rHt!C~Jvfh`(Fy*n 0[gpGZDk 5Pu:wMsq;%A'c9n<T /IW-)7eE$R@{X]x+a\4Lrmtu P^Nm|CqQ^jBhl E = ogkG#;&W{<w5dbsQ- 2R V?71'biD/aOSS0j_(] |+zv%d minute(s) ago%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished(no author)(no date)Add BranchAdd TagBranch DetailBranchesNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. Remote RepositoriesTag DetailTagsA wizard with steps for mergingAboutAbout RabbitVCSActionAddAdd EmblemAdd an emblemAdd line:Add to ignore listAddedAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:Annotate - %sAnnotate a fileAnnotate...AnnotatedApplies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Applying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?Are you sure you want to delete %s?Authentication information clearedAuthorAuthor:BranchBranch ManagerBranch/tagBranch/tag...Branch:BranchesBrowse a repository treeBrowse toBrowse to a file or folderBugsCannot annotate a directoryChangeChange the repository location of a working copyChangedCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyChecking out %s...CheckoutCheckout - %sCheckout...CleanClean up working copyCleaning Up...CleanupCloneClose BranchColorCommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompletedCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanCompleted CleanupCompleted CloneCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted Mark as ResolvedCompleted MergeCompleted Merge TestCompleted PushCompleted RelocateCompleted RenameCompleted ResetCompleted RevertCompleted RollbackCompleted StageCompleted SwitchCompleted UnlockCompleted UnstageCompleted UpdateCompleted repository setupConfig file:ConflictedCopiedCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to clipboardCopy to clipboard the full data of these revisionsCopy to...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDate:DebugDebug RevertDeleteDelete propertyDelete property (recursive)Delete this propertyDelete this property (recursive)DeletedDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit conflictsEdit detailsEdit log messageEdit log message...Edit revision properties...ExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternalFailed LockFailed RevertFailed UnlockFetch/PullFile is not under version control.FinishedForce an invalidate_extension_info() callFound %d item(s)Get LockGet Lock...GraphHEADHelpHostHost:Ignore by File ExtensionIgnore by File NameIgnore file:Ignore item by extensionIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInapplicableInitialize RepositoryInvalidateKeep old branch's historyLineList of comparison optionsLoading...Locally lock itemsLockedLog - %sLog MessageMark a conflicted item as resolvedMark as ResolvedMergeMerge...MergedMessageMessage:Mime TypeMissingModifiedMore Actions...Move to...N/ANameName:New Location:New Name:NoNo active branchNo commits foundNumberObstructedOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPatch FailedPatch File AppliedPatch File CreatedPatchedPathPrevious messages clearedPropertiesProperties - %sProperty ChangeProperty StatusPushRVCS AgeRVCS AuthorRVCS RevisionRVCS StatusRabbitVCSRabbitVCS GitRabbitVCS HgRabbitVCS SVNRabbitVCS status forRefresh StatusRejected PatchRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remote Repository ManagerRemotesRenameRename...ReplacedRepository BrowserRepository URLRepository paths clearedRepository successfully createdRepository:ReservedResetResolvedRestoreRestore a missing itemRestoredRevertRevert an item to its unmodified stateRevert changes from this revisionRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)RevertedReverts everything it seesRevisionRevision:Rollback To RevisionRolling Back...Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Clean Command...Running Clone Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge Command...Running Merge TestRunning Push Command...Running Relocate Command...Running Rename Command...Running Reset Command...Running Resolved Command...Running Revert Command...Running Stage Command...Running Switch Command...Running Unlock Command...Running Unstage Command...SaveSave As...Schedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelectSelect a FileSelect a FolderSelect a programSet as active branchSetting up repository...SettingsShow Changes...Show LogShow a file's log informationShow and edit property detailsShow changes against previous revisionShow changes between paths and revisionsShow changes between revisionsSimple status checkerSizeSkippedStageStart Point:StatusSwitchSwitch...TagTag ManagerTagger:TagsTextText StatusThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe new name field is requiredThe output from '%s' was not able to be processed. %sThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.The requested file or folder does not exist.There was a problem saving your properties.There was an error communicating with the status checker service.There was an error creating the repository. Make sure the given folder is empty.Unable to retrieve properties listUnable to set new value for property.UnchangedUnknownUnlockUnlockedUnstageUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate the selected path by reverse merging the changesUpdate the selected path to this revisionUpdate to revision...Update to this revisionUpdatedUpdating...ValueView diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffView unified diff(s)What revision/branch do you want to checkout?Where do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must specify a version control system using the --vcs [svn|git] optionYou must supply a destination path.just nowthe selected item(s)toProject-Id-Version: rabbit-vcs 0.17.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2018-02-08 20:40+0100 PO-Revision-Date: 2018-02-10 21:00+0100 Last-Translator: csola48 Language-Team: hungarian Language: hu_HU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Poedit 1.8.7.1 X-Poedit-SourceCharset: UTF-8 X-Poedit-Basepath: .. X-Poedit-SearchPath-0: . %d perce%i nap%i nap%i óra%i óra%i perc%i perc%i hónap%i hónap%i mp%i mp%i hét%i hét%i év%i év%s - Befejezve(nincs szerző)(nincs adat)Ág hozzáadásaÜzenet hozzáadásaÁg részleteiÁgakFigyelem: a tulajdonságok változása azonnal megtörténik. A helyi menü segítségével tételenként megtekintheti és visszavonhatja a változásokat. Távoli tároló:Címke részleteiCímkékEgyesítővarázslóNévjegyRabbitVCS névjegyeEseményHozzáadásJelkép hozzáadásaEgy jelkép hozzáadásaSor hozzáadásaHozzáadás a mellőzött fájl listáhozHozzáadvaDosszié hozzáadása a tárolóhozEgy hiba történt a RabbitVCS Nautilus kiterjesztésben. Vegye fel a kapcsolatot RabbitVCS team a hiba alábbi részletes leírásával:Jegyzet - %sJegyzet egy fájlhozJegyzet...Megjegyzés hozzáfűzveEgységes összehasonlító fájl alkalmazása a munkapéldánybanHibajavítás alkalmazásaHibajavítás alkalmazása a könyvtárraHibajavítás alkalmazása...Hibajavító fájl alkalmazása...Biztos, hogy akarja törölni a hitelesítési információt?Biztos, hogy akarja törölni a korábbi üzeneteket?Biztos, hogy akarja törölni a tároló útvonalakat?Biztos, hogy folytatni akarja?Biztos, hogy törölni akarja ezt: %s?Hitelesítési információ törölveSzerzőSzerzőÁgÁgkezelőÁgak/címkék...Ágak/címkék...Ág:ÁgakTároló fa böngészéseBöngészésFájl vagy dosszié böngészéseProgram hibaNem lehet jegyzetet fűzni a könyvtárhozVáltozásMunkapéldány helyének megváltoztatása a tárolóbanMódosítvaMódosítások ellenőrzése...Tárolóhoz készített módosítások ellenőrzéseMunkapéldány ellenőrzése%s lecsekkol...EllenőrzésLecsekkolás - %sLecsekkolás...TisztításMunkapéldány tisztításaTisztítás...TisztításKlónozásÁg lezárasaSzínBeküldésMódosítás beküldése a tárolóbaFájl/dosszié összehasonlításaRevíziók összehasonlításaPárhuzamos összehasonlításKülönbségek összehasonlítása két tétel közöttÖsszehasonlítás a bázissalÖsszehasonlítás a bázissal a párhuzamos összehasonlító eszközzelÖsszehasonlítás az előző revízióvalÖsszehasonlítás az előző revízió használatával a párhuzamos összehasonlító eszközzelÖsszehasonlítás a munkapéldánnyalBefejezveHozzáadás befejezveBranch/tag parancs befejezveEllenőrzés befejezveTisztítás befejezveTisztítás befejezveKlónozás befejezveBeküldés befejezveExportálás befejezveImportálás befejezveZárolás befejezveMegjelölés megoldottként befejezveEgyesítés befejezveEgyesítés teszt befejezvePush befejezveÁthelyezés befejezveÁtnevezés befejezveAlaphelyzetbe állítás készVisszavonás befejezveVisszagörgetés készStage készÁtváltás készNyitás befejezveUnstage befejezveFrissítés befejezveTároló beállítása befejeződöttBeállítási fájl:KonfliktusosÁtmásolvaMásolás az útvonalrólMásolás a revízióbólURL másolása a vágólapraEgy tétel másolása másik helyre a tárolóbanMásolás a vágólapraEzen reviziók telejes adatállományának vágólapra másolásaMásolás...Hibajavítás készítéseHibajavítás készítése...Tároló készítése ideTároló készítése ebben a mappábanMappa létrehozása...Egységes összehasonlító fájl készítése, amely minden változást tartalmazHibajavító fájl készítése...DátumDátumHibakeresésNyomkövetés visszafeléTörlésTulajdonság törléseTulajdonság törlése (rekurzívan)Ezen tulajdonság törléseEzen tulajdonság törlése (rekurzívan)TörölveÖsszehasonlító menü...Törölni akarja a kiválasztott tulajdonságot minden fájlban ebben könyvtárban és alkönyvtáraiban?Szerző szerkesztéseSzerző szerkesztése...Konfliktusok szerkesztéseRészletek szerkesztéseNapló üzenet szerkesztéseNapló üzenet szerkesztése...Revízió tulajdonságok szerkesztése...ExportExport - %sEgy munkapéldány vagy tároló exportálása verzióinformáció nélkülExport...KiterjesztésKülsőZárolás sikertelenVisszaállítás sikertelenSikertelen zárolásFetch/PullEz a fájl nincs verzió kontroll alatt.BefejezveEgy érvénytelen kiterjesztés információ lehívásának kényszerítése%d elemet találtZárolásZárolás...GrafikonHEADSúgóHostHost:Mellőzés fájlkiterjesztés szerintMellőzés fájlnév szerintMellőzött fájl:Tétel mellőzése kiterjesztés szerintMellőzött tétel fájl kiterjesztés szerintTétel mellőzése fájl név szerintImportImport - %sEgy tétel importálása a tárolóbaNem alkalmazhatóA tároló inicializálásaÉrvénytelenítésRégi ágelőzmények megtartásaSorÖsszehasonlító lista beállításokBetöltés...Helyi zárolt tételekLezárvaNapló - %sNapló bejegyzésEgy konfliktusos tétel megoldottként való megjelöléseMegjelölés megoldottkéntEgyesítésEgyesítés...EgyesítveÜzenetÜzenet:Mime típusHiányzóMódosítvaTovábbi műveletek...Áthelyezés...N/ANévNév:Új hely:Új név:NemNincs aktív ágNincsenek commit-okSzámAkadályba ütközikMegnyitHéjprogram megnyitásaFájl megnyitásaAz első revízió megnyitásaA második revízió megnyitásaHibajavítás nem sikerültHibajavító fájl alkalmazvaHibajavító fájl elkészítveHibajavítása készÚtvonalElőző üzenet törölveTulajdonságokTulajdonságok - %sTulajdonság változásaTulajdonság állapotPushRVCS ÉletkorRVCS SzerzőRVCS RevizióRVCS ÁllapotRabbitVCSRabbitVCS GitRabbitVCS HgRabbitVCS SVNRabbitVCS státuszFrissített állapotElutasított hibajavításZárolás felodása...Egy tétel zárolásának feloldásaÁthelyezMunkapéldány áthelyezéseÁthelyezés...Távoli tárolókezelőTávoli tárolókÁtnevezésÁtnevezés...LecserélveTároló böngészésTároló URLTároló útvonal törölveTároló sikeresen létrehozvaTárolóFenntartvaAlaphelyzetMegoldvaVisszaállítvaHiányzó tétel visszaállításaHelyreállítvaVisszaállításEgy tétel visszaállítás a módosítás elötti állapotáraMódosítások visszavonása ebbő a revizióbólTulajdonság visszaállításaTulajdonságok visszaállítása (rekurzívan)Eredeti tulajdonságok visszaállításaEzen tulajdonság eredeti állapotba való visszaállítása (rekurzívan)VisszaállítvaMinden látható visszavonásaRevízióRevízió:Visszagörgetés revizióraVisszagörgetés...Hozzáadás parancs fut...Branch/tag parancs fut...Ellenőrzés parancs fut...Tisztítás parancs fut...Klónozásás parancs fut...Beküldés parancs fut...Exportálás parancs fut...Importálás parancs fut...Zárolás parancs fut...Egyesítés parancs futEgyesítés parancs fut...Egyesítés teszt futPush parancs fut...Áthelyezés parancs fut...Átnevezés parancs fut...Alaphelyzet parancs fut...Megoldva parancs fut...Visszavonás parancs futStage parancs fut...Átváltás parancs fut...Nyitás parancs fut...Unstage parancs fut...MentésMentés másként…A tárolóból törlendő elemek ütmezéseA tárolóban átnevezendő elemek ütemezéseA tárolóhoz hozzáadandó elemek ütemezéseKijelölésFájl kiválasztásaDosszié kiválasztásaProgram kiválasztásaBeállítás aktív ágkéntTároló beállítása...BeállításokVáltozások mutatása...Napló mutatásaFájl napló információ mutatásaRészletek megjelenítése és szerkesztéseÖsszehasonlító nézet az előző revízióvalVáltozások mutatása az útvonal és a revízió közöttVáltozások mutatása két revízió közöttEgyszerű állapot-ellenőrzőMéretKihagyvaStageKezdőpont:ÁllapotÁtváltásÁtváltás...CímkeCímkekezelőCímkéző:CímkékSzövegSzöveg állapotAz URL tartomány határainak megadása szükséges.A revízió mező egész szám kell legyenA megadott útvonal nem a munkapéldányé.Új név mező szükségesA(z) '%s' kimenetét nem sikerült feldolgozni. %sA tároló URL és a végcél útvonal mezőket ki kell tölteni.Tároló URL mező igényeltTároló helye mező kitöltése kötelező.A kért fájl vagy mappa nem létezik.Tulajdonságok mentésénél probléma adódott.Hiba történt a státuszellenőrző szolgáltatással való kommunikációbanHiba a tároló készítésekor. Győződjön meg róla, hogy a mappa üres.Tulajdonság lista nem állítható helyreA tulajdonság új értékét nem lehet beállítani.VáltozatlanIsmeretlenNyitásZárolás feloldvaUnstageFrissítésRevízió frissítéseEgy fájl frissítése speciális revízióraMunkapéldány frissítéseA kijelölt útvonal frissítése a módosítások visszavonásávalA kijelölt útvonal frissítése erre a revizióraRevíziófrissítés...Frissítés erre a revizióraFrissítveFrissítés...ÉrtékÖsszehasonlító nézet a bázissalÖsszehasonlító nézet az előző revízióvalÖsszehasonlító nézet a munkapéldánnyalÖsszehasonlító nézet, mint párhuzamos összehasonlításÖsszehasonlító nézet fájlok/dossziék közöttÖsszehasonlító nézet revíziók közöttSúgó megjelenítéseRabbitVCS beállítások megtekintése vagy módosításaÖsszehasonlító nézet két fájl közöttFájlhoz készített módosítás nézeteEgy fájl módosítások megtkintése az utolsó változás ótaEgy tétel tulajdonságainak megtekintéseEgységes összehasonlító nézetEgységes összehasonlító nézetMelyik reviziót/ágat szeretné lecsekkolni?Hová akarja másolni a kijelölést?Hová akarja áthelyezni a kijelölést?MunkapéldányIgenA --vcs [svn|git] opció használatával meg kell adnia egy verziókövető rendszerMeg kell adni a végcél útvonalat.épp mosta kiválasztott tétel/ek/eddigrabbitvcs-0.18/locale/it/000077500000000000000000000000001362112712700152765ustar00rootroot00000000000000rabbitvcs-0.18/locale/it/LC_MESSAGES/000077500000000000000000000000001362112712700170635ustar00rootroot00000000000000rabbitvcs-0.18/locale/it/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000656321362112712700212130ustar00rootroot00000000000000~   & 9 N _ p ~  ;   1!84!m!!!!!!(!" ("5"I"`"o""-"6-#1d##$####$!$7$G$^$&q$$$$$$7%H@%-%:%%&&(& 7&C&J& N&Y& m&{& &&B' K'Y' i'/u' '''''?(6N(5("(("()) ) +)9) R)\) w))))0))).*6*O* X* f*pr*V*:+P+_+2g+%+++&+,,),)>,h,4z,,A,- *-8-M-`-r---------. .1.B. S.`.o..2. .. ..//;/5L//// ////// 000 50gB0 0000011141S1[1 b1Bn1 1 11"1 12)2:2K2Q2Y2 b2n2s2x2~2222 2 22 33 !3+32373 R3 _3j3 }3333 333"3333 4%4.4 64@4U4 e4p4t4 y4 4444444455 5 '535L5 f5p555555 555566 !6 +656E6 L6V6^6m66666 66 66 7"7B7K7S7[7r7&y777*767.8I8 R8\8s8888889)9<9X9r99999 99 :2:0Q:,:: ::::: ;;5;(S;|;;;;;;; ;; ; << < $<0<A8<-z<*<$<*<#=AB=%=,=+=Q>U>Y> _>i>"n>%>>>>>$>?? 1?=?8@?@E@L@#c@@$@@@ A!A&3A%ZA;AAA(A(B ?BLB#PBtBBBLD `DnDDDDD DDDBD?EUE5uEBEE"E"F:FOF fF$tFF FFFFFG1G2G,G(H-CHqHHHHHHHI#I=I*SI"~IIIMIGJ-fJ;JJJJK(K:KAKJKYKxKK#KKZL aLmL |L<L LLL$L"ME;M:M9M MN)&NPNWN _N jNxNNN NNNN8N*O@O(WOOO O OOhEPPPPEP +QLQ`Q gQQQQ'QQ- R"8R=[RRRRRRSS0SHSZSkSSSSSSSTT(T;TQT1mT TT T TT"T U@U^UqUvU|UUU%UUU&U$V)Vaj%aj=j%jjk'k GkTk,WkkkJtbz<n,FA?hlE>_UZ@A,NCRwIDx`y%T{2b4v"ovpD4Q'.]&*_s%\ HGMo;{$?Rx $|y}S^S/ (w9k7:![>3caZ = W3V\t#js7(k~E5c); BQ eT. 0}rfgVWMzK|ui HXhq#0]U*rd+ lL5 a:P-qmB)'CJ`PF<iNO8L&m^!YI6pd-=fYX~K+1Gj9/g" u@6O1n8e[2%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-10-26 11:05+0000 Last-Translator: timendum Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i giorno%i giorni%i ora%i ore%i minuto%i minuti%i mese%i mesi%i secondo%i secondi%i settimana%i settimane%i anno%i anni%s - Finiti100Aggiungi MessaggioFile Modificati (doppio click per confrontarli con la base)AutenticazioneDettagli del CertificatoCambia il repository della tua copia di lavoroFile Modificati (doppio click per confrontarli con la base)Commit a:Modifica Proprieta DettagliFile da bloccareNome CartellaDalla RevisioneDa URLDa: (URL e revisione a merge)Importa MessaggioLinksMessaggi del logOpzioni di LogMessggioNote: le modifiche alle proprietà sono applicate subito. Puoi rivedere o tornare indietro usando il menu contestuale per ogni elemento. OpzioniAggiungi i tuoi dettagli di autenticazioneDescrivi perchè vuoi bloccare questi filesFile SSL di certificazione necessarioMessaggi PrecedentiProgramma usato per confrontare i fileProprieta per:RabbitVCSURI remota:RepositoryIntervallo RevisioniRevisioneTabella RevisioniAlla Revisionea: (URL e revisione a merge)Cronologia URLURL sorgente da effettuare il MergeInformazioni della VersioneCopia di Lavoro:Copia di LavoroLe proprietà selezionate non possono essere applicate ricorsivamente.Sei sicuro di voler cancellare %item%?RabbitVCSErrore RabbitVCSProcedura guidata per il mergeInformazioni suInformazioni su RabbitVCSAccetta SempreAccetta una VoltaAzioneAggiungiAggiungi iconaAggiungi una nuova proprietà.Aggiungi un'iconaAggiungi in ignoraAggiungi una cartella al repositorySi è verificato un errore nell'estensione RabbitVCS Nautilus. Contatta il RabbitVCS team con i dettagli dell'errore specificati sotto:AnnotaAnnota - %sAnnota un fileAnnota...Applica il file unico con le differenza alla copia di lavoroApplica PatchApplica Path Alla CartellaApplica Patch...Applica le proprietà ricorsivamenteApplica Patch al File...Sei sicuro di voler cancellare le tue informazioni di autenticazione?Sei sicuro di voler cancellare i tuoi messaggi precedenti?Sei sicuro di voler pulire i percorsi del tuo repository?Sei sicuro di voler continuare ?AutenticazioneInformazioni di autenticazione cancellateAutoreAutori:Branch/tagBranch/tag...Sfoglia l'albero del repositorySfogliaSfoglia file o cartellaSfoglia...BugsNon posso annotare una cartellaModificaCambia la locazione del repository della copia di lavoroControlla CertificatoControlla modifiche...Controlla modifiche fatte nel repositoryPreleva una Copia di LavoroCheckoutCheckout - %sCheckout...Seleziona questo metodo se hai fatto qualche cambiamento al branch e vuoi effettuare un merge tra le tue modifiche e un altro branch.Seleziona questo metodo se vuoi effettuare un merge tra due differenti branch nella tua copia di lavoro.Pulisci la copia di lavoroPulizia in corso...PulisciRichiesta di pulizia.... Iniziare una pulizia nella copia di lavoro?Elimina i dati di autenticazioneChiudi la finestra.CommitInvia le modifiche al RepositoryConfronta file/cartelleConfronta le revisioniConfronta affiancatoConfronta le differenze tra due oggettiConfronta con la baseConfronta con la base affiancando le finestreCompara con la versione precedenteConfronta con la revisione precedente affiancando le finestreCompara con la copia localeAggiunta completataBranch/tag completatoCheckout completatoPulizia CompletataCommit CompletatoEsportazione CompletataImportazione completataBlocco CompletatoMerge CompletatoTest del Merge CompletatoRicollocamento CompletatoRinomina CompletataRisoluzione CompletataRipristino completatoScambio completatoSblocco completatoAggiornamento completatoConfermaCopia dal PercorsoCopia dalla RevisioneCopia l'URL nella clipboardCopia un oggetto in un altra parte del repositoryCopia in...Crea cartella...Crea PatchCrea Patch...Crea un Repository quaCrea un Repositori in una cartellaCrea cartellaCrea un file unico con le differenza di tutte le modifiche fatteCrea Patch File...DataDebugDebug RipristinoCancellaCancella ConfermaCancella le proprietà ricorsivamenteCancella proprietàCancella questa proprietàCancella questa proprietà (ricorsivo)NegaMenu Differenze...Vuoi cancellare la proprietà selezionata da tutti i file e sotto-cartelle sotto questa cartella?Modifica autoreModifica autore...Modifica messaggio di logModifica messaggio di log...Modifica le proprietà della revisione...Modifica...Abilita iconeAbilita gli attributi dei fileAbilita il controllo ricorsivo degli statiIngleseEsportaEsporta - %sEsporta la copia di lavoro o repository senza le informazioni di versioneEsporta...EstensioneProgrammi esterniFile senza controllo versioneFingerprint:FinitoForza una chiamata a invalidate_extension_info()Trovati %d oggettiDa:GeneraleBloccaBlocca...HEADAiutoHost:Ignora AntenatiIgnora oggetto dall'estensioneIgnora oggetto dal nome fileImportaImporta - %sImporta un oggetto in un repositoryIncludi file ignoratiInvalidaEmittenteLingua:Limiti:LineaVisualizza opzioni di confrontoCarica/AggiornaCaricamento...Blocca gli oggetti localmenteFile BloccatiBloccatoLogLog - %sMessaggio di logLoggingLogin:Segna un oggetto in conflitto come risoltoMergeAssistente al MergeEffettua un Merge per un intervallo di revisioniEffettua un merge di due differenti alberiMerge...MessaggioTipo MimeLivello minimo per logAltre azioni...Sposta in...N/ANomeNuova Destinazione:Nuiovo Nome:Nuovo...NoMessaggi di NotificaNumeroNumero di URL da ricordareNumero di messaggi da ricordareOmetti esterniRegistra solo il mergeApriApri ShellApri un fileApri dalla prima revisioneApri dalla seconda revisionePassword:Patch al File ApplicataPatch File CreatoPercorsoPercorso:Messaggi PrecedentiMessaggi precedenti cancellatiProprietaProprieta - %sProprietaCambia ProprietàModifica delle proprietàStato ProprietaProprieta:RabbitVCSErrore RabbitVCSDominio:RicorsivoAggiornaAggiorna StatoAggiorna la lista delle proprietà.Sblocca...Sblocca l'oggettoRicollocaRicolloca la tua copia di lavoroRicolloca...RinominaRinonima...Sfoglia RepositoryPercorsi del repository pulitiRepository creato con successoRiservatoRisolviRipristinaRipristina oggetto mancanteRipristinaRipristina gli oggetti nel loro stato non modificatoRipristina proprietàRipristina proprietà (ricorsivo)Ripristina questa proprietà con il suo stato originaleRipristina questa proprietà con il suo stato originale (ricorsivo)Ripristina tutto ciò che vediRevisioneRevisione:Esecuzione del comando Aggiungi...Esecuzione del comando Branch/tag...Esecuzione del comando Checkout...Esecuzione del comando Commit...Esecuzione del comando di Esportazione...Esecuzione del comando di Importazione...Esecuzione del comando Blocca...Esecuzione del comando Merge...Esecuzione del Merge Test...Esecuzione del comando di RicollocamentoEsecuzione del comando Rinomina...Esecuzione del comando Risolvi...Esecuzione del comando di Ripristino...Esecuzione del comando di Scambio...Esecuzione del comando Sblocca...SSL Client CertificationeSalva con nome...Salva AutenticazioneDati salvatiSchedula un oggetto da essere cancellato dal repositorySchedula un oggetto da essere rinonimato nel repositorySchedula oggetti da aggiungere al repositorySelezione / Deseleziona tuttiSeleziona un FileSeleziona una CartellaSeleziona un programmaOpzioniVisualizza modifiche...Visualizza LogMostra gli strumenti di debugging di RabbitVCSVisualizza il file logVisualizza modifiche tra percorsi e revisioniVisualizza le modifiche tra le revisioniVisualizza LogVisualizza i file non versionatiRevisioni:DimensioneStatusRuba il bloccaggioFerma su copiaScambiaScambia...Testa il MergeTestoTesto ModificatoStato TestoGrazie:Il menu di debug è usato per diagnosticare problemi con RabbitVCSI campi da e url sono entrambi obbligatoriIl campo da revisione deve essere un interoIl percorso non è la copia di lavoroGli oggetti verranno inviati al cestino.Il campo nuovo nome è obbligatorio.I campi URL e percorso di destinazione del repository sono entrambi obbligatori.Il campo URL del repository è obbligatorio.La locazione del repository è un campo obbligatorioErrore nel salvataggio delle proprietàC'è stato un errore nella creazione del repository. Verifica che la cartella sia vuota.A:Tipo:URL/PathURL:Impossibile caricare le proprietàImpossibile inserire valore della proprietàSconosciutoSbloccaAggiornaAggiorna alla RevisioneAggiorna il file alla specifica revisioneAggiorna la Copia di LavoroAggiorna alla revisione...Aggiornamento in corso...Usa la finestra del log per selezionare le revisioni su cui vuoi effettuare il merge. Oppure scrivi le revisioni manualmente, ognuna separata da una virgola. Pure specificare un intervallo con un trattino. Esempio: 4-7,9,11,15-HEAD Per eseguire il merge di tutte le revisioni, lascia il box vuoto.Valido:ValoreValore:Visualizza differenze con la baseVisualizza le differenze con la revisione precedenteVisualizza le differenze con la copia di lavoroVisualizza le differenze affiancateVisualizza differenze tra file/cartelleGuarda differenze tra le versioniVisualizza aiutoVisualizza o cambia le opzioni di RabbitVCSVisualizza differenze tra due fileVisualizza le modifiche fatte al fileVisualizza le modifiche fatte al file dall'ultimo cambiamentoVisualizza le proprieta di un oggettoVisualizza differenze uniteDove vuoi copiare la selezione?Dove vuoi muovere la selezione?Copia lavoroSiDevi specificare un percorso di destinazioneoggetti selezionatiarabbitvcs-0.18/locale/ja/000077500000000000000000000000001362112712700152545ustar00rootroot00000000000000rabbitvcs-0.18/locale/ja/LC_MESSAGES/000077500000000000000000000000001362112712700170415ustar00rootroot00000000000000rabbitvcs-0.18/locale/ja/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000457041362112712700211670ustar00rootroot00000000000000o<.AVg x1'DYn(~ -6Ax$-&@gzH- 9Y_o ~    ?645k""    )380T pV82%& CQfy  ( 9 J [ l y  2   ! !!!+!0!8!G!^!}!! !B! !! !") "7"H"N"V" _"k"p"u"{"" " "" "" """ " # #'#.#2#;#C#"J#m#s##### #### ##$$3$R$a$w$ |$ $$$$$ $$$$ % %% $%.%6%E%U%m%v% %% %%%%%%&%%&.&E&c&&&&&&&'*'D'_'y''' '2'0'0( F(T(d(u(~((((((( (( ) )) )))-1)*_)$)*))A)%;*,a*Q*** ***+++$"+G+]+ s++z,,, ,!,%,,,#-'-<-?-/ ///!/(/./ 4/@/D/ d/r//7//(/ 0@0 Z02h0.00001211I1F{11:12,2=2T2t22222223/3UF3-33334%4A4Q4X4q444 44 4+445:75r55$555555 56* 6956o6'6666yx7'7868gL88 8*8 99-9I9e9x9999999 ::):<: R:_:f:|:B:!:*;+; 2;?;F;V; ];!g;$;0;;;;c<u<|<<<7<,<= ='=:=P= W= a=l===0=== >> >(>,>'<>d> >> >> >9> >>$?%7? ]?j? z?$???? ???!?!@=@Y@`@s@@@@-@@@A AA #A-A 5A?AFAVA$lA AA A AA3A-BCBJB QB^BzB B/BBBB C"C 2C?CUCeC CCCCCC9C?0DpDDDDDD$DE6 E"WEzEE!E EEE EFFL#F?pFEF>F*5GT`G-G3GuHHH HHHHH!H$HI$)I NI[IJJJJ K' K'HKpK-wKKKvHf.r{tELy ,@( jM kc*4XN7+QGC:AUi9|Vn2BIO>D \oP"~ & F  q<sxYg_$ KS0hz# Rw`=% u'81T6b!3^/a5;[l}-mpWJ]Zed?)%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAuthenticationBranch DetailCertificate DetailsChange the repository of your working copyCommit to:Edit Property DetailsFiles to lockFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to compare filesProperties for:RabbitVCSRepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking CopyAre you sure you want to delete %item%?RabbitVCSA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAnnotateAnnotate - %sAnnotate a fileAnnotate...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse toBrowse...BugsCannot annotate a directoryChange the repository location of a working copyCheck CertificateCheck out a working copyCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy an item to another location in the repositoryCreate Repository hereCreate a repository in a folderDateDebugDeleteDelete ConfirmationDenyEdit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExtensionExternal ProgramsFingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineLoading...Locally lock itemsLock FilesLockedLogLog - %sLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logN/ANameNew Name:New...Notification MessagesNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellPassword:Patch File CreatedPathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty StatusProperty:RabbitVCSRealm:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository paths clearedRepository successfully createdResolveRestoreRevertRevert an item to its unmodified stateRevisionRunning Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow a file's log informationShow logShow unversioned filesShowing Revisions:StatusSteal the locksStop on copySwitchSwitch...Test MergeTextText StatusThanks:The from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View helpView or change RabbitVCS settingsView the modifications made to a fileView the properties of an itemYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-12-02 16:25+0000 Last-Translator: yamafuji mitsugu Language-Team: Japanese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i日%i時間%i分%iヶ月%i 秒%i週%i年%s - 完了100メッセージの追加認証ブランチ 詳細証明書の詳細作業コピーのレポジトリを変更するコミット先:プロパティの詳細を編集ロックすファイル元リビジョン元URL元: (マージするURLとリビジョン)メッセージをインポートする関連リンクログメッセージログオプションメッセージオプション認証の詳細を追加してくださいファイルをロックする理由を入力してください以前のメッセージファイルの比較に使用するプログラム属性:RabbitVCSレポジトリリビジョンの範囲リビジョンリビジョン一覧先リビジョン先: (マージするURLとリビジョン)URL履歴マージ元のURLバージョン情報作業コピー本当に%iつのアイテムを削除しますか%?RabbitVCSマージウィザードRabbitVCSについてRabbitVCSについて今後受け入れる一度だけ受け入れるアクション追加エンブレムを追加エンブレムを追加無視リストに追加注釈注釈 - %sファイルに注釈注釈...本当に認証情報を削除しますか?本当にログメッセージを削除しますか?本当にレポジトリのパスをクリアしますか?本当に続けますか?認証認証情報は削除されました作者著者:ブランチ/タグブランチ/タグ...参照閲覧...バグディレクトリに注釈できません作業コピーのレポジトリの場所を変更する証明書をチェックする作業コピーをチェックアウトチェックアウトチェックアウト - %sブランチに変更を加え,それを別のブランチに変更をマージする場合,このメソッドを選択してください.2つの異なるブランチを作業コピーにマージする場合,このメソッドを選択してください.作業コピーをクリーンアップクリーンアップ中...クリーンアップクリーンアップが要求されました.... 作業コピーをクリーンアップしますか?認証履歴を削除コミットレポジトリへの変更をコミット追加完了ブランチ/タグ の完了チェックアウト完了クリーンアップ完了コミット完了エクスポート完了インポート完了ロック完了マージ完了マージテスト完了再配置完了リネームの完了解消完了元に戻しました切り替え完了ロック解除完了更新完了確認パスからコピーリビジョンからコピーレポジトリ内の別の場所にアイテムをコピーするここにレポジトリを作成フォルダ内にレポジトリを作成日付デバッグ削除削除の確認拒否編集...エンブレムを有効にするファイル属性を有効にする再帰的な状態チェックを有効にする英語エクスポートエクスポート - %sバージョン情報無しで,作業コピーまたはレポジトリをエクスポートする拡張外部プログラムフィンガープリント:完了invalidate_extension_info() 呼び出しを強制する%d個のアイテムが見つかりました元:一般ロックを取得ロックを取得...最新ヘルプホスト:系統情報を無視するインポートインポート - %sレポジトリにアイテムをインポート除外ファイルを含める無効にする発行者:言語:期限:行ロード中...ローカルでアイテムをロックロックするファイルロックログログ - %sログログイン:競合するアイテムを解決済みにマークするマージマージアシスタントリビジョンの範囲をマージ異なる2つのツリーをマージマージ...メッセージMimeタイプ次のレベル以上を記録するN/A名前新しい名前:新規...通知メッセージ記録するURLの数記録するメッセージの数外部参照を除外するマージのみ記録する開くシェルを開くパスワード:修正を作成完了パス以前のメッセージログメッセージは削除されました属性プロパティ - %s属性属性の状態属性:RabbitVCS領域:再帰的更新状態を更新ロックを開放...アイテム上でロックを開放再配置作業コピーを再配置再配置...リネームリネーム...レポジトリのパスはクリアされましたレポジトリの作成に成功しました解消復元元に戻す未変更の状態に戻すリビジョン追加中...ブランチ/タグ コマンドを実行中...チェックアウト中...コミット中エクスポート中...インポート中...ロック中...マージ中マージテスト中再配置中...リネームを実行中...解消中...元に戻しています切り替え中...ロック解除中認証を保存するデータの保存レポジトリへのアイテムの削除を予定するレポジトリへのアイテムのリネームを予定する全て選択/全て非選択ファイルを選択フォルダを選択プログラムを選択設定ログを表示ファイルのログ情報を見るログを表示バージョン管理外のファイルを表示する表示しているリビジョン:状態ロックを横取りするコピーが発生したら停止切り替え切り替え...マージをテストするテキストテキストの状態謝辞:FROMフィールドとURLフィールドの両方に入力してください元リビジョン番号は整数でなければなりません与えられたパスはワーキングコピーではありませんその(それらの)アイテムはゴミ箱へ送られます新しい名前を入力してくださいレポジトリのURLとチェックアウト先の両方の入力が必要です.レポジトリURLを入力してくださいレポジトリの場所を入力してくださいリポジトリ作成中にエラーが発生しました.フォルダが空であるか確認してください.先:種類:URL/パス:URL:不明ロック解除更新特定のリビジョンへ更新特定のリビジョンへ更新...作業コピーを更新特定のリビジョンへ更新...更新中...マージしたいリビジョンの選択にログダイアログを利用する,もしくは,マージするリビジョンをコンマで区切って入力してください.リビジョンの範囲はハイフンで指定することができます. 例: 4-7,9,11,15-HEAD すべてのリビジョンをマージするには,入力ボックスを空のままにしてください.有効:値値:ヘルプの閲覧RabbitVCSの設定ファイルに対する変更を見るアイテムのプロパティを見るはい送り先パスを設定してください.選択されたアイテムtorabbitvcs-0.18/locale/nb/000077500000000000000000000000001362112712700152615ustar00rootroot00000000000000rabbitvcs-0.18/locale/nb/LC_MESSAGES/000077500000000000000000000000001362112712700170465ustar00rootroot00000000000000rabbitvcs-0.18/locale/nb/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000644421362112712700211740ustar00rootroot00000000000000~   & 9 N _ p ~  ;   1!84!m!!!!!!(!" ("5"I"`"o""-"6-#1d##$####$!$7$G$^$&q$$$$$$7%H@%-%:%%&&(& 7&C&J& N&Y& m&{& &&B' K'Y' i'/u' '''''?(6N(5("(("()) ) +)9) R)\) w))))0))).*6*O* X* f*pr*V*:+P+_+2g+%+++&+,,),)>,h,4z,,A,- *-8-M-`-r---------. .1.B. S.`.o..2. .. ..//;/5L//// ////// 000 50gB0 0000011141S1[1 b1Bn1 1 11"1 12)2:2K2Q2Y2 b2n2s2x2~2222 2 22 33 !3+32373 R3 _3j3 }3333 333"3333 4%4.4 64@4U4 e4p4t4 y4 4444444455 5 '535L5 f5p555555 555566 !6 +656E6 L6V6^6m66666 66 66 7"7B7K7S7[7r7&y777*767.8I8 R8\8s8888889)9<9X9r99999 99 :2:0Q:,:: ::::: ;;5;(S;|;;;;;;; ;; ; << < $<0<A8<-z<*<$<*<#=AB=%=,=+=Q>U>Y> _>i>"n>%>>>>>$>?? 1?=?8@?@E@L@#c@@$@@@ A!A&3A%ZA;AAA(A(B ?BLB#PBtBBBQDaDrDDDD DDDDCD@EUE$oE@EE E F$F5FIF.XFF FFFFFeGFyG7G,G%H0ISIsIII3IJI-4J9bJJJ JJJJJJ K!K4KNKrhK KKK L0LCL"WLzLLLBL: M1FM%xM M%M M M M MNN$N?NNNSNrN.xNNNNNO O On(OZOO P P7$P%\PP PPPP"P*QDQTZQQaQ1RMRbRwRRRRRRRRS,S @SNSeSxSS SSSS3S T-T>TOTcTtT T>TTTTTUU+UFUUUjUUUSUUUV)VAV `VkVV VV VV@V W *W7W(KWtW W)WWWWW WWWWW'X"6XYX `X nXX X XXXX!X X Y Y #Y.Y4Y 9Y CYOY WY&aYYYYYYYYY Z Z-Z1Z 6Z DZOZUZYZlZsZZZ!ZZ Z ZZ[,[5[F[][a[f[z[ [[[[[[ [ [[ \\\(\8\ R\`\ z\\ \ \ \ \\\ \] ] ] 8]2E]x]!]9]E]0^I^ R^\^{^^^^^_!_8_ K_l______ `` 0`0=`/n`4`` ` `` aa,a$5aZa(waaaaa ab bb$b*b 3b=b Cb Pb\bJbb*b+b0c+5c!ac,cc'c2cR%dxd}dddd+ddd dd*e;eTe me*{efff%f/f(g<:g#wg g g'ggh1,h^h}h(h#h hhhiiJtbz<n,FA?hlE>_UZ@A,NCRwIDx`y%T{2b4v"ovpD4Q'.]&*_s%\ HGMo;{$?Rx $|y}S^S/ (w9k7:![>3caZ = W3V\t#js7(k~E5c); BQ eT. 0}rfgVWMzK|ui HXhq#0]U*rd+ lL5 a:P-qmB)'CJ`PF<iNO8L&m^!YI6pd-=fYX~K+1Gj9/g" u@6O1n8e[2%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-03-14 08:38+0000 Last-Translator: Arne Language-Team: Norwegian Bokmal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i dag%i dager%i time%i timer%i minutt%i minutter%i måned%i måneder%i sekund%i sekunder%i uke%i uker%i år%i år%s - fullført100Legg til meldingBerørte fil(er) (dobbeltklikk for å sammenlikne med basen)AutentiseringSertifikatdetaljerEndre arkiv for arbeidskopienEndrede filer (dobbeltklikk for å sammenlikne med basen)Send inn til:Rediger egenskapsdetaljerFiler til låsingMappenavnFra revisjonFra URLFra: (URL og revisjon som skal flettes)ImportmeldingLenkerLoggmeldingerLoggeopsjonerMeldingMerknad: egenskapsendringer utføres umiddelbart. Du kan se over og angre endringer vha. snarveimenyen på hvert element. AlternativerVennligst legg til dine autentiseringsdetaljer (identifikasjon)Vennligst beskriv hvorfor du låser disse fileneVennligst oppgi din ssl sertifikatfilForrige meldingProgram benyttet for å sammenlikne filerEgenskaper for:RabbitVCSFjerntliggende URI:ArkivRevisjonsutvalgRevisjonRevisjonstabellTil revisjonTil: (URL og revisjon som skal flettes)URL historikkURL det skal flettes fraVersjonsinformasjonArbeidskopi:ArbeidskopiValgte egenskaper vil bli anvendt rekursivt.Er du sikker på at du vil slette %item%?RabbitVCSRabbitVCS feilEn hjelper for flettingOmOm RabbitVCSAksepter for alltidAksepter en gangHandlingLegg tilLegg til emblemLegg til en egenskap.Legg til et emblemLegg til ignoreringslisteLa til en mappe i arkivetEn feil oppstod i RabbitVCS-utvidelsen. Vennligst kontakt RabbitVCS team med feildetaljene under:KommenterKommenter - %sKommenter en filKommenter...Anvend en samlet differansefil på arbeidskopienAnvend lapp (patch)Anvend lapp (patch) på katalog...Anvend lapp (patch)...Anvend egenskap rekursivtAnvender lappefil (patch)...Er du sikker på at du vil nullstille autentiseringsinformasjonen?Er du sikker på at du vil nullstille din forrige melding?Er du sikker på at du vil nullstille arkivstien?Er du sikker på at du vil fortsette?AutentiseringAutentiseringsinformasjonen nullstiltOpphavsmannForfattere:Gren/merkeGren/merke...Bla gjennom ett arkivtreBla tilBla til en fil eller mappeBla gjennom...FeilKan ikke kommentere en katalogEndreFlytt plasseringen av en arbeidskopi i arkivetSjekk sertifikatSjekk for endringer...Sjekk for endringer i arkivetSjekk ut en arbeidskopiSjekk utSjekk ut - %sSjekk ut...Velg denne metoden hvis du har gjort endringer i grenen og ønsker å flette dine endringer med en annen gren.Velg denne metoden hvis du ønsker å flette to forskjellige grener inn i din arbeidskopi.Rensk opp en arbeidskopiRensker opp...Rensk oppOpprensking forespurt... Start arbeidskopiopprensking?Fjern all autentiseringsinformasjonenLukk dette dialogvindu.RVCS Send innSend inn endringer til et arkivSammelikn filer/mapperSammenlikne revisjonerSammenlikne ved siden av hverandreSammenlikn differansen mellom to elementerSammenlikne med basenSammenlikne med basen ved bruk av verktøy for å sammenlikne ved siden av hverandreSammenlikne med forrige versjonSammenlikne med tidligere revisjon ved bruk av verktøy for å sammenlikne ved siden av hverandreSammenlikne med arbeidskopiFullført "legg til"Fullført gren/merkeUtsjekk fullførtOpprensking fullførtFullført innsendingFullført eksportImport fullførtFullført låsingFullført flettingFullført flettingstestFullført ommplasseringFullført omnavningFullfør løsFullført tilbakestillFullført flyttingFullfør lås oppFullført oppdateringBekreftelseKopier fra stiKopier fra revisjonKopier URL til utklippsbordKopier et element til en annen plassering i arkivetKopier til...Opprett mappe...Lag lapp (patch)Lag lapp (patch)...Lag et arkiv herLag et arkiv i en mappeLag mappe...Lager en forent differansefil med alle endringene du har gjortLager lappefil (patch)...DatoAvlusAvlus tilbakestillingSlettSlettebekreftelseSlett egenskaper rekursivtSlett egenskapSlett denne egenskapSlett denne egenskapenAvvisDifferansemeny...Ønsker du å slette valgte egenskaper fra alle filer og mapper under denne mappen?Rediger forfatterRediger forfatter...Rediger loggemeldingRediger loggemelding...Rediger revisjonsegenskaper...Rediger...Muliggjør emblemerMuliggjør filattributterMuliggjør rekkursiv statussjekkEngelskEksporterEksportert - %sEksporter en arbeidskopi eller et arkiv uten versjonsinformasjonEksporter...FiletternavnEksterne programmerFila er ikke underlagt versjonskontroll.Fingeravtrykk:FullførtTving et invalidate_extension_info() kallFunnet %d element(er)Fra:GenereltLåsTa lås...HODEHjelpVert:Ignorer stamfedreIgnorer element basert på filetternavnIgnorer element basert på filnavnImportImporter - %sImporter et element til et arkivInkluder ignorerte filerInnvaliderUtsteder:Språk:Grense:LinjeListe over sammenlikningsopsjonerLast/oppdaterLaster...Lås elementer lokaltLås filerLåstLoggLogg - %sLoggmeldingLoggingLogg inn:Marker et element i konflikt som løstFlettFletteassistentFlett et utvalg av revisjonerFlett to forskjellige trærFlett...MeldingMimetypeMinimumsnivå for loggingFlere handlinger...Flytt til...I/TNavnNy plasseringNytt navn:Ny...NeiVarslingsmeldingerNummerAntall URLer som huskesAntall meldinger som huskesUtelat eksterneKun marker fletting (ikke utfør)ÅpneÅpne skallÅpne en filÅpne fra første revisjonÅpne fra andre revisjonPassord:Lappefil anvendtLappefil (patch) lagetStiSti:Tidligere meldingerForrige melding nullstiltEgenskaperEgenskaper - %sEgenskapEndre egenskapEgenskpasredigeringEgenskapstatusEgenskap:RabbitVCSRabbitVCS feilOmråde:RekursivOppdaterOppfrisk statusOppdatert egenskapslistenFrigi lås...Frigi lås på et elementOmplasserOmplasser din arbeidskopiOmplasser...Endre navnEndre navn...ArkivleserArkivsti nullstiltArkiv vellykket opprettetReservertLøsGjenopprettGjenopprett et manglende elementTilbakestillTilbakestill et element til dens uendrere tilstandTilbakestill egenskapTilbakestill egenskap (rekursivt)Tilbakestill denne egenskapen til dens originale tilstandTilbakestill denne egenskapen til dens originale tilstand (rekursivt)Tilbakestill alt den serRevisjonRevisjon:Kjører "legg til" kommando...Kjører gren/merke-kommando...Kjører utsjekkommando...Kjører innsendingskommando...Kjører eksportkommando...Kjører importkommando...Kjører låsekommando...Kjører flettekommandoKjører flettetestKjører omplasseringskommando...Kjører omnavningskommando...Kjører løs-kommando...Kjører tilbakestillkommando...Kjører flyttekommando...Kjører lås opp kommando...SSL klientsertifikatLagre som...Lagre autentiseringLagrede dataTidsplanlegg et element for sletting fra arkivetTidsplanlegg et element for omnavning i arkivetTidsplanlegg elementer som skal legges til i arkivetVelg/avvelg altVelg en filVelg en mappeVelg et programInnstillingerVis endringer...Vis loggVis RabbitVCS sine avlusingsverktøyVis en fils loggeinformasjonVis endringer mellom stier og revisjonerVis endringer mellom revisjonerVis loggVis ikke-versjonerte filerViser revisjoner:StørrelseStatusStjel låserStopp ved kopiFlyttFlytt...TestflettTekstTekstendringTekststatusTakk:Avlusingsmenyen benyttes for å diangostisere problemer med RabbitVCS selvFra og til -URLfeltene er begge påkrevet."Fra revisjon" -feltet må være et heltallDen oppgitte stien peker ikke til en arbeidskopiElementene vil bli sendt til søppeldunken.Det nye navnefeltet er påkrevet.ArkivURL og målsti er begge påkrevde felt.ArkivURLfelt er påkrevetArkivplasseringen er et påkrevet felt.Det oppstod et problem med lagring av egenskapene.En feil oppstod ved opprettelse av arkiv. Sørg for at den oppgitte mappen er tom.Til:Type:URL/Sti:URL:Får ikke tak i egenskapslisteKlarer ikke å sette ny verdi for egenskap.UkjentLås oppRVCS OppdaterOppdater til revisjonOppdatert en fil til en spesifikk revisjonOppdatert en arbeidskopiOppdater til revisjon...Oppdaterer...Bruk loggknappen (til høyre for revisjonsutvalgsfeltet) til å velge revisjonen du ønsker å flette. Eller skriv revisjonene manuelt, hver separert med komma. Du kan spesifisere et revisjonsutvalg med en bindestrek. Eksempel: 4-7,9,11,15-HEAD La boksen være tom for å flette alle revisjoner.Gyldig:VerdiVerdi:Vis en differanse i forhold til basenVis differanse i forhold til tidligere revisjonVis differanse i forhold til arbeidskopiVis differanse som en "ved siden av hverandre" sammenlikningVis differansen mellom filer/mapperVis differanse mellom revisjonerVis hjelpVis eller endre RabbitVCS innstillingerVis differansen mellom to filerVis endringene gjort i en filVis endringene i en fil siden den ble sist lagretVis egenskapene til et elementVis samlet differanseHvor ønsker du å kopiere utvalget til?Hvor ønsker du å flytte utvalget?ArbeidskopiJaDu må oppgi en målsti.det/de valgte elementtilrabbitvcs-0.18/locale/nl/000077500000000000000000000000001362112712700152735ustar00rootroot00000000000000rabbitvcs-0.18/locale/nl/LC_MESSAGES/000077500000000000000000000000001362112712700170605ustar00rootroot00000000000000rabbitvcs-0.18/locale/nl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000001000551362112712700211750ustar00rootroot00000000000000wh'i'z''''''' '(2 (>(P(c(;r(((((1)86)o))))#))**0*(@*2i** ****++++-+6+1,O,h,${,,,,,,- -6-F-]- o-{-&-----.7%.H].-.:.///5/E/ T/ `/ l/z// // / // //0 00 0/0 001181?O16151"1#2C2"R2u2|2222 2 2222 22 333!3=30D3u33.3333 4 4p 4V444 525%H5n5t55&5555)564.6c6A66 6677&767G7X7i7x7777777788(8 98 F8S8p888828 88 99$9;9[95l99999 9999: :<: Q:r: w:g: :: ;;%;9;U;];d;s;;;; ;B; < << -<"8< [<h<)q<<<<< <<<<<<<<== %=2=P=h= o= {=== === ==> > &> 3>>> Q>\>c>g> p>|>>">>>>>>?(?1?9? B?L?a? q?|???? ? ???????@"@8@ =@ H@T@m@ @@@@@@@ @@ AA"A2ABA SA]AbA gAqA A AA AAAAAA B!B*B EBQBkB rB|BBBB BBBBC C#C&*CQCaC*}C6CCC D D%"DHDXDoDDDDDDE(E>EQEiEEEEEEF!F &F1F EF2PF0F,FFF F GG-GBGKG[GdGGG&G(GH/H!8HZHqHH HHHH H HH HH HHH II I I,IA4I-vI*I$I*IJA>J%J,J,J+KA,KQnKKK KK"K%K"L*L1L8LPL$cLL)LLL LMMMMM#2MVM$uMMM M!M&N%)N;ONNN(N(N OOJO#jOOOOOOQQ QQQR)R:R JRUR;YRRRRER#S8SLS\S2vSDSSTT!4T%VT |TTTT,T9T5UOUbUzUUUU aVoV4V4V4V'W@W*RW}WWWWWW X"X1XEX VXbX-vXX&XXXY>!YL`Y-Y9YZ5Z:ZNZeZxZZZ ZZZZZ[!"[D[ [[[ \8\W\g\\\\;\3 ]2=]$p]] ]]]]]] ] ^ ^$^,^ 5^ V^!d^ ^^ ^^ ^1^^_>3_r__ __ _|_[I````@`"a:aAa]a(daaaa,abJbfbNbbbcc(c:cJcZcjc{ccc ccccdd/dAdQddd ydd ddd#d<d{{{{{,{:{)| 2|?|G|a|#v||/||| }}#}+}2}$:}._})}+}%} ~%~+4~-`~'~C~&~!&>(e J (\ ZVZ0bNK()9xSV~G{OS ';eTcjX{<0%g8  F  o mJ^3JHaHO=l?Q,#I3}T$?7"xW.*Ac]2v\69k+ssq/GzAI`4np_^)E~Mn a-L >P=rdtp! m]_Q@y&$6uC!}f|UiY7&uR;h4(2t[b`BloNq1Y"#jg>kfK:|C/h*wXe' DL8ziP1WwvFy5,[E 5@Bd+:URDM<r-.%%d minute(s) ago%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100A conflict was found in the following file:Add BranchAdd MessageAdd TagAffected File(s) (double-click to compare with base)AuthenticationBranch DetailBranchesCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Checker type:Commit to:Configuration EditorEdit Property DetailsEnter Name and Email DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Ignore and exclude files from being trackedImport MessageLinksLog MessagesLogging OptionsMemory usage: MessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsOther InformationPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProcess ID:Program used to compare filesProperties for:Pull InformationRabbitVCSRemote RepositoriesRemote URI:RepositoryRevision RangeRevisionRevisions TableTag DetailTagsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept MineAccept OnceAccept TheirsActionAddAdd EmblemAdd a new property.Add an emblemAdd line:Add to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?Are you sure you want to delete %s?AuthenticationAuthentication information clearedAuthorAuthor:Authors:BranchBranch ManagerBranch/tagBranch/tag...Branch:BranchesBrowse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCancelCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyChecking out %s...CheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCloneClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CloneCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted PushCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted RollbackCompleted SwitchCompleted UnlockCompleted UpdateConfig file:ConfirmationConflict Resolution DecisionContent status:Copy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDate:DebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete property (recursive)Delete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit detailsEdit log messageEdit log message...Edit revision properties...Edit...Email:Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFetch/PullFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...GitGraphHEADHelpHostHost:How do you want to handle this?IgnoreIgnore ancestryIgnore file:Ignore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInitialize RepositoryInvalidateIssuer:Keep old branch's historyLanguage:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge ManuallyMerge a range of revisionsMerge changes into local branchMerge two different treesMerge...MessageMessage:Mime TypeMinimum level to logMore Actions...Move to...N/ANameName and EmailName:New Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty status:Property:PullPushRabbitVCSRabbitVCS ErrorRabbitVCS GitRabbitVCS SVNRealm:RecursiveRefreshRefresh InformationRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remote Repository ManagerRenameRename...Repository BrowserRepository URLRepository paths clearedRepository successfully createdRepository:ReservedResolveRestart CheckerRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Rollback To RevisionRollback to specified revision numberRolling Back...Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Clone Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Push Command...Running Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSaveSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelectSelect / Deselect allSelect a FileSelect a FolderSelect a programSet as active branchSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow and edit property detailsShow changes against previous revisionShow changes between paths and revisionsShow changes between revisionsShow logShow new version on the left sideShow unversioned filesShowing Revisions:SizeStart Point:StatusStatus CheckerSteal the locksStop CheckerStop on copySwitchSwitch...TagTag ManagerTagger:TagsTest MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.The requested file or folder does not exist.There was a problem saving your properties.There was an error communicating with the status checker service.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate Local RepositoryUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate the selected path to this revisionUpdate to revision...Update to this revisionUpdating...VCS:Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must specify a version control system using the --vcs [svn|git] optionYou must supply a destination path.just nowlabelthe selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-12-09 15:20+0000 Last-Translator: Reinout van Schouwen Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) X-Poedit-Language: Dutch %d minu(u)t(en) geleden%i dag%i dagen%i uur%i uur%i minuut%i minuten%i maand%i maanden%i seconde%i seconden%i week%i weken%i jaar%i jaar%s - klaar100Er is een conflict gevonden in het volgende bestand:Branch toevoegenBoodschap ToevoegenTag toevoegenBetrokken bestand(en) (dubbelklik om te vergelijken met basis)AuthenticatieBranchdetailBranchesCertificaatdetailsHet repository van uw werkversie veranderenGewijzigde bestanden (dubbelklik om met basis te vergelijken)Checkertype:Committen naar:Configuratie-editorEigenschapdetails bewerkenVoer naam- en e-maildetails inTe vergrendelen bestandenMapnaamVan RevisieVan URLVan: (Samen te voegen URL en revisie)Bestanden negeren en uitsluiten van gevolgd wordenBericht importerenKoppelingenLogboekberichtenLogboek-optiesGeheugengebruik: BerichtMerk op: veranderingen aan eigenschappen worden direct doorgevoerd. U kunt veranderingen herzien en ongedaan maken met behulp van het contextmenu voor elk item. OptiesAndere informatieGelieve uw authenticatiedetails toe te voegenBeschrijf waarom u deze bestanden vergrendeltGeef alstublieft uw ssl certification-bestandEerdere berichtenProces-ID:Programma voor bestandsvergelijkingEigenschappen voor:Informatie over pullRabbitVCSRepository's op afstandURI op afstand:RepositoryRevisiebereikRevisieRevisietabelTagdetailTagsNaar RevisieNaar: (samen te voegen URL en revisie)URL-geschiedenisURL waarvandaan samen te voegenVersie InformatieWerkversie:WerkversieGeselecteerde eigenschappen worden recursief toegepast.Weet u zeker dat u %item% wilt verwijderen?RabbitVCSRabbitVCS-foutEen wizard met samenvoegstappenOverInfo over RabbitVCSVoor altijd accepterenVan mij accepterenEenmalig accpeterenVan hen accepterenActieToevoegenEmbleem toevoegenNieuwe eigenschap toevoegen.Een embleem toevoegen…Regel toevoegen:Voeg toe aan negeer lijstMap toegevoegd aan het repositoryEr is een fout opgetreden in de RabbitVCS Nautilus-extensie. Neem contact op met het RabbitVCS-team met de hieronder vermelde foutdetails:AnnoterenAnnoteren — %sEen bestand annoterenAnnoteren…Past een geünificeerd diff-bestand toe op de werkversiePatch toepassenPatch op map toepassen...Patch toepassen…Eigenschap recursief toepassenPatchbestand toepassen...Weet u zeker dat u uw authenticatie-informatie wilt wissen?Weet u zeker dat u uw vorige berichten wilt wissen?Weet u zeker dat u uw repositorypaden wilt wissen?Weet je zeker dat je wil verdergaan?Wilt u %s echt verwijderen?AuthenticatieAuthenticatie-informatie gewistAuteurAuteur:Auteurs:BranchBranchbeheerBranch/tagBranch/tag…Branch:BranchesEen repository-boom doorbladerenBladeren naarNaar een bestand of map navigerenBladeren…FoutenAnnulerenKan een map niet annoterenVeranderingDe repository-locatie van een werkversie wijzigenCertificaat controlerenControleren op aanpassingen…Controleren op wijzigingen die aan het repository zijn gemaaktEen werkversie uitcheckenUitchecken van %s…UitcheckenUitchecken — %sUitchecken…Gebruik deze methode als u wijzigingen hebt gemaakt aan een branch en uw wijzigingen wilt samenvoegen met een andere branch.Gebruik deze methode als u twee verschillende branches wilt samenvoegen naar uw werkversie.Werkversie opschonenWordt opgeruimd...OpruimenOpschonen aangevraagd… Beginnen met opschonen van werkversie?Uw authenticatie-informatie wissenKlonenDit dialoogvenster sluiten.CommitAanpassingen committen in het repositoryBestanden/mappen vergelijkenRevisies vergelijkenNaast elkaar vergelijkenDe verschillen tussen twee items vergelijkenVergelijken met basisMet basisversie vergelijken met behulp van naast-elkaar-vergelijkprogrammaVergelijken met eerdere revisieVergelijken met eerdere revisie met behulp van naast-elkaar-vergelijkprogrammaVergelijken met werkversieToevoegen klaarBranch/tag is klaarUitchecken voltooidOpruimen voltooidKlonen voltooidCommit voltooidExport is klaarImporteren klaarVergrendelen is klaarSamenvoegen voltooidSamenvoegtest voltooidPush voltooidVerhuizen voltooidHernoemen voltooidOplossen voltooidTerugdraaien voltooidTerugdraaien voltooidWisselen voltooidUnlock voltooidUpdate is voltooidConfiguratiebestand:BevestigingBeslissing op conflictoplossingInhoudstatus:Kopiëren van padKopiëren van revisieLocatie naar het klembord kopiërenEen item kopiëren naar een andere locatie in het repositoryKopiëren naar...Map aanmaken…Patch aanmakenPatch aanmaken…Hier een repository aanmakenRepository in een map aanmakenMap maken...Maakt een geünificeerd diff-bestand met al de wijzigingen die u gemaakt heeftBezig met maken van patch-bestand…DatumDatum:DebuggenDebug-terugdraaienVerwijderenVerwijderen bevestigenEigenschappen recursief verwijderenEigenschap verwijderenEigenschap verwijderen (recursief)Deze eigenschap verwijderenDeze eigenschap verwijderen (recursief)WeigerenDiff-menu…Wilt u de geselecteerde eigenschappen van alle bestanden en submappen onder deze map verwijderen?Auteur bewerkenAuteur bewerken…Details bewerkenLogboekmelding bewerkenLogboekmelding bewerken…Revisie-eigenschappen bewerken…Bewerken...E-mail:Emblemen inschakelen…Bestandskenmerken inschakelenRecursieve statuscontroles inschakelenEngelsExporterenExporteren — %sEen werkversie of repository exporteren zonder versiebeheer-informatieExporteren…ExtensieExterne programma'sFetch/PullBestand is niet onder versiebeheerVingerafdruk:KlaarAanroep van invalidate_extension_info() afdwingen%d item(s) gevondenVan:AlgemeenVergrendelenBlokkering verkrijgen…GitGrafiekHEADHulpHostHostcomputer:Hoe wilt u dit afhandelen?NegerenVoorgeschiedenis negerenBestand negeren:Item negeren per extensieItem negeren per bestandsnaamImporterenImporteren — %sItem importeren in een repositoryGenegeerde bestanden meenemenRepository initialiserenOngeldig makenUitgever:Geschiedenis van oude branch behoudenTaal:Limiet:RegelLijst van vergelijkingsoptiesLaden/verversenLaden...Items lokaal blokkerenBestanden vergrendelenVergrendeldLogboekLogboek — %sLogboekmeldingLogboekAanmeldnaam:Een item in conflict markeren als opgelostSamenvoegenSamenvoeg-assistentHandmatig samenvoegenEen reeks revisies samenvoegenWijzigingen samenvoegen in lokale branchTwee verschillende bomen samenvoegenSamenvoegen…BoodschapMessage:Mime typeMinimumniveau voor loggenMeer acties...Verplaatsen naar...N.v.t.NaamNaam en e-mailName:Nieuwe locatie:Nieuwe naam:Nieuw…NeeMeldingenNummerHet aantal te onthouden URLsHet aantal te onthouden berichtenExternen overslaanAlleen het samvoegen opnemenOpenShell openenBestand openenOpenen vanaf eerste revisieOpenen vanaf tweede revisieWachtwoord:Patchbestand toegepastPatch-bestand aangemaaktPadPad:Vorige boodschappenVorige berichten gewistEigenschappenEigenschappen — %sEigenschapEigenschap-wijzigingEigenschappen-editorEigenschapsstatusEigenschapsstatus:Eigenschap:PullPushRabbitVCSRabbitVCS-foutRabbitVCS GitRabbitVCS SVNOmgeving:RecursiefVerversenInformatie verversenVerversingsstatusDe eigenschappenlijst verversenBlokkering vrijgeven…Blokkering op een item vrijgevenVerhuizenUw werkversie verhuizenVerhuizen…Afstandrepository-beheerHernoemenHernoemen…Bladeren door repositoryRepository-URLRepository paden gewistRepository succesvol aangemaaktRepository:GereserveerdOplossenChecker herstartenTerugzettenEen ontbrekend item herstellenTerugdraaienEen item terugzetten naar zijn ongemodificeerde staatEigenschap terugdraaienEigenschap terugdraaien (recursief)Deze eigenschap terugdraaien naar haar oorspronkelijke staatDeze eigenschap terugdraaien naar haar oorspronkelijke staat (recursief)Alles in zicht terugdraaienRevisieRevisie:Terugdraaien naar revisieTerugdraaien naar opgegeven revisienummerTerugdraaien…Wordt toegevoegd...Branch/tag wordt uitgevoerd...Uitvoeren checkout-opdracht…Uitvoeren van kloon-opdracht…Commit-opdracht uitvoeren…Wordt geëxporteerd...Wordt geïmporteerd...Wordt vergrendeld...Bezig met uitvoeren van merge-opdrachtSamenvoegtest draaienUitvoeren Push-opdracht…Uitvoeren relocate-opdracht…Uitvoeren rename-opdracht…Bezig met uitvoeren resolve-opdracht…Bezig met uitvoeren revert-opdracht…Bezig met uitvoeren switch-opdracht…Bezig met uitvoeren unlock-opdracht…SSL-gebruikerscertificaatOpslaanOpslaan als…Authenticatie opslaanOpgeslagen dataEen item klaarzetten om verwijderd te worden uit het repositoryEen item klaarzetten om hernoemd te worden in het repositoryItems klaarzetten om toegevoegd te worden aan het repositorySelecterenAlles (de)selecterenSelecteer een bestandSelecteer een mapSelecteer een programmaAls actieve branch instellenInstellingenWijzigingen weergeven…Logboek tonenRabbitVCS-debughulpprogramma's tonenDe logboekinformatie over een bestand tonenEigenschapdetails tonen en bewerkenWijzigingen tonen ten opzichte van vorige revisieWijzigingen tussen paden en revisies tonenWijzigingen tussen revisies tonenToon logNieuwe versie tonen aan de linkerkantBestanden buiten versiebeheer tonenGetoonde revisies:GrootteStartpunt:StatusStatuscheckerDe blokkeringen stelenStopcheckerOp kopie stoppenWisselenWisselen…TagTagbeheerTagger:TagsTest-samenvoegenTekstTekstwijzigingTekst-statusMet dank aan:Het debugmenu is bedoeld om problemen met RabbitVCS zelf te diagnosticerenDe 'vanaf' en 'tot' url velden zijn beide verplicht.De 'vanaf' revisie moet een integer zijn.Het gegeven pad is geen werk kopieDe item(s) worden in de prullenbak gegooid.Het veld 'nieuwe naam' is verplicht.De repository URL en doel pad velden zijn beide verplicht.Het repository URL veld is verplicht.De repository-locatie is een vereist veld.Het bestand of de map die werd gevraagd bestaat niet.Er trad een probleem op bij het opslaan van uw eigenschappen.Er is een fout opgetreden bij het communiceren met de statuscontroledienst.Er is een fout opgetreden bij het aanmaken van het repository. Zorg ervoor dat de opgegeven map leeg is.Naar:Type:URL/Pad:URL:Niet in staat eigenschappenlijst op te halenNiet in staat nieuwe waarde voor eigenschap in te stellen.OnbekendOntgrendelenUpdatenLokale repository updatenUpdaten naar revisieUpdaten naar een specifieke revisieEen werkversie updatenHet geselecteerde pad updaten naar deze revisieUpdaten naar revisie…Updaten naar deze revisieUpdaten...VCS:Geldig:WaardeWaarde:Diff ten opzichte van basis bekijkenDiff ten opzichte van eerdere revisie bekijkenDiff ten opzichte van werkversie bekijkenDiff als naast-elkaar-vergelijking bekijkenDiff tussen bestanden/mappen bekijkenDiff tussen revisies tonenHulp weergevenRabbitVCS-instellingen bekijken of wijzigenDe verschillen tussen twee bestanden bekijkenDe wijzigingen aan een bestand bekijkenDe aanpassingen aan een bestand sinds de laatste wijziging bekijkenDe eigenschappen van een item bekijkenGeünificeerde diff bekijkenWaarheen wilt u de selectie kopiëren?Waarheen wilt u de selectie verplaatsen?WerkversieJaU dient een versiecontrolesysteem op te geven met de optie --vcs [svn|git]Een doel pad is verplicht.nu netlabelde geselecteerde item(s)naarrabbitvcs-0.18/locale/oc/000077500000000000000000000000001362112712700152635ustar00rootroot00000000000000rabbitvcs-0.18/locale/oc/LC_MESSAGES/000077500000000000000000000000001362112712700170505ustar00rootroot00000000000000rabbitvcs-0.18/locale/oc/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000121361362112712700211670ustar00rootroot00000000000000m@ A P a v            & * 3 B Q X a k p w              ) 2 8 @ E K R ^ h o t                , 6 ; A L \ e o y               " ) 0 < B I M P 9JYn~  &-5<Td j t  #  & .;C L Xbv}  % .: CM^rv z       *4 =GVh q {      "/IOX\K[2XH Ne!6E4WI"\Cgmk/'BQ9D?:)U*>,O=-Ld@$8#AMPGl&]Tf`R<7cV ;iFY jZS5+aJ_%3 10b(h^.%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years100AuthenticationMessageOptionsRabbitVCSRevisionAboutActionAddAnnotateApply Patch...AuthenticationAuthorAuthors:Browse...BugsChangeCleanupCommitConfirmationCopy URL to clipboardCopy to...Create Folder...Create Patch...DateDebugDeleteDenyEdit...EnglishExportExport...ExtensionExternal ProgramsFinishedFrom:GeneralHelpHost:ImportImport - %sLanguage:Limit:LineLoading...LockedLogLog MessageLoggingLogin:MergeMerge...MessageMime TypeMore Actions...Move to...N/ANameNew Name:New...NoNotification MessagesNumberOpenOpen a filePassword:PathPath:PropertiesProperties - %sPropertyProperty:RabbitVCSRealm:RecursiveRefreshRenameRename...ReservedRestoreRevertRevisionRevision:Save As...Select a FileSettingsSizeStatusSwitch...TextTo:Type:URL:UnknownUnlockUpdateUpdating...ValueValue:YestoProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-05-06 06:27+0000 Last-Translator: Cédric VALMARY (Tot en òc) Language-Team: Occitan (post 1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i jorn%i jorns%i ora%i oras%i minuta%i minutas%i mes%i meses%i segonda%i segondas%i setmana%i setmanas%i annada%i annadas100AutentificacionMessatgeOpcionsRabbitVCSRevisionA prepausAccionApondreAnotarAplicar lo correctiu...AutentificacionAutorAutors :Percórrer...BugsModificarNetejarValidarConfirmacionCopiar l'URL dins lo quichapapièrsCopiar cap a...Crear un dorsièr...Crear un correctiu...DataDesbugatgeSuprimirRefusarModificar...AnglésExportarExportar...ExtensionProgramas extèrnesAcabatDe :GeneralAjudaÒste :ImportarImportacion - %sLenga :Limit :LinhaCargament en cors...VarrolhatJornalMessatge del jornalArchivatgeNom d'utilizaire :FusionarFusionar...MessatgeTipe MIMED'accions mai...Desplaçar cap a...N/ANomNom novèl :Novèl...NonMessatges de notificacionNumèroDobrirDobrir un fichièrSenhal :CaminCamin :ProprietatsProprietats - %sProprietatProprietat :RabbitVCSDomeni :RecursiuRefrescarTornar nomenarTornar nomenar...ReservatRestablirRestablirRevisionRevision :Enregistrar jos...Seleccionatz un fichièrParamètresTalhaEstatBascuolar...TèxteCap a :Tipe :URL :DesconegutDesvarrolharMetre a jornEn cors de mesa a jorn...ValorValor :Òcarabbitvcs-0.18/locale/pl/000077500000000000000000000000001362112712700152755ustar00rootroot00000000000000rabbitvcs-0.18/locale/pl/LC_MESSAGES/000077500000000000000000000000001362112712700170625ustar00rootroot00000000000000rabbitvcs-0.18/locale/pl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000520731362112712700212050ustar00rootroot00000000000000: HIXi~ ;)?1Z8 1(Aj H-W61$,CTgy&37GH-:1 7 G V b i m x  a! j! x!!!!?!6"5I"""""""" "" ###3#:#L# U#pc#V#+$:$2B$%u$$$&$$$%"% <%J%_%r%%%%%%%%% &&.&?& P&]&l&& && &&&&&&& '*':' O'p'gu' ''' ((9(A(P(g((( ( ( (("( (())))()-)2)8) ?)K)a) i)s)z) ) ) )))) ))))))** $*.*C* S*^*b* g* u*********+ + +!+:+ T+^+q+++++ +++++ + ,,#, *,4,<,K,k,t, {,,,,,,,,,*-?- H-R-i------ ..;.U.p... .. .. . //-/6/F/e//////// / // / 0 0A0-V0*0$0*00A1%`1,1+1Q11252 ;2E2"J2%m2222222 2223#3,3K3k3&3%3(3(3 &434#74[4p4s4p666%66!7*7A7R7V7Bo77707B8V8l8888 8)89 9*9$C9h9{9 :0 :)Q:*{::0::;!;4;H; ];k;;);;;; <;<E[<-<;< = =#=3=N=T= Z=g= ====c> s>>>#>>8>6 ?;W?!??+???@@5@D@L@k@r@@ @j@`AgAwAAAAA A AB(B>B^BzBBBBBB C!C8CNCgCxCCCC C CC DD 0D>DQD`DpDDDDD DDD&E+Ek3E EEEEE F FF(5F ^F hFrF F FF&FF FFGGG,G5G;GAG JGXG qG{GGGG GG GGGGGH HH"H6H NHZH+cHHH HHH HHHH II$/ITIgI~II IIIIII J %J0J,GJtJJJJJJ JJ J K KK /K PK ZKhKyK0K!K K K KL'!L0ILzLLLLLLL M!M8MNMcM|MMMMMM NN 9NFNVN fNqN'N N NNNOOO &O 1O ?OMO SOaOqOLOO-O0P"FPiPAP#P-P4Q_PQQQQQ,Q'Q%R.R 7RCRXRtRR R R R-R)R,S"BS(eSS$S%S SS#T%T8T_l16P,NBO H@/W("^Ux*D0`i9FS{aR)t5C %[ |3 ]\)<7TG p06!,# ( 35joZ78..4w2+K>:VL $-/8hJ1 'M?e~!dEk-&Q#:&g+=}Y94'zqsXm;* b%rIvAu$f "2ycn%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sApply PatchApply Patch To Directory...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBrowse a repository treeBrowse...BugsCannot annotate a directoryChangeCheck CertificateCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Cleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare revisionsCompare side by sideCompare with previous revisionCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy to...Create Folder...Create PatchCreate folder...Creating Patch File...DateDebugDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDo you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedFound %d item(s)From:GeneralGet LockHEADHelpHost:ImportImport - %sInclude ignored filesIssuer:Language:Limit:LineLoad/RefreshLoading...Lock FilesLockedLogLog - %sLog MessageLoggingLogin:MergeMerge AssistantMerge a range of revisionsMerge two different treesMessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.RelocateRenameRename...Repository BrowserRepository paths clearedRepository successfully createdResolveRestoreRevertRevert propertyRevert property (recursive)Revert this property to its original stateRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save As...Save AuthenticationSaved DataSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show RabbitVCS debugging toolsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksSwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a working copyUpdate to revision...Updating...Valid:ValueValue:View diff against previous revisionView diff against working copyView diff between files/foldersView diff between revisionsView the differences between two filesView the modifications made to a fileWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-11-18 22:00+0000 Last-Translator: Mateusz Boś Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i dzień%i dni%i dni%i godzina%i godzin%i godzin%i minuta%i minut%i minut%i miesiąc%i miesięcy%i miesięcy%i sekundy%i sekund%i sekund%i tydzień%i tygodni%i tygodni%i rok%i lata%i lata%s - Zakończono100Dodaj wiadomośćDotknięte pliki (kliknij dwukrotnie by porównać z bazą)UwierzytelnianieSzczegóły certyfikatuZmiana repozytorium twojej kopii roboczejZmienione pliki (kliknij dwukrotnie, by porównać z bazą)Zatwierdź do:Zmień właściwośćPliki do zablokowaniaNazwa kataloguOd wersjiZ URLOd: (URL i rewizja do złączenia)Wpisz WiadomośćLinkiZapis WiadomościOpcje zapisywania wiadomościWiadomośćUwaga: zmiany właściwości są stosowane natychmiast. Możesz przejrzeć i cofnąć zmiany używając menu kontekstowego dla każdego obiektu OpcjeProszę dodaj swoje dane uwierzytelnianiaOpisz, dlaczego blokujesz te plikiProszę podać plik certyfikatu SSLPoprzednie wiadomościProgram używany do porównywania plikówWłaściwości dla:RabbitVCSZdalny URI:RepozytoriumZakres wersjiWersjaTablica wersjiDo wersjiDo: (URL i rewizja do złączenia)Historia Adresów URLInformacje o wersjiKopia robocza:Kopia roboczaWybrane właściwości będą stosowana rekursywnie.Czy na pewno chcesz usunąć %item%?RabbitVCSBłąd RabbitVCSO programieO RabbitVCSZawsze akceptujZaakceptuj tylko tym razemAkcjaDodajDodaj SymbolDodaj nową właściwość.Dodaj SymboleDodaj do ignorowanychDodano katalog do repozytoriumWystąpił błąd w rozszerzeniu RabbitVCS. Proszę skontaktować się z autorami RabbitVCS podając szczegóły błędu widoczne poniżej:Dodaj komentarzAdnotuj - %sZastosuj łatęZastosuj łatę do katalogu...Zastosuj właściwość rekursywnieStosowanie łaty...Czy na pewno chcesz wyczyścić swoje dane autentykacji?Czy na pewno chcesz wyczyścić poprzednie wiadomościCzy na pewno chcesz wyczyścić ścieżki do repozytoriów?Czy na pewno chcesz kontynuować?UwierzytelnianieDane uwierzytelniania zostały wyczyszczoneAutorAutorzy:Utwórz gałąź/etykietęPrzeglądaj repozytoriumPrzeglądaj...BłędyNie można adnotować kataloguZmieńSprawdź certyfikatPobierzPobierz - %sWybierz tą metodę, jeżeli dokonałeś zmian w gałęzi i chciałbyś połączyć je z inną gałęzią.Wybierz tą metodę, jeżeli chcesz połączyć dwie różne gałęzie do twojej kopii roboczej.Oczyszczanie...OczyśćZażądano oczyszczania Rozpocząć oczyszczanie kopii roboczej?Wyczyść dane uwierzytelnianiaZamknij.ZatwierdźZatwierdź zmiany w repozytoriumPorównaj wersjePorównaj obok siebiePorównaj z poprzednią wersjąPorównaj z kopią robocząZakończono "dodaj"Utworzono gałąź/etykietęZakończono pobieranieZakończono oczyszczanieZakończono "zatwierdź"Zakończono "eksport"Zakończono "importuj"Zakończono "zablokuj"Zakończono 'Złącz'Przenoszenie zakończoneZmieniono nazwęZakończono "rozwiąż"Zakończono "przywróć"Zakończono "przełącz"Zakończono "odblokuj"Uaktualniono.PotwierdzenieKopiuj ze ścieżkiKopiuj z wersjiSkopiuj URL do schowkaSkopiuj do...Utwórz katalog...Utwórz łatęUtwórz katalogTworzenie pliku łaty...DataDebugujUsuńPotwierdzenie usunięciaUsuń właściwości rekursywnieUsuń właściwośćUsuń tą właściwośćUsuń tą właściwość (rekursywnie)OdrzućCzy chcesz usunąć wskazane właściwości ze wszystkich plików i podkatalogów zawartych w tym katalogu?Edytuj autoraEdytuj autora...Edytuj opis zmianEdytuj opis zmian...Edytuj właściwości wersjiZmień...Włącz symboleWłącz atrybuty plikówWłącz rekursywne sprawdzanie statusówangielskiEksportujEksportuj - %sEksportuj...RozszerzenieZewnętrzne programyPlik nie jest objęty kontrolą wersjiOdcisk klucza:ZakończonoZnaleziono %d obiekt(y/ów)Z:GłówneZałóż blokadęGŁÓWNAPomocHost:ImportujImportuj - %sWłącz pliki ignorowaneWystawca:Język:Limit:LiniaZaładuj / OdświeżŁadowanie...Zablokuj plikiZablokowanyLogLog - %sWpis dziennikaZapisywanie WiadomościLogin:ScalAsystent łączeniaScal zakres rewizjiScal dwa różne drzewaWiadomośćTyp MIMEMinimalny poziom do zapisywania wiadomościWięcej akcji...Przenieś do..Nie dotyczyNazwaNowe położenie:Nowa nazwa:Nowa...NiePowiadomienie o wiadomościachNumerIlość URL-i do zapamiętaniaIlość wiadomości do zapamiętaniaPomiń zewnętrzneTylko zanotuj scalenieOtwórzOtwórz PowłokęOtwórz plikOtwórz z pierwszej rewizjiOtwórz z drugiej rewizjiHasło:Łata została zastosowanaPlik łaty został utworzonyŚcieżkaŚcieżka:Poprzednie wiadomościPoprzednie wiadomości zostały wyczyszczoneWłaściwościWłaściwości - %sWłaściwośćZmiana właściwościEdytor właściwościWłaściwość:RabbitVCSBłąd RabbitVCSDziedzina:RekursywnieOdświeżOdśwież StatusOdśwież listę właściwości.PrzenieśZmień nazwęZmień nazwę...Przeglądarka repozytoriumŚcieżki do repozytoriów zostały wyczyszczonePomyślnie utworzono repozytoriumRozwiążPrzywróćPrzywróćPrzywróć właściwośćPrzywróć właściwość (rekursywnie)Przywróć właściwość do oryginalnej postaciWersjaWersja:Wykonywanie "dodaj"...Tworzę gałąź/etykietę...Wykonywanie 'Pobierz' ...Wykonywanie "zatwierdź"...Wykonywanie "eksport"Wykonywanie "importuj"Wykonywanie "zablokuj"Wykonywanie 'Złącz'Trwa przenoszenie...Trwa zmienianie nazwy...Wykonywanie komendy rozwiążWykonywanie "przywróć"Wykonywanie "przełącz"...Wykonywanie "odblokuj"...Zapisz jako....Zapisz dane logowaniaZapisane daneZaznacz / Odznacz wszystkieWybierz plikWybierz katalogWybierz programUstawieniaPokaż zmiany...Zobacz narzędzia debugowania RabbitVCSPokaż zmiany pomiędzy wersjamiPokaż logiPokaż pliki niewersjonowanePokazuję wersje:RozmiarStatusPrzejmij blokadyPrzełączPrzełącz...Test ScalaniaTekstZmiana TekstuStatus TekstowyPodziękowania:Menu debugowania jest używane do diagnozowania problemów z samym RabbitVCSPola z i do są wymaganePole od rewizji musi być liczbą całkowitąPodana ścieżka nie wskazuje na kopię robocząObiekty zostaną wysłane do koszaPole nowa nazwa jest wymaganeZarówno URL repozytorium, jak i ścieżka docelowa są wymagane.Pole URL repozytorium jest wymaganePołożenie repozytorium jest polem wymaganymWystąpił błąd przy próbie zapisu właściwościWystąpił błąd w czasie tworzenia repozytorium. Upewnij się, że podany katalog jest pusty.Do:Rodzaj:URL/Ścieżka:URL:Nie udało się pobrać listy właściwościNie udało się zmienić właściwościNieznaneOdblokujZaktualizujUaktualnij do wersjiZaktualizuj kopię robocząZaktualizuj do wersji...Uaktualnianie...Poprawny:WartośćWartość:Pokaż różnice względem poprzedniej wersjiPokaż różnice względem kopii roboczejZobacz różnice pomiędzy plikami/folderamiPokaż różnice pomiedzy wersjamiZobacz różnice pomiędzy dwoma plikamiZobacz zmiany w plikuGdzie chcesz skopiować zaznaczenie?Gdzie chcesz przenieść zaznaczenie?Kopia roboczaTakMusisz podać ścieżkę docelową.zaznaczone obiektydorabbitvcs-0.18/locale/pt_BR/000077500000000000000000000000001362112712700156705ustar00rootroot00000000000000rabbitvcs-0.18/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001362112712700174555ustar00rootroot00000000000000rabbitvcs-0.18/locale/pt_BR/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000713301362112712700215750ustar00rootroot00000000000000 #(")":"I"Z"o"""" """";")#?#O#1j#8###$$,$A$(Q$z$ $$$$$X%-g%6%1%%$&<&S&d&w&&&&& &&&&'1'J'e'z'7'H'-(:=(x(((( ((( (( () )5)) )) )/) +*7*S*b*}*?*6*5 +"A+#d++"+++++ + ++, ,%, @,J,O,k,0r,,,.,,- !- /-p;-V-..(.20.%c....&....) /7/4I/~/A// /00/0A0R0c0t0000000011 "1/1>1Q12g1 11 1111 252Q2h2m2s2 y2222222 3!3 &3g33 33 33334 4424Q4Y4 `4Bl4 4 44"4 45)585I5O5W5 `5l5q5v5|5 5555 5 566 /6:6 B6L6S6X6 s6 66 6666 666"6677,7F7O7W7 `7j77 7777 7 7777778"818G8 L8 W8c8|8 8888888 899!919A9 Q9 [9e9 u9 99 999999: : %:1:9: @:J:]:v::::::&::;* ;6K;;; ;;;;<<5<O<g<}<<<<<<=/=H= M=X= l=2w=0=,=> >,><>M>V>f>o>>>(>>??3?F?K?R? b?o? v?? ?? ?? ? ??A?-@*5@$`@*@@A@%A,7A+dAQAAA AA"A%BDBLBSBZB$mBBB BBCCCC#CD$3DXDxD D!D&D%D; EIEhE(zE(E EE#EF FF"FH(H7HHH]HnHHHHHHHDH;IQIgI7IAIJ%J:JXJmJ J*JJ JJJKKK:KGL;`LL0LLMM$M8MVMfMMMM,MM#N9NYNnNDNGN-O=CO%OOOOOO OOP P5P$UPzP Q Q"Q6QREQQ$QQ"QRA R4bR=R!RRS&&SMSSS \SjS S SS$S SS TT(T  y<gRppjUUl 6r;d"XCG\ uvS5jyT~)le5YR^/w1X\t30|hdID) KEcr-S3 $B!9m ?[{*V4fM,]#.NwAi1'CN$s sxcb7` M8hAbt E7 @==Ze%k@TqL,H`Pa}#_%;D*Y/24]FaF+WQ{_(":GxHOK2omO0v}96Wukz(Q.>gn8^[oB&|qfV-L%d minute(s) ago%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAdd TagAffected File(s) (double-click to compare with base)AuthenticationBranchesCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTag DetailTagsTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?Are you sure you want to delete %s?AuthenticationAuthentication information clearedAuthorAuthors:BranchBranch ManagerBranch/tagBranch/tag...BranchesBrowse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCloneClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDate:DebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete property (recursive)Delete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit detailsEdit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore file:Ignore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInitialize RepositoryInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMessage:Mime TypeMinimum level to logMore Actions...Move to...N/ANameName:New Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRabbitVCS GitRabbitVCS SVNRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RemotesRenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSaveSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow and edit property detailsShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...TagTag ManagerTagsTest MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.just nowthe selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-12-06 05:15+0000 Last-Translator: Fernando P Silveira Language-Team: Brazilian Portuguese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %d minutos(s) atrás%i dia%i dias%i hora%i horas%i minuto%i minutos%i mês%i meses%i segundo%i segundos%i semana%i semanas%i ano%i anos%s - Finalizado100Adicionar MensagemAdicionar palavra-chaveArquivo(s) afetado(s) (duplo clique para comparar com a base)AutenticaçãoRamificaçõesDetalhes do CertificadoAlterar o repositório da sua cópia de trabalhoArquivos alterados (duplo clique para comparar com a base)Enviar para:Editar Detalhes da PropriedadeArquivos para bloquearNome da PastaDa RevisãoDa URLDe: (URL e revisão para mesclagem)Importar MensagemLinksMensagens de LogOpções de LogMensagemNota: Alterações das propriedades são aplicadas instantâneamente. Você precisa rever e anular as alterações efetuadas usando o menu de contexto para cada item. OpçõesPor favor, adicionar detalhes da sua autenticaçãoPor favor, descreva porque você está bloqueando esses arquivosPor favor forneça seu arquivo de certificação SSLMensagem AnteriorPrograma utilizado para comparar arquivosPropriedades para:RabbitVCSURI Remota:RepositórioIntervalo de RevisõesRevisãoTabela de RevisõesDetalhe da palavra-chavePalavras-chavePara RevisãoPara: (URL e revisão para mesclagem)Histórico de URL(s)URL de origem para mesclagemInformações da VersãoCópia em usoCópia de TrabalhoAs propriedades selecionadas serão aplicadas recursivamente.Tem certeza que deseja deleter %item%?RabbitVCSErro do RRabbitVCSUm assistente com passos para mesclarSobreSobre o RabbitVCSAceitar SempreAceitar uma vezAçãoAdicionarAdicionar EmblemaAdicione uma nova propriedade.Adicionar um emblemaAdicionar à lista de ignoradosAdicionado uma pasta ao repositórioOcorreu um erro na extensão do RabbitVCS Nautilus.Por favor contate o Time RabbitVCS com os detalhes do erro listados abaixo:ComentarComentar - %sComentar um arquivoComentário...Aplicar um arquivo com resultado de equalidade unificado para a cópia de trabalhoAplicar remendoAplicar remendo para o diretório...Aplicar remendoAplicar propriedade recursivamenteAplicando a linha de remendo...Tem certeza que deseja apagar sua informação de autenticação?Tem certeza que deseja apagar sua mensagem anterior?Tem certeza de que deseja apagar seu caminho do repositório?Tem certeza que deseja continuar?Tem certeza que quer apagar %s?AutenticaçãoInformação de autenticação apagadaAutorAutores:RamificaçãoGerenciador de ramificaçõesBranch/tagBranch/tag...RamificaçõesProcurar uma árvore de repositórioNavegue paraProcurar em um arquivo ou pastaProcurar...BugsNão é possível comentar um diretórioAlteraçãoMudar o lugar do repositório de um cópia de trabalhoVerificar CertificadoVerificando se existem modificações...Verificando se existem modificações efetuados para o repositórioObter uma cópia de trabalhoObterCheckout - %sObter...Escolha este método se você fez algumas alterações para um branch e deseja mesclar suas alterações com outro branch.Escolha este método se você deseja mesclar dois diferentes branches em sua cópia de trabalho.Limpeza de cópia de trabalhoLimpando...LimpezaLimpeza Solicitada .... Começar a limpeza da cópia de trabalho?Apagar sua informação de autenticaçãoClonarFechar esta janela.EnviarEnviar modificações para o repositórioComparar arquivos/pastasCompare revisõesComparação lado a ladoComparar as diferenças entre dois itensComparar com a baseComparar com a base usando a ferramenta de comparação lado a ladoCompare com a revisão préviaComparar com prévia revisão usando a ferramenta de comparação lado a ladoCompare com a versão localAdicionar ConcluídoBranch/tag CompletadaObter ConcluídoLimpeza ConcluídaEnviar ConcluídoExportar ConcluídoImportar ConcluídoBloqueadoMerge ConcluídoTeste de Merge ConcluídoRelocar ConcluídoRenomear CompletadoResolver ConcluídoReverter ConcluídoTrocar ConcluídoDesbloquear CompletadoAtualização CompletadaConfirmaçãoCopiar do CaminhoCopiar da versãoCopiar a URL para a área de transferênciaCopiar um item para outro lugar no repositórioCopiar para...Criar pasta...Criar PatchCriar Remendo...Criar Repositório aquiCriar um repositório no diretórioCriar pasta...Cria um arquivo diff unificado com todas as mudanças que vocẽ fezCriando arquivo de remendoDataData:DepurarReverter depuraçãoApagarConfirmação de RemoçãoApagar propriedades recursivamenteExcluir propriedadeApagar propriedade (recursivo)Excluir esta propriedadeExcluir esta propriedade (recursivo)NegarMenu do diferenciadorVocê deseja deletar as propriedades selecionadas para todos os arquivos e subdiretórios contidos neste diretório?Edite o autorEdite o autor...Editar detalhesEdite a mensagem do relatórioEdite a mensagem do relatório...Editar propriedades de revisãoEditar...Ativar emblemasAtivar atributos de arquivoAtivar checagem recursiva de statusInglêsExportarExportado - %sExportar uma cópia de trabalho ou repositório sem informações de versionamentoExportar...ExtensãoProgramas ExternosO arquivo não está sob o controle da versão.Impressão digital:ConcluídoForçar uma chamada invalidate_extension_info()Encontrado(s) %d item(ns)De:GeralBloquearBloquear...HEADAjudaServidor:Ignorar ancestralIgnorar arquivo:Ignorar item por extensão de arquivoIgnorar item por nome de arquivoImportarImportado - %sImportar um item em um respositórioIncluir arquivos ignoradosIniciar repositórioInvalidarEmissor:Idioma:Limite:LinhaLista de opções de comparaçãoCarreage/RenovarCarregando...Itens bloqueados localmenteBloquear ArquivosBloqueadoLogLog - %sMensagem de logGravando LogLogin:Marcar um item conflitante como resolvidoMergeAssistente de MesclagemMesclar um intervalo de revisõesMesclar duas árvores diferentesMesclar...MensagemMensagem:Tipo MimeNível médio para logMais ações...Mover para...N/DChaveNome:Nova LocalizaçãoNovo Nome:Novo...NãoMensagens de NotificaçãoNúmeroNúmero de URLs para se lembrarNúmero de mensagens para se lembrarOmitir os ExternosSomente gravar a mesclagemAbrirAbrir ShellAbrir um arquivoAbrir da primeira versãoAbrir da segunda versãoSenha:Linha de remendo aplicadaArquivo de remendo criadoCaminhoCaminho:Mensagem AnteriorMensagem anterior apagadaPropriedadesPropriedades - %sPropriedadeAlteração de PropriedadeEditor de PropriedadePropriedades de StatusPropriedade:RabbitVCSErro do RabbitVCSRabbitVCS GitRabbitVCS SVNDomínio:RecursivoAtualizarAtualizar StatusAtualizar a lista de propriedades.Liberar Bloqueio...Liberar bloqueio de um itemRealocarRealocar sua cópia de trabalhoRealocar...RemotosRenomearRenomear...Navegador de RepositórioCaminho do repositório apagadoRepositório criado com sucessoReservadoResolverRestaurarRecuperar um item em faltaReverterReverter um item para seu estado inalteradoReverter propriedadeReverter propriedade (recursivo)Reverter esta propriedade ao seu estado originalReverter esta propriedade ao seu estado original (recursivo)Reverter tudo que veRevisãoRevisão:Rodando Comando Adicionar...Rodando comando Branch/tag...Executando Checkout...Rodando Comando Enviar...Rodando Comando ExportarRodando Comando Importar...Bloqueando...Executando MergeExecutando Teste de MergeRodando Comando RealocarRodando Comando Renomear..Rodando Comando ResolverRodando Comando Reverter...Rodando Comando TrocarRodando Comando DesbloquearCertificação SSL do clienteSalvarSalvar como...Salvar AutenticaçãoData SalvaAgendar um item para ser deletado do repositórioAgendar um item para ser renomeado no repositórioProgramar itens para serem adicionaos ao repositórioSelecionar / Deselecionar tudoSelecionar um arquivoSelecionar um diretórioSelecione um programaConfiguraçõesMostrar Alterações...Mostrar LogMostrar ferramentas de debug do RabbitVCSMostrar as informações de um arquivo de logExibir e editar detalhes da propriedadeMostrar alterações entre caminhos e revisõesMostrar mudanças entre as revisõesMostrar LogMostrar arquivos não versionadosMostrando Revisões:TamanhoEstadoRoubar os bloqueiosParar em cópiaTrocarMudar...Palavra-chaveGerenciador de palavras-chavePalavras-chaveTestar MesclagemTextoAlteração do textoTexto de StatusAgradecimentos:O menu de debug é usado para diagnosticar problemas com o próprio RabbitVCSAs URL origem e destino são necessáriasO campo revisão de origem deve um inteiroO caminho informado não é de uma cópia de trabalhoO(s) item(ns) pode(m) ser enviado(s) para lixeira.O nome do novo campo é requeridoOs campos URL do repositório e caminho de destino são necessários.O campo URL do repositório é necessário.O campo repositório local é necessárioHouve um problema ao salvar suas propriedades.Ocorreu um erro criando o repositório. Tenha certeza que o diretório informando está vazio.Para:Tipo:URL/Caminho:URL:Incapaz de recuperar a lista de propriedadesIncapaz de ajustar um novo valor à propriedade.DesconhecidoDesbloquearAtualizarAtualizando para RevisãoAtualizar um arquivo para uma revisão específicaAtualizar uma cópia de trabalhoAtualizar para revisão...Atualizando...Utilize o diálogo de log para selecionar as revisões que você deseja mesclar. Ou, escreve manualmente as revisões, separando por vírgula. Você pode especificar um intervalo de visões utilizando um traço. Examplo: 4-7,9,11,15-HEAD Para mesclar todas as revisões, deixa a caixa vazia.Validar:ValorValor:Diferenciações comparadas à baseVeja a diferenciação de encontro com a revisão préviaVeja a diferenciação de encontro com a cópia em usoVer diferenciação por comparação lado a ladoVer diferenciações entre arquivos/pastasVeja a diferenciação entre as revisõesVisualizar ajudarVisualizar ou alterar as configurações do RabbitVCSVer as diferenças emtre dois arquivosVisualizar as alterações feitas em um arquivoVer as modificações realizadas em um arquivo desde a última alteraçãoVisualizar as propriedades de um itemVisão da unificação pelo diferenciadorOnde você quer copiar a seleção?Onde você quer mover a seleção?Cópia em uso.SimVocê deve informar uma pasta de destino.há poucoO(s) item(ns) selecionado(s)pararabbitvcs-0.18/locale/ro/000077500000000000000000000000001362112712700153025ustar00rootroot00000000000000rabbitvcs-0.18/locale/ro/LC_MESSAGES/000077500000000000000000000000001362112712700170675ustar00rootroot00000000000000rabbitvcs-0.18/locale/ro/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000225571362112712700212160ustar00rootroot000000000000004L    )?Zj7H>-    % 5?A65"" CJ S ^ hr 0A R_djq   $)/? FR hs {  3 8BGY s~    &-6Mk  "+2 9 CN S_-g% !' .!8%Z#  #15J_y :*Le- ,> Zeu 67>!G i$w   #9Uk{    ,?[d mz    + 4 < E K [ b i p x         ! !!"! 8!F! X!d! u! !!!!!! !!!" " "*"2""P"s"" """""# #$+# P#^#d# l#x## # #4#%###!$&$ +$ 6$ C$O$g$$$$$0$.$*%:%1=%gvNEX32Q^SF@ &Gye;}I+UY'_s RJ{>T"bpl.t8?!d5,cP$KmVh|1ak4f z O9rD)H(7u/-MiA]`ZC06#:=% W \[<nBowxj~q*L%i hour%i hours%i minute%i minutes%i second%i seconds%s - Finished100Add MessageAuthenticationCertificate DetailsFrom URLImport MessageLog MessagesMessageOptionsPrevious MessagesProperties for:RabbitVCSURL HistorySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSAboutAbout RabbitVCSAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAnnotateAnnotate - %sAnnotate a fileAnnotate...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBrowse toBrowse...Cannot annotate a directoryCheck CertificateCleaning Up...CleanupCompleted AddCompleted Branch/tagCompleted CleanupCompleted ExportCompleted ImportCompleted LockCompleted RelocateCompleted RenameCompleted UpdateConfirmationDateDebugDeleteDelete ConfirmationDenyEdit...Enable emblemsEnable file attributesEnglishExportExport - %sExtensionExternal ProgramsFingerprint:FinishedFound %d item(s)From:GeneralHelpHost:Ignore ancestryImportImport - %sInclude ignored filesInvalidateIssuer:Language:Limit:LineLoading...LockedLogLoggingLogin:Merge AssistantMessageN/ANameNew Name:New...Notification MessagesNumber of messages to rememberOnly record the mergeOpenPassword:PathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty StatusProperty:RabbitVCSRealm:RecursiveRefreshRefresh StatusRelocateRenameRename...Repository paths clearedResolveRestoreRevertRevisionRunning Add Command...Running Branch/tag Command...Running Relocate Command...Running Rename Command...Saved DataSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow RabbitVCS debugging toolsShow logStatusSwitchSwitch...Test MergeTextText StatusThanks:The from and to url fields are both required.The new name field is requiredThe repository URL field is required.Type:URL:UnknownUnlockUpdateUpdate To RevisionUpdating...Valid:ValueValue:View helpView or change RabbitVCS settingsView the modifications made to a fileView the properties of an itemYesYou must supply a destination path.Project-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Romanian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 == 0) && (n != 0))) ? 2: 1)); X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i oră%i ore%i de ore%i minut%i minute%i de minute%i secundă%i de secunde%s - Terminat100Adaugă MesajAutentificareDetalii CertificatDin URLImportă MesajMesaje JurnalMesajOpțiuniMesaje AnterioareProprietăți pentru:RabbitVCSIstorie URLProprietățile selectate vor fi aplicate recursiv.Ești sigur că vrei să ștergi %articol%?RabbitVCSDespreDespre RabbitVCSAcceptă O dataAcțiuneAdăugareAdaugă EmblemăAdauga o emblemăAdaugă la lista de ignoratAdnoteazăAdnotează - %sAdnotează un fișierAdnotează...Vrei să îți ștergi informațiile de autentificare?Ești sigur că vrei sa îți ștergi mesajul anterior?Ești sigur că vrei să ștergi căile tale către depozitar?Ești sigur că vrei sa continui?AutentificareInformații de autentificare șterseAutorAutori:Domeniu/etichetăCaută înRăsfoiește...Nu se poate adnota un directorVerifică CertificatSe șterge...ȘtergereAdăugare FinalizatăDomeniu/etichetă finalizatȘtergere FinalizatăExport TerminatImport TerminatBlocare TerminatăMutare FinalizatăRedenumire efectuatăActualizare completăConfirmareDataDepaneazăȘtergeConfirmare ștergereInterziceEditează...Activează emblemeActivează atribute fișierEnglezăExportăExportă- %sExtensiePrograme ExterneAmprentă:TerminatGăsit %d articol(e)Din:GeneralAjutorGazdă:Ignoră antecedentImportăImportă - %sInclude fișiere ignorateInvalideazăEmitent:Limbă:Limită:LiniaSe încarcă...BlocatJurnalLogareLogare:Asistent ĂmbinareMesajN/DNumeNume Nou:Nou...Mesaje de notifcareNumăr mesaje de reținutÎnregistrează doar îmbinareaDeschideParolă:CaleMesaje AnterioareMesaj anterior ștersProprietățiPropietăți + %sProprietateStare PropietateProprietate:RabbitVCSDomeniu:RecursivReîmprospătareStare ReîmprospătareMutăRedenumireRedenumește...Căile către depozitar șterseRezolvăRestaureazăRestaureazăReviziaRulează Comanda Adăugare...Rulează comanda Domeniu/etichetăRulează Comanda MutăRulează Comanda RedenumireDate SalvateSelecteză/Deselecteză totSelectează un fișierSelectează un DirectorSelectează un programSetăriArată JurnalArată uneltele de depanare RabitVCSArată jurnalStareComutăComutare...Test ÎmbinareTextStare TextMulțumiriCâmpurile url de la și la sunt amândouă necesareEste necesar câmpul pentru noul numeCâmpul URL depozitar este necesar.Tip:URL:NecunoscutDeblocheazăActualizareActualizați la reviziaÎn curs de actualizare...Valid:ValoareValoare:Vizualizează ajutorVizualizează sau modifică setaările RabbitVCSVizualizează modificările aduse unui fișierVizualizează proprietățile unui articolDaTrebuie să furnizați o cale pentru destinație.rabbitvcs-0.18/locale/ru/000077500000000000000000000000001362112712700153105ustar00rootroot00000000000000rabbitvcs-0.18/locale/ru/LC_MESSAGES/000077500000000000000000000000001362112712700170755ustar00rootroot00000000000000rabbitvcs-0.18/locale/ru/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000603311362112712700212140ustar00rootroot00000000000000)d  -;?Rh1(G ]j~-6$1Vm~& ;7OH-$4 COV Z es : CQ a my?65>"t"      ' 0. _ q  p V!u!!!2!%!!&")";"P" o"}"""""""" ##1#B#T#e#v## ####2# $ $($?$_$p$$$ $$$$$$$$ %*%2% 9%BE% %% %%%%%% %%%%%& & !&B& X&b&i& n& y&&&&&&"&&&&&'' &'0'E' U'`'d' i' w''''''''( (()( C(M(`(s(x(( ((((( (( () ))*)B)K) f)r) y))))))&))**5*S*o*******+4+O+i++ ++ ++ +++ ,,,=,[,z,,,,,, ,, , ,, ,-A --M-*{-$-*--A.%W.,}.Q../ ////#/$6/[/q/ //0000 0!00(0(%1N1#R1v11113#3-33"4V4n4*r4#4.4S4%D54j5+555856/6f6"z6(666c6d^7.7Y7L8l8}8&88$88869%P9+v9 9^9d":-:.:: :;';G;X;i;;;3;;<!<%=+=K=2g=8=!=c=]Y>b>B?]?Cz? ? ???? @ #@:0@k@J~@'@.@ A/ACAUAB,BBB\BEQCCGCCD96DpD D'D#D#DE4ERE!mE(E)EEE>F+XFF'FFFG/GXOGGG0G3 H @H&aHHH.HH)H4I=IPIpI0III J J/JCJJ!J KK$'KLK RK]KxKK K K'K KKCK4AL vLL LL!LLL L M" M;0M lMwM*M1MMN N6%N1\NNNNNN NN'N,O6LO(O<OOO-P/FP vPPPP'P6PQ-QCQ#TQxQQQQQQQ+R;R6PRRRR4R2 S#@SdS#}S7SCST,T'DT,lTT!TTTU+#UOU#fU*UEUU$V9V/VV#V8VVVW5WHW8`W"W=WW/X(BX kXxX!X4XXXY 1Y!E%YuD. #$N^gP| 5c<K `]&yS_6[?Flq2); %k+f&dZ!Q mpJb aA "URw='CL %d minute(s) ago%i hour%i hours%i minute%i minutes%i second%i seconds%s - Finished100Add MessageAuthenticationCertificate DetailsChange the repository of your working copyCommit to:Edit Property DetailsFiles to lockFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to compare filesProperties for:RabbitVCSRepositoryRevision RangeRevisionRevisions TableTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Apply PatchApply Patch To Directory...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse toBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompare revisionsCompare side by sideCompare with previous revisionCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create PatchCreate Repository hereCreate a repository in a folderCreate folder...Creating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDenyEdit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExtensionExternal ProgramsFingerprint:FinishedFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryImportImport - %sImport an item into a repositoryInclude ignored filesLanguage:Limit:LineLoading...Lock FilesLockedLogLog - %sLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty StatusProperty:Realm:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository paths clearedRepository successfully createdResolveRestoreRevertRevert an item to its unmodified stateReverts everything it seesRevisionRunning Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save As...Save AuthenticationSaved DataSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:UnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff between revisionsView helpView or change RabbitVCS settingsView unified diffWhere do you want to copy the selection?Where do you want to move the selection?YesYou must supply a destination path.just nowthe selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-12-03 19:19+0000 Last-Translator: Sergey Sedov Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %d минут(ы) назад%i час%i часа%i часов%i минута%i минуты%i минут%i секунда%i секунды%i секунд%s - Завершено100Добавить сообщениеАутентификацияСвойства сертификатаИзменить репозиторий вашей рабочей копииЗафиксировать в:Редактирование свойстваФайлы на блокировкиИз ревизииИз URLИз: (URL и ревизия для слития)Сообщение ИмпортированияСсылкиСообщения логаНастройки журналаСообщениеНастройкиПожалуйста добавьте информацию об аутентификацииПожалуйста опишите причину блокировки этих файловПредыдущие сообщенияПрограмма используемая для сравнения файловСвойства для:RabbitVCSРепозиторийДиапозон ревизийРевизияТаблица ревизийВ: (URL и ревизия для слияния)История URLURL для слияния изИнформация о версииРабочая копияВыбранные свойства будут применены рекурсивно.Вы действительно хотите удалить %item%?RabbitVCSПошаговый мастер слиянияО программеО RabbitVCSПринять навсегдаПринять единождыДействиеДобавитьДобавить ИконкуДобавить иконкуДобавить в игнордобавить папку в репозиториВ расширении RabbitVCS для Nautilus произошла ошибка. Свяжитесь с командой RabbitVCS и передайте детали ошибки нижеКомментироватьКомментировать - %sКомментировать файлКомментировать...Применить патчПрименить патч к каталогу...Применять свойства рекурсивноПрименение патча..Вы точно хотите удалить информацию об аутентификации?Вы точно хотите удалить ваши предыдущие сообщения?Вы действительно хотите удалить адреса репозиториев?Вы действительно хотите продолжить?АутентификацияИнформация о аутентификации удаленаАвторАвторы:Ветка/тэгВетка/тэг...ПросмотретьОбзор...ОшибкиНельзя комментировать каталогиизменениеСменить адрес репозитория рабочей копииПроверить сертификатИзвлечение рабочей копииИзвлечьИзвлечь - %sИзвлечь...Выберите этот метод если вы вносили изменения в ветку и желаете слить свои изменения с другой веткой.Выберите этот метод если вы хотите слить две разных ветки в свою рабочую копию.Зачистить рабочую копиюЗачистка...ЗачиститьВызвана зачистка... Начать зачистку рабочей копии?Удалить информацию об аутентификацииЗафиксироватьЗафиксировать изменения в репозиторииСравнить ревизииСравнить рядомСравнить с предудыщей ревизиейДобавленоВетка/тэг созданаИзвлечение завершеноЗачистка завершенаФиксация завершенаЭкспорт завершенИмпорт завершенЗаблокированоСлияние завершеноТест слияния завершенПереселение завершеноПереименованоКонфликт решенИсходное состояние восстановленоПереключение завершеноБлокировка снятаОбновление завершеноПодтверждениеКопия из путиКопия из ревизииСкопировать адрес в буферКопировать элемент в другое место в репозиторииКопировать в...Создать патчСоздать репозиторий здесьСоздать репозиторий в папкеСоздать каталог...Создания файла патчаДатаОтладкаОтладка отмены измененийУдалитьУдалить подтверждениеУдалять свойства рекурсивноЗапретитьРедактирование...Разрешить иконкиРазрешить атрибуты файловРазрешить рекурсивную проверку статусаАнглийскийЭкспортЭкспорт - %sЭкспортировать рабочую копию или репозиторий без информации о версионностиРасширениеВнешние ПрограммыFingerprint:ЗавершеноНайдено %d элементовИз:ОбщиеЗаблокироватьБлокировка...ВедущаяПомощьХост:Игнорировать предковИмпортИмпорт - %sИмпортировать элемент в репозиторийВключить игнорируемые файлыЯзык:ОгрничениеСтрокаЗагрузка...Блокировать файлыБлокированЛогЛог - %sЖурналИмя пользоввателя:Пометить конфликт как улаженныйСлитьПомощник СлиянияСлить диапозон ревизийСлить два различных дереваСлияние...СообщениеТип mimeМаксимальный уровень журналаДополнительные действия ...Переместить в...Н/ДИмяНовое место:Новое имя:Новый...НетСообщения оповещенийСколько URL'ов запоминатьСколько сообщений запоминатьБез внешних включенийТолько зарегистрировать слияниеОткрытьОткрыть терминалоткрыть с первой ревизииоткрыть со второй ревизииПароль:Патч примененПатч созданПутьПредыдущие сообщенияПредыдущие сообщения удаленыСвойстваСвойства - %sСвойствоИзменение свойстваСостояниеСвойство:Область:РекурсивноОбновитьОбновить статусРазблокировка...Разблокировать элементПереселитьПеребазировать рабочую копиюПереселить...ПереименоватьПереименовать...Адреса репозиториев удаленыРепозиторий успешно созданРазрешить конфликтВосстановитьОткатить измененияВернуть к исходному состояниюОтменяет изменения во всем что видитРевизияДобавление...Создание ветки/тэга...Извлечение исходников...Фиксация...Экспортирование...Импортирование...Блокировка...Запуск слиянияЗапуск теста на слияниеПереселениеПереименовывание...Разрешение конфликта...Восстановление исходного состояния...ПереключениеСнатие блокировки...Сохранить как...Сохранить аутентификациюСохраненные данынеВыбрать / Снять выбор для всегоВыбрать файлВыбор каталогаВыбор программыНастройкиПоказать логПоказать утилиты отладки RabbitVCSПоказать лог файлаПоказать отличия между ревизиямиПоказать логПоказать файлы без версииОтображенные ревизии:РазмерСостояниеСкрыть блокировкиОстановиться на копированииПереключитьПереключить...Пробное слияниеТекстСостояние текстаСпасибо:Меню отладки используется для диагностики неполадок RabbitVCSПоля URL и От - обязательныНачальная ревизия должно быть целое числоЗаданный путь не является рабочей копиейЭлементы будут отправлены в корзинуНовое имя обазятельно!Поля URL репозитория и путь назначения - обязательны.Поле URL - обязательноУкажите адрес репозиторияОшибка при создании репозитория. Убедитесь что папка пуста.В:Тип:URL/Путь:URL:РазблокироватьОбновитьОбновить до ревизииОбновить файл до определенной ревизииОбновить рабочую копиюОбновить до ревизии...Обновление...Используйте диалог лога для выбора ревизий для слияния. Или впишите ревизии вручную через запятую. Вы можете указать диапазон через тире Пример: 4-7,9,11,15-HEAD Оставьте пустым для слияния всех ревизий.Действителен:ЗначениеЗначение:Показать отличия между ревизиямиПосмотреть помощьПросмотреть или изменить настройки RabbitVCSПросмотреть diffКуда вы хотите скопировать выделенное?Куда вы хотите переместить выделенное?ДаВы должны задать путь назначения.прямо сейчасвыбранные элементыдоrabbitvcs-0.18/locale/sk/000077500000000000000000000000001362112712700152775ustar00rootroot00000000000000rabbitvcs-0.18/locale/sk/LC_MESSAGES/000077500000000000000000000000001362112712700170645ustar00rootroot00000000000000rabbitvcs-0.18/locale/sk/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000376061362112712700212140ustar00rootroot00000000000000Q &<1W( 1>Rix-6$*ARdz&"76Hn-  *6= A LZm v ?65"Mp"   0&8Q ZphV0FU2]%& (9JYi~ 2'Zq'/ 6BB     3 I T \ f m r }      "    !,!5!=!A! F!P!W!m!!!! ! !!!! ""#"," <" F"P" W"a"i"x"""" "" """#"#*#&1#X#s#|######$+$>$Z$t$$$$$ $$ % %0%A%J%S%\%s%%% %% % %% %%*% &Q)&{&& &&&&&&$&&& ''!''' .'!8'%Z'''#''''))))*1#*U*'j*** *%** ++ ,+M+ \+4j+7++5+-,D,U,h,,,,%,,,-*-7A-By---$-. ..-.?.E. M.Z. o. ....>.A /=O/%/ //// // 00$00B0s00 00o0Y:111 1A1% 2 12;2[2o22222223353N3c3v333 33313)4"B4e4l4 ~44"4 4 444%5.575 >5GJ5 555 555 556 6 66*6 16#=6a666666666 66 6 6 7,7 L7W7l7!7 7777 777 7858L8U8d8k8q8"8 88 8 8 8 88 8 9 9"959 P9#]99 9 999 999+:.:I:R:q: ::":: ;3;&N;%u;;;; ;<*<;< V<c<t< <<<<<<<< = ==/= 4= ?=#L="p=^=== => > > >,>*C>n>>>>>>>+>?+?H?!L?n??!o/G^?y9NO`FV8&tan+R"1qW23H,wBQ@g}zT5_E -6{mur 4*.ieIs hcY7>M%xjUb#= S][D:$kK|(JP<CL Xd\0 v~Al'p;Z)f%s - Finished100Add MessageAuthenticationCertificate DetailsChange the repository of your working copyCommit to:Edit Property DetailsFiles to lockFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to compare filesProperties for:RabbitVCSRepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAnnotateAnnotate - %sAnnotate a fileAnnotate...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tag...Browse toBrowse...BugsCannot annotate a directoryChange the repository location of a working copyCheck CertificateCheck out a working copyCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompleted AddCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy an item to another location in the repositoryCreate Repository hereCreate a repository in a folderDateDebugDeleteDelete ConfirmationDelete properties recursivelyDenyEdit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExtensionExternal ProgramsFingerprint:FinishedFound %d item(s)From:GeneralGet LockHEADHelpHost:Ignore ancestryImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineLoading...Locally lock itemsLock FilesLockedLogLog - %sLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageN/ANameNew Name:New...Notification MessagesNumber of URLs to rememberNumber of messages to rememberOnly record the mergeOpenOpen ShellPassword:PathPrevious MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty StatusProperty:RabbitVCSRealm:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository paths clearedRepository successfully createdResolveRestoreRevertRevert an item to its unmodified stateReverts everything it seesRevisionRunning Add Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save AuthenticationSaved DataSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow LogShow logShow unversioned filesShowing Revisions:StatusSteal the locksStop on copySwitchSwitch...Test MergeTextText StatusThanks:The item(s) will be sent to the trash can.The new name field is requiredThere was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Valid:ValueValue:View helpView or change RabbitVCS settingsView the modifications made to a fileView the properties of an itemYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %s - Dokončené100Pridať správuAutentizáciaPodrobnosti certifikátuZmeniť repozitár vašej pracovnej kópieOdovzdať do:Upraviť vlastnosť podrobnostíSúbory na zamknutieZ Revíziez URLOd: (URL a revíziu zlúčiť)Import správyLinkyZáznam správMožnosti zaznamenávaniaSprávaVoľbyProsím pridajte vaše podrobnosti o overeníOpíšte prosím, prečo tieto súbory zamykátePredchádzajúce správyProgram používaný na porovnávanie súborovVlastnosti pre:RabbitVCSRepozitáreRozsah revízieRevíziaRevízna tabuľkaDo RevízieDo: (URL a revíziu zlúčiť)URL HistóriaURL zlúčiť odInformácie o verziiPracovná kopiaVybrané vlastnosti budú použité rekurzívne.Naozaj chcete zmazať %položku%?RabbitVCSA sprievodca s krokmi pre zlúčenieOO RabbitVCSPrijať navždyPrijať iba terazAkciaPridaťPridať znakPridať nejaký znakPridať do zoznamu ignorovanýchKomentovaťKomentovať -%sKomentovať súborKomentovať...Ste si istí, že chcete vymazať vaše autentizačný údaje?Ste si istý, že chcete vymazať vaše predchádzajúce správy?Ste si istí, že chcete vymazať vašu cestu k repozitárom?Ste si istý že chcete pokračovať?AutentizáciaAutentizačný údaje vymazanéAutorAutori:Branch/tag...PrehľadávaťPrehľadávať...ChybyNemožno komentovať adresárZmeniť umiestnenie repozitára pracovnej kópieSkontrolujte CertifikátPozrite sa na pracovnú kópiuVyskúšanieVyskúšanie - %sVyberte túto možnosť, ak ste urobili nejaké zmeny vo vetvách a chcete zlúčiť vaše zmeny s inou vetvou.Vyberte túto možnosť, ak chcete zlúčiť dve rôzne vetvy do vašej pracovnej kópie.Vyčistiť pracovnú kópiuVyčistené...ČisteniePožadované čistenie.... Otvorenie pracovnej kópie čistenia?Vymazať vaše overovacie informácieOdovzdaťRešpektovať zmeny repozitáraPridanie ukončenéVyskúšanie ukončenéČistenie ukončenéOdovzdanie ukončenéExport ukončenýImport ukončenýZamknutie ukončenéZlúčenie ukončenéTest zlúčenia ukončenýPremiestnenie ukončenéPremenovanie dokončenéRiešenie ukončenéNávrat ukončenýPrepnutie dokončenéOdomknutie dokončenéAktualizácia dokončenáPotvrdenieKopírovať zo záznamuKopírovať z revízieKopírovať položku na iné miesto v repozitáriVytvoriť repozitáre tuVytvoriť repozitáre v priečinkuDátumSpráva o ladeníOdstrániťOdstráň potvrdenieOdstrániť vlastnosti rekurzívneOdmietnuťEditovať...Povoliť emblémyPovoliť atribúty súborovPovoliť kontrolu rekurzívneho stavuAnglickyExportExport - %sExportovať pracovnú kópiu alebo repozitáre bez informácie o verziiRozšírenieExterné programyOdtlačok prsta:DokončenéNájdená %d položka(y)Z...VšeobecnéZamkniteHEADPomocníkHostiteľ:Ignorovať rodImportImport - %sImportovať položky do repozitáraZahrnúť ignorované súboryZrušíEmitent:Jazyk:Limit:RiadokNačítavam...Lokálny zámok položkyZamknúť súboryZamknutýZáznamZáznam - %sPrihláseniePrihlasovacie meno:Označiť položku v rozpore ako vyriešenúZlúčenieZlúčiť pomocníkaZlúčiť niekoľko revíziíZlúčenie dvoch rôznych stromovZlúčiť...SpráavaN/ANázovNový názovNový...Oznamovacie SprávyPočet adries URL k zapamätaniuPočet správ k zapamätaniuIba záznam zlúčeniaOtvoriťOtvoriť shellHeslo:CestaPredchádzajúca správaPredchádzajúce správy vymazanéVlastnostiVlastnosti - %sVlastnosťStav objektuVlastnosť:RabbitVCSOblasť:RekurzívnyObnoviťObnoviť stavVydanie zámku ...Vydanie zámku na položkuPremiestniťPremiestniť vašu pracovnú kópiuPremiestniť...PremenovaťPremenovaťCesta k repozitárom vymazanáRepozitár úspešne vytvorenýRiešenieObnoviťSpäťVrátiť položku do jej nezmeneného stavuVráti všetko viditeľnéRevíziaSpúšťam príkaz na pridanieSpúšťam test na vyskúšanieSpúšťam príkaz na odovzdanieSpúšťam príkaz na exportSpúšťam príkaz na importovanieSpúšťam príkaz na zamknutieSpúšťam príkaz na zlúčenieSpúšťam test zlúčeniaSpúšťam príkaz na premiestnenie...Spúšťam príkaz na premenovanie...Spúšťam príkaz na riešenieSpúšťam spätný príkazSpúšťam príkaz na prepnutieSpúšťam príkaz na odomknutieUložiť overenieUložené údajeVybrať / Zrušiť všetkoVyber súborVyber priečinokVyberte programNastaveniaZobraziť záznamUkázať záznamZobraziť neverziované súboryZobraziť revízie:StavPrevziať zámkyStop na kópiuPrepnúťPrepni...Test zlúčeniaTextStav textuPoďakovaniePoložka(y) bude zaslaná do koša.Vyžadovaný je nový názov poľaDošlo ku chybe pri vytváraní repozitára. Uistite sa, či je príslušná zložka prázdna.Do:TypURL/Cesta:URL:NeznámeOdomknúťAktualizáciaAktualizovať revíziuAktualizácia súboru do určenej revízieAktualizovať pracovnú kópiuAktualizácia revízieAktualizácia...Platné:HodnotaHodnota:Pozrieť pomocníkaPozrieť alebo zmeniť nastavenia RabbitVCSZobrazenie zmien do súboruPozrieť vlastnosti položkyAnoMusíte zadať cieľ umiestnenia.vybraná položka(y)dorabbitvcs-0.18/locale/sl/000077500000000000000000000000001362112712700153005ustar00rootroot00000000000000rabbitvcs-0.18/locale/sl/LC_MESSAGES/000077500000000000000000000000001362112712700170655ustar00rootroot00000000000000rabbitvcs-0.18/locale/sl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000100701362112712700211770ustar00rootroot00000000000000FLa| 6-5d    (9JYk|      " *48=B\l  ' 8 A H M Y ] d k w } #       ? = ] l "s '     7 ) A V g w        04HM S ^ l w   $+2.Hw  6>%&:1.'87/,(? $B- # 9C56* 3< ;!0 2"DA+E@)=4F%s - FinishedActionAddAdd to ignore listAre you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Branch/tagBrowse toCheckoutCheckout - %sCleaning Up...CleanupCommitCompleted AddCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted ResolveCompleted UpdateCopy From RevisionCreate PatchDeleteExportExport - %sExtensionFinishedFound %d item(s)From:Get LockHEADImportImport - %sLoading...LockedLog - %sMergeMessageMime TypeN/ANamePathPrevious messages clearedProperty StatusRepository paths clearedRepository successfully createdResolveRestoreRevertRunning Add Command...Running Checkout Command...Running Commit Command...Select a FileSelect a FolderSelect a programShow logSwitchTextText StatusTo:UnlockUpdateUpdating...ValueYesYou must supply a destination path.toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0); X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %s - ZaključenoDejanjeDodajDodaj na seznam 'ignore'Ali ste prepričani, da želite izbrisati prejšnja sporočila?Ali ste prepričani, da želite izbrisati poti repozitorijev?Vejitev/oznakaBrskajPoveži in pridobi iz repozitorijaPoveži in pridobi iz repozitorija - %sČiščenje...PočistiPotrdiKončano dodajanje.Povezovanje z repozitorijem in pridobivanje zaključenoČiščenje zaključenoKončano potrjevanjeIzvoz zaključenUvoz zaključenZaklepanje zaključenoRazrešitev zaključenaPosdabljanje končanoKopiraj iz revizijeIzdelaj obliž (patch)IzbrišiIzvoziIzvozi - %sKončnicaZaključenoNajdeno %d element(ov)Od:Prevzami zaklepanjeHEADUvoziUvozi - %sNalaganje ...ZaklenjenoDnevnik - %sSpojiSporočiloVrsta MIMENi na voljoNazivPotPrejšnja sporočila izbrisanaStanje lastnostiPoti repozitorijev izbrisane.Repozitorij je izdelanRazrešiObnoviPovrniZaganjam dodajanje...Povezovanje z repozitorijem in pridobivanje...Zaganjam PotrdiIzberite datotekoIzberi mapoIzberi programPokaži dnevnikPreklopiBesediloStanje besedilaZa:OdkleniPosodobiPosodabljanje ...VrednostDaDoločiti morate ciljno pot.vrabbitvcs-0.18/locale/sr/000077500000000000000000000000001362112712700153065ustar00rootroot00000000000000rabbitvcs-0.18/locale/sr/LC_MESSAGES/000077500000000000000000000000001362112712700170735ustar00rootroot00000000000000rabbitvcs-0.18/locale/sr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000023571362112712700212160ustar00rootroot00000000000000xy        & B MXkz       ActionAddApply PatchAuthorDateExtensionFinishedLineLoading...Log MessageMime TypePathRevisionSizeTextProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-06-24 21:05+0000 Last-Translator: Игор Миловановић Language-Team: Serbian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) АкцијаДодајПримени закрпуАуторДатумПроширењеЗавршенРедУчитавам...Лог порукаMIME типПутањаРевизијаВеличинаТекстrabbitvcs-0.18/locale/sv/000077500000000000000000000000001362112712700153125ustar00rootroot00000000000000rabbitvcs-0.18/locale/sv/LC_MESSAGES/000077500000000000000000000000001362112712700170775ustar00rootroot00000000000000rabbitvcs-0.18/locale/sv/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000522011362112712700212130ustar00rootroot00000000000000GT hix ; I_1z8)<Q(a -6$[$t&#J]vH- 1 Q W g v       ?!6G!5~!"!!"! "" " $" 2" <"F"K"0g"""" "p"VK####2#%$($&/$V$l$~$)$$$$ %%+%>%P%a%r%%%%%%%%%& & 1&>&M&`&2v& &&&&& '' '%','@'^' c' p'|''''''''(!( ((B4( w( (("( (()()))) ()4)9)>)D)T) [) g)) )) ))) ) )) ))** **%*",*O*U*e**** *** *** * *+ ++&+-+H+g+v++ + +++++ +++,,!, 1, ;,E,U, \,f,n,},,,, ,, ,,,-(-0-8-O-&V-}-- -----.0.J.b.x....../ */5/ I/2T/0// ////000>0\0{000000 00 0 00 01- 1*:1$e1*11A1%2,<2+i2Q222 223333$)3N3d3 z334444#4445 +5!55&W5%~5;55 5 6#646I6L6$848G8[8q88 8 888E89+9(E9n99!99999.:7:S:b:y:::(:,: ;4*;_;w; ;;;;;.;<)<I<d<x<N<-<*=3= 6=C=Y=l= u==== === =#=B!>>d>;>)> ? ? 8? D? Q? [? h? v??'?*??? @ @m@Q@@ @A4A;A[AbAAAA&AA"A!B:BNBcBrBBBBBBBBC #C0CDCSCdC xCCCC/CC DD*D DDRDXD`DrDzDDDDDDDD#E TfT|T siWF+L%vDeo;%5+j1?,2B-Y$V,4tdw6&K=/M.D } Ena#>*kb\{ E]3*3?|G('<[_r; pql^Q~!ZT"fHO2<4'(5CJ:hN 18.:ARg0 $8uF=A/0  S6 @ 7@c9)xI9CX# )-yU>z7&BP`"Gm!%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageOptionsPlease add your authentication detailsPlease describe why you are locking these filesPrevious MessagesProgram used to compare filesProperties for:RabbitVCSRepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopyAre you sure you want to delete %item%?RabbitVCSA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd an emblemAdd to ignore listAnnotateAnnotate - %sAnnotate a fileAnnotate...Apply property recursivelyAre you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse toBrowse...BugsCannot annotate a directoryChange the repository location of a working copyCheck CertificateCheck out a working copyCheckoutCheckout - %sChoose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationCommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with previous revisionCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create Repository hereCreate a repository in a folderCreate folder...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDenyDiff Menu...Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumberNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellPassword:PathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRelease Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateReverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...Save As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText StatusThanks:The from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemWorking CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-04-13 19:52+0000 Last-Translator: Andreas Dahlberg Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i dag%i dagar%i timme%i timmar%i minut%i minuter%i månad%i månader%i sekund%i sekunder%i vecka%i veckor%i år%i år%s - Färdigt100Lägg till MeddelandePåverkade filer (dubbelklicka för att jämföra med grunden)AutentiseringCertifikatdetaljerÄndra arkiv till din arbetskopiaÄndrade filerSkicka till:Redigera egenskapsdetaljerFiler att låsaMappnamnFrån revisionFrån URLFrån: (URL och revision sammanfogning)Importera meddelandeLänkarLoggmeddelandenLogg alternativMeddelandeAlternativLägg till autentiseringsdetaljerBeskriv varför du låser dessa filerFöregående MeddelandenProgram som används för att jämföra filerEgenskaper för:RabbitVCSArkivRevisionsspanRevisionRevisionstabellTill revisionTill: (URL och revision att sammanfoga)URL HistorikURL att sammanfoga frånVersionsinformationArbetskopia:ArbetskopiaÄr du säker på att du vill ta bort %item%?RabbitVCSEn guide med åtgärder för sammanfogningOmOm RabbitVCSAcceptera för alltidAcceptera en gångÅtgärdLägg tillLägg till emblemLägg till ett emblemLägg till ignoreringslistaKommentarKommentar - %sKommentera en filKommentera...Verkställ inställningar rekursivtÄr du säker på att du vill rensa din autentiseringsinformation?Är du säker på att du vill rensa dina tidigare meddelanden?Är du säker på att du vill rensa dina arkivs sökvägar?Är du säker på att du vill fortsätta?AutentiseringAutentiseringsinformation rensadFörfattareUpphovsmän:Gren/taggGren/tagg...Bläddra tillBläddra...BuggarDet går inte att kommentera en katalogÄndra arkivets plats för en arbets kopiaKontrollera certifikatHämta en arbetskopiaHämtaHämta - %sVälj denna metod om du har gjort ändringar i en gren och vill sammanfoga dina ändringar med en annan gren.Välj den här metoden om du vill sammanfoga två olika grenar i din arbetskopia.Rensa upp arbetskopiaRensar upp...RensaRensning begärd .... Börja rensa i arbets kopian?Rensa autentiseringsinformationSkickaSkicka ändringar till arkivetJämför filer/mapparJämför revisionerJämför sida vid sidaJämför skillnaden mellan två objektJämför med grundenJämför med föregående revisionJämför med arbetskopiaFärdig Lägga tillFärdig Gren/tagg...Färdig HämtaRensning färdigFärdig SkickaFärdig ExporteraFärdig ImporteraFärdig Hämta låsFärdig SammanfogaFärdig SammanfogningstestOmlokalisering färdigNamnbyte genomförtFärdig LösFärdig ÅterställFärdig VäxlaFärdig Lås uppUppdatering färdigBekräftelseKopiera från sökvägKopiera från versionKopiera URL till urklippKopiera et objekt till en annan plats i arkivetKopiera till...Skapa mapp...Skapa arkiv härSkapa ett arkiv i en mappSkapa mapp...DatumFelsökDebug återställTa bortRadera BekräftelseRadera inställningar rekursivtNekaSkillnadsmeny...Ändra skapareÄndra skapare...Redigera loggmeddelandeRedigera loggmeddelande...Redigera revisionsinställningar...Redigera...Aktivera emblemAktivera filattributAktivera rekursiva statuskontrollerEngelskaExporteraExportera - %sExportera en fungerande kopia eller arkiv utan versionsinformationExportera...TilläggExterna programFilen är inte versionskontrolleradFingeravtryck:FärdigTvinga fram ett invalidate_extension_info() anropHittade %d objektFrån:AllmäntHämta låsHämta Lås...HEADHjälpVärd:Ignorera anorImporteraImportera - %sImportera ett objekt till ett arkivInkludera ignorerade filerOgiltigförklaraUtgivare:Språk:Gräns:RadLadda/UppdateraLaddar...Lås objekt lokaltLås filerLåstLoggLogg - %sLoggmeddelandeLoggningAnvändarnamn:Markera ett tvistande objektet som löstSammanfogaSammanfogningsassistentSammanfoga ett span av revisionerSammanfoga två olika trädSammanfoga...MeddelandeMime-typLägsta nivå att loggaMer åtgärder...Flytta till...Ej tillgängligNamnNy plats:Nytt namn:Ny...NejNotifieringsmeddelandenNummerAntal URLer att minnasAntal meddelande att minnasUteslut externaRegistrera endast sammanfogningenÖppnaÖppna SkalLösenord:SökvägSökväg:Föregående meddelandeTidigare meddelanden rensadeEgenskaperEgenskaper - %sEgenskapEgenskapsändringEgenskapseditorEgenskap statusEgenskap:RabbitVCSRabbitVCS FelRike:RekursivUppdateraUppdatera StatusSläpp lås...Släpp lås på ett objektOmlokaliseraFlytta din arbetskopiaFlytta...Byt namnByt namn...Arkivets sökvägar rensadeArkivet skapadesReserveradLösÅterställÅterställ ett saknat objektÅterställÅterställ ett objekt till dess omodifierade formÅterställer allt den serRevisionRevision:Kör Lägg till...Kör Gren/tagg kommando...Kör Hämta...Kör Skicka...Kör Exportera...Kör Importera...Kör Hämta lås...Kör Sammanfoga...Kör Sammanfogningstest...Kör omlokalisering...Kör Byt namn...Kör Lös...Kör Återställ...Kör Växla...Kör Lås upp...Spara som...Spara autentiseringSparad dataSchemalägg ett objekt som ska tas bort från arkivetSchemalägg ett objekt som ska byta namn i arkivetMarkera / Avmarkera allaVälj en filVälj en mappVälj ett programInställningarVisa ändringar...Visa LoggVisa RabbitsVCS felsökningsverktygVisa en fils logginformationVisa ändringar mellan revisionerVisa loggVisa oversionerade filerVisar revisioner:StorlekStatusStjäl låsenStopp vid kopiaVäxlaVäxla...Test sammanfogaTextTextstatusTack:Både från och till url-fälten krävs.Från version fältet måste vara ett heltalDen angivna sökvägen är inte en arbetskopiaDessa objekt kommer att skickas till papperskorgen.Det nya namnet är ett obligatoriskt fältArkivets URL och destination sökvägen är obligatoriska fält.Arkivets URL fält krävs.Arkivets plats är ett obligatoriskt fält.Ett problem uppstod när dina inställningar skulle sparas.Det blev fel när arkivet skulle skapas. Kontrollera att den angivna mappen är tom.Till:Typ:URL/Sökväg:URL:OkändLås uppUppdateraUppdatera till revisionUppdatera till angiven versionUppdatera en arbetskopiaUppdatera till revision...Uppdaterar...Använd logg dialogrutan för att välja de revisioner som du vill sammanfoga. Eller skriv ut revisionerna manuellt, separerade med ett kommatecken. Du kan ange ett revisionsspan med ett bindestreck. Exempel: 4-7,9,11,15-HEAD För att sammanfoga alla revisioner, lämna rutan tom.Giltig:VärdeVärde:Se skillanden mot grundenVisa skillnaden mot tidigare revisionVisa skillnaden mot arbetskopianSe skillnaden mellan filer/mapparSe skillnaden mellan revisionerVisa HjälpVisa eller ändra RabbitVCS inställningarSe skillnaden mellan två filerVisa ändringar som gjorts i en filSe filändringar sedan senaste ändringVisa egenskaperna för ett objektArbetskopiaJaDu måste ange en destinationssökväg.de markerade objektentillrabbitvcs-0.18/locale/th/000077500000000000000000000000001362112712700152755ustar00rootroot00000000000000rabbitvcs-0.18/locale/th/LC_MESSAGES/000077500000000000000000000000001362112712700170625ustar00rootroot00000000000000rabbitvcs-0.18/locale/th/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000007701362112712700212020ustar00rootroot00000000000000$,89Project-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-02-09 10:19+0000 Last-Translator: FULL NAME Language-Team: Thai MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) rabbitvcs-0.18/locale/zh_CN/000077500000000000000000000000001362112712700156635ustar00rootroot00000000000000rabbitvcs-0.18/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001362112712700174505ustar00rootroot00000000000000rabbitvcs-0.18/locale/zh_CN/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000616511362112712700215750ustar00rootroot00000000000000}   ) > O ` n r ;   1 8$!]!o!!!!!(!" "%"9"P"_""-"6#1T##$#####$'$7$N$&a$$$$$$7$H0%-y%:%%&&& '&3&:& >&I& ]&k& ~&&2' ;'I' Y'/e' '''''?'6>(5u("(("()) ) ))) B)L) g)q)v))0))).)&*?* H* V*pb*V**+@+O+2W+%+++&++,,).,X,4j,,A,- -(-=-P-b-s---------.!.2. C.P._.r.2. .. ... /+/5>B> H>R>"W>%z>>>>>$>>? ?&?!@(@.@5@#L@p@$@@@ @!@&A%CA;iAAA(A(A (B5B#9B]BrBuBMD TD ^DhDoDvD}D DDD0DDD%E-'EUEiEEEEE+EF F$F8F LFuZF F"F.G'0GXG"oGGGGGG GHH(#HLH^HvHHH.HAH-&I;TI*III I III IJ$J7J!MJyoJJ JJ K#K =KJKcKsKK'K'K'KL0L7LML TL ^LiLzL L!L LLLL$L M M0MLM_M fMrMoM]MTN gNqN0xNNNNNN O O,OKO-aOO6OO P P !P .P ;P HP VP dP pP}PPPP P P PPPP QQ-3Q aQoQ QQQ$QQ5Q#R?RFR MRZR aRnR RRRRRKR S*S:SMScS yS SSSSS S?S T T 'T4T MT WT(aTTTT T TTT TTTUU !U-ULU eU oU |U UUU U UU U UU U VV V V?V FVSVoV VV VVV V VV V V WW WW4W JWWWgW nW{WWW WWWWWXX+X 2X>X EXRX bX oX yXXXXX XX XX XX Y Y )Y6YIY_Y xYYYYY$Y YYY*Z?Z [Z eZoZZZZZZ[[7[J[c[|[[[[[ [ \\'$\*L\w\\\\\\\ ]]1]!J]l] ]]] ]]]]] ] ^^ ^ '^ 4^2>^ q^$^^^^4 _@_Z_'s_K__ _ _` `&`B`I`P`W`j``` `` aaaa'a$ab%.bTb jb wb!bb0bc c3cLc ecrcycccJsay<m,F@>glD>_TZ@A+MCRvIDx`y%Tz2b3u"ovpC4Q&.\%)^r$[ GFMn;{#?Qw $|x|R]S. 'w8k7:![=3caY < V2U\t"is6(j}E4b(: BPdS- / }refVWLzJ{th HWhp#0]U*qd+ kL5`9P,qlA)'BI_OE;iNO8K&m^ XH6oc-=fYX~K*1Gj9/g! u?5N0n7eZ1%i day%i days%i hour%i hours%i minute%i minutes%i month%i months%i second%i seconds%i week%i weeks%i year%i years%s - Finished100Add MessageAffected File(s) (double-click to compare with base)AuthenticationCertificate DetailsChange the repository of your working copyChanged Files (double-click to compare with base)Commit to:Edit Property DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import MessageLinksLog MessagesLogging OptionsMessageNote: changes to properties are applied instantly. You may review and undo changes using the context menu for each item. OptionsPlease add your authentication detailsPlease describe why you are locking these filesPlease provide your ssl certification filePrevious MessagesProgram used to compare filesProperties for:RabbitVCSRemote URI:RepositoryRevision RangeRevisionRevisions TableTo RevisionTo: (URL and revision to merge)URL HistoryURL to merge fromVersion InformationWorking Copy:Working CopySelected properties will be applied recursively.Are you sure you want to delete %item%?RabbitVCSRabbitVCS ErrorA wizard with steps for mergingAboutAbout RabbitVCSAccept ForeverAccept OnceActionAddAdd EmblemAdd a new property.Add an emblemAdd to ignore listAdded a folder to the repositoryAn error has occurred in the RabbitVCS Nautilus extension. Please contact the RabbitVCS team with the error details listed below:AnnotateAnnotate - %sAnnotate a fileAnnotate...Applies a unified diff file to the working copyApply PatchApply Patch To Directory...Apply Patch...Apply property recursivelyApplying Patch File...Are you sure you want to clear your authentication information?Are you sure you want to clear your previous messages?Are you sure you want to clear your repository paths?Are you sure you want to continue?AuthenticationAuthentication information clearedAuthorAuthors:Branch/tagBranch/tag...Browse a repository treeBrowse toBrowse to a file or folderBrowse...BugsCannot annotate a directoryChangeChange the repository location of a working copyCheck CertificateCheck for Modifications...Check for modifications made to the repositoryCheck out a working copyCheckoutCheckout - %sCheckout...Choose this method if you have made some changes to a branch and wish to merge your changes with another branch.Choose this method if you wish to merge two different branches into your working copy.Clean up working copyCleaning Up...CleanupCleanup Requested.... Begin working copy cleanup?Clear your authentication informationClose this dialog.CommitCommit modifications to the repositoryCompare files/foldersCompare revisionsCompare side by sideCompare the differences between two itemsCompare with baseCompare with base using side-by-side comparison toolCompare with previous revisionCompare with previous revision using side-by-side comparison toolCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted SwitchCompleted UnlockCompleted UpdateConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy an item to another location in the repositoryCopy to...Create Folder...Create PatchCreate Patch...Create Repository hereCreate a repository in a folderCreate folder...Creates a unified diff file with all changes you madeCreating Patch File...DateDebugDebug RevertDeleteDelete ConfirmationDelete properties recursivelyDelete propertyDelete this propertyDelete this property (recursive)DenyDiff Menu...Do you want to delete the selected properties from all files and subdirectories beneath this directory?Edit authorEdit author...Edit log messageEdit log message...Edit revision properties...Edit...Enable emblemsEnable file attributesEnable recursive status checksEnglishExportExport - %sExport a working copy or repository with no versioning informationExport...ExtensionExternal ProgramsFile is not under version control.Fingerprint:FinishedForce an invalidate_extension_info() callFound %d item(s)From:GeneralGet LockGet Lock...HEADHelpHost:Ignore ancestryIgnore item by file extensionIgnore item by filenameImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer:Language:Limit:LineList of comparison optionsLoad/RefreshLoading...Locally lock itemsLock FilesLockedLogLog - %sLog MessageLoggingLogin:Mark a conflicted item as resolvedMergeMerge AssistantMerge a range of revisionsMerge two different treesMerge...MessageMime TypeMinimum level to logMore Actions...Move to...N/ANameNew Location:New Name:New...NoNotification MessagesNumber of URLs to rememberNumber of messages to rememberOmit ExternalsOnly record the mergeOpenOpen ShellOpen a fileOpen from first revisionOpen from second revisionPassword:Patch File AppliedPatch File CreatedPathPath:Previous MessagesPrevious messages clearedPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty StatusProperty:RabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...RenameRename...Repository BrowserRepository paths clearedRepository successfully createdReservedResolveRestoreRestore a missing itemRevertRevert an item to its unmodified stateRevert propertyRevert property (recursive)Revert this property to its original stateRevert this property to its original state (recursive)Reverts everything it seesRevisionRevision:Running Add Command...Running Branch/tag Command...Running Checkout Command...Running Commit Command...Running Export Command...Running Import Command...Running Lock Command...Running Merge CommandRunning Merge TestRunning Relocate Command...Running Rename Command...Running Resolve Command...Running Revert Command...Running Switch Command...Running Unlock Command...SSL Client CertificationSave As...Save AuthenticationSaved DataSchedule an item to be deleted from the repositorySchedule an item to be renamed on the repositorySchedule items to be added to the repositorySelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes between paths and revisionsShow changes between revisionsShow logShow unversioned filesShowing Revisions:SizeStatusSteal the locksStop on copySwitchSwitch...Test MergeTextText ChangeText StatusThanks:The debug menu is used to diagnose problems with RabbitVCS itselfThe from and to url fields are both required.The from revision field must be an integerThe given path is not a working copyThe item(s) will be sent to the trash can.The new name field is requiredThe repository URL and destination path are both required fields.The repository URL field is required.The repository location is a required field.There was a problem saving your properties.There was an error creating the repository. Make sure the given folder is empty.To:Type:URL/Path:URL:Unable to retrieve properties listUnable to set new value for property.UnknownUnlockUpdateUpdate To RevisionUpdate a file to a specific revisionUpdate a working copyUpdate to revision...Updating...Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty.Valid:ValueValue:View diff against baseView diff against previous revisionView diff against working copyView diff as side-by-side comparisonView diff between files/foldersView diff between revisionsView helpView or change RabbitVCS settingsView the differences between two filesView the modifications made to a fileView the modifications made to a file since its last changeView the properties of an itemView unified diffWhere do you want to copy the selection?Where do you want to move the selection?Working CopyYesYou must supply a destination path.the selected item(s)toProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-08-14 14:07+0000 Last-Translator: Jiehan Zheng Language-Team: Chinese (Simplified) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i 天%i 小时%i 分钟%i 月%i 秒%i 周%i 年%s - 完成100添加消息受影响的文件 (双击会比较 Base)身份验证认证细节改变您工作副本的属性更改的文件 (双击会比较 Base)提交给:编辑属性细节要锁定的文件文件夹名称从版本来自URL来自:(URL 和要合并的版本)导入消息链接日志信息日志选项消息注意: 属性修改会立即被应用。您可以使用每项的上下文菜单来回顾或撤销修改。 选项请添加您的认证细节请描述您锁定这些文件的原因请提供您的 SSL 证书文件前一个消息用于比较文件的程序属性属于:RabbitVCS远程 URI:版本库版本范围版本版本表至版本至:(URL 和要合并的版本)URL 历史要合并自 URL版本信息工作副本:工作副本选中的属性将会被递归应用。您确实要删除 %item% 吗?RabbitVCSRabbitVCS 错误一个由几个步骤组成的合并向导关于关于 RabbitVCS总是接受接受一次操作添加添加徽章添加一个新的属性。添加一个徽章添加至忽略列表添加一个文件夹到版本库RabbitVCS Nautilus 扩展发生了一个错误。请联系RabbitVCS 团队并提供下列错误细节:注释注释 - %s批注一个文件批注...应用 unified diff 至工作副本应用补丁对目录应用补丁...应用补丁...递归应用属性从文件应用补丁...您确定要清空您的认证信息?您确定要清空您之前的消息?您确定要清空您的仓库路径?您确定要继续吗?认证认证信息已清空作者作者:分支/tag分支/标签...浏览源码库源码树浏览至浏览至一个文件或文件夹浏览...Bugs不能给目录加注释更改改变工作副本源码库的位置检查证书检查修改...检查至源码库的修改检出工作版本检出签出 - %s检出(Checkout)...如果您对某个分支进行了修改,并且想将这些修改与另一分支合并,选择这种方法。如果您想合并两个不同的分支到您的工作副本的话,请选择这个方法。清理工作副本正清理清理清理请求.... 开始工作副本清理么?清除你的认证信息关闭这个对话框。提交提交修改至源码库比较文件/文件夹比较版本并排比较比较两个项目间的差异与 Base 进行比较使用并排比较工具与 Base 进行比较与前一个版本进行比较使用并排比较工具与前一个版本进行比较与工作版本进行比较Add 完成完成的 分支/tag完成签出清理完成提交完成Export 完成Import 完成Lock 完成合并完成完成合并测试重分配完毕重命名完成Resolve 完成完成还原切换完成解锁完成完成的更新确认复制自路径复制自版本复制URL到剪切板复制一个项目到源码库中其它位置复制到 ...创建文件夹...生成补丁生成补丁...在这里创建源码库在文件夹中创建一个源码库创建目录...对您所有的修改创建一个 unified diff 文件正在生成补丁文件...日期调试调试还原删除删除确认递归删除属性删除属性删除该属性删除该属性 (递归的)拒绝比较菜单...您想从该目录下所有文件和子目录中删除选中的属性么?编辑作者编辑作者...编辑日志消息编辑日志消息...编辑版本属性...编辑...启用徽章启用文件属性启用递归状态检查英语导出导出 - %s导出工作副本或源码库,而不包含任何版本信息导出...扩展外部程序文件不受版本控制指纹:已完成强行调用 invalidate_extension_info()已找到 %d 项从:常规获得 Lock获得锁...HEAD帮助主机:忽略早期的按扩展名忽略项目按文件名忽略项目导入导入 - %s导入一个项目至源码库包括已忽略的文件使无效颁发者:语言:限制:明细比较选项列表加载/刷新加载中...本地锁定项目锁定文件已锁定日志日志 - %s日志信息日志登录:标记冲突条目为已解决合并合并助手合并一个范围的版本合并两个不同的源码树合并...消息MIME 类型最小日志级别更多操作...移动到...不可用名称新位置:新名字:新建...否通知信息记住的 URL 数目记住的信息数量省略外部仅记录合并打开打开 Shell打开一个文件从第一个版本打开从第二个版本打开密码:已应用补丁文件已生成补丁文件路径路径:前一个消息以往消息已清空属性属性 - %s属性属性改变属性编辑器属性状态属性:RabbitVCSRabbitVCS 错误域:递归刷新刷新状态刷新属性列表释放锁...释放项目的锁重新分配重定位您的工作副本重定位...重命名重命名...版本库浏览器仓库路径已清空版本仓库创建成功保留的解决恢复恢复丢失项目恢复还原项目到其未修改的状态还原属性还原属性 (递归的)还原该属性至其原状态还原该属性至其原状态 (递归的)还原看到的每个文件修订版版本:正执行 Add 命令正运行 Branch/tag 命令...正在运行签出命令正在运行提交命令...正运行 Export 命令正运行 Import 命令正运行 Lock 命令正在运行合并命令运行合并测试正运行重分配命令正运行重命名命令正运行 Resolve 命令运行还原命令...正在运行切换命令...正在运行解锁命令...SSL 客户端证书另存为…保存认证已保存的数据计划一个项目在源码库被删除计划一个项目在源码库被重命名计划要添加至仓库的项选择 / 取消选择 全部选择一个文件选择一个文件夹选择一个程序设置显示修改...显示日志显示 RabbitVCS 调试工具显示文件日志信息显示路径与版本间的改动显示版本之间的更改显示日志显示非版本控制的文件正在显示版本:文件大小状态偷锁终止于复制切换切换...测试合并文本文本更改文本状态感谢:调试菜单用于诊断 RabbitVCS 自身的问题来自和到 URL 栏均为必填来自修订版一栏必须为整数指定路径不是工作副本这些会被发送到回收站新名称一栏必填“仓库 URL”和“目的地路径”均必填。“仓库 URL”必填。仓库地址栏必填。保存属性时出现了一个问题。版本库创建过程中出现错误。请确认所指定目录是空的。至:类型:URL/路径:URL:无法获取属性列表不能为属性设置新值未知解锁更新更新到修订版更新文件至指定版本更新工作版本更新到版本...更新...使用日志对话框来选择您想合并的版本。或者手动指定版本,用逗号分割。您可以通过减号"-"来指定一个版本范围。 例如:4-7,9,11,15-HEAD 要合并所有分支请保持空白。有效:值值:查看相对于 Base 的差异查看相对于前一个版本的差异查看相对于工作版本的差异并排比较查看差异查看文件/文件夹之间的差异查看版本间差异查看帮助查看或更改 RabbitVCS 设置查看两个文件之间的差异查看对文件的修改查看自从上一次修改后对文件的改动查看一个项目的属性查看统一差异将选区复制到哪?将选区移动到哪?工作副本确定必须提供目标路径。已选择的项到rabbitvcs-0.18/locale/zh_TW/000077500000000000000000000000001362112712700157155ustar00rootroot00000000000000rabbitvcs-0.18/locale/zh_TW/LC_MESSAGES/000077500000000000000000000000001362112712700175025ustar00rootroot00000000000000rabbitvcs-0.18/locale/zh_TW/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000123271362112712700216230ustar00rootroot00000000000000sL       3 B H O S \ k r {            . 9 J [ ` f m                " ) - 6 B J Q W _ i t x }             # * 4 < C M V ^ f m v           !( /;AHLO " ,6E IWm       )6=Mf     #( /<D KW_ g t~          !)9 @L S`p x      (5K R_fmt{    pGS=X6!  bPh$TFRCk?<VDc2UY1`W/ A#HE%jO0Lra.78:-g\I@ i+^q)d"Mm &3nNef>Q*o 9;5B[J(,K'_ls]4Z%i hour%i hours%i minute%i minutes%s - Finished100AuthenticationFrom URLLog MessagesOptionsAboutActionAddAnnotateAuthenticationAuthorAuthors:Browse...BugsChangeCheckoutCleanupCommitCompare revisionsCompleted AddCompleted CommitCompleted LockConfirmationCopy From PathCopy From RevisionCopy URL to clipboardCopy to...Create Folder...Create folder...DateDebugDeleteDelete ConfirmationDenyEdit...EnglishExportExternal ProgramsFingerprint:FinishedFound %d item(s)From:GeneralGet LockHost:ImportImport - %sLanguage:Limit:Loading...LockedLogLog - %sLog MessageLoggingLogin:MergeMessageMime TypeMove to...N/ANameNew Name:New...NoNotification MessagesNumberPassword:PathPath:Previous MessagesPropertiesProperties - %sPropertyProperty ChangeProperty EditorProperty:Realm:RecursiveRefreshRenameRename...ReservedResolveRestoreRevertRevisionRevision:Running Add Command...Running Lock Command...Save As...Select a FileSelect a FolderSettingsShow LogSizeStatusSwitchTextThanks:To:Type:URL:UnknownUnlockUpdateUpdating...ValueValue:YestoProject-Id-Version: rabbitvcs Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-06-09 03:20+0000 Last-Translator: Yu - Sian , Liu Language-Team: Chinese (Traditional) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) %i 小時%i 分鐘%s - 已完成100驗證從 URL 新增日誌訊息選項關於動作加入註解驗證作者作者:瀏覽...問題回報更改取出清除提交比較修訂版間差異完整加入完成提交完成上鎖確認從路徑複製從修訂版本中複製複製網址到剪貼簿複製到...建立資料夾...新增資料夾日期偵錯刪除確認刪除取消編輯...英文匯出外部程式指紋:已完成找到 %d 個項目從:一般取得鎖定主機:匯入匯入 - %s語言:限制:載入中...已鎖定紀錄紀錄 - %s紀錄訊息紀錄帳號:合併訊息MIME 類型移動到...無名稱新名稱:新增...否通知訊息數字密碼:路徑路徑:之前的訊息屬性屬性 - %s屬性屬性改變屬性編輯器属性:領域:遞迴進入子目錄重新整理重新命名重新命名...保留解決還原還原修訂版本修訂版:執行加入...執行上鎖命令另存為...選取檔案選擇一個資料夾設定顯示日誌大小狀態轉換文字鳴謝:到:類型:URL:不明解除鎖定更新更新中...值數值:是到rabbitvcs-0.18/po/000077500000000000000000000000001362112712700140415ustar00rootroot00000000000000rabbitvcs-0.18/po/POTFILES.in000066400000000000000000000030231362112712700156140ustar00rootroot00000000000000util/helper.py util/contextmenuitems.py ui/delete.py ui/revert.py ui/remotes.py ui/unstage.py ui/reset.py ui/markresolved.py ui/ignore.py ui/wraplabel.py ui/renderers/__init__.py ui/stage.py ui/lock.py ui/log.py ui/unlock.py ui/__init__.py ui/clean.py ui/editconflicts.py ui/action.py ui/about.py ui/xml/revert.xml.h ui/xml/commit.xml.h ui/xml/property_editor.xml.h ui/xml/browser.xml.h ui/xml/manager.xml.h ui/xml/relocate.xml.h ui/xml/update.xml.h ui/xml/merge.xml.h ui/xml/settings.xml.h ui/xml/add.xml.h ui/xml/dialogs/delete_confirmation.xml.h ui/xml/dialogs/certificate.xml.h ui/xml/dialogs/name_email_prompt.xml.h ui/xml/dialogs/confirmation.xml.h ui/xml/dialogs/ssl_client_cert_prompt.xml.h ui/xml/dialogs/message_box.xml.h ui/xml/dialogs/previous_messages.xml.h ui/xml/dialogs/mark_resolved_prompt.xml.h ui/xml/dialogs/property.xml.h ui/xml/dialogs/error_notification.xml.h ui/xml/dialogs/conflict_decision.xml.h ui/xml/dialogs/create_folder.xml.h ui/xml/dialogs/loading.xml.h ui/xml/ignore.xml.h ui/xml/clean.xml.h ui/xml/properties.xml.h ui/xml/notification.xml.h ui/xml/git-update.xml.h ui/xml/log.xml.h ui/xml/lock.xml.h ui/xml/annotate.xml.h ui/xml/import.xml.h ui/xml/reset.xml.h ui/xml/property_page.xml.h ui/rename.py ui/update.py ui/revprops.py ui/widget.py ui/browser.py ui/relocate.py ui/add.py ui/updateto.py ui/create.py ui/tags.py ui/property_page.py ui/properties.py ui/merge.py ui/dialog.py ui/annotate.py ui/property_editor.py ui/open.py ui/cleanup.py ui/import.py ui/clone.py ui/settings.py ui/commit.py ui/diff.py ui/export.py rabbitvcs-0.18/po/README000066400000000000000000000006601362112712700147230ustar00rootroot00000000000000How to create a translation -------------------------- Here is a brief set of commands to generate a new translation. Replace en_CA with your language and locale of choice. $ msginit --input=po/RabbitVCS.pot --locale=en_CA $ mv en_CA.po po/en_CA.po Update po/en_CA.po with your translations. When you are done, type: $ mkdir -p locale/en_CA/LC_MESSAGES $ msgfmt --output-file=locale/en_CA/LC_MESSAGES/RabbitVCS.mo po/en_CA.po rabbitvcs-0.18/po/RabbitVCS.pot000066400000000000000000001161441362112712700163530ustar00rootroot00000000000000# 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. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-06-14 01:58+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: util/helper.py:73 msgid "%I:%M%P" msgstr "" #: util/helper.py:74 msgid "%a %I:%M%p" msgstr "" #: util/helper.py:75 msgid "%b %d" msgstr "" #: util/helper.py:76 msgid "%b %d %Y" msgstr "" #: util/helper.py:215 msgid "(no date)" msgstr "" #: util/helper.py:219 msgid "just now" msgstr "" #: util/helper.py:221 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:833 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:836 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:839 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:842 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:845 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:848 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:851 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:321 msgid "Debug" msgstr "" #: util/contextmenuitems.py:326 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:331 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:337 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:342 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:343 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:349 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:350 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:356 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:357 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:363 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:364 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:369 ui/xml/update.xml.h:1 ui/update.py:55 #: ui/update.py:104 msgid "Update" msgstr "" #: util/contextmenuitems.py:370 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:375 ui/xml/commit.xml.h:1 ui/commit.py:318 #: ui/commit.py:386 msgid "Commit" msgstr "" #: util/contextmenuitems.py:376 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:381 ui/xml/property_page.xml.h:5 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:386 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:391 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:396 msgid "RabbitVCS Hg" msgstr "" #: util/contextmenuitems.py:401 ui/xml/browser.xml.h:1 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:402 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:407 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:408 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:413 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:414 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:419 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:420 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:425 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:426 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:431 ui/log.py:988 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:432 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:437 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:438 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:443 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:444 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:449 ui/log.py:1003 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:450 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:455 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:456 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:461 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:462 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:467 ui/xml/add.xml.h:1 ui/widget.py:1431 #: ui/add.py:215 ui/add.py:240 ui/tags.py:284 msgid "Add" msgstr "" #: util/contextmenuitems.py:468 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:473 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:478 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:479 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:484 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:485 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:490 msgid "Delete" msgstr "" #: util/contextmenuitems.py:491 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:496 ui/revert.py:175 ui/revert.py:201 #: ui/xml/revert.xml.h:1 msgid "Revert" msgstr "" #: util/contextmenuitems.py:497 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:502 ui/markresolved.py:45 ui/markresolved.py:76 msgid "Mark as Resolved" msgstr "" #: util/contextmenuitems.py:503 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:508 msgid "Restore" msgstr "" #: util/contextmenuitems.py:509 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:513 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:514 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:519 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:520 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:525 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:526 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:531 ui/cleanup.py:56 msgid "Cleanup" msgstr "" #: util/contextmenuitems.py:532 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:537 msgid "Export..." msgstr "" #: util/contextmenuitems.py:538 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:551 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:552 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:557 ui/xml/import.xml.h:1 ui/import.py:75 msgid "Import" msgstr "" #: util/contextmenuitems.py:558 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:567 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:568 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:573 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:574 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:579 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:580 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:585 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:586 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:591 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:592 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:597 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:598 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:603 ui/xml/properties.xml.h:1 msgid "Properties" msgstr "" #: util/contextmenuitems.py:604 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:609 msgid "Help" msgstr "" #: util/contextmenuitems.py:610 msgid "View help" msgstr "" #: util/contextmenuitems.py:615 ui/xml/settings.xml.h:1 msgid "Settings" msgstr "" #: util/contextmenuitems.py:616 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:621 msgid "About" msgstr "" #: util/contextmenuitems.py:622 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:627 msgid "Open" msgstr "" #: util/contextmenuitems.py:628 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:636 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:637 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:642 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:644 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:648 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:650 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:655 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:657 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:661 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:663 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:668 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:670 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:674 ui/create.py:68 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:679 ui/clone.py:47 ui/clone.py:68 msgid "Clone" msgstr "" #: util/contextmenuitems.py:684 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:689 msgid "Push" msgstr "" #: util/contextmenuitems.py:694 msgid "Branches" msgstr "" #: util/contextmenuitems.py:699 msgid "Tags" msgstr "" #: util/contextmenuitems.py:704 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:709 ui/clean.py:66 ui/xml/clean.xml.h:1 msgid "Clean" msgstr "" #: util/contextmenuitems.py:713 ui/reset.py:96 ui/xml/reset.xml.h:1 msgid "Reset" msgstr "" #: util/contextmenuitems.py:718 ui/stage.py:48 ui/stage.py:73 msgid "Stage" msgstr "" #: util/contextmenuitems.py:723 ui/unstage.py:48 ui/unstage.py:73 msgid "Unstage" msgstr "" #: util/contextmenuitems.py:728 msgid "Edit conflicts" msgstr "" #: util/contextmenuitems.py:754 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:773 msgid "Ignore item by file extension" msgstr "" #: ui/revert.py:74 ui/markresolved.py:50 ui/lock.py:71 ui/log.py:392 #: ui/log.py:678 ui/action.py:120 ui/browser.py:91 ui/add.py:77 ui/commit.py:85 msgid "Path" msgstr "" #: ui/revert.py:74 ui/markresolved.py:51 ui/lock.py:71 ui/add.py:78 #: ui/commit.py:85 msgid "Extension" msgstr "" #: ui/revert.py:106 ui/lock.py:111 ui/unlock.py:67 ui/add.py:111 #: ui/commit.py:131 msgid "Loading..." msgstr "" #: ui/revert.py:110 ui/lock.py:114 ui/unlock.py:90 ui/add.py:133 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/revert.py:176 ui/revert.py:202 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:178 ui/revert.py:204 msgid "Completed Revert" msgstr "" #: ui/remotes.py:61 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:62 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:68 ui/properties.py:64 ui/property_editor.py:114 msgid "Name" msgstr "" #: ui/remotes.py:68 msgid "Host" msgstr "" #: ui/remotes.py:123 ui/tags.py:238 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/unstage.py:74 msgid "Running Unstage Command..." msgstr "" #: ui/unstage.py:77 msgid "Completed Unstage" msgstr "" #: ui/reset.py:97 msgid "Running Reset Command..." msgstr "" #: ui/reset.py:104 msgid "Completed Reset" msgstr "" #: ui/markresolved.py:51 ui/commit.py:86 msgid "Text Status" msgstr "" #: ui/markresolved.py:51 ui/commit.py:86 msgid "Property Status" msgstr "" #: ui/markresolved.py:77 msgid "Running Resolved Command..." msgstr "" #: ui/markresolved.py:80 msgid "Completed Mark as Resolved" msgstr "" #: ui/ignore.py:101 msgid "Ignore file:" msgstr "" #: ui/stage.py:74 msgid "Running Stage Command..." msgstr "" #: ui/stage.py:77 msgid "Completed Stage" msgstr "" #: ui/lock.py:72 msgid "Locked" msgstr "" #: ui/lock.py:121 msgid "Yes" msgstr "" #: ui/lock.py:156 msgid "Get Lock" msgstr "" #: ui/lock.py:157 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:166 msgid "Completed Lock" msgstr "" #: ui/log.py:51 ui/log.py:375 ui/log.py:662 ui/xml/merge.xml.h:19 #: ui/widget.py:1038 ui/browser.py:91 ui/annotate.py:131 ui/annotate.py:235 msgid "Revision" msgstr "" #: ui/log.py:52 ui/log.py:376 ui/log.py:663 ui/browser.py:91 ui/dialog.py:51 #: ui/annotate.py:132 ui/annotate.py:236 msgid "Date" msgstr "" #: ui/log.py:53 ui/log.py:375 ui/log.py:662 ui/browser.py:91 ui/annotate.py:131 #: ui/annotate.py:235 msgid "Author" msgstr "" #: ui/log.py:126 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:307 ui/log.py:308 ui/xml/log.xml.h:7 msgid "N/A" msgstr "" #: ui/log.py:376 ui/log.py:663 ui/xml/dialogs/message_box.xml.h:1 #: ui/dialog.py:51 msgid "Message" msgstr "" #: ui/log.py:377 msgid "Color" msgstr "" #: ui/log.py:392 ui/log.py:678 ui/action.py:120 msgid "Action" msgstr "" #: ui/log.py:393 msgid "Copy From Path" msgstr "" #: ui/log.py:393 msgid "Copy From Revision" msgstr "" #: ui/log.py:662 msgid "Graph" msgstr "" #: ui/log.py:929 ui/browser.py:322 ui/dialog.py:110 msgid "_Select" msgstr "" #: ui/log.py:983 msgid "View diff against working copy" msgstr "" #: ui/log.py:993 msgid "View diff between revisions" msgstr "" #: ui/log.py:998 msgid "Compare with working copy" msgstr "" #: ui/log.py:1008 msgid "Compare revisions" msgstr "" #: ui/log.py:1014 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:1020 msgid "Show changes between revisions" msgstr "" #: ui/log.py:1025 msgid "Update to this revision" msgstr "" #: ui/log.py:1026 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:1031 msgid "Revert changes from this revision" msgstr "" #: ui/log.py:1032 msgid "Update the selected path by reverse merging the changes" msgstr "" #: ui/log.py:1037 msgid "Copy to clipboard" msgstr "" #: ui/log.py:1038 msgid "Copy to clipboard the full data of these revisions" msgstr "" #: ui/log.py:1042 ui/log.py:1046 msgid "Edit author..." msgstr "" #: ui/log.py:1050 msgid "Edit log message..." msgstr "" #: ui/log.py:1054 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1334 msgid "Edit author" msgstr "" #: ui/log.py:1346 msgid "Edit log message" msgstr "" #: ui/unlock.py:46 ui/unlock.py:108 msgid "Unlock" msgstr "" #: ui/unlock.py:109 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:112 msgid "Completed Unlock" msgstr "" #: ui/__init__.py:52 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/clean.py:67 msgid "Running Clean Command..." msgstr "" #: ui/clean.py:77 msgid "Completed Clean" msgstr "" #: ui/action.py:120 msgid "Mime Type" msgstr "" #: ui/action.py:360 msgid "Finished" msgstr "" #: ui/action.py:364 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:386 msgid "Log Message" msgstr "" #: ui/xml/revert.xml.h:2 ui/xml/commit.xml.h:2 ui/xml/relocate.xml.h:2 #: ui/xml/update.xml.h:2 ui/xml/settings.xml.h:2 ui/xml/add.xml.h:2 #: ui/xml/dialogs/delete_confirmation.xml.h:2 #: ui/xml/dialogs/name_email_prompt.xml.h:2 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:2 #: ui/xml/dialogs/previous_messages.xml.h:2 ui/xml/dialogs/property.xml.h:2 #: ui/xml/dialogs/create_folder.xml.h:2 ui/xml/dialogs/loading.xml.h:2 #: ui/xml/ignore.xml.h:2 ui/xml/clean.xml.h:2 ui/xml/properties.xml.h:2 #: ui/xml/notification.xml.h:2 ui/xml/git-update.xml.h:1 ui/xml/lock.xml.h:2 #: ui/xml/import.xml.h:2 ui/xml/reset.xml.h:2 ui/dialog.py:109 ui/dialog.py:281 #: ui/dialog.py:301 msgid "_Cancel" msgstr "" #: ui/xml/revert.xml.h:3 ui/xml/commit.xml.h:3 ui/xml/relocate.xml.h:3 #: ui/xml/update.xml.h:3 ui/xml/settings.xml.h:3 ui/xml/add.xml.h:3 #: ui/xml/dialogs/name_email_prompt.xml.h:3 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:3 #: ui/xml/dialogs/message_box.xml.h:2 ui/xml/dialogs/previous_messages.xml.h:3 #: ui/xml/dialogs/property.xml.h:3 ui/xml/dialogs/create_folder.xml.h:3 #: ui/xml/ignore.xml.h:3 ui/xml/clean.xml.h:3 ui/xml/notification.xml.h:3 #: ui/xml/git-update.xml.h:2 ui/xml/lock.xml.h:3 ui/xml/import.xml.h:3 #: ui/xml/reset.xml.h:3 msgid "_OK" msgstr "" #: ui/xml/revert.xml.h:4 ui/xml/commit.xml.h:8 ui/xml/add.xml.h:5 #: ui/xml/lock.xml.h:5 msgid "Select / Deselect all" msgstr "" #: ui/xml/commit.xml.h:4 ui/xml/log.xml.h:2 msgid "Refresh" msgstr "" #: ui/xml/commit.xml.h:5 ui/xml/dialogs/previous_messages.xml.h:1 #: ui/xml/lock.xml.h:7 ui/xml/import.xml.h:5 msgid "Previous Messages" msgstr "" #: ui/xml/commit.xml.h:6 ui/xml/dialogs/create_folder.xml.h:5 msgid "Add Message" msgstr "" #: ui/xml/commit.xml.h:7 msgid "Show unversioned files" msgstr "" #: ui/xml/commit.xml.h:9 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/xml/commit.xml.h:10 msgid "Commit to:" msgstr "" #: ui/xml/property_editor.xml.h:1 msgid "Property Editor" msgstr "" #: ui/xml/property_editor.xml.h:2 ui/xml/browser.xml.h:3 ui/xml/manager.xml.h:1 #: ui/xml/dialogs/error_notification.xml.h:2 ui/xml/log.xml.h:1 #: ui/xml/annotate.xml.h:3 msgid "_Close" msgstr "" #: ui/xml/property_editor.xml.h:3 msgid "Close this dialog." msgstr "" #: ui/xml/property_editor.xml.h:4 msgid "_Refresh" msgstr "" #: ui/xml/property_editor.xml.h:5 msgid "Refresh the list of properties." msgstr "" #: ui/xml/property_editor.xml.h:6 msgid "_New" msgstr "" #: ui/xml/property_editor.xml.h:7 msgid "Add a new property." msgstr "" #: ui/xml/property_editor.xml.h:8 msgid "Remote URI:" msgstr "" #: ui/xml/property_editor.xml.h:9 msgid "Working Copy:" msgstr "" #: ui/xml/browser.xml.h:2 msgid "Load/Refresh" msgstr "" #: ui/xml/browser.xml.h:4 ui/tags.py:108 ui/tags.py:176 ui/merge.py:508 msgid "Revision:" msgstr "" #: ui/xml/browser.xml.h:5 msgid "URL:" msgstr "" #: ui/xml/relocate.xml.h:1 ui/relocate.py:82 msgid "Relocate" msgstr "" #: ui/xml/relocate.xml.h:4 msgid "To:" msgstr "" #: ui/xml/relocate.xml.h:5 msgid "From:" msgstr "" #: ui/xml/relocate.xml.h:6 msgid "Change the repository of your working copy" msgstr "" #: ui/xml/update.xml.h:4 msgid "Rollback to specified revision number" msgstr "" #: ui/xml/update.xml.h:5 msgid "Omit Externals" msgstr "" #: ui/xml/update.xml.h:6 ui/xml/merge.xml.h:29 msgid "Recursive" msgstr "" #: ui/xml/update.xml.h:7 ui/xml/merge.xml.h:30 ui/xml/git-update.xml.h:7 #: ui/xml/reset.xml.h:13 msgid "Options" msgstr "" #: ui/xml/update.xml.h:8 ui/xml/reset.xml.h:14 msgid "Revision" msgstr "" #: ui/xml/merge.xml.h:1 msgid "Merge Assistant" msgstr "" #: ui/xml/merge.xml.h:2 msgid "Choose this method if you wish to reintegrate a branch into the trunk." msgstr "" #: ui/xml/merge.xml.h:3 msgid "Reintegrate a branch" msgstr "" #: ui/xml/merge.xml.h:4 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/xml/merge.xml.h:5 msgid "Merge two different trees" msgstr "" #: ui/xml/merge.xml.h:6 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/xml/merge.xml.h:7 msgid "Merge a range of revisions" msgstr "" #: ui/xml/merge.xml.h:8 msgid "Step 1: Merge Type" msgstr "" #: ui/xml/merge.xml.h:9 msgid "Working Copy" msgstr "" #: ui/xml/merge.xml.h:10 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" #: ui/xml/merge.xml.h:15 msgid "Show log" msgstr "" #: ui/xml/merge.xml.h:16 msgid "Revision Range" msgstr "" #: ui/xml/merge.xml.h:17 msgid "URL to merge from" msgstr "" #: ui/xml/merge.xml.h:18 msgid "Step 2: Merge a Range of Revisions" msgstr "" #: ui/xml/merge.xml.h:20 ui/widget.py:1037 ui/widget.py:1043 msgid "HEAD" msgstr "" #: ui/xml/merge.xml.h:21 msgid "To: (URL and revision to merge)" msgstr "" #: ui/xml/merge.xml.h:22 msgid "From: (URL and revision to merge)" msgstr "" #: ui/xml/merge.xml.h:23 msgid "Step 2: Merge two different trees" msgstr "" #: ui/xml/merge.xml.h:24 msgid "From URL" msgstr "" #: ui/xml/merge.xml.h:25 msgid "Step 2: Reintegrate a Branch" msgstr "" #: ui/xml/merge.xml.h:26 msgid "Test Merge" msgstr "" #: ui/xml/merge.xml.h:27 msgid "Only record the merge" msgstr "" #: ui/xml/merge.xml.h:28 msgid "Ignore ancestry" msgstr "" #: ui/xml/merge.xml.h:31 msgid "Step 3: Final Options" msgstr "" #: ui/xml/settings.xml.h:4 msgid "Version Control Systems" msgstr "" #: ui/xml/settings.xml.h:5 msgid "Enable Subversion" msgstr "" #: ui/xml/settings.xml.h:6 msgid "Enable Git" msgstr "" #: ui/xml/settings.xml.h:7 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/xml/settings.xml.h:8 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/xml/settings.xml.h:9 msgid "Enable emblems" msgstr "" #: ui/xml/settings.xml.h:10 msgid "Enable recursive status checks" msgstr "" #: ui/xml/settings.xml.h:11 msgid "Enable file attributes" msgstr "" #: ui/xml/settings.xml.h:12 msgid "RabbitVCS" msgstr "" #: ui/xml/settings.xml.h:13 msgid "General" msgstr "" #: ui/xml/settings.xml.h:14 msgid "Configure the program to resolve conflicted files." msgstr "" #: ui/xml/settings.xml.h:16 msgid "" "Use the following macros to configure the merge tool:\n" "%base - The common ancestor of the two files to be merged.\n" "%mine - The file you modified in your working copy.\n" "%theirs - The file being merged into your working copy.\n" "%merged - The file to store the merged result." msgstr "" #: ui/xml/settings.xml.h:21 msgid "Browse..." msgstr "" #: ui/xml/settings.xml.h:22 msgid "Show new version on the left side" msgstr "" #: ui/xml/settings.xml.h:23 msgid "Program used to compare files" msgstr "" #: ui/xml/settings.xml.h:24 msgid "External Programs" msgstr "" #: ui/xml/settings.xml.h:25 msgid "Clear" msgstr "" #: ui/xml/settings.xml.h:26 msgid "Clear your authentication information" msgstr "" #: ui/xml/settings.xml.h:27 msgid "Authentication" msgstr "" #: ui/xml/settings.xml.h:28 msgid "Number of messages to remember" msgstr "" #: ui/xml/settings.xml.h:29 msgid "Log Messages" msgstr "" #: ui/xml/settings.xml.h:30 msgid "Number of URLs to remember" msgstr "" #: ui/xml/settings.xml.h:31 msgid "URL History" msgstr "" #: ui/xml/settings.xml.h:32 msgid "Saved Data" msgstr "" #: ui/xml/settings.xml.h:33 msgid "Logging Options" msgstr "" #: ui/xml/settings.xml.h:34 msgid "Minimum level to log:" msgstr "" #: ui/xml/settings.xml.h:35 msgid "Type:" msgstr "" #: ui/xml/settings.xml.h:36 msgid "Logging" msgstr "" #: ui/xml/settings.xml.h:37 msgid "Refresh Information" msgstr "" #: ui/xml/settings.xml.h:38 msgid "Restart Checker" msgstr "" #: ui/xml/settings.xml.h:39 msgid "Stop Checker" msgstr "" #: ui/xml/settings.xml.h:40 msgid "Other Information" msgstr "" #: ui/xml/settings.xml.h:41 msgid "Checker type:" msgstr "" #: ui/xml/settings.xml.h:42 ui/settings.py:43 msgid "Unknown" msgstr "" #: ui/xml/settings.xml.h:43 msgid "Process ID:" msgstr "" #: ui/xml/settings.xml.h:44 msgid "Memory usage: " msgstr "" #: ui/xml/settings.xml.h:45 msgid "Locale: " msgstr "" #: ui/xml/settings.xml.h:46 msgid "Status Checker" msgstr "" #: ui/xml/settings.xml.h:47 msgid "Configuration Editor" msgstr "" #: ui/xml/settings.xml.h:48 msgid "Git" msgstr "" #: ui/xml/add.xml.h:4 msgid "Show ignored files" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:1 msgid "Delete Confirmation" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:3 ui/xml/properties.xml.h:6 msgid "_Delete" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:4 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:6 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/xml/dialogs/certificate.xml.h:1 msgid "Check Certificate" msgstr "" #: ui/xml/dialogs/certificate.xml.h:2 msgid "Accept Once" msgstr "" #: ui/xml/dialogs/certificate.xml.h:3 msgid "Accept Forever" msgstr "" #: ui/xml/dialogs/certificate.xml.h:4 msgid "Deny" msgstr "" #: ui/xml/dialogs/certificate.xml.h:5 msgid "Fingerprint:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:6 msgid "Valid:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:7 msgid "Issuer:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:8 ui/widget.py:1310 msgid "Host:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:9 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:6 msgid "Realm:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:10 msgid "Certificate Details" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:1 msgid "Name and Email" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:4 msgid "Enter Name and Email Details" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:5 msgid "Email:" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:6 ui/xml/property_page.xml.h:4 #: ui/tags.py:98 msgid "Name:" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:1 msgid "Confirmation" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:2 msgid "_No" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:3 msgid "_Yes" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:4 ui/dialog.py:316 msgid "Are you sure you want to continue?" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:1 msgid "SSL Client Certification" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:4 msgid "Save Authentication" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:5 msgid "Path:" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:7 msgid "Please provide your ssl certification file" msgstr "" #: ui/xml/dialogs/previous_messages.xml.h:4 msgid "Previous Messages" msgstr "" #: ui/xml/dialogs/previous_messages.xml.h:5 ui/xml/log.xml.h:13 msgid "Message" msgstr "" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:1 msgid "Mark Resolved" msgstr "" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:2 msgid "Unresolved" msgstr "" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:3 msgid "Resolved" msgstr "" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:4 msgid "Mark Conflict As" msgstr "" #: ui/xml/dialogs/property.xml.h:1 msgid "Property" msgstr "" #: ui/xml/dialogs/property.xml.h:4 msgid "Apply property recursively" msgstr "" #: ui/xml/dialogs/property.xml.h:5 msgid "Value:" msgstr "" #: ui/xml/dialogs/property.xml.h:6 msgid "Property:" msgstr "" #: ui/xml/dialogs/property.xml.h:7 msgid "Edit Property Details" msgstr "" #: ui/xml/dialogs/error_notification.xml.h:1 msgid "RabbitVCS Error" msgstr "" #: ui/xml/dialogs/error_notification.xml.h:3 msgid "RabbitVCS Error" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:1 msgid "Edit Conflicts" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:2 msgid "Cancel" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:3 msgid "Accept Mine" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:4 msgid "Accept Theirs" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:5 msgid "A conflict was found in the following file:" msgstr "" #: ui/xml/dialogs/create_folder.xml.h:1 msgid "Create Folder..." msgstr "" #: ui/xml/dialogs/create_folder.xml.h:4 msgid "Folder Name" msgstr "" #: ui/xml/dialogs/loading.xml.h:1 msgid "Loading" msgstr "" #: ui/xml/ignore.xml.h:1 msgid "Ignore" msgstr "" #: ui/xml/ignore.xml.h:4 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/xml/clean.xml.h:4 msgid "Force" msgstr "" #: ui/xml/clean.xml.h:5 msgid "Dry run" msgstr "" #: ui/xml/clean.xml.h:6 msgid "Remove only ignored files" msgstr "" #: ui/xml/clean.xml.h:7 msgid "Remove ignored files, too" msgstr "" #: ui/xml/clean.xml.h:8 msgid "Remove directories" msgstr "" #: ui/xml/clean.xml.h:9 msgid "Remove untracked files from the working tree" msgstr "" #: ui/xml/clean.xml.h:10 msgid "Clean your Repository" msgstr "" #: ui/xml/properties.xml.h:3 ui/dialog.py:302 msgid "_Save" msgstr "" #: ui/xml/properties.xml.h:4 msgid "_New..." msgstr "" #: ui/xml/properties.xml.h:5 msgid "_Edit..." msgstr "" #: ui/xml/properties.xml.h:7 msgid "Delete properties recursively" msgstr "" #: ui/xml/properties.xml.h:8 msgid "Selected properties will be applied recursively." msgstr "" #: ui/xml/properties.xml.h:9 msgid "Properties for:" msgstr "" #: ui/xml/notification.xml.h:1 msgid "Notification Messages" msgstr "" #: ui/xml/notification.xml.h:4 ui/xml/annotate.xml.h:2 msgid "Save _As" msgstr "" #: ui/xml/git-update.xml.h:3 msgid "Fetch from all remotes" msgstr "" #: ui/xml/git-update.xml.h:4 msgid "Apply remote changes prior to local changes (rebase)" msgstr "" #: ui/xml/git-update.xml.h:5 msgid "Merge into local branch" msgstr "" #: ui/xml/git-update.xml.h:6 msgid "Apply remote changes" msgstr "" #: ui/xml/log.xml.h:3 msgid "100" msgstr "" #: ui/xml/log.xml.h:4 msgid "Limit:" msgstr "" #: ui/xml/log.xml.h:5 msgid "_Back" msgstr "" #: ui/xml/log.xml.h:6 msgid "_Forward" msgstr "" #: ui/xml/log.xml.h:8 ui/dialog.py:136 msgid "to" msgstr "" #: ui/xml/log.xml.h:9 msgid "Showing Revisions:" msgstr "" #: ui/xml/log.xml.h:10 msgid "Stop on copy" msgstr "" #: ui/xml/log.xml.h:11 msgid "Revisions Table" msgstr "" #: ui/xml/log.xml.h:12 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/xml/lock.xml.h:1 msgid "Lock Files" msgstr "" #: ui/xml/lock.xml.h:4 msgid "Steal the locks" msgstr "" #: ui/xml/lock.xml.h:6 msgid "Files to lock" msgstr "" #: ui/xml/lock.xml.h:8 msgid "Please describe why you are locking these files" msgstr "" #: ui/xml/annotate.xml.h:1 msgid "Annotate" msgstr "" #: ui/xml/annotate.xml.h:4 msgid "To Revision" msgstr "" #: ui/xml/annotate.xml.h:5 msgid "From Revision" msgstr "" #: ui/xml/import.xml.h:4 msgid "Include ignored files" msgstr "" #: ui/xml/import.xml.h:6 msgid "Import Message" msgstr "" #: ui/xml/import.xml.h:7 msgid "Repository" msgstr "" #: ui/xml/reset.xml.h:4 msgid "None" msgstr "" #: ui/xml/reset.xml.h:5 msgid "" "Merge - Resets the index to match the tree recorded by the named " "commit,\n" "and updates the files that are different between the named commit\n" "and the current commit in the working tree" msgstr "" #: ui/xml/reset.xml.h:8 msgid "" "Hard - Matches the working tree and index to that of the \n" "tree being switched to" msgstr "" #: ui/xml/reset.xml.h:10 msgid "" "Soft - Does not touch the index file or working tree at all, \n" "but requires them to be in good working order" msgstr "" #: ui/xml/reset.xml.h:12 msgid "Mixed - Reset the index but not the working tree" msgstr "" #: ui/xml/reset.xml.h:15 msgid "Path" msgstr "" #: ui/xml/reset.xml.h:16 msgid "Reset current HEAD to specified state." msgstr "" #: ui/xml/reset.xml.h:17 msgid "Reset your Repository" msgstr "" #: ui/xml/property_page.xml.h:1 msgid "Property status:" msgstr "" #: ui/xml/property_page.xml.h:2 msgid "Content status:" msgstr "" #: ui/xml/property_page.xml.h:3 msgid "VCS:" msgstr "" #: ui/rename.py:50 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:54 ui/rename.py:86 ui/rename.py:115 ui/browser.py:465 msgid "Rename" msgstr "" #: ui/rename.py:54 ui/browser.py:465 msgid "New Name:" msgstr "" #: ui/rename.py:62 msgid "The new name field is required" msgstr "" #: ui/rename.py:87 ui/rename.py:116 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:93 ui/rename.py:122 msgid "Completed Rename" msgstr "" #: ui/update.py:56 ui/update.py:105 ui/updateto.py:92 msgid "Updating..." msgstr "" #: ui/update.py:58 ui/update.py:123 ui/updateto.py:100 msgid "Completed Update" msgstr "" #: ui/revprops.py:66 ui/properties.py:153 ui/property_editor.py:158 msgid "Unable to retrieve properties list" msgstr "" #: ui/widget.py:1039 msgid "Branch" msgstr "" #: ui/widget.py:1044 msgid "Number" msgstr "" #: ui/widget.py:1047 msgid "Working Copy" msgstr "" #: ui/widget.py:1268 msgid "Repository:" msgstr "" #: ui/widget.py:1285 msgid "Branch:" msgstr "" #: ui/widget.py:1426 msgid "Add line:" msgstr "" #: ui/browser.py:91 msgid "Size" msgstr "" #: ui/browser.py:341 msgid "Create folder..." msgstr "" #: ui/browser.py:346 msgid "Copy to..." msgstr "" #: ui/browser.py:351 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:356 msgid "Move to..." msgstr "" #: ui/browser.py:526 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:527 ui/browser.py:556 msgid "New Location:" msgstr "" #: ui/browser.py:555 msgid "Where do you want to move the selection?" msgstr "" #: ui/relocate.py:72 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:83 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:90 msgid "Completed Relocate" msgstr "" #: ui/add.py:216 ui/add.py:241 msgid "Running Add Command..." msgstr "" #: ui/add.py:218 ui/add.py:243 msgid "Completed Add" msgstr "" #: ui/updateto.py:80 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:81 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:89 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:91 msgid "Update To Revision" msgstr "" #: ui/updateto.py:117 msgid "What revision/branch do you want to checkout?" msgstr "" #: ui/updateto.py:138 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 msgid "Completed Checkout" msgstr "" #: ui/create.py:52 msgid "Repository successfully created" msgstr "" #: ui/create.py:54 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/create.py:69 msgid "Setting up repository..." msgstr "" #: ui/create.py:71 msgid "Completed repository setup" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:127 ui/tags.py:188 ui/merge.py:520 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:295 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:497 msgid "Date:" msgstr "" #: ui/tags.py:286 msgid "Add Tag" msgstr "" #: ui/tags.py:304 msgid "Tag Detail" msgstr "" #: ui/property_page.py:146 ui/property_page.py:152 msgid "Repository URL" msgstr "" #: ui/properties.py:56 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:64 ui/property_editor.py:114 msgid "Value" msgstr "" #: ui/properties.py:174 msgid "There was a problem saving your properties." msgstr "" #: ui/merge.py:103 msgid "Running Merge Test" msgstr "" #: ui/merge.py:104 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:106 msgid "Running Merge Command" msgstr "" #: ui/merge.py:107 ui/merge.py:566 msgid "Completed Merge" msgstr "" #: ui/merge.py:118 ui/merge.py:559 msgid "Merge" msgstr "" #: ui/merge.py:474 msgid "No active branch" msgstr "" #: ui/merge.py:485 msgid "Author:" msgstr "" #: ui/merge.py:560 msgid "Running Merge Command..." msgstr "" #: ui/dialog.py:35 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:106 msgid "Select a Folder" msgstr "" #: ui/dialog.py:276 msgid "Select a File" msgstr "" #: ui/dialog.py:282 msgid "_Open" msgstr "" #: ui/dialog.py:296 msgid "Save As..." msgstr "" #: ui/dialog.py:344 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:415 msgid "Added a folder to the repository" msgstr "" #: ui/annotate.py:58 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:64 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:131 ui/annotate.py:235 msgid "Line" msgstr "" #: ui/annotate.py:132 ui/annotate.py:236 msgid "Text" msgstr "" #: ui/annotate.py:149 msgid "The from revision field must be an integer" msgstr "" #: ui/property_editor.py:57 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:62 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:104 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:114 msgid "Reserved" msgstr "" #: ui/property_editor.py:114 msgid "Status" msgstr "" #: ui/property_editor.py:182 msgid "Unable to set new value for property." msgstr "" #: ui/cleanup.py:57 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:59 msgid "Completed Cleanup" msgstr "" #: ui/import.py:41 #, python-format msgid "Import - %s" msgstr "" #: ui/import.py:63 msgid "The repository URL field is required." msgstr "" #: ui/import.py:76 msgid "Running Import Command..." msgstr "" #: ui/import.py:84 msgid "Completed Import" msgstr "" #: ui/clone.py:60 ui/export.py:73 ui/export.py:142 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/clone.py:69 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:76 msgid "Completed Clone" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:124 msgid "Config file:" msgstr "" #: ui/settings.py:300 msgid "Select a program" msgstr "" #: ui/settings.py:309 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:316 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:320 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:327 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:331 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:348 msgid "Authentication information cleared" msgstr "" #: ui/commit.py:267 #, python-format msgid "Found %(changed)d changed and %(unversioned)d unversioned item(s)" msgstr "" #: ui/commit.py:319 ui/commit.py:387 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:332 ui/commit.py:396 msgid "Completed Commit" msgstr "" #: ui/diff.py:311 msgid "View diff as side-by-side comparison" msgstr "" #: ui/export.py:46 ui/export.py:125 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:93 ui/export.py:162 msgid "Export" msgstr "" #: ui/export.py:94 ui/export.py:163 msgid "Running Export Command..." msgstr "" #: ui/export.py:105 ui/export.py:171 msgid "Completed Export" msgstr "" rabbitvcs-0.18/po/cs.po000066400000000000000000000663171362112712700150230ustar00rootroot00000000000000# Czech translation for rabbitvcs # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-03-04 14:35-0500\n" "PO-Revision-Date: 2009-03-27 10:34+0000\n" "Last-Translator: Ladislav Prskavec \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-09-24 13:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ui/branch.py:71 msgid "" "There have been modifications to your working copy. If you copy from the " "HEAD revision you will lose your changes." msgstr "" #: ui/branch.py:89 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:99 msgid "The from revision field is required." msgstr "Políčko z revize je povinné." #: ui/branch.py:108 msgid "Invalid revision information" msgstr "" #: ui/branch.py:123 ui/glade/branch.glade.h:4 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:124 msgid "Running Branch/tag Command..." msgstr "Spuštím příkaz branch/tag" #: ui/branch.py:126 msgid "Completed Branch/tag" msgstr "Branch/tag dokončen." #: ui/updateto.py:70 msgid "Update To Revision" msgstr "Aktualizace na revizi" #: ui/updateto.py:71 ui/update.py:54 msgid "Updating..." msgstr "Aktualizuji" #: ui/updateto.py:79 ui/update.py:57 msgid "Completed Update" msgstr "Aktualizace dokončena." #: ui/rename.py:59 msgid "The new name field is required" msgstr "Políčko nové jméno je povinné" #: ui/rename.py:70 ui/glade/rename.glade.h:2 msgid "Rename" msgstr "Přejmenovat" #: ui/rename.py:71 msgid "Running Rename Command..." msgstr "Spouštím příkaz Přejmenovat" #: ui/rename.py:78 msgid "Completed Rename" msgstr "Přejmenování dokončeno." #: ui/annotate.py:51 msgid "Cannot annotate a directory" msgstr "Nemohu anotovat adresář" #: ui/annotate.py:58 #, python-format msgid "Annotate - %s" msgstr "Anotace - %s" #: ui/annotate.py:71 msgid "Line" msgstr "Řádek" #: ui/annotate.py:71 ui/log.py:80 ui/glade/switch.glade.h:5 #: ui/glade/merge.glade.h:17 ui/glade/checkout.glade.h:10 #: ui/glade/update.glade.h:6 msgid "Revision" msgstr "Revize" #: ui/annotate.py:71 ui/log.py:80 msgid "Author" msgstr "Autor" #: ui/annotate.py:72 ui/dialog.py:47 ui/log.py:81 msgid "Date" msgstr "Datum" #: ui/annotate.py:72 msgid "Text" msgstr "Test" #: ui/annotate.py:112 msgid "The from revision field must be an integer" msgstr "Políčko revize musí obsahovat číslo" #: ui/annotate.py:122 msgid "Generating Annotation..." msgstr "Generuji anotaci" #: ui/annotate.py:138 lib/vcs/svn/__init__.py:122 lib/vcs/svn/__init__.py:124 msgid "Completed" msgstr "Dokončeno" #: ui/settings.py:50 msgid "English" msgstr "Anglicky" #: ui/settings.py:156 ui/settings.py:165 msgid "Select a program" msgstr "Vyberte program" #: ui/settings.py:174 msgid "Are you sure you want to clear your repository paths?" msgstr "Opravdu chcete vymazat cesty k repozitory?" #: ui/settings.py:181 msgid "Repository paths cleared" msgstr "Cesty k repozitory vymazány." #: ui/settings.py:185 msgid "Are you sure you want to clear your previous messages?" msgstr "Opravdu chcete vymazat zprávy?" #: ui/settings.py:192 msgid "Previous messages cleared" msgstr "Zprávy vymazány." #: ui/settings.py:196 msgid "Are you sure you want to clear your authentication information?" msgstr "Opravdu chcete vymazat vaše autentikační údaje?" #: ui/settings.py:213 msgid "Authentication information cleared" msgstr "Autentikační údaje vymazány." #: ui/cleanup.py:54 lib/extensions/nautilus/RabbitVCS.py:831 msgid "Cleanup" msgstr "Vyčistit" #: ui/cleanup.py:55 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Čistím" #: ui/cleanup.py:57 msgid "Completed Cleanup" msgstr "Čištění dokončeno" #: ui/relocate.py:76 msgid "The from and to url fields are both required." msgstr "Políčka z a url jsou povinná" #: ui/relocate.py:86 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Přesunutí" #: ui/relocate.py:87 msgid "Running Relocate Command..." msgstr "Spouštím příkaz Přesunutí" #: ui/relocate.py:94 msgid "Completed Relocate" msgstr "Přesunutí dokončeno" #: ui/add.py:64 ui/lock.py:66 ui/resolve.py:55 ui/action.py:66 ui/commit.py:73 #: ui/unlock.py:55 ui/log.py:89 ui/revert.py:55 msgid "Path" msgstr "Cesta" #: ui/add.py:64 ui/lock.py:66 ui/resolve.py:55 ui/commit.py:73 ui/unlock.py:55 #: ui/revert.py:55 msgid "Extension" msgstr "" #: ui/add.py:78 ui/lock.py:96 ui/commit.py:97 ui/unlock.py:70 ui/log.py:253 #: ui/glade/log.glade.h:6 msgid "Loading..." msgstr "Nahrávám..." #: ui/add.py:81 ui/lock.py:99 ui/commit.py:100 ui/unlock.py:91 #, python-format msgid "Found %d item(s)" msgstr "Našel %d položek" #: ui/add.py:115 ui/commit.py:269 ui/glade/add.glade.h:1 #: lib/extensions/nautilus/RabbitVCS.py:638 msgid "Add" msgstr "Přidat" #: ui/add.py:116 msgid "Running Add Command..." msgstr "" #: ui/add.py:118 msgid "Completed Add" msgstr "Přidání dokončeno" #: ui/add.py:141 ui/lock.py:206 ui/commit.py:239 msgid "Open" msgstr "Otevřít" #: ui/add.py:150 ui/lock.py:216 ui/commit.py:249 msgid "Browse to" msgstr "Procházet" #: ui/add.py:159 ui/commit.py:259 ui/glade/properties.glade.h:2 #: lib/extensions/nautilus/RabbitVCS.py:735 msgid "Delete" msgstr "Smazat" #: ui/add.py:168 ui/commit.py:299 lib/extensions/nautilus/RabbitVCS.py:654 msgid "Add to ignore list" msgstr "Přídat na ignore list" #: ui/import.py:41 #, python-format msgid "Import - %s" msgstr "Importovat - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:80 ui/glade/import.glade.h:3 #: lib/extensions/nautilus/RabbitVCS.py:888 msgid "Import" msgstr "Import" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/lock.py:67 lib/vcs/svn/__init__.py:132 msgid "Locked" msgstr "Zamčeno" #: ui/lock.py:90 ui/lock.py:107 msgid "Yes" msgstr "Ano" #: ui/lock.py:144 msgid "Get Lock" msgstr "" #: ui/lock.py:145 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:154 msgid "Completed Lock" msgstr "" #: ui/lock.py:176 msgid "Remove Lock" msgstr "Odstranit zámek" #: ui/lock.py:186 ui/commit.py:229 lib/extensions/nautilus/RabbitVCS.py:597 msgid "View Diff" msgstr "Zobrazit Diff" #: ui/lock.py:196 ui/glade/switch.glade.h:6 ui/glade/branch.glade.h:10 #: ui/glade/merge.glade.h:18 ui/glade/checkout.glade.h:11 #: ui/glade/update.glade.h:7 msgid "Show log" msgstr "Zobrazit log" #: ui/export.py:40 #, python-format msgid "Export - %s" msgstr "Exportovat - %s" #: ui/export.py:58 ui/checkout.py:82 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:79 lib/extensions/nautilus/RabbitVCS.py:856 msgid "Export" msgstr "Export" #: ui/export.py:80 msgid "Running Export Command..." msgstr "" #: ui/export.py:91 msgid "Completed Export" msgstr "" #: ui/resolve.py:45 ui/resolve.py:76 #: lib/extensions/nautilus/RabbitVCS.py:767 msgid "Resolve" msgstr "" #: ui/resolve.py:77 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:80 msgid "Completed Resolve" msgstr "" #: ui/action.py:66 ui/log.py:89 msgid "Action" msgstr "Akce" #: ui/action.py:66 msgid "Mime Type" msgstr "Mime Type" #: ui/action.py:135 msgid "Empty Message" msgstr "Prázdná zpráva" #: ui/action.py:249 ui/log.py:309 msgid "Finished" msgstr "Dokončeno" #: ui/action.py:253 #, python-format msgid "%s - Finished" msgstr "%s - Dokončeno" #: ui/commit.py:66 msgid "The given path is not a working copy" msgstr "" #: ui/commit.py:74 msgid "Text Status" msgstr "Status" #: ui/commit.py:74 msgid "Property Status" msgstr "" #: ui/commit.py:188 ui/glade/commit.glade.h:4 #: lib/extensions/nautilus/RabbitVCS.py:568 msgid "Commit" msgstr "Commit" #: ui/commit.py:189 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:195 msgid "Completed Commit" msgstr "" #: ui/commit.py:279 ui/revert.py:45 ui/revert.py:75 #: lib/extensions/nautilus/RabbitVCS.py:751 msgid "Revert" msgstr "" #: ui/commit.py:289 msgid "Restore" msgstr "Obnovit" #: ui/dialog.py:47 ui/log.py:81 ui/glade/dialogs.glade.h:20 msgid "Message" msgstr "Zpráva" #: ui/dialog.py:88 msgid "Select a Folder" msgstr "Zvolit adresář" #: ui/dialog.py:117 ui/glade/log.glade.h:12 msgid "to" msgstr "" #: ui/dialog.py:210 msgid "Select a File" msgstr "Zvolit soubor" #: ui/dialog.py:229 ui/glade/dialogs.glade.h:10 msgid "Are you sure you want to continue?" msgstr "Opravdu chcete pokračovat?" #: ui/dialog.py:257 msgid "the selected item(s)" msgstr "zvolené(á) položky(a)" #: ui/switch.py:65 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:81 ui/glade/switch.glade.h:7 msgid "Switch" msgstr "Switch" #: ui/switch.py:82 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:90 msgid "Completed Switch" msgstr "" #: ui/unlock.py:45 ui/unlock.py:109 msgid "Unlock" msgstr "" #: ui/unlock.py:110 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:113 msgid "Completed Unlock" msgstr "" #: ui/merge.py:81 msgid "Running Merge Test" msgstr "" #: ui/merge.py:82 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:84 msgid "Running Merge Command" msgstr "" #: ui/merge.py:85 msgid "Completed Merge" msgstr "" #: ui/merge.py:93 msgid "Merge" msgstr "" #: ui/checkout.py:52 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:100 ui/glade/checkout.glade.h:5 #: lib/extensions/nautilus/RabbitVCS.py:536 msgid "Checkout" msgstr "" #: ui/checkout.py:101 msgid "Running Checkout Command..." msgstr "" #: ui/checkout.py:111 msgid "Completed Checkout" msgstr "" #: ui/log.py:63 #, python-format msgid "Log - %s" msgstr "Log - %s" #: ui/log.py:90 msgid "Copy From Path" msgstr "" #: ui/log.py:90 msgid "Copy From Revision" msgstr "" #: ui/log.py:112 msgid "Cancelled" msgstr "Zrušeno" #: ui/log.py:236 ui/log.py:237 ui/glade/log.glade.h:8 msgid "N/A" msgstr "N/A" #: ui/log.py:284 msgid "(no author)" msgstr "(autor neznámý)" #: ui/log.py:313 msgid "Retrieving Log Information..." msgstr "" #: ui/properties.py:53 #, python-format msgid "Properties - %s" msgstr "Vlastnosti - %s" #: ui/properties.py:61 msgid "Name" msgstr "Jméno" #: ui/properties.py:61 msgid "Value" msgstr "Hodnota" #: ui/revert.py:76 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:78 msgid "Completed Revert" msgstr "" #: ui/update.py:53 ui/glade/update.glade.h:8 #: lib/extensions/nautilus/RabbitVCS.py:552 msgid "Update" msgstr "Update" #: ui/create.py:49 msgid "Repository successfully created" msgstr "Repozitory bylo úspěšně vytvořeno" #: ui/create.py:51 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/switch.glade.h:1 ui/glade/checkout.glade.h:3 #: ui/glade/update.glade.h:1 msgid "Revision" msgstr "Revize" #: ui/glade/switch.glade.h:2 msgid "Switch Details" msgstr "" #: ui/glade/switch.glade.h:3 ui/glade/branch.glade.h:8 #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Od:" #: ui/glade/switch.glade.h:4 ui/glade/merge.glade.h:10 #: ui/glade/checkout.glade.h:7 ui/glade/update.glade.h:3 msgid "HEAD" msgstr "HEAD" #: ui/glade/switch.glade.h:8 ui/glade/branch.glade.h:11 #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Do:" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/commit.glade.h:1 ui/glade/branch.glade.h:1 msgid "Add Message" msgstr "Přidat zprávu" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to see diff)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Commit do:" #: ui/glade/commit.glade.h:5 ui/glade/lock.glade.h:4 ui/glade/branch.glade.h:9 #: ui/glade/dialogs.glade.h:22 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Předchozí zprávy" #: ui/glade/commit.glade.h:6 ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 msgid "Select / Deselect all" msgstr "Vybrat / zrušit vše" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Soubory k uzamknutí" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Vlastnosti pro:" #: ui/glade/properties.glade.h:3 msgid "Edit..." msgstr "Upravit..." #: ui/glade/properties.glade.h:4 msgid "New..." msgstr "Nový..." #: ui/glade/properties.glade.h:5 lib/extensions/nautilus/RabbitVCS.py:995 msgid "Properties" msgstr "Vlastnosti" #: ui/glade/properties.glade.h:6 msgid "URL/Path:" msgstr "URL/cesta:" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Odkazy" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informace o verzi" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:4 lib/extensions/nautilus/RabbitVCS.py:1059 msgid "About" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autoři:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Děkujeme:" #: ui/glade/rename.glade.h:1 msgid "New Name:" msgstr "Nové jméno:" #: ui/glade/branch.glade.h:2 msgid "Create copy from" msgstr "" #: ui/glade/branch.glade.h:3 ui/glade/checkout.glade.h:2 #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repozitory" #: ui/glade/branch.glade.h:5 msgid "Copy from HEAD" msgstr "" #: ui/glade/branch.glade.h:6 msgid "Copy from revision" msgstr "" #: ui/glade/branch.glade.h:7 msgid "Copy from working copy" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s)" msgstr "" #: ui/glade/log.glade.h:3 ui/glade/dialogs.glade.h:3 msgid "Message" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limit:" #: ui/glade/log.glade.h:7 msgid "Log" msgstr "Log" #: ui/glade/log.glade.h:9 msgid "Refresh" msgstr "Obnovit" #: ui/glade/log.glade.h:10 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:11 msgid "Stop on copy" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Z URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:3 ui/glade/checkout.glade.h:1 msgid "Options" msgstr "Volby" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:16 ui/glade/checkout.glade.h:9 #: ui/glade/update.glade.h:5 msgid "Recursive" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:4 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Program used to browse repositories" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:7 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:8 ui/glade/checkout.glade.h:4 msgid "Browse..." msgstr "Procházet..." #: ui/glade/settings.glade.h:9 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:10 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:11 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:13 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:14 msgid "General" msgstr "Obecné" #: ui/glade/settings.glade.h:15 msgid "Language:" msgstr "Jazyk:" #: ui/glade/settings.glade.h:16 msgid "Logging" msgstr "Logování" #: ui/glade/settings.glade.h:17 msgid "Minimum level to log" msgstr "Minimální úroveň pro logování" #: ui/glade/settings.glade.h:18 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Saved Data" msgstr "Uložená data" #: ui/glade/settings.glade.h:21 lib/extensions/nautilus/RabbitVCS.py:1043 msgid "Settings" msgstr "Nastavení" #: ui/glade/settings.glade.h:22 msgid "Show new version on the right side" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Type:" msgstr "Typ" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:2 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Previous Messages" msgstr "Předchozí zprávy" #: ui/glade/dialogs.glade.h:7 msgid "" "Are you sure you want to delete %item%?" msgstr "Opravdu chcete smazat %item%?" #: ui/glade/dialogs.glade.h:8 msgid "Accept Forever" msgstr "Přijmout natrvalo" #: ui/glade/dialogs.glade.h:9 msgid "Accept Once" msgstr "Přijmout jednou" #: ui/glade/dialogs.glade.h:11 msgid "Authentication" msgstr "Authentikace" #: ui/glade/dialogs.glade.h:12 msgid "Check Certificate" msgstr "Kontrola certifikátu" #: ui/glade/dialogs.glade.h:13 msgid "Confirmation" msgstr "Potvrzení" #: ui/glade/dialogs.glade.h:14 msgid "Delete Confirmation" msgstr "Smazat potvrzení" #: ui/glade/dialogs.glade.h:15 msgid "Deny" msgstr "Zakázané" #: ui/glade/dialogs.glade.h:16 msgid "Fingerprint:" msgstr "Fingerprint:" #: ui/glade/dialogs.glade.h:17 msgid "Host:" msgstr "Host" #: ui/glade/dialogs.glade.h:18 msgid "Issuer:" msgstr "Vydavatel:" #: ui/glade/dialogs.glade.h:19 msgid "Login:" msgstr "Jméno:" #: ui/glade/dialogs.glade.h:21 msgid "Password:" msgstr "Heslo:" #: ui/glade/dialogs.glade.h:23 msgid "Property" msgstr "Vlastnost" #: ui/glade/dialogs.glade.h:24 msgid "Property:" msgstr "Vlastnost:" #: ui/glade/dialogs.glade.h:25 msgid "Realm:" msgstr "Realm" #: ui/glade/dialogs.glade.h:26 msgid "Save Authentication" msgstr "Uložit autentikaci" #: ui/glade/dialogs.glade.h:27 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Valid:" msgstr "Platné:" #: ui/glade/dialogs.glade.h:29 msgid "Value:" msgstr "Hodnota:" #: ui/glade/checkout.glade.h:6 msgid "Destination:" msgstr "" #: ui/glade/checkout.glade.h:8 ui/glade/update.glade.h:4 msgid "Omit Externals" msgstr "" #: ui/glade/checkout.glade.h:12 msgid "URL:" msgstr "URL:" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/update.glade.h:2 msgid "Update Depth" msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:362 msgid "Debug" msgstr "Debug:" #: lib/extensions/nautilus/RabbitVCS.py:375 msgid "DBus" msgstr "DBus:" #: lib/extensions/nautilus/RabbitVCS.py:388 msgid "Start/Restart Service" msgstr "Start/Restart Service" #: lib/extensions/nautilus/RabbitVCS.py:404 msgid "Exit Service" msgstr "Exit Service" #: lib/extensions/nautilus/RabbitVCS.py:422 msgid "Bugs" msgstr "Bugy" #: lib/extensions/nautilus/RabbitVCS.py:435 msgid "Test Asynchronicity" msgstr "Test Asynchronicity" #: lib/extensions/nautilus/RabbitVCS.py:453 msgid "Open Shell" msgstr "Otevřít shell" #: lib/extensions/nautilus/RabbitVCS.py:469 msgid "Refresh Status" msgstr "Obnovit status" #: lib/extensions/nautilus/RabbitVCS.py:486 msgid "Debug Revert" msgstr "Debug Revert" #: lib/extensions/nautilus/RabbitVCS.py:487 msgid "Reverts everything it sees" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:502 msgid "Invalidate" msgstr "Nevalidní" #: lib/extensions/nautilus/RabbitVCS.py:503 msgid "Force an invalidate_extension_info() call" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:518 msgid "Add Emblem" msgstr "Přidat emblem" #: lib/extensions/nautilus/RabbitVCS.py:519 msgid "Add an emblem" msgstr "Přidat emblem" #: lib/extensions/nautilus/RabbitVCS.py:537 msgid "Check out a working copy" msgstr "Check out pracovní kopie" #: lib/extensions/nautilus/RabbitVCS.py:553 msgid "Update a working copy" msgstr "Update pracovní kopie" #: lib/extensions/nautilus/RabbitVCS.py:569 msgid "Commit modifications to the repository" msgstr "Commit změn do repozitory" #: lib/extensions/nautilus/RabbitVCS.py:584 msgid "RabbitVCS" msgstr "RabbitVCS" #: lib/extensions/nautilus/RabbitVCS.py:598 msgid "View the modifications made to a file" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:613 msgid "Show Log" msgstr "Zobrazit log" #: lib/extensions/nautilus/RabbitVCS.py:614 msgid "Show a file's log information" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:639 msgid "Schedule an item to be added to the repository" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:663 msgid "Ignore an item" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:678 msgid "Ignore all files with this extension" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:703 msgid "Update to revision..." msgstr "Update na revizi..." #: lib/extensions/nautilus/RabbitVCS.py:704 msgid "Update a file to a specific revision" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:719 msgid "Rename..." msgstr "Přejmenovat" #: lib/extensions/nautilus/RabbitVCS.py:720 msgid "Schedule an item to be renamed on the repository" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:736 msgid "Schedule an item to be deleted from the repository" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:752 msgid "Revert an item to its unmodified state" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:768 msgid "Mark a conflicted item as resolved" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:783 msgid "Relocate..." msgstr "Relocate..." #: lib/extensions/nautilus/RabbitVCS.py:784 msgid "Relocate your working copy" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:799 msgid "Get Lock..." msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:800 msgid "Locally lock items" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:815 msgid "Release Lock..." msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:816 msgid "Release lock on an item" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:832 msgid "Clean up working copy" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:857 msgid "Export a working copy or repository with no versioning information" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:872 msgid "Create Repository here" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:873 msgid "Create a repository in a folder" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:889 msgid "Import an item into a repository" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:913 msgid "Branch/tag..." msgstr "Branch/tag" #: lib/extensions/nautilus/RabbitVCS.py:914 msgid "Copy an item to another location in the repository" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:929 msgid "Switch..." msgstr "Switch..." #: lib/extensions/nautilus/RabbitVCS.py:930 msgid "Change the repository location of a working copy" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:945 msgid "Merge..." msgstr "Merge..." #: lib/extensions/nautilus/RabbitVCS.py:946 msgid "A wizard with steps for merging" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:970 msgid "Annotate..." msgstr "Anotace..." #: lib/extensions/nautilus/RabbitVCS.py:971 msgid "Annotate a file" msgstr "Anotace souboru" #: lib/extensions/nautilus/RabbitVCS.py:996 msgid "View the properties of an item" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:1027 msgid "Help" msgstr "Help" #: lib/extensions/nautilus/RabbitVCS.py:1028 msgid "View help" msgstr "Zobrazit nápovědu" #: lib/extensions/nautilus/RabbitVCS.py:1044 msgid "View or change RabbitVCS settings" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:1060 msgid "About RabbitVCS" msgstr "" #: lib/vcs/svn/__init__.py:111 lib/vcs/svn/__init__.py:120 #: lib/vcs/svn/__init__.py:127 msgid "Added" msgstr "" #: lib/vcs/svn/__init__.py:112 lib/vcs/svn/__init__.py:128 msgid "Copied" msgstr "" #: lib/vcs/svn/__init__.py:113 lib/vcs/svn/__init__.py:119 msgid "Deleted" msgstr "" #: lib/vcs/svn/__init__.py:114 msgid "Restored" msgstr "" #: lib/vcs/svn/__init__.py:115 msgid "Reverted" msgstr "" #: lib/vcs/svn/__init__.py:116 msgid "Failed Revert" msgstr "" #: lib/vcs/svn/__init__.py:117 msgid "Resolved" msgstr "" #: lib/vcs/svn/__init__.py:118 msgid "Skipped" msgstr "Přeskočeno" #: lib/vcs/svn/__init__.py:121 msgid "Updated" msgstr "Aktualizováno" #: lib/vcs/svn/__init__.py:123 lib/vcs/svn/__init__.py:125 msgid "External" msgstr "Externí" #: lib/vcs/svn/__init__.py:126 msgid "Modified" msgstr "Modifikováno" #: lib/vcs/svn/__init__.py:129 msgid "Replaced" msgstr "Přepsáno" #: lib/vcs/svn/__init__.py:130 lib/vcs/svn/__init__.py:149 msgid "Changed" msgstr "Změněno" #: lib/vcs/svn/__init__.py:131 msgid "Annotated" msgstr "Anotováno" #: lib/vcs/svn/__init__.py:133 msgid "Unlocked" msgstr "Odemčeno" #: lib/vcs/svn/__init__.py:134 msgid "Failed Lock" msgstr "Zámek selhal" #: lib/vcs/svn/__init__.py:135 msgid "Failed Unlock" msgstr "Odemčení selhalo" #: lib/vcs/svn/__init__.py:144 msgid "Inapplicable" msgstr "" #: lib/vcs/svn/__init__.py:145 msgid "Unknown" msgstr "Neznámé" #: lib/vcs/svn/__init__.py:146 msgid "Unchanged" msgstr "" #: lib/vcs/svn/__init__.py:147 msgid "Missing" msgstr "Chybějící" #: lib/vcs/svn/__init__.py:148 msgid "Obstructed" msgstr "" #: lib/vcs/svn/__init__.py:150 msgid "Merged" msgstr "Spojeno" #: lib/vcs/svn/__init__.py:151 msgid "Conflicted" msgstr "" rabbitvcs-0.18/po/de.po000066400000000000000000001003311362112712700147670ustar00rootroot00000000000000# German translations for PACKAGE package. # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Marcel Stimberg , 2009. # msgid "" msgstr "" "Project-Id-Version: neu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-04 14:35-0500\n" "PO-Revision-Date: 2009-03-19 09:59+0000\n" "Last-Translator: Steve Markgraf \n" "Language-Team: German <>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-09-24 13:44+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Basepath: ../\n" #: ui/branch.py:71 msgid "" "There have been modifications to your working copy. If you copy from the " "HEAD revision you will lose your changes." msgstr "" "Ihre Arbeitskopie wurde verändert. Wenn Sie von der HEAD-Revision kopieren, " "gehen diese Änderungen verloren." #: ui/branch.py:89 msgid "You must supply a destination path." msgstr "Sie müssen einen Zielpfad angeben." #: ui/branch.py:99 msgid "The from revision field is required." msgstr "Sie müssen die Ausgangsrevision angeben." #: ui/branch.py:108 msgid "Invalid revision information" msgstr "Ungültige Revisionsinformation" #: ui/branch.py:123 ui/glade/branch.glade.h:4 msgid "Branch/tag" msgstr "Zweig/Tag" #: ui/branch.py:124 msgid "Running Branch/tag Command..." msgstr "Erstelle Zweig/Tag..." #: ui/branch.py:126 msgid "Completed Branch/tag" msgstr "Zweig/Tag-Erstellung abgeschlossen" #: ui/updateto.py:70 msgid "Update To Revision" msgstr "Aktualisiere auf Revision" #: ui/updateto.py:71 ui/update.py:54 msgid "Updating..." msgstr "Aktualisiere..." #: ui/updateto.py:79 ui/update.py:57 msgid "Completed Update" msgstr "Aktualisierung abgeschlossen." #: ui/rename.py:59 msgid "The new name field is required" msgstr "Der neue Name muss angegeben werden" #: ui/rename.py:70 ui/glade/rename.glade.h:2 msgid "Rename" msgstr "Umbenennen" #: ui/rename.py:71 msgid "Running Rename Command..." msgstr "Benenne um..." #: ui/rename.py:78 msgid "Completed Rename" msgstr "Umbenennen abgeschlossen" #: ui/annotate.py:51 msgid "Cannot annotate a directory" msgstr "Kann kein Verzeichnis annotieren" #: ui/annotate.py:58 #, python-format msgid "Annotate - %s" msgstr "Annotiere - %s" #: ui/annotate.py:71 msgid "Line" msgstr "Zeile" #: ui/annotate.py:71 ui/log.py:80 ui/glade/switch.glade.h:5 #: ui/glade/merge.glade.h:17 ui/glade/checkout.glade.h:10 #: ui/glade/update.glade.h:6 msgid "Revision" msgstr "Revision" #: ui/annotate.py:71 ui/log.py:80 msgid "Author" msgstr "Autor" #: ui/annotate.py:72 ui/dialog.py:47 ui/log.py:81 msgid "Date" msgstr "Datum" #: ui/annotate.py:72 msgid "Text" msgstr "Text" #: ui/annotate.py:112 msgid "The from revision field must be an integer" msgstr "Die Ausgangsrevision muss eine ganze Zahl sein." #: ui/annotate.py:122 msgid "Generating Annotation..." msgstr "Erzeuge Annotationen..." #: ui/annotate.py:138 lib/vcs/svn/__init__.py:122 lib/vcs/svn/__init__.py:124 msgid "Completed" msgstr "Abgeschlossen" #: ui/settings.py:50 msgid "English" msgstr "englisch" #: ui/settings.py:156 ui/settings.py:165 msgid "Select a program" msgstr "Ein Programm auswählen" #: ui/settings.py:174 msgid "Are you sure you want to clear your repository paths?" msgstr "Wollen Sie wirklich die Projektarchivpfade löschen?" #: ui/settings.py:181 msgid "Repository paths cleared" msgstr "Projektarchivpfade gelöscht" #: ui/settings.py:185 msgid "Are you sure you want to clear your previous messages?" msgstr "Wollen Sie wirklich die früheren Nachrichten löschen?" #: ui/settings.py:192 msgid "Previous messages cleared" msgstr "Frühere Logmeldungen gelöscht" #: ui/settings.py:196 msgid "Are you sure you want to clear your authentication information?" msgstr "Wollen Sie wirklich Ihre Authentifizierungsinformationen löschen?" #: ui/settings.py:213 msgid "Authentication information cleared" msgstr "Authentifizierungsinformationen gelöscht" #: ui/cleanup.py:54 lib/extensions/nautilus/RabbitVCS.py:831 msgid "Cleanup" msgstr "Aufräumen" #: ui/cleanup.py:55 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Räume auf..." #: ui/cleanup.py:57 msgid "Completed Cleanup" msgstr "Aufräumen abgeschlossen" #: ui/relocate.py:76 msgid "The from and to url fields are both required." msgstr "Die Ursprungs- und Ziel-URL müssen angegeben werden." #: ui/relocate.py:86 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Zweig/Tag wechseln" #: ui/relocate.py:87 msgid "Running Relocate Command..." msgstr "Stelle URL um..." #: ui/relocate.py:94 msgid "Completed Relocate" msgstr "Umstellen der URL abgeschlossen" #: ui/add.py:64 ui/lock.py:66 ui/resolve.py:55 ui/action.py:66 ui/commit.py:73 #: ui/unlock.py:55 ui/log.py:89 ui/revert.py:55 msgid "Path" msgstr "Pfad" #: ui/add.py:64 ui/lock.py:66 ui/resolve.py:55 ui/commit.py:73 ui/unlock.py:55 #: ui/revert.py:55 msgid "Extension" msgstr "Erweiterung" #: ui/add.py:78 ui/lock.py:96 ui/commit.py:97 ui/unlock.py:70 ui/log.py:253 #: ui/glade/log.glade.h:6 msgid "Loading..." msgstr "Lade..." #: ui/add.py:81 ui/lock.py:99 ui/commit.py:100 ui/unlock.py:91 #, python-format msgid "Found %d item(s)" msgstr "%d Objekt(e) gefunden" #: ui/add.py:115 ui/commit.py:269 ui/glade/add.glade.h:1 #: lib/extensions/nautilus/RabbitVCS.py:638 msgid "Add" msgstr "Hinzufügen" #: ui/add.py:116 msgid "Running Add Command..." msgstr "Füge hinzu..." #: ui/add.py:118 msgid "Completed Add" msgstr "Hinzufügen abgeschlossen" #: ui/add.py:141 ui/lock.py:206 ui/commit.py:239 msgid "Open" msgstr "Öffnen" #: ui/add.py:150 ui/lock.py:216 ui/commit.py:249 msgid "Browse to" msgstr "Dursuchen" #: ui/add.py:159 ui/commit.py:259 ui/glade/properties.glade.h:2 #: lib/extensions/nautilus/RabbitVCS.py:735 msgid "Delete" msgstr "Löschen" #: ui/add.py:168 ui/commit.py:299 lib/extensions/nautilus/RabbitVCS.py:654 msgid "Add to ignore list" msgstr "Zur Liste der ignorierten Dateien hinzufügen" #: ui/import.py:41 #, python-format msgid "Import - %s" msgstr "Import - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Die Projektarchiv-URL muss angegeben werden." #: ui/import.py:80 ui/glade/import.glade.h:3 #: lib/extensions/nautilus/RabbitVCS.py:888 msgid "Import" msgstr "Import" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Importiere..." #: ui/import.py:89 msgid "Completed Import" msgstr "Import abgescholssen" #: ui/lock.py:67 lib/vcs/svn/__init__.py:132 msgid "Locked" msgstr "Gesperrt" #: ui/lock.py:90 ui/lock.py:107 msgid "Yes" msgstr "Ja" #: ui/lock.py:144 msgid "Get Lock" msgstr "Sperren" #: ui/lock.py:145 msgid "Running Lock Command..." msgstr "Sperre..." #: ui/lock.py:154 msgid "Completed Lock" msgstr "Sperren abgeschlossen" #: ui/lock.py:176 msgid "Remove Lock" msgstr "Sperre aufheben" #: ui/lock.py:186 ui/commit.py:229 lib/extensions/nautilus/RabbitVCS.py:597 msgid "View Diff" msgstr "Unterschiede anzeigen" #: ui/lock.py:196 ui/glade/switch.glade.h:6 ui/glade/branch.glade.h:10 #: ui/glade/merge.glade.h:18 ui/glade/checkout.glade.h:11 #: ui/glade/update.glade.h:7 msgid "Show log" msgstr "Log anzeigen" #: ui/export.py:40 #, python-format msgid "Export - %s" msgstr "Exportieren - %s" #: ui/export.py:58 ui/checkout.py:82 msgid "The repository URL and destination path are both required fields." msgstr "Die Projektarchiv-URL und der Zielpfad müssen angegeben werden." #: ui/export.py:79 lib/extensions/nautilus/RabbitVCS.py:856 msgid "Export" msgstr "Exportieren" #: ui/export.py:80 msgid "Running Export Command..." msgstr "Exportiere" #: ui/export.py:91 msgid "Completed Export" msgstr "Export abgeschlossen" #: ui/resolve.py:45 ui/resolve.py:76 #: lib/extensions/nautilus/RabbitVCS.py:767 msgid "Resolve" msgstr "Auflösen" #: ui/resolve.py:77 msgid "Running Resolve Command..." msgstr "Löse Konflikte auf..." #: ui/resolve.py:80 msgid "Completed Resolve" msgstr "Auflösen abgeschlossen" #: ui/action.py:66 ui/log.py:89 msgid "Action" msgstr "Aktion" #: ui/action.py:66 msgid "Mime Type" msgstr "MIME-Typ" #: ui/action.py:135 msgid "Empty Message" msgstr "Leere Logmeldung" #: ui/action.py:249 ui/log.py:309 msgid "Finished" msgstr "Abgeschlossen" #: ui/action.py:253 #, python-format msgid "%s - Finished" msgstr "%s - abgeschlossen" #: ui/commit.py:66 msgid "The given path is not a working copy" msgstr "Der angegebene Pfad ist keine Arbeitskopie" #: ui/commit.py:74 msgid "Text Status" msgstr "Textstatus" #: ui/commit.py:74 msgid "Property Status" msgstr "Eigenschaftenstatus" #: ui/commit.py:188 ui/glade/commit.glade.h:4 #: lib/extensions/nautilus/RabbitVCS.py:568 msgid "Commit" msgstr "Übernehmen" #: ui/commit.py:189 msgid "Running Commit Command..." msgstr "Übernehme ins Projektarchiv..." #: ui/commit.py:195 msgid "Completed Commit" msgstr "Übernehmen abgeschlossen" #: ui/commit.py:279 ui/revert.py:45 ui/revert.py:75 #: lib/extensions/nautilus/RabbitVCS.py:751 msgid "Revert" msgstr "Rückgängig machen" #: ui/commit.py:289 msgid "Restore" msgstr "Wiederherstellen" #: ui/dialog.py:47 ui/log.py:81 ui/glade/dialogs.glade.h:20 msgid "Message" msgstr "Logmeldung" #: ui/dialog.py:88 msgid "Select a Folder" msgstr "Ordner wählen" #: ui/dialog.py:117 ui/glade/log.glade.h:12 msgid "to" msgstr "bis" #: ui/dialog.py:210 msgid "Select a File" msgstr "Datei wählen" #: ui/dialog.py:229 ui/glade/dialogs.glade.h:10 msgid "Are you sure you want to continue?" msgstr "Wollen Sie wirklich fortfahren?" #: ui/dialog.py:257 msgid "the selected item(s)" msgstr "die ausgewählten Objekte" #: ui/switch.py:65 msgid "The repository location is a required field." msgstr "Der Ort des Projektarchivs muss angegeben werden." #: ui/switch.py:81 ui/glade/switch.glade.h:7 msgid "Switch" msgstr "Zweig/Tag wechseln" #: ui/switch.py:82 msgid "Running Switch Command..." msgstr "Wechsele Zweig/Tag..." #: ui/switch.py:90 msgid "Completed Switch" msgstr "Zweig/Tag gewechselt" #: ui/unlock.py:45 ui/unlock.py:109 msgid "Unlock" msgstr "Entsperren" #: ui/unlock.py:110 msgid "Running Unlock Command..." msgstr "Entsperre..." #: ui/unlock.py:113 msgid "Completed Unlock" msgstr "Entsperren abgeschlossen" #: ui/merge.py:81 msgid "Running Merge Test" msgstr "Zusammenführen testen" #: ui/merge.py:82 msgid "Completed Merge Test" msgstr "Zusammenfü" #: ui/merge.py:84 msgid "Running Merge Command" msgstr "Führe zusammen..." #: ui/merge.py:85 msgid "Completed Merge" msgstr "Zusammenführen abgeschlossen" #: ui/merge.py:93 msgid "Merge" msgstr "Zusammenführen" #: ui/checkout.py:52 #, python-format msgid "Checkout - %s" msgstr "Auschecken - %s" #: ui/checkout.py:100 ui/glade/checkout.glade.h:5 #: lib/extensions/nautilus/RabbitVCS.py:536 msgid "Checkout" msgstr "Auschecken" #: ui/checkout.py:101 msgid "Running Checkout Command..." msgstr "Checke aus..." #: ui/checkout.py:111 msgid "Completed Checkout" msgstr "Auschecken beendet" #: ui/log.py:63 #, python-format msgid "Log - %s" msgstr "Log - %s" #: ui/log.py:90 msgid "Copy From Path" msgstr "Kopiert von Pfad" #: ui/log.py:90 msgid "Copy From Revision" msgstr "Kopiert von Revision" #: ui/log.py:112 msgid "Cancelled" msgstr "Abgebrochen" #: ui/log.py:236 ui/log.py:237 ui/glade/log.glade.h:8 msgid "N/A" msgstr "n/v" #: ui/log.py:284 msgid "(no author)" msgstr "(kein Autor)" #: ui/log.py:313 msgid "Retrieving Log Information..." msgstr "Ermittle Logmeldungen..." #: ui/properties.py:53 #, python-format msgid "Properties - %s" msgstr "Eigenschaften - %s" #: ui/properties.py:61 msgid "Name" msgstr "Name" #: ui/properties.py:61 msgid "Value" msgstr "Wert" #: ui/revert.py:76 msgid "Running Revert Command..." msgstr "Mache rückgängig..." #: ui/revert.py:78 msgid "Completed Revert" msgstr "Rückgängigmachen abgeschlossen" #: ui/update.py:53 ui/glade/update.glade.h:8 #: lib/extensions/nautilus/RabbitVCS.py:552 msgid "Update" msgstr "Aktualisieren" #: ui/create.py:49 msgid "Repository successfully created" msgstr "Projektarchiv erfolgreich erstellt" #: ui/create.py:51 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Beim Erstellen des Projektarchivs ist ein Fehler aufgetreten. Stellen Sie " "sicher, dass der angegebene Ordner leer ist." #: ui/glade/switch.glade.h:1 ui/glade/checkout.glade.h:3 #: ui/glade/update.glade.h:1 msgid "Revision" msgstr "Revision" #: ui/glade/switch.glade.h:2 msgid "Switch Details" msgstr "Umstelldetails" #: ui/glade/switch.glade.h:3 ui/glade/branch.glade.h:8 #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Von:" #: ui/glade/switch.glade.h:4 ui/glade/merge.glade.h:10 #: ui/glade/checkout.glade.h:7 ui/glade/update.glade.h:3 msgid "HEAD" msgstr "HEAD" #: ui/glade/switch.glade.h:8 ui/glade/branch.glade.h:11 #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Auf:" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Nachrichten" #: ui/glade/commit.glade.h:1 ui/glade/branch.glade.h:1 msgid "Add Message" msgstr "Logmeldung hinzufügen" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to see diff)" msgstr "Geänderte Dateien (Doppelklick um Unterschiede anzuzeigen)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Übernehmen nach:" #: ui/glade/commit.glade.h:5 ui/glade/lock.glade.h:4 ui/glade/branch.glade.h:9 #: ui/glade/dialogs.glade.h:22 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Frühere Logmeldungen" #: ui/glade/commit.glade.h:6 ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 msgid "Select / Deselect all" msgstr "Alle aus-/abwählen" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Nicht versionierte Dateien anzeigen" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Zu sperrende Dateien" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Bitte beschreiben Sie, warum Sie diese Dateien sperren" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Dateien sperren" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Existierende Sperren brechen" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Eigenschaften für:" #: ui/glade/properties.glade.h:3 msgid "Edit..." msgstr "Bearbeiten..." #: ui/glade/properties.glade.h:4 msgid "New..." msgstr "Neu..." #: ui/glade/properties.glade.h:5 lib/extensions/nautilus/RabbitVCS.py:995 msgid "Properties" msgstr "Eigenschaften" #: ui/glade/properties.glade.h:6 msgid "URL/Path:" msgstr "URL/Pfad:" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Von Revision" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Bis Revision" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Annotieren" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Links" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Versionsinformationen" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:4 lib/extensions/nautilus/RabbitVCS.py:1059 msgid "About" msgstr "Über" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autoren:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Danksagungen:" #: ui/glade/rename.glade.h:1 msgid "New Name:" msgstr "Neuer Name:" #: ui/glade/branch.glade.h:2 msgid "Create copy from" msgstr "Kopie erstellen von" #: ui/glade/branch.glade.h:3 ui/glade/checkout.glade.h:2 #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Projektarchiv" #: ui/glade/branch.glade.h:5 msgid "Copy from HEAD" msgstr "Kopie von HEAD" #: ui/glade/branch.glade.h:6 msgid "Copy from revision" msgstr "Kopie von Revision" #: ui/glade/branch.glade.h:7 msgid "Copy from working copy" msgstr "Kopie von Arbeitskopie" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s)" msgstr "Betroffene Datei(en)" #: ui/glade/log.glade.h:3 ui/glade/dialogs.glade.h:3 msgid "Message" msgstr "Logmeldung" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revisionen" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limit:" #: ui/glade/log.glade.h:7 msgid "Log" msgstr "Log" #: ui/glade/log.glade.h:9 msgid "Refresh" msgstr "Aktualisieren" #: ui/glade/log.glade.h:10 msgid "Showing Revisions:" msgstr "Zeige Revisionen:" #: ui/glade/log.glade.h:11 msgid "Stop on copy" msgstr "Bei Kopie anhalten" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Quell-URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Von: (URL und zusammenzuführende Revision)" #: ui/glade/merge.glade.h:3 ui/glade/checkout.glade.h:1 msgid "Options" msgstr "Optionen" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Revisionsbereich" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Nach: (URL und zusammenzuführende Revision)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL von der zusammengeführt werden soll" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Arbeitskopie" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Wählen Sie diese Methode, wenn Sie Änderungen an einem Zweig vorgenommen " "haben und Ihre Änderungen mit einem anderen Zweig zusammenführen möchten." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Wählen Sie diese Methode, wenn Sie zwei verschiedene Zweige in Ihre " "Arbeitskopie zusammenführen möchten." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Abstammung ignorieren" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Zusammenführassistent" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Einen Revisionsbereich zusammenführen" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Zwei verschiedene Bäume zusammenführen" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Nur als zusammengeführt markieren" #: ui/glade/merge.glade.h:16 ui/glade/checkout.glade.h:9 #: ui/glade/update.glade.h:5 msgid "Recursive" msgstr "Rekursiv" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Zusammenführen testen" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Benutzen Sie den Log-Dialog, um die Revisionen zum Zusammenführen " "auszuwählen. Oder geben Sie die Revisionen per Hand an, durch Komma " "getrennt. Sie können einen Revisionsbereich mit dem Bindestrich angeben.\n" "\n" "Beispiel: 4-7, 9,11,15-HEAD\n" "\n" "Lassen Sie das Feld leer, um alle Revisionen zusammenzuführen." #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Authentifizierung" #: ui/glade/settings.glade.h:2 msgid "Log Messages" msgstr "Logmeldungen" #: ui/glade/settings.glade.h:3 msgid "Logging Options" msgstr "Logging-Optionen" #: ui/glade/settings.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:5 msgid "Program used to browse repositories" msgstr "Programm zum Durchsuchen von Projektarchiven" #: ui/glade/settings.glade.h:6 msgid "Program used to compare files" msgstr "Programm zum Dateivergleich" #: ui/glade/settings.glade.h:7 msgid "URL History" msgstr "URL-Historie" #: ui/glade/settings.glade.h:8 ui/glade/checkout.glade.h:4 msgid "Browse..." msgstr "Durchsuchen..." #: ui/glade/settings.glade.h:9 msgid "Clear your authentication information" msgstr "Ihre Anmeldeinformationen löschen" #: ui/glade/settings.glade.h:10 msgid "Enable emblems" msgstr "Embleme einschalten" #: ui/glade/settings.glade.h:11 msgid "Enable file attributes" msgstr "Dateiattribute einschalten" #: ui/glade/settings.glade.h:12 msgid "Enable recursive status checks" msgstr "Rekursive Statusüberprüfungen aktivieren" #: ui/glade/settings.glade.h:13 msgid "External Programs" msgstr "Externe Programme" #: ui/glade/settings.glade.h:14 msgid "General" msgstr "Allgemein" #: ui/glade/settings.glade.h:15 msgid "Language:" msgstr "Sprache:" #: ui/glade/settings.glade.h:16 msgid "Logging" msgstr "Logging" #: ui/glade/settings.glade.h:17 msgid "Minimum level to log" msgstr "Minimaler Loglevel" #: ui/glade/settings.glade.h:18 msgid "Number of URLs to remember" msgstr "Zahl der zu merkenden URLs" #: ui/glade/settings.glade.h:19 msgid "Number of messages to remember" msgstr "Zahl der zu merkenden Logmeldungen" #: ui/glade/settings.glade.h:20 msgid "Saved Data" msgstr "Gespeicherte Daten" #: ui/glade/settings.glade.h:21 lib/extensions/nautilus/RabbitVCS.py:1043 msgid "Settings" msgstr "Einstellungen" #: ui/glade/settings.glade.h:22 msgid "Show new version on the right side" msgstr "Neue Version auf der rechten Seite zeigen" #: ui/glade/settings.glade.h:23 msgid "Type:" msgstr "Typ:" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Aufräumen angefragt...\n" "\n" "Aufräumen der Arbeitskopie beginnen?" #: ui/glade/dialogs.glade.h:1 msgid "Certificate Details" msgstr "Zertifikatsdetails" #: ui/glade/dialogs.glade.h:2 msgid "Edit Property Details" msgstr "Eigenschaftsdetails bearbeiten" #: ui/glade/dialogs.glade.h:4 msgid "Please add your authentication details" msgstr "Bitte geben Sie Ihre Authentifizierungsinformationen an" #: ui/glade/dialogs.glade.h:5 msgid "Previous Messages" msgstr "Frühere Logmeldungen" #: ui/glade/dialogs.glade.h:7 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Wollen Sie wirklich %item% löschen?" #: ui/glade/dialogs.glade.h:8 msgid "Accept Forever" msgstr "Dauerhaft akzeptieren" #: ui/glade/dialogs.glade.h:9 msgid "Accept Once" msgstr "Einmal akzeptieren" #: ui/glade/dialogs.glade.h:11 msgid "Authentication" msgstr "Anmeldung" #: ui/glade/dialogs.glade.h:12 msgid "Check Certificate" msgstr "Zertifikat prüfen" #: ui/glade/dialogs.glade.h:13 msgid "Confirmation" msgstr "Bestätigung" #: ui/glade/dialogs.glade.h:14 msgid "Delete Confirmation" msgstr "Bestätigung zum Löschen" #: ui/glade/dialogs.glade.h:15 msgid "Deny" msgstr "Verweigern" #: ui/glade/dialogs.glade.h:16 msgid "Fingerprint:" msgstr "Fingerabdruck:" #: ui/glade/dialogs.glade.h:17 msgid "Host:" msgstr "Server:" #: ui/glade/dialogs.glade.h:18 msgid "Issuer:" msgstr "Aussteller:" #: ui/glade/dialogs.glade.h:19 msgid "Login:" msgstr "Benutzername:" #: ui/glade/dialogs.glade.h:21 msgid "Password:" msgstr "Passwort:" #: ui/glade/dialogs.glade.h:23 msgid "Property" msgstr "Eigenschaft" #: ui/glade/dialogs.glade.h:24 msgid "Property:" msgstr "Eigenschaft:" #: ui/glade/dialogs.glade.h:25 msgid "Realm:" msgstr "Bereich:" #: ui/glade/dialogs.glade.h:26 msgid "Save Authentication" msgstr "Anmeldeinformationen speichern" #: ui/glade/dialogs.glade.h:27 msgid "The item(s) will be sent to the trash can." msgstr "Das Objekt/Die Objekte werden in den Mülleimer verschoben." #: ui/glade/dialogs.glade.h:28 msgid "Valid:" msgstr "Gültig:" #: ui/glade/dialogs.glade.h:29 msgid "Value:" msgstr "Wert:" #: ui/glade/checkout.glade.h:6 msgid "Destination:" msgstr "Zielort:" #: ui/glade/checkout.glade.h:8 ui/glade/update.glade.h:4 msgid "Omit Externals" msgstr "Ignoriere Externe Links" #: ui/glade/checkout.glade.h:12 msgid "URL:" msgstr "URL:" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Import-Logmeldung" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Ignorierte Dateien einbeziehen" #: ui/glade/update.glade.h:2 msgid "Update Depth" msgstr "Aktualisierungstiefe" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Das Projektarchiv der Arbeitskopie ändern" #: lib/extensions/nautilus/RabbitVCS.py:362 msgid "Debug" msgstr "Debug" #: lib/extensions/nautilus/RabbitVCS.py:375 msgid "DBus" msgstr "DBus" #: lib/extensions/nautilus/RabbitVCS.py:388 msgid "Start/Restart Service" msgstr "Start/Restart Service" #: lib/extensions/nautilus/RabbitVCS.py:404 msgid "Exit Service" msgstr "Exit Service" #: lib/extensions/nautilus/RabbitVCS.py:422 msgid "Bugs" msgstr "Bugs" #: lib/extensions/nautilus/RabbitVCS.py:435 msgid "Test Asynchronicity" msgstr "Test Asynchronicity" #: lib/extensions/nautilus/RabbitVCS.py:453 msgid "Open Shell" msgstr "Open Shell" #: lib/extensions/nautilus/RabbitVCS.py:469 msgid "Refresh Status" msgstr "Refresh Status" #: lib/extensions/nautilus/RabbitVCS.py:486 msgid "Debug Revert" msgstr "Debug Revert" #: lib/extensions/nautilus/RabbitVCS.py:487 msgid "Reverts everything it sees" msgstr "Reverts everything it sees" #: lib/extensions/nautilus/RabbitVCS.py:502 msgid "Invalidate" msgstr "Ungültig machen" #: lib/extensions/nautilus/RabbitVCS.py:503 msgid "Force an invalidate_extension_info() call" msgstr "Einen Aufruf von invalidate_extension_info() forcieren" #: lib/extensions/nautilus/RabbitVCS.py:518 msgid "Add Emblem" msgstr "Emblem hinzufügen" #: lib/extensions/nautilus/RabbitVCS.py:519 msgid "Add an emblem" msgstr "Ein Emblem hinzufügen" #: lib/extensions/nautilus/RabbitVCS.py:537 msgid "Check out a working copy" msgstr "Eine Arbeitskopie auschecken" #: lib/extensions/nautilus/RabbitVCS.py:553 msgid "Update a working copy" msgstr "Eine Arbeitskopie aktualisieren" #: lib/extensions/nautilus/RabbitVCS.py:569 msgid "Commit modifications to the repository" msgstr "Änderungen in das Projektarchiv übertragen" #: lib/extensions/nautilus/RabbitVCS.py:584 msgid "RabbitVCS" msgstr "RabbitVCS" #: lib/extensions/nautilus/RabbitVCS.py:598 msgid "View the modifications made to a file" msgstr "Die an einer Datei vorgenommen Änderung ansehen" #: lib/extensions/nautilus/RabbitVCS.py:613 msgid "Show Log" msgstr "Log anzeigen" #: lib/extensions/nautilus/RabbitVCS.py:614 msgid "Show a file's log information" msgstr "Logmeldungen einer Datei zeigen" #: lib/extensions/nautilus/RabbitVCS.py:639 msgid "Schedule an item to be added to the repository" msgstr "Ein Objekt zum Hinzufügen zum Projektarchiv vormerken" #: lib/extensions/nautilus/RabbitVCS.py:663 msgid "Ignore an item" msgstr "Ein Objekt ignorieren" #: lib/extensions/nautilus/RabbitVCS.py:678 msgid "Ignore all files with this extension" msgstr "Alle Dateien mit dieser Erweiterung ignorieren" #: lib/extensions/nautilus/RabbitVCS.py:703 msgid "Update to revision..." msgstr "Aktualisieren auf..." #: lib/extensions/nautilus/RabbitVCS.py:704 msgid "Update a file to a specific revision" msgstr "Eine Datei auf eine bestimmte Revision aktualisieren" #: lib/extensions/nautilus/RabbitVCS.py:719 msgid "Rename..." msgstr "Umbenennen..." #: lib/extensions/nautilus/RabbitVCS.py:720 msgid "Schedule an item to be renamed on the repository" msgstr "Ein Objekt zum Umbenennen im Projektarchiv vormerken" #: lib/extensions/nautilus/RabbitVCS.py:736 msgid "Schedule an item to be deleted from the repository" msgstr "Ein Objekt zum Löschen aus dem Projektarchiv vomerken" #: lib/extensions/nautilus/RabbitVCS.py:752 msgid "Revert an item to its unmodified state" msgstr "Ein Objekt in seinen unveränderten Zustand rückversetzen" #: lib/extensions/nautilus/RabbitVCS.py:768 msgid "Mark a conflicted item as resolved" msgstr "Ein in Konflikt stehendes Objekt als gelöst markieren" #: lib/extensions/nautilus/RabbitVCS.py:783 msgid "Relocate..." msgstr "URL umstellen" #: lib/extensions/nautilus/RabbitVCS.py:784 msgid "Relocate your working copy" msgstr "URL des Projektarchivs umstellen" #: lib/extensions/nautilus/RabbitVCS.py:799 msgid "Get Lock..." msgstr "Sperren..." #: lib/extensions/nautilus/RabbitVCS.py:800 msgid "Locally lock items" msgstr "Objekte lokal sperren" #: lib/extensions/nautilus/RabbitVCS.py:815 msgid "Release Lock..." msgstr "Sperre aufheben..." #: lib/extensions/nautilus/RabbitVCS.py:816 msgid "Release lock on an item" msgstr "Sperre für Objekte aufheben" #: lib/extensions/nautilus/RabbitVCS.py:832 msgid "Clean up working copy" msgstr "Arbeitskopie aufräumen" #: lib/extensions/nautilus/RabbitVCS.py:857 msgid "Export a working copy or repository with no versioning information" msgstr "" "Eine Arbeitskopie oder ein Projektarchiv ohne Versionsinformationen " "exportieren" #: lib/extensions/nautilus/RabbitVCS.py:872 msgid "Create Repository here" msgstr "Projektarchiv hier erstellen" #: lib/extensions/nautilus/RabbitVCS.py:873 msgid "Create a repository in a folder" msgstr "Ein Projektarchiv in einem Ordner erstellen" #: lib/extensions/nautilus/RabbitVCS.py:889 msgid "Import an item into a repository" msgstr "Ein Objekt in ein Projektarchiv importieren" #: lib/extensions/nautilus/RabbitVCS.py:913 msgid "Branch/tag..." msgstr "Zweig/Tag..." #: lib/extensions/nautilus/RabbitVCS.py:914 msgid "Copy an item to another location in the repository" msgstr "Ein Objekt zu einem anderen Ort im Projektarchiv kopieren" #: lib/extensions/nautilus/RabbitVCS.py:929 msgid "Switch..." msgstr "Zweig/Tag wechseln..." #: lib/extensions/nautilus/RabbitVCS.py:930 msgid "Change the repository location of a working copy" msgstr "Den Ort des Projektarchivs für eine Arbeitskopie umstellen" #: lib/extensions/nautilus/RabbitVCS.py:945 msgid "Merge..." msgstr "Zusammenführen..." #: lib/extensions/nautilus/RabbitVCS.py:946 msgid "A wizard with steps for merging" msgstr "Ein Assistent zum Zusammenführen" #: lib/extensions/nautilus/RabbitVCS.py:970 msgid "Annotate..." msgstr "Annotieren" #: lib/extensions/nautilus/RabbitVCS.py:971 msgid "Annotate a file" msgstr "Autoren- und Revisionsinformationen zu einer Datei anzeigen" #: lib/extensions/nautilus/RabbitVCS.py:996 msgid "View the properties of an item" msgstr "Die Eigenschaften eines Objekts ansehen" #: lib/extensions/nautilus/RabbitVCS.py:1027 msgid "Help" msgstr "Hilfe" #: lib/extensions/nautilus/RabbitVCS.py:1028 msgid "View help" msgstr "Hilfe ansehen" #: lib/extensions/nautilus/RabbitVCS.py:1044 msgid "View or change RabbitVCS settings" msgstr "Einstellungen von RabbitVCS sehen oder bearbeiten" #: lib/extensions/nautilus/RabbitVCS.py:1060 msgid "About RabbitVCS" msgstr "Über RabbitVCS" #: lib/vcs/svn/__init__.py:111 lib/vcs/svn/__init__.py:120 #: lib/vcs/svn/__init__.py:127 msgid "Added" msgstr "Hinzugefügt" #: lib/vcs/svn/__init__.py:112 lib/vcs/svn/__init__.py:128 msgid "Copied" msgstr "Kopiert" #: lib/vcs/svn/__init__.py:113 lib/vcs/svn/__init__.py:119 msgid "Deleted" msgstr "Gelöscht" #: lib/vcs/svn/__init__.py:114 msgid "Restored" msgstr "Wiederhergestellt" #: lib/vcs/svn/__init__.py:115 msgid "Reverted" msgstr "Rückgängig gemacht" #: lib/vcs/svn/__init__.py:116 msgid "Failed Revert" msgstr "Rückgängig machen fehlgeschlagen" #: lib/vcs/svn/__init__.py:117 msgid "Resolved" msgstr "Aufgelöst" #: lib/vcs/svn/__init__.py:118 msgid "Skipped" msgstr "Übersprungen" #: lib/vcs/svn/__init__.py:121 msgid "Updated" msgstr "Aktualisiert" #: lib/vcs/svn/__init__.py:123 lib/vcs/svn/__init__.py:125 msgid "External" msgstr "Extern" #: lib/vcs/svn/__init__.py:126 msgid "Modified" msgstr "Geändert" #: lib/vcs/svn/__init__.py:129 msgid "Replaced" msgstr "Ersetzt" #: lib/vcs/svn/__init__.py:130 lib/vcs/svn/__init__.py:149 msgid "Changed" msgstr "Geändert" #: lib/vcs/svn/__init__.py:131 msgid "Annotated" msgstr "Annotiert" #: lib/vcs/svn/__init__.py:133 msgid "Unlocked" msgstr "Entsperrt" #: lib/vcs/svn/__init__.py:134 msgid "Failed Lock" msgstr "Sperren fehlgeschlagen" #: lib/vcs/svn/__init__.py:135 msgid "Failed Unlock" msgstr "Entsperren fehlgeschlagen" #: lib/vcs/svn/__init__.py:144 msgid "Inapplicable" msgstr "Nicht anwendbar" #: lib/vcs/svn/__init__.py:145 msgid "Unknown" msgstr "Unbekannt" #: lib/vcs/svn/__init__.py:146 msgid "Unchanged" msgstr "Unverändert" #: lib/vcs/svn/__init__.py:147 msgid "Missing" msgstr "Fehlend" #: lib/vcs/svn/__init__.py:148 msgid "Obstructed" msgstr "Verhindert" #: lib/vcs/svn/__init__.py:150 msgid "Merged" msgstr "Zusammengeführt" #: lib/vcs/svn/__init__.py:151 msgid "Conflicted" msgstr "Im Konflikt" rabbitvcs-0.18/po/es.po000066400000000000000000001375141362112712700150230ustar00rootroot00000000000000# Spanish translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-03-19 15:25+0000\n" "Last-Translator: Raúl Ricardo Amaya \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i segundo" msgstr[1] "%i segundos" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuto" msgstr[1] "%i minutos" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i hora" msgstr[1] "%i horas" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i día" msgstr[1] "%i días" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i semana" msgstr[1] "%i semanas" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mes" msgstr[1] "%i meses" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i año" msgstr[1] "%i años" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Depurar" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Errores" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Abrir terminal" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Actualizar estado" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Depurar reversión" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Revertir todo lo que se vea" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Invalidar" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Forzar a una llamada a invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Añadir emblema" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Añadir un emblema" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Comprobar..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Obtener una copia de trabajo" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Actualizar" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Actualizar una copia de trabajo" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Confirmar" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Confirmar modificaciones al repositorio" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Navegador de repositorio" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Navegar por un árbol de repositorio" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Comprobar si hay modificaciones..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Comprobar si hay modificaciones en el repositorio" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Menú de Diff..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Lista de opciones de comparación" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Ver diff con base" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Ver las modificaciones realizadas a un archivo" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Ver diff entre archivos/carpetas" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Ver las diferencias entre dos archivos" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Ver diff con la versión anterior" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Ver las modificaciones del archivo desde el último cambio" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Comparar con base" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" "Comparar con base usando la herramienta de comparación uno al lado del otro" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Comparar archivos/carpetas" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Comparar las diferencias entre los dos elementos" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Comparar con versión anterior" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" "Comparar con revisión anterior usando la herramienta de comparación uno al " "lado del otro" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Mostrar cambios..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Mostrar cambios entre rutas y revisiones" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Mostrar registro" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Mostrar información de registro de un archivo" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Añadir" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Gestionar elementos que se añadirán al repositorio" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Añadir a la lista de ignorados" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Actualizar a revisión..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Actualizar un archivo a una versión específica" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Renombrar..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Planificar que un elemento sea renombrado en el repositorio" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Eliminar" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Planificar que un elemento sea eliminado del repositorio" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Revertir" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Revertir un elemento a su estado no modificado" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Resolver" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Marcar un elemento conflictivo como resuelto" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Restaurar" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Restaurar un elemento que falta" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Reubicar..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Reubicar copia de trabajo" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Bloquear" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Elementos locales bloqueados" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Desblouear..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Desbloquear un elemento" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Limpiar" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Limpiar copia de trabajo" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exportar..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" "Exportar una copia de trabajo o repositorio sin información de versionado" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Crear aquí un repositorio" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Crear un repositorio en una carpeta" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importar" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importar un elemento en un repositorio" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Rama/etiqueta..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Copiar un elemento a otra ubicación en el repositorio" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Cambiar..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Cambiar la ubicación de un repositorio de una copia local" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Mezclar..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Un asistente con pasos para mezclar" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Anotar..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Anotar un archivo" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Crear parche..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "Crea un archivo diff unificado con todos los cambios que hizo" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Aplicar parche..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Aplica un archivo diff unificado a una copia funcional" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Propiedades" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Ver las propiedades de un elemento" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Ayuda" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Ver ayuda" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Preferencias" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Ver o cambiar las preferencias de RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Acerca de" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Sobre RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Abrir" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Abrir un archivo" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Navegar en" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Buscar archivo o carpeta" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Revertir propiedad" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Revertir esta propiedad a su estado original" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Revertir propiedad (recusivo)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Revertir esta propiedad a su estado original (recursivo)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Eliminar propiedad" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Eliminar esta propiedad" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Eliminar esta propiedad (recursivo)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Ignorar elementos por nombre de archivo" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Ignorar elementos por extensión de archivo" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Actualizando..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Actualización completada" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Actualizar a revisión" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Obtener rep." #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Obtención completada" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Ruta" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Extensión" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Cargando..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "%d elemento(s) encontrados" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Ejecutando orden de añadir..." #: ui/add.py:159 msgid "Completed Add" msgstr "La orden de añadir se ha completado" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revisión:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exportar - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "Se requiere la URL del repositorio y la ruta de destino." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exportar" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Ejecutando orden de exportar..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Exportación completada" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Aplicar parche" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Aplicar parche al directorio..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Aplicando archivo de parche..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Archivo de parche aplicado" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Fecha" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Mensaje" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importar - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Se necesita el campo de dirección del repositorio." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Ejecutando importación..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importación completada" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Renombrar" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nuevo nombre:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Se necesita el campo de nuevo nombre" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Ejecutando la orden de renombrar..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Renombrado completado" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Estado del texto" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Estado de propiedad" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Ejecutando orden de confirmación..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Confirmación competada" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Estado" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Ver diff uno al lado del otro" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Ejecutando prueba de mezcla" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Prueba de mezcla completada" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Ejecutando orden de mezclar" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Mezcla completada" #: ui/merge.py:102 msgid "Merge" msgstr "Mezclar" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Ha ocurrido un error en el complemento RabbitVCS de Nautilus. Contacte con " "el equipo de RabbitVCS con los detalles de error listados " "debajo:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Seleccione una carpeta" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "a" #: ui/dialog.py:261 msgid "Select a File" msgstr "Seleccione un archivo" #: ui/dialog.py:280 msgid "Save As..." msgstr "Guardar como…" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "¿Está seguro de que quiere continuar?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "el/los elemento(s) seleccionado(s)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Se ha añadido una carpeta al repositorio" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Ejecutando orden de reversión..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Reversión completada" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Se requieren los campos de origen y destino." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Relocalizar" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Ejecutando orden de relocalización" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Relocalización completada" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisión" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Ver diff unificado" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Comparar uno al lado del otro" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Ejecutando orden de resolver..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Resolución completada" #: ui/changes.py:49 msgid "More Actions..." msgstr "Más acciones..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Cambiar" #: ui/changes.py:279 msgid "Property Change" msgstr "Cambiar propiedad" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Sí" #: ui/changes.py:321 msgid "No" msgstr "No" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Abrir desde la primera revisión" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Abrir desde la segunda revisión" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "No se puede anotar un directorio" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Anotado - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Línea" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Texto" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "El campo revisión debe ser un entero" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Registro - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Acción" #: ui/log.py:338 msgid "Copy From Path" msgstr "Copiar desde la ruta" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Copiar desde la revisión" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Ver diff con la copia de trabajo" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Ver diff entre revisiones" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Comparar con copia de trabajo" #: ui/log.py:806 msgid "Compare revisions" msgstr "Comparar revisiones" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Mostrar cambios entre revisiones" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Editar autor..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Editar mensaje de registro..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Editar propiedades de la revisión..." #: ui/log.py:1047 msgid "Edit author" msgstr "Editar autor" #: ui/log.py:1059 msgid "Edit log message" msgstr "Editar mensaje de registro" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Desconocido" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Inglés" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Seleccionar un programa" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "¿Está seguro de que quiere borrar las rutas de su repositorio?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Rutas de repositorio borradas" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "¿Está seguro de que quiere limpiar sus mensajes anteriores?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Mensajes anteriores borrados" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "¿Está seguro de que quiere limpiar su información de autenticación?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Información de autenticación borrada" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "No se pudo obtener la lista de propiedades" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Debe proporcionar una ruta de destino." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Rama/etiqueta" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Ejecutando la orden de Rama/Etiqueta..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Rama/etiqueta completada" #: ui/lock.py:73 msgid "Locked" msgstr "Bloqueado" #: ui/lock.py:167 msgid "Get Lock" msgstr "Tomar cerrojo" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Ejecutando orden de cerrar..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Clausura completada" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "La ubicación del repositorio es un campo obligatorio." #: ui/switch.py:80 msgid "Switch" msgstr "Cambiar" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Ejecutando comando de cambio" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Cambio completo" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "Número" #: ui/widget.py:861 msgid "Working Copy" msgstr "Copia de trabajo" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Equipo:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Obtener repositorio - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Obteniendo repositorio..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nombre" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Crear parche" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "La ruta proporcionada no es una copia de trabajo" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Creando fichero parche" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Fichero parche creado" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Propiedades - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valor" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Ha ocurrido un problema al guardar sus propiedades." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Nota: los cambios en las propiedades se aplican instantáneamente. " "Puede revisar y deshacer los cambios usando el menú de contexto de cada " "elemento.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "¿Quiere eliminar las propiedades seleccionadas de todos los archivos y " "subdirectorios\n" "que estén por debajo de este directorio?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "El archivo no está bajo control de versiones." #: ui/property_editor.py:112 msgid "Reserved" msgstr "Reservado" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "No se puedo establecer un nuevo valor a esta propiedad." #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Tipo MIME" #: ui/action.py:338 msgid "Finished" msgstr "Finalizado" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Finalizado" #: ui/action.py:365 msgid "Log Message" msgstr "Mensaje de registro" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Abrir cerrojo" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Ejecutando orden de abrir cerrojo..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Apertura de cerrojo completada" #: ui/browser.py:89 msgid "Size" msgstr "Tamaño" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Crear carpeta..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Copiar a..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Copiar el URL al portapapeles" #: ui/browser.py:363 msgid "Move to..." msgstr "Mover a..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "¿Dónde quiere copiar la selección?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nueva ubicación:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "¿A dónde quiere mover la selección?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Limpiando..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Limpieza completada" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repositorio creado con éxito" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Ha habido un error al crear el repositorio. Asegúrese de que la carpeta dada " "está vacía." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Propiedades de:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Las propiedades seleccionadas serán aplicadas recursivamente." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Eliminar propiedades recursivamente" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Editar..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nuevo..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/ruta:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Cargar/actualizar" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Añadir mensaje" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Detalles de certificación" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Editar detalles de propiedad" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Nombre de carpeta" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Mensaje" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Por favor, añada sus detalles de autenticación" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Introduzca su archivo certificación SSL" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Mensajes anteriores" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "¿Está seguro de que quiere eliminar " "%item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "Error de RabbitVCS" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Aceptar siempre" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Aceptar una vez" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Aplicar propiedad recursivamente" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autenticación" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Comprobar certificado" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Confirmación" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Crear carpeta..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Eliminar confirmación" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Denegar" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Huella:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Emisor:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Usuario:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Contraseña:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Ruta:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Mensajes anteriores" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Propiedad" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Propiedad:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "Error de RabbitVCS" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Reino:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "Certificación de cliente SSL" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Guardar autenticación" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Cambio de texto" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "El/los elemento(s) se enviarán a la papelera de reciclaje." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Válido:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valor:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Enlaces" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Información de versión" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autores:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Agradecimientos:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" "Archivos afectados (pulse dos veces para comparar con la base)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tabla de revisiones" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Límite:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Registro" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Actualizar" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Mostrando revisiones:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Parar al copiar" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Petición de limpieza realizada...\n" "\n" "¿Empezar limpieza de copia local?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autenticación" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Mensajes de registro" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Opciones de registro" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Programa usado para comparar archivos" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Histórico de URLs" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Navegar..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Limpiar su información de autenticación" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Activar emblemas" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Activar atributos de archivo" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Activar comprobaciones recursivas de estado" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programas externos" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "General" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Idioma:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Registro" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Nivel mínimo de registro" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Número de URLs a recordar" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Número de mensajes a recordar" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Datos guardados" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Mostrar las herramientas de depuración de RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "El menú de depuración es usado para diagnosticar problemas en RabbitVCS" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tipo:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Archivos a cerrar" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" "Por favor, describa el motivo por el que está cerrando estos archivos" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Archivos cerrados" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Seleccionar/Deseleccionar todos" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Robar los cerrojos" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "De revisión" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "A revisión" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Anotar" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" "Archivos cambiados (pulse dos veces para comparar con el base)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Confirmar a:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Mostrar archivos no versionados" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Mensajes de notificación" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "URI remota:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Copia de trabajo:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Añadir nueva propiedad." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Cerrar este diálogo." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Editor de propiedades" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Actualizar lista de propiedades." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Cambiar el repositorio de su copia de trabajo" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Desde:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "A:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opciones" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revisión" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Omitir externos" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Recursivo" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importar mensaje" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repositorio" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Incluir archivos ignorados" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Desde URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Desde: (URL y revisión a mezclar)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Intervalo de revisión" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "A: (URL y revisión a mezclar)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL a la que mezclar" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Copia de trabajo" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Elija este método si ha hecho algunos cambios a la rama y desea mezclar sus " "cambios con otra rama." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Elija este método si desea mezclar dos ramas diferentes en su copia de " "trabajo." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorar ancestros" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Asistente de mezclado" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Mezclar un intervalo de revisiones" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Mezclar dos árboles diferentes" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Registrar sólo la mezcla" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Mostrar registro" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Comprobar mezcla" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Use el diálogo de registro para seleccionar las revisiones que desea " "mezclar. O escriba las revisiones manualmente, cada una separada por una " "coma. Puede especificar un intervalo de revisiones con un guión. \n" "\n" "Ejemplo: 4-7,9,11,15-HEAD\n" "\n" "Para mezclar todas las revisiones, deje el campo vacío." #~ msgid "Completed" #~ msgstr "Completado" #~ msgid "Switch Details" #~ msgstr "Cambiar detalles" #~ msgid "Create copy from" #~ msgstr "Crear copia de" #~ msgid "Program used to browse repositories" #~ msgstr "Programa usado para navegar en repositorios" #~ msgid "Show new version on the right side" #~ msgstr "Mostrar nueva versión a la derecha" #~ msgid "Destination:" #~ msgstr "Destino:" #~ msgid "Update Depth" #~ msgstr "Actualizar profundidad" #~ msgid "Deleted" #~ msgstr "Eliminado" #~ msgid "Copied" #~ msgstr "Copiado" #~ msgid "Added" #~ msgstr "Añadido" #~ msgid "Restored" #~ msgstr "Restaurado" #~ msgid "Reverted" #~ msgstr "Revertido" #~ msgid "External" #~ msgstr "Externo" #~ msgid "Failed Revert" #~ msgstr "Falló la reversión" #~ msgid "Resolved" #~ msgstr "Resuelto" #~ msgid "Skipped" #~ msgstr "Ignorado" #~ msgid "Updated" #~ msgstr "Actualizado" #~ msgid "Inapplicable" #~ msgstr "No aplicable" #~ msgid "Unchanged" #~ msgstr "Sin cambios" #~ msgid "Modified" #~ msgstr "Modificado" #~ msgid "Replaced" #~ msgstr "Reemplazado" #~ msgid "Changed" #~ msgstr "Cambiado" #~ msgid "Annotated" #~ msgstr "Anotado" #~ msgid "Unlocked" #~ msgstr "Abierto" #~ msgid "Conflicted" #~ msgstr "Con conflictos" #~ msgid "Merged" #~ msgstr "Mezclado" #~ msgid "Missing" #~ msgstr "Perdido" #~ msgid "Obstructed" #~ msgstr "Obstruido" #~ msgid "(no author)" #~ msgstr "(sin autor)" #~ msgid "Failed Unlock" #~ msgstr "Falló desbloqueo" #~ msgid "Failed Lock" #~ msgstr "Falló bloqueo" rabbitvcs-0.18/po/es_CL.po000066400000000000000000000774701362112712700154050ustar00rootroot00000000000000# Spanish translations for PACKAGE package # Traducciones al español para el paquete PACKAGE. # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Camilo Flores , 2009. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-04 14:35-0500\n" "PO-Revision-Date: 2009-04-01 00:36-0300\n" "Last-Translator: Camilo Flores \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" #: ui/branch.py:71 msgid "There have been modifications to your working copy. If you copy from the HEAD revision you will lose your changes." msgstr "Se han detectado cambios en tu copia local. Si actualizas desde la versión HEAD perderás los cambios." #: ui/branch.py:89 msgid "You must supply a destination path." msgstr "Debes ingresar una ruta de destino." #: ui/branch.py:99 msgid "The from revision field is required." msgstr "Es necesario el campo \"desde versión\"." #: ui/branch.py:108 msgid "Invalid revision information" msgstr "Información no válida sobre la versión." #: ui/branch.py:123 #: ui/glade/branch.glade.h:4 msgid "Branch/tag" msgstr "" #: ui/branch.py:124 msgid "Running Branch/tag Command..." msgstr "Ejecutando el comando Branch/tag" #: ui/branch.py:126 msgid "Completed Branch/tag" msgstr "Comando Branch/tag exitoso." #: ui/updateto.py:70 msgid "Update To Revision" msgstr "Actualizar según versión" #: ui/updateto.py:71 #: ui/update.py:54 msgid "Updating..." msgstr "Actualizando..." #: ui/updateto.py:79 #: ui/update.py:57 msgid "Completed Update" msgstr "Actualización exitosa." #: ui/rename.py:59 msgid "The new name field is required" msgstr "Es necesario el campo \"nuevo nombre\"" #: ui/rename.py:70 #: ui/glade/rename.glade.h:2 msgid "Rename" msgstr "Cambiar nombre" #: ui/rename.py:71 msgid "Running Rename Command..." msgstr "Ejecutando comando de cambio de nombre..." #: ui/rename.py:78 msgid "Completed Rename" msgstr "Cambio de nombre exitoso." #: ui/annotate.py:51 msgid "Cannot annotate a directory" msgstr "Imposible anotar el directorio" #: ui/annotate.py:58 #, python-format msgid "Annotate - %s" msgstr "Anotar - %s" #: ui/annotate.py:71 msgid "Line" msgstr "Línea" #: ui/annotate.py:71 #: ui/log.py:80 #: ui/glade/switch.glade.h:5 #: ui/glade/merge.glade.h:17 #: ui/glade/checkout.glade.h:10 #: ui/glade/update.glade.h:6 msgid "Revision" msgstr "Versión" #: ui/annotate.py:71 #: ui/log.py:80 msgid "Author" msgstr "Autor" #: ui/annotate.py:72 #: ui/dialog.py:47 #: ui/log.py:81 msgid "Date" msgstr "Fecha" #: ui/annotate.py:72 msgid "Text" msgstr "Texto" #: ui/annotate.py:112 msgid "The from revision field must be an integer" msgstr "El campo \"desde version\" debe ser un número entero" #: ui/annotate.py:122 msgid "Generating Annotation..." msgstr "Generando Anotación..." #: ui/annotate.py:138 #: lib/vcs/svn/__init__.py:122 #: lib/vcs/svn/__init__.py:124 msgid "Completed" msgstr "Completo." #: ui/settings.py:50 msgid "English" msgstr "Inglés" #: ui/settings.py:156 #: ui/settings.py:165 msgid "Select a program" msgstr "Elije el programa" #: ui/settings.py:174 msgid "Are you sure you want to clear your repository paths?" msgstr "¿Estás seguro de querer reestablecer las rutas de tu repositorio?" #: ui/settings.py:181 msgid "Repository paths cleared" msgstr "Rutas del repositorio reestablecidas" #: ui/settings.py:185 msgid "Are you sure you want to clear your previous messages?" msgstr "¿Estás seguro de querer eliminar tus mensajes previos?" #: ui/settings.py:192 msgid "Previous messages cleared" msgstr "Mensajes previos eliminados" #: ui/settings.py:196 msgid "Are you sure you want to clear your authentication information?" msgstr "¿Estas seguro de querer eliminar tu información de autenticación?" #: ui/settings.py:213 msgid "Authentication information cleared" msgstr "Información de autenticación eliminada" #: ui/cleanup.py:54 #: lib/extensions/nautilus/RabbitVCS.py:831 msgid "Cleanup" msgstr "Limpiar" #: ui/cleanup.py:55 #: ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Limpiando..." #: ui/cleanup.py:57 msgid "Completed Cleanup" msgstr "Limpieza Completa" #: ui/relocate.py:76 msgid "The from and to url fields are both required." msgstr "Son necesarios los campos \"desde\" y \"hasta\" la url" #: ui/relocate.py:86 #: ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Relocalizar" #: ui/relocate.py:87 msgid "Running Relocate Command..." msgstr "Ejecutando relocalización..." #: ui/relocate.py:94 msgid "Completed Relocate" msgstr "Relocalización Completa" #: ui/add.py:64 #: ui/lock.py:66 #: ui/resolve.py:55 #: ui/action.py:66 #: ui/commit.py:73 #: ui/unlock.py:55 #: ui/log.py:89 #: ui/revert.py:55 msgid "Path" msgstr "Ruta" #: ui/add.py:64 #: ui/lock.py:66 #: ui/resolve.py:55 #: ui/commit.py:73 #: ui/unlock.py:55 #: ui/revert.py:55 msgid "Extension" msgstr "Extensión" #: ui/add.py:78 #: ui/lock.py:96 #: ui/commit.py:97 #: ui/unlock.py:70 #: ui/log.py:253 #: ui/glade/log.glade.h:6 msgid "Loading..." msgstr "Cargando..." #: ui/add.py:81 #: ui/lock.py:99 #: ui/commit.py:100 #: ui/unlock.py:91 #, python-format msgid "Found %d item(s)" msgstr "Encontrado %d elemento(s)" #: ui/add.py:115 #: ui/commit.py:269 #: ui/glade/add.glade.h:1 #: lib/extensions/nautilus/RabbitVCS.py:638 msgid "Add" msgstr "Añadir" #: ui/add.py:116 msgid "Running Add Command..." msgstr "Añadiendo..." #: ui/add.py:118 msgid "Completed Add" msgstr "Añadir Completado" #: ui/add.py:141 #: ui/lock.py:206 #: ui/commit.py:239 msgid "Open" msgstr "Abrir" #: ui/add.py:150 #: ui/lock.py:216 #: ui/commit.py:249 msgid "Browse to" msgstr "Navegar hacia" #: ui/add.py:159 #: ui/commit.py:259 #: ui/glade/properties.glade.h:2 #: lib/extensions/nautilus/RabbitVCS.py:735 msgid "Delete" msgstr "Eliminar" #: ui/add.py:168 #: ui/commit.py:299 #: lib/extensions/nautilus/RabbitVCS.py:654 msgid "Add to ignore list" msgstr "Añadir a lista de ignorados" #: ui/import.py:41 #, python-format msgid "Import - %s" msgstr "Importar - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Es necesario el campo de la URL del repositorio." #: ui/import.py:80 #: ui/glade/import.glade.h:3 #: lib/extensions/nautilus/RabbitVCS.py:888 msgid "Import" msgstr "Importar" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Importando..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importar Completado" #: ui/lock.py:67 #: lib/vcs/svn/__init__.py:132 msgid "Locked" msgstr "Bloqueado" #: ui/lock.py:90 #: ui/lock.py:107 msgid "Yes" msgstr "Sí" #: ui/lock.py:144 msgid "Get Lock" msgstr "Bloquear" #: ui/lock.py:145 msgid "Running Lock Command..." msgstr "Bloqueando..." #: ui/lock.py:154 msgid "Completed Lock" msgstr "Bloqueo Completado" #: ui/lock.py:176 msgid "Remove Lock" msgstr "Levantar Bloqueo" #: ui/lock.py:186 #: ui/commit.py:229 #: lib/extensions/nautilus/RabbitVCS.py:597 msgid "View Diff" msgstr "Ver Diferencias" #: ui/lock.py:196 #: ui/glade/switch.glade.h:6 #: ui/glade/branch.glade.h:10 #: ui/glade/merge.glade.h:18 #: ui/glade/checkout.glade.h:11 #: ui/glade/update.glade.h:7 msgid "Show log" msgstr "Mostrar historial" #: ui/export.py:40 #, python-format msgid "Export - %s" msgstr "Exportar - %s" #: ui/export.py:58 #: ui/checkout.py:82 msgid "The repository URL and destination path are both required fields." msgstr "Se necesita el campo de la URL del repositorio y la ruta de destino." #: ui/export.py:79 #: lib/extensions/nautilus/RabbitVCS.py:856 msgid "Export" msgstr "Exportar" #: ui/export.py:80 msgid "Running Export Command..." msgstr "Exportando..." #: ui/export.py:91 msgid "Completed Export" msgstr "Exportar Completado" #: ui/resolve.py:45 #: ui/resolve.py:76 #: lib/extensions/nautilus/RabbitVCS.py:767 msgid "Resolve" msgstr "Resolver" #: ui/resolve.py:77 msgid "Running Resolve Command..." msgstr "Resolviendo..." #: ui/resolve.py:80 msgid "Completed Resolve" msgstr "Resolver Completado" #: ui/action.py:66 #: ui/log.py:89 msgid "Action" msgstr "Acción" #: ui/action.py:66 msgid "Mime Type" msgstr "Tipo MIME" #: ui/action.py:135 msgid "Empty Message" msgstr "Mensaje vacío" #: ui/action.py:249 #: ui/log.py:309 msgid "Finished" msgstr "Finalizado" #: ui/action.py:253 #, python-format msgid "%s - Finished" msgstr "%s - Finalizado" #: ui/commit.py:66 msgid "The given path is not a working copy" msgstr "La ruta proporcionada no corresponde a una copia de trabajo" #: ui/commit.py:74 msgid "Text Status" msgstr "Estado del Texto" #: ui/commit.py:74 msgid "Property Status" msgstr "Estado de la Propiedad" #: ui/commit.py:188 #: ui/glade/commit.glade.h:4 #: lib/extensions/nautilus/RabbitVCS.py:568 msgid "Commit" msgstr "Enviar cambios" #: ui/commit.py:189 msgid "Running Commit Command..." msgstr "Enviando cambios..." #: ui/commit.py:195 msgid "Completed Commit" msgstr "Envío de cambios completado" #: ui/commit.py:279 #: ui/revert.py:45 #: ui/revert.py:75 #: lib/extensions/nautilus/RabbitVCS.py:751 msgid "Revert" msgstr "Revertir modificaciones" #: ui/commit.py:289 msgid "Restore" msgstr "Restaurar" #: ui/dialog.py:47 #: ui/log.py:81 #: ui/glade/dialogs.glade.h:20 msgid "Message" msgstr "Mensaje" #: ui/dialog.py:88 msgid "Select a Folder" msgstr "Selecciona una carpeta" #: ui/dialog.py:117 #: ui/glade/log.glade.h:12 msgid "to" msgstr "hacia" #: ui/dialog.py:210 msgid "Select a File" msgstr "Selecciona un archivo" #: ui/dialog.py:229 #: ui/glade/dialogs.glade.h:10 msgid "Are you sure you want to continue?" msgstr "¿Estás seguro de querer continuar?" #: ui/dialog.py:257 msgid "the selected item(s)" msgstr "los elementos seleccionados" #: ui/switch.py:65 msgid "The repository location is a required field." msgstr "Es necesario el campo de la ubicación del repositorio." #: ui/switch.py:81 #: ui/glade/switch.glade.h:7 msgid "Switch" msgstr "" #: ui/switch.py:82 msgid "Running Switch Command..." msgstr "Ejecutando Switch" #: ui/switch.py:90 msgid "Completed Switch" msgstr "Switch Completado" #: ui/unlock.py:45 #: ui/unlock.py:109 msgid "Unlock" msgstr "Desbloquear" #: ui/unlock.py:110 msgid "Running Unlock Command..." msgstr "Desbloqueando..." #: ui/unlock.py:113 msgid "Completed Unlock" msgstr "Desbloqueo Completo" #: ui/merge.py:81 msgid "Running Merge Test" msgstr "Ejecutando " #: ui/merge.py:82 msgid "Completed Merge Test" msgstr "Prueba de factibilidad de fusión completado" #: ui/merge.py:84 msgid "Running Merge Command" msgstr "Fusionando..." #: ui/merge.py:85 msgid "Completed Merge" msgstr "Fusión completa" #: ui/merge.py:93 msgid "Merge" msgstr "Fusionar" #: ui/checkout.py:52 #, python-format msgid "Checkout - %s" msgstr "Descargar repositorio - %s" #: ui/checkout.py:100 #: ui/glade/checkout.glade.h:5 #: lib/extensions/nautilus/RabbitVCS.py:536 msgid "Checkout" msgstr "Descargar repositorio" #: ui/checkout.py:101 msgid "Running Checkout Command..." msgstr "Descargando repositorio..." #: ui/checkout.py:111 msgid "Completed Checkout" msgstr "Descarga de repositorio completa" #: ui/log.py:63 #, python-format msgid "Log - %s" msgstr "Bitácora - %s" #: ui/log.py:90 msgid "Copy From Path" msgstr "Copiar desde ruta" #: ui/log.py:90 msgid "Copy From Revision" msgstr "Copiar desde versión" #: ui/log.py:112 msgid "Cancelled" msgstr "Cancelado" #: ui/log.py:236 #: ui/log.py:237 #: ui/glade/log.glade.h:8 msgid "N/A" msgstr "N/D" #: ui/log.py:284 msgid "(no author)" msgstr "(sin autor)" #: ui/log.py:313 msgid "Retrieving Log Information..." msgstr "Recuperando información de la bitácora" #: ui/properties.py:53 #, python-format msgid "Properties - %s" msgstr "Propiedades - %s" #: ui/properties.py:61 msgid "Name" msgstr "Nombre" #: ui/properties.py:61 msgid "Value" msgstr "Valor" #: ui/revert.py:76 msgid "Running Revert Command..." msgstr "Revirtiendo cambios..." #: ui/revert.py:78 msgid "Completed Revert" msgstr "Reversión de cambios completada" #: ui/update.py:53 #: ui/glade/update.glade.h:8 #: lib/extensions/nautilus/RabbitVCS.py:552 msgid "Update" msgstr "Actualizar" #: ui/create.py:49 msgid "Repository successfully created" msgstr "Repositorio creado exitosamente" #: ui/create.py:51 msgid "There was an error creating the repository. Make sure the given folder is empty." msgstr "Hubo un error al crear el repositorio. Asegúrate de que la carpeta especificada esté vacía." #: ui/glade/switch.glade.h:1 #: ui/glade/checkout.glade.h:3 #: ui/glade/update.glade.h:1 msgid "Revision" msgstr "Versión" #: ui/glade/switch.glade.h:2 msgid "Switch Details" msgstr "Detalles del Switch" #: ui/glade/switch.glade.h:3 #: ui/glade/branch.glade.h:8 #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Desde:" #: ui/glade/switch.glade.h:4 #: ui/glade/merge.glade.h:10 #: ui/glade/checkout.glade.h:7 #: ui/glade/update.glade.h:3 msgid "HEAD" msgstr "" #: ui/glade/switch.glade.h:8 #: ui/glade/branch.glade.h:11 #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Hasta:" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Mensajes de notificación" #: ui/glade/commit.glade.h:1 #: ui/glade/branch.glade.h:1 msgid "Add Message" msgstr "Agregar Mensaje" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to see diff)" msgstr "Archivos Modificados (doble click para comparar diferencias)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Enviar hacia:" #: ui/glade/commit.glade.h:5 #: ui/glade/lock.glade.h:4 #: ui/glade/branch.glade.h:9 #: ui/glade/dialogs.glade.h:22 #: ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Mensajes anteriores" #: ui/glade/commit.glade.h:6 #: ui/glade/lock.glade.h:5 #: ui/glade/add.glade.h:2 msgid "Select / Deselect all" msgstr "Seleccionar / Descartar todos" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Mostrar archivos fuera del control de versiones" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Archivos a bloquear" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Por favor describe por qué estás bloqueando estos archivos" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Bloquear Archivos" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Romper los bloqueos" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Propiedades para:" #: ui/glade/properties.glade.h:3 msgid "Edit..." msgstr "Editar..." #: ui/glade/properties.glade.h:4 msgid "New..." msgstr "Nuevo..." #: ui/glade/properties.glade.h:5 #: lib/extensions/nautilus/RabbitVCS.py:995 msgid "Properties" msgstr "Propiedades" #: ui/glade/properties.glade.h:6 msgid "URL/Path:" msgstr "URL/Ruta:" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Desde la versión" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Hasta la versión" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Anotar" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Información de la versión" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:4 #: lib/extensions/nautilus/RabbitVCS.py:1059 msgid "About" msgstr "Acerca de" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autores:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Agradecimientos:" #: ui/glade/rename.glade.h:1 msgid "New Name:" msgstr "Nuevo nombre:" #: ui/glade/branch.glade.h:2 msgid "Create copy from" msgstr "Crear copia desde" #: ui/glade/branch.glade.h:3 #: ui/glade/checkout.glade.h:2 #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repositorio" #: ui/glade/branch.glade.h:5 msgid "Copy from HEAD" msgstr "Copiar desde versión HEAD" #: ui/glade/branch.glade.h:6 msgid "Copy from revision" msgstr "Copiar desde la versión" #: ui/glade/branch.glade.h:7 msgid "Copy from working copy" msgstr "Copiar desde la copia de trabajo" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s)" msgstr "Archivos afectados" #: ui/glade/log.glade.h:3 #: ui/glade/dialogs.glade.h:3 msgid "Message" msgstr "Mensaje" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tabla de versiones" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Límite:" #: ui/glade/log.glade.h:7 msgid "Log" msgstr "Bitácora" #: ui/glade/log.glade.h:9 msgid "Refresh" msgstr "Refrescar" #: ui/glade/log.glade.h:10 msgid "Showing Revisions:" msgstr "Mostrar versiones:" #: ui/glade/log.glade.h:11 msgid "Stop on copy" msgstr "Detenerse en la copia" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Desde la URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Desde: (URL y versión a fusionar)" #: ui/glade/merge.glade.h:3 #: ui/glade/checkout.glade.h:1 msgid "Options" msgstr "Opciones" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Rango de versiones" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Desde: (URL y versión a fusionar)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL desde la cual fusionar" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Copia de trabajo" #: ui/glade/merge.glade.h:8 msgid "Choose this method if you have made some changes to a branch and wish to merge your changes with another branch." msgstr "Escoge este método si has hecho cambios a un branch y deseas fusionar tus cambios con otro branch" #: ui/glade/merge.glade.h:9 msgid "Choose this method if you wish to merge two different branches into your working copy." msgstr "Escoge este método si deseas fusionar dos branch diferentes en tu copia de trabajo" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorar antecesores" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Asistente de Fusión" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Fusionar un rango de versiones" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Fusionar dos árboles diferentes" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Registrar sólo la fusión" #: ui/glade/merge.glade.h:16 #: ui/glade/checkout.glade.h:9 #: ui/glade/update.glade.h:5 msgid "Recursive" msgstr "Recursivamente" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Comprobar factibilidad de fusión" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autenticación" #: ui/glade/settings.glade.h:2 msgid "Log Messages" msgstr "Mensajes de la bitácora" #: ui/glade/settings.glade.h:3 msgid "Logging Options" msgstr "Opciones de la bitácora" #: ui/glade/settings.glade.h:4 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Program used to browse repositories" msgstr "Programa a usar para navegar en los repositorios" #: ui/glade/settings.glade.h:6 msgid "Program used to compare files" msgstr "Programa a usar para comparar archivos" #: ui/glade/settings.glade.h:7 msgid "URL History" msgstr "Historia de la URL" #: ui/glade/settings.glade.h:8 #: ui/glade/checkout.glade.h:4 msgid "Browse..." msgstr "Navegar..." #: ui/glade/settings.glade.h:9 msgid "Clear your authentication information" msgstr "Eliminar tu información de autenticación" #: ui/glade/settings.glade.h:10 msgid "Enable emblems" msgstr "Activar emblemas" #: ui/glade/settings.glade.h:11 msgid "Enable file attributes" msgstr "Activar atributos de archivo" #: ui/glade/settings.glade.h:12 msgid "Enable recursive status checks" msgstr "Activar comprobación de estado recursiva" #: ui/glade/settings.glade.h:13 msgid "External Programs" msgstr "Programas Externos" #: ui/glade/settings.glade.h:14 msgid "General" msgstr "General" #: ui/glade/settings.glade.h:15 msgid "Language:" msgstr "Idioma:" #: ui/glade/settings.glade.h:16 msgid "Logging" msgstr "Bitácora" #: ui/glade/settings.glade.h:17 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:18 msgid "Number of URLs to remember" msgstr "Cantidad de URLs a recordar" #: ui/glade/settings.glade.h:19 msgid "Number of messages to remember" msgstr "Cantidad de mensajes a recordar" #: ui/glade/settings.glade.h:20 msgid "Saved Data" msgstr "Información guardada" #: ui/glade/settings.glade.h:21 #: lib/extensions/nautilus/RabbitVCS.py:1043 msgid "Settings" msgstr "Configuración" #: ui/glade/settings.glade.h:22 msgid "Show new version on the right side" msgstr "Mostrar la nueva versión al lado derecho" #: ui/glade/settings.glade.h:23 msgid "Type:" msgstr "Tipo:" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Limpieza Solicitada...\n" "\n" "¿Deseas comenzar la limpieza de tu copia de trabajo?" #: ui/glade/dialogs.glade.h:1 msgid "Certificate Details" msgstr "Detalles del Certificado" #: ui/glade/dialogs.glade.h:2 msgid "Edit Property Details" msgstr "Edita los detalles de la propiedad" #: ui/glade/dialogs.glade.h:4 msgid "Please add your authentication details" msgstr "Por favor agrega tus detalles de autenticación" #: ui/glade/dialogs.glade.h:5 msgid "Previous Messages" msgstr "Mensajes anteriores" #: ui/glade/dialogs.glade.h:7 msgid "Are you sure you want to delete %item%?" msgstr "¿Estás seguro de eliminar %item%?" #: ui/glade/dialogs.glade.h:8 msgid "Accept Forever" msgstr "Aceptar permanentemente" #: ui/glade/dialogs.glade.h:9 msgid "Accept Once" msgstr "Aceptar por ahora" #: ui/glade/dialogs.glade.h:11 msgid "Authentication" msgstr "Autenticación" #: ui/glade/dialogs.glade.h:12 msgid "Check Certificate" msgstr "Comprobar certificado" #: ui/glade/dialogs.glade.h:13 msgid "Confirmation" msgstr "Confirmación" #: ui/glade/dialogs.glade.h:14 msgid "Delete Confirmation" msgstr "Eliminar confirmación" #: ui/glade/dialogs.glade.h:15 msgid "Deny" msgstr "Denegar" #: ui/glade/dialogs.glade.h:16 msgid "Fingerprint:" msgstr "Huella digital:" #: ui/glade/dialogs.glade.h:17 msgid "Host:" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Issuer:" msgstr "Reportado por:" #: ui/glade/dialogs.glade.h:19 msgid "Login:" msgstr "Nombre de usuario:" #: ui/glade/dialogs.glade.h:21 msgid "Password:" msgstr "Contraseña:" #: ui/glade/dialogs.glade.h:23 msgid "Property" msgstr "Propiedad" #: ui/glade/dialogs.glade.h:24 msgid "Property:" msgstr "Propiedad:" #: ui/glade/dialogs.glade.h:25 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Save Authentication" msgstr "Guardar autenticación" #: ui/glade/dialogs.glade.h:27 msgid "The item(s) will be sent to the trash can." msgstr "Los elementos serán enviados a la Papelera" #: ui/glade/dialogs.glade.h:28 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Value:" msgstr "Valor:" #: ui/glade/checkout.glade.h:6 msgid "Destination:" msgstr "Destino:" #: ui/glade/checkout.glade.h:8 #: ui/glade/update.glade.h:4 msgid "Omit Externals" msgstr "Omitir los Externos" #: ui/glade/checkout.glade.h:12 msgid "URL:" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importar mensaje" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Incluir archivos ignorados" #: ui/glade/update.glade.h:2 msgid "Update Depth" msgstr "Profundidad de la actualización" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Cambiar el repositorio de tu copia de trabajo" #: lib/extensions/nautilus/RabbitVCS.py:362 msgid "Debug" msgstr "Depurar" #: lib/extensions/nautilus/RabbitVCS.py:375 msgid "DBus" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:388 msgid "Start/Restart Service" msgstr "Iniciar/Detener Servicio" #: lib/extensions/nautilus/RabbitVCS.py:404 msgid "Exit Service" msgstr "Terminar Servicio" #: lib/extensions/nautilus/RabbitVCS.py:422 msgid "Bugs" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:435 msgid "Test Asynchronicity" msgstr "Probar Asincronicidad" #: lib/extensions/nautilus/RabbitVCS.py:453 msgid "Open Shell" msgstr "Abrir Consola" #: lib/extensions/nautilus/RabbitVCS.py:469 msgid "Refresh Status" msgstr "Refrescar Estado" #: lib/extensions/nautilus/RabbitVCS.py:486 msgid "Debug Revert" msgstr "Revertir Debug" #: lib/extensions/nautilus/RabbitVCS.py:487 msgid "Reverts everything it sees" msgstr "Revertir todo lo que vea" #: lib/extensions/nautilus/RabbitVCS.py:502 msgid "Invalidate" msgstr "Invalidar" #: lib/extensions/nautilus/RabbitVCS.py:503 msgid "Force an invalidate_extension_info() call" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:518 msgid "Add Emblem" msgstr "Agregar Emblema" #: lib/extensions/nautilus/RabbitVCS.py:519 msgid "Add an emblem" msgstr "Agregar un emblema" #: lib/extensions/nautilus/RabbitVCS.py:537 msgid "Check out a working copy" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:553 msgid "Update a working copy" msgstr "Actualizar copia de trabajo" #: lib/extensions/nautilus/RabbitVCS.py:569 msgid "Commit modifications to the repository" msgstr "Enviar modificaciones al repositorio" #: lib/extensions/nautilus/RabbitVCS.py:584 msgid "RabbitVCS" msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:598 msgid "View the modifications made to a file" msgstr "Ver las modificaciones hechas a un archivo" #: lib/extensions/nautilus/RabbitVCS.py:613 msgid "Show Log" msgstr "Mostrar bitácora" #: lib/extensions/nautilus/RabbitVCS.py:614 msgid "Show a file's log information" msgstr "Mostrar la información de la bitácora de un archivo" #: lib/extensions/nautilus/RabbitVCS.py:639 msgid "Schedule an item to be added to the repository" msgstr "Agendar un elemento a añadir al repositorio" #: lib/extensions/nautilus/RabbitVCS.py:663 msgid "Ignore an item" msgstr "Ignorar un elemento" #: lib/extensions/nautilus/RabbitVCS.py:678 msgid "Ignore all files with this extension" msgstr "Ignorar todos los archivos con esta extension" #: lib/extensions/nautilus/RabbitVCS.py:703 msgid "Update to revision..." msgstr "Actualizar según la versión..." #: lib/extensions/nautilus/RabbitVCS.py:704 msgid "Update a file to a specific revision" msgstr "Actualizar un archivo según una versión particular" #: lib/extensions/nautilus/RabbitVCS.py:719 msgid "Rename..." msgstr "Cambiar nombre..." #: lib/extensions/nautilus/RabbitVCS.py:720 msgid "Schedule an item to be renamed on the repository" msgstr "Agendar cambio de nombre de un elemento del repositorio" #: lib/extensions/nautilus/RabbitVCS.py:736 msgid "Schedule an item to be deleted from the repository" msgstr "Agendar eliminación de un elemento del repositorio" #: lib/extensions/nautilus/RabbitVCS.py:752 msgid "Revert an item to its unmodified state" msgstr "Revertir un elemento a un estado sin modificaciones" #: lib/extensions/nautilus/RabbitVCS.py:768 msgid "Mark a conflicted item as resolved" msgstr "Marcar un elemento en conflicto como resuelto" #: lib/extensions/nautilus/RabbitVCS.py:783 msgid "Relocate..." msgstr "Reubicar..." #: lib/extensions/nautilus/RabbitVCS.py:784 msgid "Relocate your working copy" msgstr "Reubicar tu copia de trabajo" #: lib/extensions/nautilus/RabbitVCS.py:799 msgid "Get Lock..." msgstr "Solicitar bloqueo..." #: lib/extensions/nautilus/RabbitVCS.py:800 msgid "Locally lock items" msgstr "Bloquear elementos localmente" #: lib/extensions/nautilus/RabbitVCS.py:815 msgid "Release Lock..." msgstr "Levantar bloqueo..." #: lib/extensions/nautilus/RabbitVCS.py:816 msgid "Release lock on an item" msgstr "Levantar bloqueo de un elemento" #: lib/extensions/nautilus/RabbitVCS.py:832 msgid "Clean up working copy" msgstr "Limpiar tu copia de trabajo" #: lib/extensions/nautilus/RabbitVCS.py:857 msgid "Export a working copy or repository with no versioning information" msgstr "Exportar tu copia de trabajo o repositorio sin información de versionamiento" #: lib/extensions/nautilus/RabbitVCS.py:872 msgid "Create Repository here" msgstr "Crear un repositorio aquí" #: lib/extensions/nautilus/RabbitVCS.py:873 msgid "Create a repository in a folder" msgstr "Crear un repositorio en una carpeta" #: lib/extensions/nautilus/RabbitVCS.py:889 msgid "Import an item into a repository" msgstr "Importar elemento a un repositorio" #: lib/extensions/nautilus/RabbitVCS.py:913 msgid "Branch/tag..." msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:914 msgid "Copy an item to another location in the repository" msgstr "Copiar un elemento a otra ubicación dentro del repositorio" #: lib/extensions/nautilus/RabbitVCS.py:929 msgid "Switch..." msgstr "" #: lib/extensions/nautilus/RabbitVCS.py:930 msgid "Change the repository location of a working copy" msgstr "Cambiar la ubicación del repositorio de una copia de trabajo" #: lib/extensions/nautilus/RabbitVCS.py:945 msgid "Merge..." msgstr "Fusionar..." #: lib/extensions/nautilus/RabbitVCS.py:946 msgid "A wizard with steps for merging" msgstr "Un asistente con pasos para fusionar" #: lib/extensions/nautilus/RabbitVCS.py:970 msgid "Annotate..." msgstr "Anotar..." #: lib/extensions/nautilus/RabbitVCS.py:971 msgid "Annotate a file" msgstr "Anotar un archivo" #: lib/extensions/nautilus/RabbitVCS.py:996 msgid "View the properties of an item" msgstr "Ver propiedades de un elemento" #: lib/extensions/nautilus/RabbitVCS.py:1027 msgid "Help" msgstr "Ayuda" #: lib/extensions/nautilus/RabbitVCS.py:1028 msgid "View help" msgstr "Ver ayuda" #: lib/extensions/nautilus/RabbitVCS.py:1044 msgid "View or change RabbitVCS settings" msgstr "Ver o modificar la configuración de RabbitVCS" #: lib/extensions/nautilus/RabbitVCS.py:1060 msgid "About RabbitVCS" msgstr "Acerca de RabbitVCS" #: lib/vcs/svn/__init__.py:111 #: lib/vcs/svn/__init__.py:120 #: lib/vcs/svn/__init__.py:127 msgid "Added" msgstr "Añadido" #: lib/vcs/svn/__init__.py:112 #: lib/vcs/svn/__init__.py:128 msgid "Copied" msgstr "Copiado" #: lib/vcs/svn/__init__.py:113 #: lib/vcs/svn/__init__.py:119 msgid "Deleted" msgstr "Eliminado" #: lib/vcs/svn/__init__.py:114 msgid "Restored" msgstr "Restaurado" #: lib/vcs/svn/__init__.py:115 msgid "Reverted" msgstr "Revertido" #: lib/vcs/svn/__init__.py:116 msgid "Failed Revert" msgstr "Revertir fallido" #: lib/vcs/svn/__init__.py:117 msgid "Resolved" msgstr "Resuelto" #: lib/vcs/svn/__init__.py:118 msgid "Skipped" msgstr "Omitido" #: lib/vcs/svn/__init__.py:121 msgid "Updated" msgstr "Actualizado" #: lib/vcs/svn/__init__.py:123 #: lib/vcs/svn/__init__.py:125 msgid "External" msgstr "Externo" #: lib/vcs/svn/__init__.py:126 msgid "Modified" msgstr "Modificado" #: lib/vcs/svn/__init__.py:129 msgid "Replaced" msgstr "Reemplazado" #: lib/vcs/svn/__init__.py:130 #: lib/vcs/svn/__init__.py:149 msgid "Changed" msgstr "Cambiado" #: lib/vcs/svn/__init__.py:131 msgid "Annotated" msgstr "Anotado" #: lib/vcs/svn/__init__.py:133 msgid "Unlocked" msgstr "Desbloqueado" #: lib/vcs/svn/__init__.py:134 msgid "Failed Lock" msgstr "Bloqueo fallido" #: lib/vcs/svn/__init__.py:135 msgid "Failed Unlock" msgstr "Desbloqueo fallido" #: lib/vcs/svn/__init__.py:144 msgid "Inapplicable" msgstr "No aplicable" #: lib/vcs/svn/__init__.py:145 msgid "Unknown" msgstr "Desconocido" #: lib/vcs/svn/__init__.py:146 msgid "Unchanged" msgstr "Sin cambios" #: lib/vcs/svn/__init__.py:147 msgid "Missing" msgstr "Faltante" #: lib/vcs/svn/__init__.py:148 msgid "Obstructed" msgstr "Obstruído" #: lib/vcs/svn/__init__.py:150 msgid "Merged" msgstr "Fusionado" #: lib/vcs/svn/__init__.py:151 msgid "Conflicted" msgstr "En conflicto" rabbitvcs-0.18/po/fa.po000066400000000000000000001111331362112712700147670ustar00rootroot00000000000000# Persian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-03-14 15:29+0000\n" "Last-Translator: Hamed Nemati \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "مشخصه‌ها" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "در حال به‌هنگام‌سازی..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "به‌هنگام‌سازی کامل شد" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "مسیر" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "در حال بارگذاری..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/add.py:157 msgid "Running Add Command..." msgstr "" #: ui/add.py:159 msgid "Completed Add" msgstr "" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "تغییر نام" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "نام جدید:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "" #: ui/dialog.py:261 msgid "Select a File" msgstr "" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "انگلیسی" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "نوع مایم" #: ui/action.py:338 msgid "Finished" msgstr "" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - پایان یافته" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "اندازه‌" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "ویرایش..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "جدید..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "اطلاعات نسخه" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "مخزن" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/fi.po000066400000000000000000001112161362112712700150010ustar00rootroot00000000000000# Finnish translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-09-02 20:14+0000\n" "Last-Translator: Jani Välimaa \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Toimita" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Lisää" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "" #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Polku" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Laajennus" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Ladataan..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/add.py:157 msgid "Running Add Command..." msgstr "" #: ui/add.py:159 msgid "Completed Add" msgstr "" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Vie" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Viesti" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Nimeä uudelleen" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Uusi nimi:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Valitse hakemisto" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "kohde" #: ui/dialog.py:261 msgid "Select a File" msgstr "Valitse tiedosto" #: ui/dialog.py:280 msgid "Save As..." msgstr "Tallenna nimellä..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisio" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Tekijä" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "Lisää toimintoja..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Muuta" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Kyllä" #: ui/changes.py:321 msgid "No" msgstr "Ei" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Rivi" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Teksti" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Toiminto" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Luo paikkatiedosto" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Luodaan paikkatiedosto..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Luotiin paikkatiedosto" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "MIME-tyyppi" #: ui/action.py:338 msgid "Finished" msgstr "Valmis" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "Koko" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Luo hakemisto..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Kopioi..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Kopioi URL leikepöydälle" #: ui/browser.py:363 msgid "Move to..." msgstr "Siirrä ..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Uusi sijainti:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "" #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/fr.po000066400000000000000000001674061362112712700150260ustar00rootroot00000000000000# French translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # Patrick Monnerat <.>, 2019. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-06-14 01:58+0200\n" "PO-Revision-Date: 2019-06-14 13:08+0200\n" "Last-Translator: Patrick Monnerat <.>\n" "Language-Team: French <.>\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Gtranslator 3.30.1\n" #: util/helper.py:73 msgid "%I:%M%P" msgstr "%H:%M" #: util/helper.py:74 msgid "%a %I:%M%p" msgstr "%a %H:%M" #: util/helper.py:75 msgid "%b %d" msgstr "%d %b" #: util/helper.py:76 msgid "%b %d %Y" msgstr "%d %b %Y" #: util/helper.py:215 #| msgid "(no author)" msgid "(no date)" msgstr "(pas de date)" #: util/helper.py:219 msgid "just now" msgstr "À l'instant" #: util/helper.py:221 #, python-format msgid "%d minute(s) ago" msgstr "Il y a %d minute(s)" #: util/helper.py:833 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i seconde" msgstr[1] "%i secondes" #: util/helper.py:836 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minute" msgstr[1] "%i minutes" #: util/helper.py:839 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i heure" msgstr[1] "%i heures" #: util/helper.py:842 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i jour" msgstr[1] "%i jours" #: util/helper.py:845 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i semaine" msgstr[1] "%i semaines" #: util/helper.py:848 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mois" msgstr[1] "%i mois" #: util/helper.py:851 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i année" msgstr[1] "%i années" #: util/contextmenuitems.py:321 msgid "Debug" msgstr "Debug" #: util/contextmenuitems.py:326 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:331 msgid "Open Shell" msgstr "Ouvrir un terminal" #: util/contextmenuitems.py:337 msgid "Refresh Status" msgstr "Rafraîchir le statut" #: util/contextmenuitems.py:342 msgid "Debug Revert" msgstr "Debug inversé" #: util/contextmenuitems.py:343 msgid "Reverts everything it sees" msgstr "Rétablir tout ce qu'on voit" #: util/contextmenuitems.py:349 msgid "Invalidate" msgstr "Invalider" #: util/contextmenuitems.py:350 msgid "Force an invalidate_extension_info() call" msgstr "Forcer un appel à invalidate_extension_info()" #: util/contextmenuitems.py:356 msgid "Add Emblem" msgstr "Ajouter un emblème" #: util/contextmenuitems.py:357 msgid "Add an emblem" msgstr "Ajouter un emblème" #: util/contextmenuitems.py:363 msgid "Checkout..." msgstr "Mettre à jour" #: util/contextmenuitems.py:364 msgid "Check out a working copy" msgstr "Obtenir une copie de travail" #: util/contextmenuitems.py:369 ui/xml/update.xml.h:1 ui/update.py:55 #: ui/update.py:104 msgid "Update" msgstr "Mettre à jour" #: util/contextmenuitems.py:370 msgid "Update a working copy" msgstr "Mettre à jour une copie de travail" #: util/contextmenuitems.py:375 ui/xml/commit.xml.h:1 ui/commit.py:318 #: ui/commit.py:386 msgid "Commit" msgstr "Envoyer" #: util/contextmenuitems.py:376 msgid "Commit modifications to the repository" msgstr "Envoyer les modifications au dépôt." #: util/contextmenuitems.py:381 ui/xml/property_page.xml.h:5 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:386 msgid "RabbitVCS SVN" msgstr "RabbitVCS SVN" #: util/contextmenuitems.py:391 msgid "RabbitVCS Git" msgstr "RabbitVCS Git" #: util/contextmenuitems.py:396 #| msgid "RabbitVCS" msgid "RabbitVCS Hg" msgstr "RabbitVCS Hg" #: util/contextmenuitems.py:401 ui/xml/browser.xml.h:1 msgid "Repository Browser" msgstr "Navigateur de dépôt" #: util/contextmenuitems.py:402 msgid "Browse a repository tree" msgstr "Navigateur de référentiel" #: util/contextmenuitems.py:407 msgid "Check for Modifications..." msgstr "Vérifier les modifications ..." #: util/contextmenuitems.py:408 msgid "Check for modifications made to the repository" msgstr "Vérifiez les modifications apportées au référentiel" #: util/contextmenuitems.py:413 msgid "Diff Menu..." msgstr "Menu des différences..." #: util/contextmenuitems.py:414 msgid "List of comparison options" msgstr "Liste des options de comparaisons" #: util/contextmenuitems.py:419 msgid "View diff against base" msgstr "Voir les différences avec la base" #: util/contextmenuitems.py:420 msgid "View the modifications made to a file" msgstr "Voir les modifications faites sur un fichier" #: util/contextmenuitems.py:425 msgid "View diff between files/folders" msgstr "Voir les différences entre les fichiers/dossiers" #: util/contextmenuitems.py:426 msgid "View the differences between two files" msgstr "Voir les différences entre deux fichiers" #: util/contextmenuitems.py:431 ui/log.py:988 msgid "View diff against previous revision" msgstr "Voir les différences par rapport à la révision précédente" #: util/contextmenuitems.py:432 msgid "View the modifications made to a file since its last change" msgstr "" "Voir les modifications apportées à un fichier depuis le dernier changement" #: util/contextmenuitems.py:437 msgid "Compare with base" msgstr "Comparer avec la base" #: util/contextmenuitems.py:438 msgid "Compare with base using side-by-side comparison tool" msgstr "Comparer côte à côte avec la base" #: util/contextmenuitems.py:443 msgid "Compare files/folders" msgstr "Comparer des fichiers ou dossiers" #: util/contextmenuitems.py:444 msgid "Compare the differences between two items" msgstr "Comparer les différences entre deux fichiers" #: util/contextmenuitems.py:449 ui/log.py:1003 msgid "Compare with previous revision" msgstr "Comparer avec la révision précédente" #: util/contextmenuitems.py:450 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "Comparer côte à côte avec la révision précédente" #: util/contextmenuitems.py:455 msgid "Show Changes..." msgstr "Voir le journal" #: util/contextmenuitems.py:456 msgid "Show changes between paths and revisions" msgstr "Afficher les changements entre les chemins et les révisions" #: util/contextmenuitems.py:461 msgid "Show Log" msgstr "Consulter le journal" #: util/contextmenuitems.py:462 msgid "Show a file's log information" msgstr "Montrer le journal d'information d'un fichier" #: util/contextmenuitems.py:467 ui/xml/add.xml.h:1 ui/widget.py:1431 #: ui/add.py:215 ui/add.py:240 ui/tags.py:284 msgid "Add" msgstr "Ajouter" #: util/contextmenuitems.py:468 msgid "Schedule items to be added to the repository" msgstr "Ajouter au dépôt" #: util/contextmenuitems.py:473 msgid "Add to ignore list" msgstr "Ajouter à la liste de fichier ignorés" #: util/contextmenuitems.py:478 msgid "Update to revision..." msgstr "Mettre à jour à la révision..." #: util/contextmenuitems.py:479 msgid "Update a file to a specific revision" msgstr "Mettre à jour un fichier vers une version précise" #: util/contextmenuitems.py:484 msgid "Rename..." msgstr "Renommer..." #: util/contextmenuitems.py:485 msgid "Schedule an item to be renamed on the repository" msgstr "Planifier le renommage d'un objet dans le dépôt" #: util/contextmenuitems.py:490 msgid "Delete" msgstr "Supprimer" #: util/contextmenuitems.py:491 msgid "Schedule an item to be deleted from the repository" msgstr "Planifier la suppression d'un objet dans le dépôt" #: util/contextmenuitems.py:496 ui/revert.py:175 ui/revert.py:201 #: ui/xml/revert.xml.h:1 msgid "Revert" msgstr "Rétablir" #: util/contextmenuitems.py:497 msgid "Revert an item to its unmodified state" msgstr "Rétablir un objet à son état non modifié" #: util/contextmenuitems.py:502 ui/markresolved.py:45 ui/markresolved.py:76 #| msgid "Resolved" msgid "Mark as Resolved" msgstr "Marquer comme Résolu" #: util/contextmenuitems.py:503 msgid "Mark a conflicted item as resolved" msgstr "Marquer un conflit sur un objet comme résolu" #: util/contextmenuitems.py:508 msgid "Restore" msgstr "Restaurer" #: util/contextmenuitems.py:509 msgid "Restore a missing item" msgstr "Restaurer un fichier manquant" #: util/contextmenuitems.py:513 msgid "Relocate..." msgstr "Relocalisation…" #: util/contextmenuitems.py:514 msgid "Relocate your working copy" msgstr "Relocaliser votre copie de travail" #: util/contextmenuitems.py:519 msgid "Get Lock..." msgstr "Obtenir le verrou..." #: util/contextmenuitems.py:520 msgid "Locally lock items" msgstr "Verrouiller localement un objet" #: util/contextmenuitems.py:525 msgid "Release Lock..." msgstr "Relâcher le verrou..." #: util/contextmenuitems.py:526 msgid "Release lock on an item" msgstr "Relâcher le verrou d'un objet" #: util/contextmenuitems.py:531 ui/cleanup.py:56 msgid "Cleanup" msgstr "Nettoyer" #: util/contextmenuitems.py:532 msgid "Clean up working copy" msgstr "Nettoyer votre copie de travail" #: util/contextmenuitems.py:537 msgid "Export..." msgstr "Exporter" #: util/contextmenuitems.py:538 msgid "Export a working copy or repository with no versioning information" msgstr "" "Exporter une copie de travail ou un dépôt sans information de versionnage" #: util/contextmenuitems.py:551 msgid "Create Repository here" msgstr "Créer un dépôt ici" #: util/contextmenuitems.py:552 msgid "Create a repository in a folder" msgstr "Créer un dépôt dans un dossier" #: util/contextmenuitems.py:557 ui/xml/import.xml.h:1 ui/import.py:75 msgid "Import" msgstr "Importer" #: util/contextmenuitems.py:558 msgid "Import an item into a repository" msgstr "Importer un objet dans un dépôt" #: util/contextmenuitems.py:567 msgid "Branch/tag..." msgstr "Branch/tag..." #: util/contextmenuitems.py:568 msgid "Copy an item to another location in the repository" msgstr "Copier un objet vers un autre emplacement dans le dépôt" #: util/contextmenuitems.py:573 msgid "Switch..." msgstr "Basculement..." #: util/contextmenuitems.py:574 msgid "Change the repository location of a working copy" msgstr "Changer l'emplacement d'une copie de travail" #: util/contextmenuitems.py:579 msgid "Merge..." msgstr "Fusion..." #: util/contextmenuitems.py:580 msgid "A wizard with steps for merging" msgstr "Un assistant de fusion en étapes" #: util/contextmenuitems.py:585 msgid "Annotate..." msgstr "Annoter..." #: util/contextmenuitems.py:586 msgid "Annotate a file" msgstr "Annoter un fichier" #: util/contextmenuitems.py:591 msgid "Create Patch..." msgstr "Créer un correctif..." #: util/contextmenuitems.py:592 msgid "Creates a unified diff file with all changes you made" msgstr "" "Crée un fichier diff unifié avec tous les changements que vous avez fait" #: util/contextmenuitems.py:597 msgid "Apply Patch..." msgstr "Appliquer le correctif..." #: util/contextmenuitems.py:598 msgid "Applies a unified diff file to the working copy" msgstr "Applique un fichier diff unifié de la copie de travail" #: util/contextmenuitems.py:603 ui/xml/properties.xml.h:1 msgid "Properties" msgstr "Propriétés" #: util/contextmenuitems.py:604 msgid "View the properties of an item" msgstr "Consulter les propriétés d'un objet" #: util/contextmenuitems.py:609 msgid "Help" msgstr "Aide" #: util/contextmenuitems.py:610 msgid "View help" msgstr "Consulter l'aide" #: util/contextmenuitems.py:615 ui/xml/settings.xml.h:1 msgid "Settings" msgstr "Paramètres" #: util/contextmenuitems.py:616 msgid "View or change RabbitVCS settings" msgstr "Consulter ou modifier les paramètres de RabbitVCS" #: util/contextmenuitems.py:621 msgid "About" msgstr "À propos" #: util/contextmenuitems.py:622 msgid "About RabbitVCS" msgstr "À propos de RabbitVCS" #: util/contextmenuitems.py:627 msgid "Open" msgstr "Ouvrir" #: util/contextmenuitems.py:628 msgid "Open a file" msgstr "Ouvrir un fichier" #: util/contextmenuitems.py:636 msgid "Browse to" msgstr "Parcourir dans" #: util/contextmenuitems.py:637 msgid "Browse to a file or folder" msgstr "Naviguez vers un fichier ou un dossier" #: util/contextmenuitems.py:642 msgid "Revert property" msgstr "Rétablir la propriété" #: util/contextmenuitems.py:644 msgid "Revert this property to its original state" msgstr "Rétablir la propriété à son état d'origine" #: util/contextmenuitems.py:648 msgid "Revert property (recursive)" msgstr "Rétablir la propriété (récursive)" #: util/contextmenuitems.py:650 msgid "Revert this property to its original state (recursive)" msgstr "Rétablir récursivement la propriété à son état d'origine" #: util/contextmenuitems.py:655 msgid "Delete property" msgstr "Supprimer la propriété" #: util/contextmenuitems.py:657 msgid "Delete this property" msgstr "Supprimer cette propriété" #: util/contextmenuitems.py:661 msgid "Delete property (recursive)" msgstr "Supprimer récursivement la propriété" #: util/contextmenuitems.py:663 msgid "Delete this property (recursive)" msgstr "Supprimer récursivement cette propriété" #: util/contextmenuitems.py:668 msgid "Edit details" msgstr "Modifier les détails" #: util/contextmenuitems.py:670 msgid "Show and edit property details" msgstr "Afficher et modifier les détails de la propriété" #: util/contextmenuitems.py:674 ui/create.py:68 msgid "Initialize Repository" msgstr "Initialiser le dépot" #: util/contextmenuitems.py:679 ui/clone.py:47 ui/clone.py:68 msgid "Clone" msgstr "Dupliquer" #: util/contextmenuitems.py:684 msgid "Fetch/Pull" msgstr "Fetch/Pull" #: util/contextmenuitems.py:689 msgid "Push" msgstr "Push" #: util/contextmenuitems.py:694 msgid "Branches" msgstr "Branches" #: util/contextmenuitems.py:699 msgid "Tags" msgstr "Tags" #: util/contextmenuitems.py:704 msgid "Remotes" msgstr "Distants" #: util/contextmenuitems.py:709 ui/clean.py:66 ui/xml/clean.xml.h:1 #| msgid "Cleanup" msgid "Clean" msgstr "Nettoyer" #: util/contextmenuitems.py:713 ui/reset.py:96 ui/xml/reset.xml.h:1 #| msgid "Reserved" msgid "Reset" msgstr "Reset" #: util/contextmenuitems.py:718 ui/stage.py:48 ui/stage.py:73 msgid "Stage" msgstr "Stage" #: util/contextmenuitems.py:723 ui/unstage.py:48 ui/unstage.py:73 msgid "Unstage" msgstr "Unstage" #: util/contextmenuitems.py:728 msgid "Edit conflicts" msgstr "Modifier les confits" #: util/contextmenuitems.py:754 msgid "Ignore item by filename" msgstr "Ignorer un élément par nom de fichier" #: util/contextmenuitems.py:773 msgid "Ignore item by file extension" msgstr "Ignorer un élément par extension du nom" #: ui/revert.py:74 ui/markresolved.py:50 ui/lock.py:71 ui/log.py:392 #: ui/log.py:678 ui/action.py:120 ui/browser.py:91 ui/add.py:77 ui/commit.py:85 msgid "Path" msgstr "Répertoire" #: ui/revert.py:74 ui/markresolved.py:51 ui/lock.py:71 ui/add.py:78 #: ui/commit.py:85 msgid "Extension" msgstr "Extension" #: ui/revert.py:106 ui/lock.py:111 ui/unlock.py:67 ui/add.py:111 #: ui/commit.py:131 msgid "Loading..." msgstr "Chargement..." #: ui/revert.py:110 ui/lock.py:114 ui/unlock.py:90 ui/add.py:133 #, python-format msgid "Found %d item(s)" msgstr "%d objet(s) trouvé(s)" #: ui/revert.py:176 ui/revert.py:202 msgid "Running Revert Command..." msgstr "Exécution de la commande de rétablissement..." #: ui/revert.py:178 ui/revert.py:204 msgid "Completed Revert" msgstr "Rétablissement terminé" #: ui/remotes.py:61 msgid "Remote Repository Manager" msgstr "Gestionnaire de Dépôts à distance" #: ui/remotes.py:62 msgid "Remote Repositories" msgstr "Dépôts distants" #: ui/remotes.py:68 ui/properties.py:64 ui/property_editor.py:114 msgid "Name" msgstr "Nom" #: ui/remotes.py:68 msgid "Host" msgstr "Hôte" #: ui/remotes.py:123 ui/tags.py:238 #, python-format msgid "Are you sure you want to delete %s?" msgstr "Êtes-vous sûr de vouloir supprimer %s ?" #: ui/unstage.py:74 #| msgid "Running Rename Command..." msgid "Running Unstage Command..." msgstr "Exécution de la commande Unstage..." #: ui/unstage.py:77 #| msgid "Completed Update" msgid "Completed Unstage" msgstr "Unstage terminé" #: ui/reset.py:97 #| msgid "Running Revert Command..." msgid "Running Reset Command..." msgstr "Exécution de la commande Reset..." #: ui/reset.py:104 #| msgid "Completed Revert" msgid "Completed Reset" msgstr "Reset terminé" #: ui/markresolved.py:51 ui/commit.py:86 msgid "Text Status" msgstr "État du texte" #: ui/markresolved.py:51 ui/commit.py:86 msgid "Property Status" msgstr "État de la propriété" #: ui/markresolved.py:77 #| msgid "Running Resolve Command..." msgid "Running Resolved Command..." msgstr "Exécution de la commande Resolved..." #: ui/markresolved.py:80 #| msgid "Completed Resolve" msgid "Completed Mark as Resolved" msgstr "Résolution terminée" #: ui/ignore.py:101 msgid "Ignore file:" msgstr "Ignorer les fichiers :" #: ui/stage.py:74 #| msgid "Running Rename Command..." msgid "Running Stage Command..." msgstr "Exécution de la commande Stage..." #: ui/stage.py:77 #| msgid "Completed Merge" msgid "Completed Stage" msgstr "Stage terminé" #: ui/lock.py:72 msgid "Locked" msgstr "Verrouillé" #: ui/lock.py:121 msgid "Yes" msgstr "Oui" #: ui/lock.py:156 msgid "Get Lock" msgstr "Obtenir le verrou" #: ui/lock.py:157 msgid "Running Lock Command..." msgstr "Exécution de la commande de verrouillage..." #: ui/lock.py:166 msgid "Completed Lock" msgstr "Verrouillage terminé" #: ui/log.py:51 ui/log.py:375 ui/log.py:662 ui/xml/merge.xml.h:19 #: ui/widget.py:1038 ui/browser.py:91 ui/annotate.py:131 ui/annotate.py:235 msgid "Revision" msgstr "Révision" #: ui/log.py:52 ui/log.py:376 ui/log.py:663 ui/browser.py:91 ui/dialog.py:51 #: ui/annotate.py:132 ui/annotate.py:236 msgid "Date" msgstr "Date" #: ui/log.py:53 ui/log.py:375 ui/log.py:662 ui/browser.py:91 ui/annotate.py:131 #: ui/annotate.py:235 msgid "Author" msgstr "Auteur" #: ui/log.py:126 #, python-format msgid "Log - %s" msgstr "Journal - %s" #: ui/log.py:307 ui/log.py:308 ui/xml/log.xml.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:376 ui/log.py:663 ui/xml/dialogs/message_box.xml.h:1 #: ui/dialog.py:51 msgid "Message" msgstr "Message" #: ui/log.py:377 msgid "Color" msgstr "Couleur" #: ui/log.py:392 ui/log.py:678 ui/action.py:120 msgid "Action" msgstr "Action" #: ui/log.py:393 msgid "Copy From Path" msgstr "Copier depuis le chemin" #: ui/log.py:393 msgid "Copy From Revision" msgstr "Copier depuis la révision" #: ui/log.py:662 msgid "Graph" msgstr "Graphe" #: ui/log.py:929 ui/browser.py:322 ui/dialog.py:110 #| msgid "Select" msgid "_Select" msgstr "_Sélectionner" #: ui/log.py:983 msgid "View diff against working copy" msgstr "Comparer avec la copie de travail" #: ui/log.py:993 msgid "View diff between revisions" msgstr "Voir les différences entre les révisions" #: ui/log.py:998 msgid "Compare with working copy" msgstr "Comparer avec la copie de travail" #: ui/log.py:1008 msgid "Compare revisions" msgstr "Comparer les révisions" #: ui/log.py:1014 msgid "Show changes against previous revision" msgstr "Comparer avec la révision précédente" #: ui/log.py:1020 msgid "Show changes between revisions" msgstr "Montrer les différences entre les révisions" #: ui/log.py:1025 msgid "Update to this revision" msgstr "Mise à jour vers cette révision" #: ui/log.py:1026 msgid "Update the selected path to this revision" msgstr "Mise à jour du chemin sélectionné vers cette révision" #: ui/log.py:1031 #| msgid "Open from first revision" msgid "Revert changes from this revision" msgstr "Défaire les modifications à partir de cette révision" #: ui/log.py:1032 msgid "Update the selected path by reverse merging the changes" msgstr "Mise à jour du chemin sélectionné par fusion inverse des changements" #: ui/log.py:1037 #| msgid "Copy URL to clipboard" msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" #: ui/log.py:1038 msgid "Copy to clipboard the full data of these revisions" msgstr "Copier les données complètes de ces révisions dans le presse-papier" #: ui/log.py:1042 ui/log.py:1046 msgid "Edit author..." msgstr "Editer l'auteur..." #: ui/log.py:1050 msgid "Edit log message..." msgstr "Editer le message de journal..." #: ui/log.py:1054 msgid "Edit revision properties..." msgstr "Editer les propriétés de la révision..." #: ui/log.py:1334 msgid "Edit author" msgstr "Editer l'auteur" #: ui/log.py:1346 msgid "Edit log message" msgstr "Editer le message de journal" #: ui/unlock.py:46 ui/unlock.py:108 msgid "Unlock" msgstr "Déverrouiller" #: ui/unlock.py:109 msgid "Running Unlock Command..." msgstr "Exécution de la commande de déverrouillage..." #: ui/unlock.py:112 msgid "Completed Unlock" msgstr "Déverrouillage terminé" #: ui/__init__.py:52 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" "Vous devez définir un système de contrôle de versions en utilisant l'option " "--vcs [svn|git]" #: ui/clean.py:67 #| msgid "Running Rename Command..." msgid "Running Clean Command..." msgstr "Exécution de la commande de nettoyage..." #: ui/clean.py:77 #| msgid "Completed Cleanup" msgid "Completed Clean" msgstr "Nettoyage terminé" #: ui/action.py:120 msgid "Mime Type" msgstr "Type MIME" #: ui/action.py:360 msgid "Finished" msgstr "Terminé" #: ui/action.py:364 #, python-format msgid "%s - Finished" msgstr "%s - Terminé" #: ui/action.py:386 msgid "Log Message" msgstr "Message du journal" #: ui/xml/revert.xml.h:2 ui/xml/commit.xml.h:2 ui/xml/relocate.xml.h:2 #: ui/xml/update.xml.h:2 ui/xml/settings.xml.h:2 ui/xml/add.xml.h:2 #: ui/xml/dialogs/delete_confirmation.xml.h:2 #: ui/xml/dialogs/name_email_prompt.xml.h:2 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:2 #: ui/xml/dialogs/previous_messages.xml.h:2 ui/xml/dialogs/property.xml.h:2 #: ui/xml/dialogs/create_folder.xml.h:2 ui/xml/dialogs/loading.xml.h:2 #: ui/xml/ignore.xml.h:2 ui/xml/clean.xml.h:2 ui/xml/properties.xml.h:2 #: ui/xml/notification.xml.h:2 ui/xml/git-update.xml.h:1 ui/xml/lock.xml.h:2 #: ui/xml/import.xml.h:2 ui/xml/reset.xml.h:2 ui/dialog.py:109 ui/dialog.py:281 #: ui/dialog.py:301 #| msgid "Cancel" msgid "_Cancel" msgstr "_Annuler" #: ui/xml/revert.xml.h:3 ui/xml/commit.xml.h:3 ui/xml/relocate.xml.h:3 #: ui/xml/update.xml.h:3 ui/xml/settings.xml.h:3 ui/xml/add.xml.h:3 #: ui/xml/dialogs/name_email_prompt.xml.h:3 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:3 #: ui/xml/dialogs/message_box.xml.h:2 ui/xml/dialogs/previous_messages.xml.h:3 #: ui/xml/dialogs/property.xml.h:3 ui/xml/dialogs/create_folder.xml.h:3 #: ui/xml/ignore.xml.h:3 ui/xml/clean.xml.h:3 ui/xml/notification.xml.h:3 #: ui/xml/git-update.xml.h:2 ui/xml/lock.xml.h:3 ui/xml/import.xml.h:3 #: ui/xml/reset.xml.h:3 msgid "_OK" msgstr "_OK" #: ui/xml/revert.xml.h:4 ui/xml/commit.xml.h:8 ui/xml/add.xml.h:5 #: ui/xml/lock.xml.h:5 msgid "Select / Deselect all" msgstr "Tous sélectionner/déselectionner" #: ui/xml/commit.xml.h:4 ui/xml/log.xml.h:2 msgid "Refresh" msgstr "Rafraîchir" #: ui/xml/commit.xml.h:5 ui/xml/dialogs/previous_messages.xml.h:1 #: ui/xml/lock.xml.h:7 ui/xml/import.xml.h:5 msgid "Previous Messages" msgstr "Messages précédents" #: ui/xml/commit.xml.h:6 ui/xml/dialogs/create_folder.xml.h:5 msgid "Add Message" msgstr "Ajouter un message" #: ui/xml/commit.xml.h:7 msgid "Show unversioned files" msgstr "Montrer les fichiers non versionnés" #: ui/xml/commit.xml.h:9 msgid "Changed Files (double-click to compare with base)" msgstr "" "Fichiers modifiés (double-clic pour comparer avec la version de base)" #: ui/xml/commit.xml.h:10 msgid "Commit to:" msgstr "Envoyer vers :" #: ui/xml/property_editor.xml.h:1 msgid "Property Editor" msgstr "Éditeur de propriété" #: ui/xml/property_editor.xml.h:2 ui/xml/browser.xml.h:3 ui/xml/manager.xml.h:1 #: ui/xml/dialogs/error_notification.xml.h:2 ui/xml/log.xml.h:1 #: ui/xml/annotate.xml.h:3 msgid "_Close" msgstr "_Fermer" #: ui/xml/property_editor.xml.h:3 msgid "Close this dialog." msgstr "Fermer cette boîte de dialogue." #: ui/xml/property_editor.xml.h:4 #| msgid "Refresh" msgid "_Refresh" msgstr "_Rafraîchir" #: ui/xml/property_editor.xml.h:5 msgid "Refresh the list of properties." msgstr "Rafraîchir la liste de propriétés." #: ui/xml/property_editor.xml.h:6 msgid "_New" msgstr "_Nouveau" #: ui/xml/property_editor.xml.h:7 msgid "Add a new property." msgstr "Ajouter une nouvelle propriété" #: ui/xml/property_editor.xml.h:8 msgid "Remote URI:" msgstr "URI distante :" #: ui/xml/property_editor.xml.h:9 msgid "Working Copy:" msgstr "Copie de travail :" #: ui/xml/browser.xml.h:2 msgid "Load/Refresh" msgstr "Charger/Rafraîchir" #: ui/xml/browser.xml.h:4 ui/tags.py:108 ui/tags.py:176 ui/merge.py:508 msgid "Revision:" msgstr "Révision :" #: ui/xml/browser.xml.h:5 msgid "URL:" msgstr "URL :" #: ui/xml/relocate.xml.h:1 ui/relocate.py:82 msgid "Relocate" msgstr "Relocaliser" #: ui/xml/relocate.xml.h:4 msgid "To:" msgstr "Vers :" #: ui/xml/relocate.xml.h:5 msgid "From:" msgstr "Depuis :" #: ui/xml/relocate.xml.h:6 msgid "Change the repository of your working copy" msgstr "Changer le dépôt de votre copie de travail" #: ui/xml/update.xml.h:4 msgid "Rollback to specified revision number" msgstr "Retour en arrière vers la révision spécifiée" #: ui/xml/update.xml.h:5 msgid "Omit Externals" msgstr "Omettre les externes" #: ui/xml/update.xml.h:6 ui/xml/merge.xml.h:29 msgid "Recursive" msgstr "Récursif" #: ui/xml/update.xml.h:7 ui/xml/merge.xml.h:30 ui/xml/git-update.xml.h:7 #: ui/xml/reset.xml.h:13 msgid "Options" msgstr "Options" #: ui/xml/update.xml.h:8 ui/xml/reset.xml.h:14 msgid "Revision" msgstr "Révision" #: ui/xml/merge.xml.h:1 msgid "Merge Assistant" msgstr "Assistant de fusion" #: ui/xml/merge.xml.h:2 #| msgid "" #| "Choose this method if you wish to merge two different branches into your " #| "working copy." msgid "Choose this method if you wish to reintegrate a branch into the trunk." msgstr "" "Choisissez cette méthode si vous souhaitez réintégrer une branche dans le " "tronc." #: ui/xml/merge.xml.h:3 msgid "Reintegrate a branch" msgstr "Réintégrer une branche" #: ui/xml/merge.xml.h:4 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Choisissez cette méthode si vous souhaitez fusionner deux branches " "différentes dans votre copie de travail." #: ui/xml/merge.xml.h:5 msgid "Merge two different trees" msgstr "Fusionner deux arbres différents" #: ui/xml/merge.xml.h:6 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Choisissez cette méthode si vous avez effectué des changements sur une " "branche et que vous souhaitez fusionner ces changements avec une autre " "branche." #: ui/xml/merge.xml.h:7 msgid "Merge a range of revisions" msgstr "Fusionner une gamme de révisions" #: ui/xml/merge.xml.h:8 msgid "Step 1: Merge Type" msgstr "Etape 1: Type de fusion" #: ui/xml/merge.xml.h:9 msgid "Working Copy" msgstr "Copie de travail" #: ui/xml/merge.xml.h:10 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Utilisez le journal de dialogue pour sélectionner la/les révision(s) que " "vous souhaitez fusionner. Ou écrivez la/les révision(s) manuellement, " "séparée(s) par des virgules. Vous pouvez spécifier une gamme de révision par " "un tiret.\n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "Pour fusionner toute les révisions, laissez le champ vide." #: ui/xml/merge.xml.h:15 msgid "Show log" msgstr "Consulter le journal" #: ui/xml/merge.xml.h:16 msgid "Revision Range" msgstr "Gamme de révision" #: ui/xml/merge.xml.h:17 msgid "URL to merge from" msgstr "Fusionner depuis l'URL" #: ui/xml/merge.xml.h:18 #| msgid "Merge a range of revisions" msgid "Step 2: Merge a Range of Revisions" msgstr "Etape 2: Fusionner une gamme de révisions" #: ui/xml/merge.xml.h:20 ui/widget.py:1037 ui/widget.py:1043 msgid "HEAD" msgstr "HEAD" #: ui/xml/merge.xml.h:21 msgid "To: (URL and revision to merge)" msgstr "Vers: (URL et révision à fusionner)" #: ui/xml/merge.xml.h:22 msgid "From: (URL and revision to merge)" msgstr "Depuis: (URL et révision à fusionner)" #: ui/xml/merge.xml.h:23 #| msgid "Merge two different trees" msgid "Step 2: Merge two different trees" msgstr "Etape 2: Fusionner deux arbres différents" #: ui/xml/merge.xml.h:24 msgid "From URL" msgstr "Depuis l'URL" #: ui/xml/merge.xml.h:25 msgid "Step 2: Reintegrate a Branch" msgstr "Etape 2: Réintégrer une branche" #: ui/xml/merge.xml.h:26 msgid "Test Merge" msgstr "Tester la fusion" #: ui/xml/merge.xml.h:27 msgid "Only record the merge" msgstr "Enregistrer seulement la fusion" #: ui/xml/merge.xml.h:28 msgid "Ignore ancestry" msgstr "Ignorer l'ascendance" #: ui/xml/merge.xml.h:31 msgid "Step 3: Final Options" msgstr "Etape 3: Options finales" #: ui/xml/settings.xml.h:4 #| msgid "Version Information" msgid "Version Control Systems" msgstr "Systèmes de contrôle de version" #: ui/xml/settings.xml.h:5 #| msgid "Enable emblems" msgid "Enable Subversion" msgstr "Activer Subversion" #: ui/xml/settings.xml.h:6 msgid "Enable Git" msgstr "Activer Git" #: ui/xml/settings.xml.h:7 msgid "Show RabbitVCS debugging tools" msgstr "Afficher les outils de débogage de RabbitVCS" #: ui/xml/settings.xml.h:8 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "Le menu Déboger est utilisé pour diagnostiquer des problèmes avec RabbitVCS " "elle-même" #: ui/xml/settings.xml.h:9 msgid "Enable emblems" msgstr "Activer les emblèmes" #: ui/xml/settings.xml.h:10 msgid "Enable recursive status checks" msgstr "Activer les vérifications récursives des statuts" #: ui/xml/settings.xml.h:11 msgid "Enable file attributes" msgstr "Activer les attributs de fichier" #: ui/xml/settings.xml.h:12 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/xml/settings.xml.h:13 msgid "General" msgstr "Général" #: ui/xml/settings.xml.h:14 msgid "Configure the program to resolve conflicted files." msgstr "Configurer le programme pour résoudre les conflits." #: ui/xml/settings.xml.h:16 msgid "" "Use the following macros to configure the merge tool:\n" "%base - The common ancestor of the two files to be merged.\n" "%mine - The file you modified in your working copy.\n" "%theirs - The file being merged into your working copy.\n" "%merged - The file to store the merged result." msgstr "" "Utiliser lea macros suivants pour configurer l'outil de fusion:\n" "%base - L'ancêtre commun aux deux fichiers à fusionner.\n" "%mine - Le ficher modifié dans votre copie de travail.\n" "%theirs - Le fichier à fusionner avec votre copie de travail.\n" "%merged - Le fichier dans lequel stocker le résultat de la fusion." #: ui/xml/settings.xml.h:21 msgid "Browse..." msgstr "Parcourir..." #: ui/xml/settings.xml.h:22 msgid "Show new version on the left side" msgstr "Afficher la nouvelle version à gauche" #: ui/xml/settings.xml.h:23 msgid "Program used to compare files" msgstr "Programme utilisé pour comparer des fichiers" #: ui/xml/settings.xml.h:24 msgid "External Programs" msgstr "Programmes externes" #: ui/xml/settings.xml.h:25 #| msgid "Cleanup" msgid "Clear" msgstr "Effacer" #: ui/xml/settings.xml.h:26 msgid "Clear your authentication information" msgstr "Nettoyer vos informations d'authentification" #: ui/xml/settings.xml.h:27 msgid "Authentication" msgstr "Authentification" #: ui/xml/settings.xml.h:28 msgid "Number of messages to remember" msgstr "Nombre de messages à retenir" #: ui/xml/settings.xml.h:29 msgid "Log Messages" msgstr "Messages du journal" #: ui/xml/settings.xml.h:30 msgid "Number of URLs to remember" msgstr "Nombre d'URL à retenir" #: ui/xml/settings.xml.h:31 msgid "URL History" msgstr "Historique des URL" #: ui/xml/settings.xml.h:32 msgid "Saved Data" msgstr "Données sauvegardées" #: ui/xml/settings.xml.h:33 msgid "Logging Options" msgstr "Options de journalisation" #: ui/xml/settings.xml.h:34 #| msgid "Minimum level to log" msgid "Minimum level to log:" msgstr "Niveau minimum à journaliser:" #: ui/xml/settings.xml.h:35 msgid "Type:" msgstr "Type:" #: ui/xml/settings.xml.h:36 msgid "Logging" msgstr "Journalisation" #: ui/xml/settings.xml.h:37 msgid "Refresh Information" msgstr "Actualiser les informations" #: ui/xml/settings.xml.h:38 msgid "Restart Checker" msgstr "Redémarrer le vérificateur" #: ui/xml/settings.xml.h:39 msgid "Stop Checker" msgstr "Arrêter le vérificateur" #: ui/xml/settings.xml.h:40 msgid "Other Information" msgstr "Information complémentaire" #: ui/xml/settings.xml.h:41 msgid "Checker type:" msgstr "Type de vérificateur:" #: ui/xml/settings.xml.h:42 ui/settings.py:43 msgid "Unknown" msgstr "Inconnu" #: ui/xml/settings.xml.h:43 msgid "Process ID:" msgstr "Identifiant de processus;" #: ui/xml/settings.xml.h:44 msgid "Memory usage: " msgstr "Mémoire occupée : " #: ui/xml/settings.xml.h:45 #| msgid "Memory usage: " msgid "Locale: " msgstr "Localisation: " #: ui/xml/settings.xml.h:46 msgid "Status Checker" msgstr "Vérificateur d'état" #: ui/xml/settings.xml.h:47 msgid "Configuration Editor" msgstr "Editeur de configuration" #: ui/xml/settings.xml.h:48 msgid "Git" msgstr "Git" #: ui/xml/add.xml.h:4 #| msgid "Show unversioned files" msgid "Show ignored files" msgstr "Montrer les fichiers ignorés" #: ui/xml/dialogs/delete_confirmation.xml.h:1 msgid "Delete Confirmation" msgstr "Confirmation de la suppression" #: ui/xml/dialogs/delete_confirmation.xml.h:3 ui/xml/properties.xml.h:6 #| msgid "Delete" msgid "_Delete" msgstr "_Supprimer" #: ui/xml/dialogs/delete_confirmation.xml.h:4 msgid "The item(s) will be sent to the trash can." msgstr "Les objets seront envoyés à la corbeille." #: ui/xml/dialogs/delete_confirmation.xml.h:6 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Êtes vous sur de vouloir supprimer %item%?" #: ui/xml/dialogs/certificate.xml.h:1 msgid "Check Certificate" msgstr "Vérifier le certificat" #: ui/xml/dialogs/certificate.xml.h:2 msgid "Accept Once" msgstr "Accepter temporairement" #: ui/xml/dialogs/certificate.xml.h:3 msgid "Accept Forever" msgstr "Accepter définitivement" #: ui/xml/dialogs/certificate.xml.h:4 msgid "Deny" msgstr "Refuser" #: ui/xml/dialogs/certificate.xml.h:5 msgid "Fingerprint:" msgstr "Empreinte :" #: ui/xml/dialogs/certificate.xml.h:6 msgid "Valid:" msgstr "Valide:" #: ui/xml/dialogs/certificate.xml.h:7 msgid "Issuer:" msgstr "Émetteur :" #: ui/xml/dialogs/certificate.xml.h:8 ui/widget.py:1310 msgid "Host:" msgstr "Hôte :" #: ui/xml/dialogs/certificate.xml.h:9 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:6 msgid "Realm:" msgstr "Domaine:" #: ui/xml/dialogs/certificate.xml.h:10 msgid "Certificate Details" msgstr "Détails du certificat" #: ui/xml/dialogs/name_email_prompt.xml.h:1 msgid "Name and Email" msgstr "Nom et E-mail" #: ui/xml/dialogs/name_email_prompt.xml.h:4 msgid "Enter Name and Email Details" msgstr "Veuillez saisir votre nom et email" #: ui/xml/dialogs/name_email_prompt.xml.h:5 msgid "Email:" msgstr "E-mail :" #: ui/xml/dialogs/name_email_prompt.xml.h:6 ui/xml/property_page.xml.h:4 #: ui/tags.py:98 msgid "Name:" msgstr "Nom:" #: ui/xml/dialogs/confirmation.xml.h:1 msgid "Confirmation" msgstr "Confirmation" #: ui/xml/dialogs/confirmation.xml.h:2 #| msgid "No" msgid "_No" msgstr "_Non" #: ui/xml/dialogs/confirmation.xml.h:3 msgid "_Yes" msgstr "_Oui" #: ui/xml/dialogs/confirmation.xml.h:4 ui/dialog.py:316 msgid "Are you sure you want to continue?" msgstr "Êtes vous sur de vouloir continuer ?" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:1 msgid "SSL Client Certification" msgstr "SSL Client Certification" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:4 msgid "Save Authentication" msgstr "Sauvegarder l'authentification" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:5 msgid "Path:" msgstr "Chemin :" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:7 msgid "Please provide your ssl certification file" msgstr "Merci de fournir vos fichier de certification ssl" #: ui/xml/dialogs/previous_messages.xml.h:4 msgid "Previous Messages" msgstr "Messages précédents" #: ui/xml/dialogs/previous_messages.xml.h:5 ui/xml/log.xml.h:13 msgid "Message" msgstr "Message" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:1 #| msgid "Resolved" msgid "Mark Resolved" msgstr "Marquer comme Résolu" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:2 #| msgid "Resolved" msgid "Unresolved" msgstr "Non-résolu" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:3 msgid "Resolved" msgstr "Résolu" #: ui/xml/dialogs/mark_resolved_prompt.xml.h:4 #| msgid "Commit to:" msgid "Mark Conflict As" msgstr "Marquer le conflit comme" #: ui/xml/dialogs/property.xml.h:1 msgid "Property" msgstr "Propriété" #: ui/xml/dialogs/property.xml.h:4 msgid "Apply property recursively" msgstr "Appliquer la propriété récursivement" #: ui/xml/dialogs/property.xml.h:5 msgid "Value:" msgstr "Valeur:" #: ui/xml/dialogs/property.xml.h:6 msgid "Property:" msgstr "Propriété :" #: ui/xml/dialogs/property.xml.h:7 msgid "Edit Property Details" msgstr "Éditer les détails de la propriété" #: ui/xml/dialogs/error_notification.xml.h:1 msgid "RabbitVCS Error" msgstr "Erreur RabbitVCS" #: ui/xml/dialogs/error_notification.xml.h:3 msgid "RabbitVCS Error" msgstr "Erreur RabbitVCS" #: ui/xml/dialogs/conflict_decision.xml.h:1 #| msgid "Conflicted" msgid "Edit Conflicts" msgstr "Editer les conflits" #: ui/xml/dialogs/conflict_decision.xml.h:2 msgid "Cancel" msgstr "Annuler" #: ui/xml/dialogs/conflict_decision.xml.h:3 msgid "Accept Mine" msgstr "Accepter le mien" #: ui/xml/dialogs/conflict_decision.xml.h:4 msgid "Accept Theirs" msgstr "Accepter le leur" #: ui/xml/dialogs/conflict_decision.xml.h:5 msgid "A conflict was found in the following file:" msgstr "Un conflit a été trouvé dans le fichier suivant :" #: ui/xml/dialogs/create_folder.xml.h:1 msgid "Create Folder..." msgstr "Créer un dossier…" #: ui/xml/dialogs/create_folder.xml.h:4 msgid "Folder Name" msgstr "Nom du dossier" #: ui/xml/dialogs/loading.xml.h:1 #| msgid "Loading..." msgid "Loading" msgstr "Chargement" #: ui/xml/ignore.xml.h:1 msgid "Ignore" msgstr "Ignorer" #: ui/xml/ignore.xml.h:4 msgid "Ignore and exclude files from being tracked" msgstr "Ignorer et exclure les fichiers à ne pas suivre" #: ui/xml/clean.xml.h:4 msgid "Force" msgstr "Forcer" #: ui/xml/clean.xml.h:5 msgid "Dry run" msgstr "Simulation" #: ui/xml/clean.xml.h:6 #| msgid "Include ignored files" msgid "Remove only ignored files" msgstr "N'enlever que les fichiers ignorés" #: ui/xml/clean.xml.h:7 #| msgid "Include ignored files" msgid "Remove ignored files, too" msgstr "Enlever aussi les fichiers ignorés" #: ui/xml/clean.xml.h:8 msgid "Remove directories" msgstr "Enlever les répertoires" #: ui/xml/clean.xml.h:9 msgid "Remove untracked files from the working tree" msgstr "Enlever les fichiers non-versionnés de la copie de travail" #: ui/xml/clean.xml.h:10 #| msgid "Repository" msgid "Clean your Repository" msgstr "Nettoyer votre dépôt" #: ui/xml/properties.xml.h:3 ui/dialog.py:302 #| msgid "Save" msgid "_Save" msgstr "_Sauvegarder" #: ui/xml/properties.xml.h:4 #| msgid "New..." msgid "_New..." msgstr "_Nouveau..." #: ui/xml/properties.xml.h:5 #| msgid "Edit..." msgid "_Edit..." msgstr "_Éditer..." #: ui/xml/properties.xml.h:7 msgid "Delete properties recursively" msgstr "Supprimer les propriétés récursivement" #: ui/xml/properties.xml.h:8 msgid "Selected properties will be applied recursively." msgstr "" "Les propriétés sélectionnées seront appliquées de manière récursive." #: ui/xml/properties.xml.h:9 msgid "Properties for:" msgstr "Propriétés pour:" #: ui/xml/notification.xml.h:1 msgid "Notification Messages" msgstr "Messages de notification" #: ui/xml/notification.xml.h:4 ui/xml/annotate.xml.h:2 #| msgid "Save As..." msgid "Save _As" msgstr "Enregistrer _Sous..." #: ui/xml/git-update.xml.h:3 msgid "Fetch from all remotes" msgstr "Aller chercher dans toutes les sources distantes" #: ui/xml/git-update.xml.h:4 msgid "Apply remote changes prior to local changes (rebase)" msgstr "" "Appliquer les modifications distantes avant les changements locaux (rebase)" #: ui/xml/git-update.xml.h:5 #| msgid "Merge changes into local branch" msgid "Merge into local branch" msgstr "Fusionner dans la branche locale" #: ui/xml/git-update.xml.h:6 msgid "Apply remote changes" msgstr "Appliquer les modifications distantes" #: ui/xml/log.xml.h:3 msgid "100" msgstr "100" #: ui/xml/log.xml.h:4 msgid "Limit:" msgstr "Limite:" #: ui/xml/log.xml.h:5 msgid "_Back" msgstr "En A_rriére" #: ui/xml/log.xml.h:6 msgid "_Forward" msgstr "En A_vant" #: ui/xml/log.xml.h:8 ui/dialog.py:136 msgid "to" msgstr "vers" #: ui/xml/log.xml.h:9 msgid "Showing Revisions:" msgstr "Consulter une révisions:" #: ui/xml/log.xml.h:10 msgid "Stop on copy" msgstr "Stopper à la copie" #: ui/xml/log.xml.h:11 msgid "Revisions Table" msgstr "Tableau de révisions" #: ui/xml/log.xml.h:12 msgid "Affected File(s) (double-click to compare with base)" msgstr "" "Ficher(s) affecté(s) (double-clic pour comparer avec la version de " "base)" #: ui/xml/lock.xml.h:1 msgid "Lock Files" msgstr "Verrouiller les fichiers" #: ui/xml/lock.xml.h:4 msgid "Steal the locks" msgstr "Voler le verrou" #: ui/xml/lock.xml.h:6 msgid "Files to lock" msgstr "Fichiers à verrouiller" #: ui/xml/lock.xml.h:8 msgid "Please describe why you are locking these files" msgstr "Merci de décrire pourquoi vous verrouillez ces fichiers" #: ui/xml/annotate.xml.h:1 msgid "Annotate" msgstr "Annoter" #: ui/xml/annotate.xml.h:4 msgid "To Revision" msgstr "Vers la révision" #: ui/xml/annotate.xml.h:5 msgid "From Revision" msgstr "Depuis la révision" #: ui/xml/import.xml.h:4 msgid "Include ignored files" msgstr "Inclure les fichiers ignorés" #: ui/xml/import.xml.h:6 msgid "Import Message" msgstr "Message d'importation" #: ui/xml/import.xml.h:7 msgid "Repository" msgstr "Dépôt" #: ui/xml/reset.xml.h:4 msgid "None" msgstr "Aucun" #: ui/xml/reset.xml.h:5 msgid "" "Merge - Resets the index to match the tree recorded by the named " "commit,\n" "and updates the files that are different between the named commit\n" "and the current commit in the working tree" msgstr "" "Fusion - Réinitialiser l'index pour correspondre à l'arborescence " "enregistrée\n" "dans le commit sélectionné et mettre à jour les fichiers de la copie de " "travail à partir de ce dernier" #: ui/xml/reset.xml.h:8 msgid "" "Hard - Matches the working tree and index to that of the \n" "tree being switched to" msgstr "" "Fort - Faire correspondre les fichiers et l'index de la copie de " "travail à l'arborescence ciblée" #: ui/xml/reset.xml.h:10 msgid "" "Soft - Does not touch the index file or working tree at all, \n" "but requires them to be in good working order" msgstr "" "Léger - Ne pas altérer l'index et les fichiers de la copie de " "travail, mais exiger qu'il soit en état de fonctionnement" #: ui/xml/reset.xml.h:12 msgid "Mixed - Reset the index but not the working tree" msgstr "" "Mixte - Réinitialiser l'index mais pas les fichiers de la copie de " "travail" #: ui/xml/reset.xml.h:15 #| msgid "Tags" msgid "Path" msgstr "Chemin" #: ui/xml/reset.xml.h:16 #| msgid "Revert an item to its unmodified state" msgid "Reset current HEAD to specified state." msgstr "Rétablir l'état de la tête (HEAD) à l'état spécifié." #: ui/xml/reset.xml.h:17 #| msgid "Repository" msgid "Reset your Repository" msgstr "Réinitialiser votre dépôt" #: ui/xml/property_page.xml.h:1 msgid "Property status:" msgstr "Etat de la propriété:" #: ui/xml/property_page.xml.h:2 msgid "Content status:" msgstr "Statut du contenu :" #: ui/xml/property_page.xml.h:3 msgid "VCS:" msgstr "VCS:" #: ui/rename.py:50 msgid "The requested file or folder does not exist." msgstr "Le fichier ou répertoire demandé n'existe pas." #: ui/rename.py:54 ui/rename.py:86 ui/rename.py:115 ui/browser.py:465 msgid "Rename" msgstr "Renommer" #: ui/rename.py:54 ui/browser.py:465 msgid "New Name:" msgstr "Nouveau nom :" #: ui/rename.py:62 msgid "The new name field is required" msgstr "Le champ 'nouveau nom' est requit." #: ui/rename.py:87 ui/rename.py:116 msgid "Running Rename Command..." msgstr "Exécution de la commande de renommage..." #: ui/rename.py:93 ui/rename.py:122 msgid "Completed Rename" msgstr "Renommage terminé" #: ui/update.py:56 ui/update.py:105 ui/updateto.py:92 msgid "Updating..." msgstr "Mise à jour..." #: ui/update.py:58 ui/update.py:123 ui/updateto.py:100 msgid "Completed Update" msgstr "Mise à jour terminée" #: ui/revprops.py:66 ui/properties.py:153 ui/property_editor.py:158 msgid "Unable to retrieve properties list" msgstr "Impossible de récupérer les propriétés de la liste" #: ui/widget.py:1039 msgid "Branch" msgstr "Branche" #: ui/widget.py:1044 msgid "Number" msgstr "Numéro" #: ui/widget.py:1047 msgid "Working Copy" msgstr "Copie de travail" #: ui/widget.py:1268 msgid "Repository:" msgstr "Dépôt :" #: ui/widget.py:1285 msgid "Branch:" msgstr "Branche :" #: ui/widget.py:1426 msgid "Add line:" msgstr "Ajouter une ligne :" #: ui/browser.py:91 msgid "Size" msgstr "Taille" #: ui/browser.py:341 msgid "Create folder..." msgstr "Créer un dossier..." #: ui/browser.py:346 msgid "Copy to..." msgstr "Copier vers..." #: ui/browser.py:351 msgid "Copy URL to clipboard" msgstr "Copier l'URL dans le presse-papier" #: ui/browser.py:356 msgid "Move to..." msgstr "Déplacer vers..." #: ui/browser.py:526 msgid "Where do you want to copy the selection?" msgstr "Où voulez-vous copier la sélection ?" #: ui/browser.py:527 ui/browser.py:556 msgid "New Location:" msgstr "Nouvel emplacement :" #: ui/browser.py:555 msgid "Where do you want to move the selection?" msgstr "Où voulez-vous déplacer la sélection ?" #: ui/relocate.py:72 msgid "The from and to url fields are both required." msgstr "Les champs 'depuis' et 'URL' sont requis." #: ui/relocate.py:83 msgid "Running Relocate Command..." msgstr "Exécution de la commande de relocalisation..." #: ui/relocate.py:90 msgid "Completed Relocate" msgstr "Relocalisation terminée" #: ui/add.py:216 ui/add.py:241 msgid "Running Add Command..." msgstr "Exécution de la commande d'Ajout..." #: ui/add.py:218 ui/add.py:243 msgid "Completed Add" msgstr "Ajout terminé" #: ui/updateto.py:80 msgid "Rollback To Revision" msgstr "Retour à la Révision" #: ui/updateto.py:81 msgid "Rolling Back..." msgstr "Retour en arrière..." #: ui/updateto.py:89 msgid "Completed Rollback" msgstr "Annulation terminée" #: ui/updateto.py:91 msgid "Update To Revision" msgstr "Mettre à jour vers la révision" #: ui/updateto.py:117 #| msgid "Where do you want to copy the selection?" msgid "What revision/branch do you want to checkout?" msgstr "Quelle branche/révision voulez-vous copier ?" #: ui/updateto.py:138 msgid "Checkout" msgstr "Checkout" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "Mise à jour %s..." #: ui/updateto.py:145 msgid "Completed Checkout" msgstr "Checkout terminé" #: ui/create.py:52 msgid "Repository successfully created" msgstr "Dépôt créé avec succès" #: ui/create.py:54 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Une erreur c'est produite durant la création du dépôt. Veuillez vérifier que " "le répertoire est vide." #: ui/create.py:69 msgid "Setting up repository..." msgstr "Mise en place du dépot..." #: ui/create.py:71 #| msgid "Create Repository here" msgid "Completed repository setup" msgstr "Mise en place du dépot terminée" #: ui/tags.py:62 msgid "Tag Manager" msgstr "Gestionnaire de Tags" #: ui/tags.py:63 msgid "Tags" msgstr "Tags" #: ui/tags.py:74 msgid "Tag" msgstr "Tag" #: ui/tags.py:127 ui/tags.py:188 ui/merge.py:520 msgid "Message:" msgstr "Message:" #: ui/tags.py:145 ui/tags.py:295 msgid "Save" msgstr "Sauvegarder" #: ui/tags.py:153 msgid "Tagger:" msgstr "Etiquetter" #: ui/tags.py:165 ui/merge.py:497 msgid "Date:" msgstr "Date :" #: ui/tags.py:286 msgid "Add Tag" msgstr "Ajouter un Tag" #: ui/tags.py:304 msgid "Tag Detail" msgstr "Détail du Tag" #: ui/property_page.py:146 ui/property_page.py:152 msgid "Repository URL" msgstr "URL du dépôt" #: ui/properties.py:56 #, python-format msgid "Properties - %s" msgstr "Propriétés - %s" #: ui/properties.py:64 ui/property_editor.py:114 msgid "Value" msgstr "Valeur" #: ui/properties.py:174 msgid "There was a problem saving your properties." msgstr "Une erreur est survenue durant la sauvegarde de vos propriétés." #: ui/merge.py:103 msgid "Running Merge Test" msgstr "Exécution du test de fusion..." #: ui/merge.py:104 msgid "Completed Merge Test" msgstr "Test de fusion terminé" #: ui/merge.py:106 msgid "Running Merge Command" msgstr "Exécution de la commande de fusion" #: ui/merge.py:107 ui/merge.py:566 msgid "Completed Merge" msgstr "Fusion terminée" #: ui/merge.py:118 ui/merge.py:559 msgid "Merge" msgstr "Fusionner" #: ui/merge.py:474 msgid "No active branch" msgstr "Pas de branche active" #: ui/merge.py:485 msgid "Author:" msgstr "Auteur :" #: ui/merge.py:560 #| msgid "Running Merge Command" msgid "Running Merge Command..." msgstr "Exécution de la commande de fusion..." #: ui/dialog.py:35 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Une erreur s'est produite dans l'extension RabbitVCS de Nautilus. Merci de " "contacter l'équipe RabbitVCS en précisant les détails de " "l'erreur ci-dessous :" #: ui/dialog.py:106 msgid "Select a Folder" msgstr "Sélectionnez un dossier" #: ui/dialog.py:276 msgid "Select a File" msgstr "Sélectionnez un fichier" #: ui/dialog.py:282 #| msgid "Open" msgid "_Open" msgstr "_Ouvrir" #: ui/dialog.py:296 msgid "Save As..." msgstr "Enregistrer sous..." #: ui/dialog.py:344 msgid "the selected item(s)" msgstr "le(s) objet(s) sélectionné(s)" #: ui/dialog.py:415 msgid "Added a folder to the repository" msgstr "Ajouter un répertoire au dépot" #: ui/annotate.py:58 msgid "Cannot annotate a directory" msgstr "Impossible d'annoter le dossier" #: ui/annotate.py:64 #, python-format msgid "Annotate - %s" msgstr "Annoter - %s" #: ui/annotate.py:131 ui/annotate.py:235 msgid "Line" msgstr "Ligne" #: ui/annotate.py:132 ui/annotate.py:236 msgid "Text" msgstr "Texte" #: ui/annotate.py:149 msgid "The from revision field must be an integer" msgstr "Le champ 'depuis la révision' est requis." #: ui/property_editor.py:57 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Remarque : les modifications apportées aux propriétés sont appliquées " "immédiatement. Vous pouvez vérifier et annuler les modifications en " "utilisant le menu contextuel pour chaque élément.\n" #: ui/property_editor.py:62 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Voulez-vous supprimer les propriétés sélectionnées de l'ensemble des " "fichiers et des sous-répertoires\n" "sous ce répertoire ?" #: ui/property_editor.py:104 msgid "File is not under version control." msgstr "Le fichier n'est pas versionné" #: ui/property_editor.py:114 msgid "Reserved" msgstr "Réservé" #: ui/property_editor.py:114 msgid "Status" msgstr "État" #: ui/property_editor.py:182 msgid "Unable to set new value for property." msgstr "Impossible de définir une nouvelle valeur pour la propriété." #: ui/cleanup.py:57 msgid "Cleaning Up..." msgstr "Nettoyage..." #: ui/cleanup.py:59 msgid "Completed Cleanup" msgstr "Nettoyage terminé" #: ui/import.py:41 #, python-format msgid "Import - %s" msgstr "Importation - %s" #: ui/import.py:63 msgid "The repository URL field is required." msgstr "Le champ 'URL du dépôt' est requit." #: ui/import.py:76 msgid "Running Import Command..." msgstr "Exécution de la commande d'importation..." #: ui/import.py:84 msgid "Completed Import" msgstr "Importation terminée" #: ui/clone.py:60 ui/export.py:73 ui/export.py:142 msgid "The repository URL and destination path are both required fields." msgstr "Les champs 'URL du dépôt' et 'chemin de destination' sont requis." #: ui/clone.py:69 msgid "Running Clone Command..." msgstr "Execution de la commande de clonage..." #: ui/clone.py:76 msgid "Completed Clone" msgstr "Clonage terminé" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" "Il y a eu une erreur de communication avec le service vérificateur d'états." #: ui/settings.py:124 msgid "Config file:" msgstr "Fichier de configuration :" #: ui/settings.py:300 msgid "Select a program" msgstr "Sélectionnez un programme" #: ui/settings.py:309 msgid "Are you sure you want to clear your repository paths?" msgstr "Êtes vous sur de vouloir nettoyer les chemins du dépôt ?" #: ui/settings.py:316 msgid "Repository paths cleared" msgstr "Chemins du dépôt nettoyés" #: ui/settings.py:320 msgid "Are you sure you want to clear your previous messages?" msgstr "Êtes vous sur de vouloir nettoyer les messages précédents ?" #: ui/settings.py:327 msgid "Previous messages cleared" msgstr "Messages précèdents nettoyés" #: ui/settings.py:331 msgid "Are you sure you want to clear your authentication information?" msgstr "" "Êtes vous sur de vouloir nettoyer vos informations d'authentification ?" #: ui/settings.py:348 msgid "Authentication information cleared" msgstr "Informations d'authentification nettoyées" #: ui/commit.py:267 #, python-format msgid "Found %(changed)d changed and %(unversioned)d unversioned item(s)" msgstr "" "%(changed)d éléments modifiés et %(unversioned)d éléments non-inclus ont été " "trouvés" #: ui/commit.py:319 ui/commit.py:387 msgid "Running Commit Command..." msgstr "Exécution de la commande d'Envoi..." #: ui/commit.py:332 ui/commit.py:396 msgid "Completed Commit" msgstr "Envoi terminé" #: ui/diff.py:311 msgid "View diff as side-by-side comparison" msgstr "Voir une comparaison côte à côte du diff" #: ui/export.py:46 ui/export.py:125 #, python-format msgid "Export - %s" msgstr "Exporter - %s" #: ui/export.py:93 ui/export.py:162 msgid "Export" msgstr "Exporter" #: ui/export.py:94 ui/export.py:163 msgid "Running Export Command..." msgstr "Exécution de la commande d'exportation..." #: ui/export.py:105 ui/export.py:171 msgid "Completed Export" msgstr "Exportation terminée" #~ msgid "Resolve" #~ msgstr "Résoudre" #~ msgid "Apply Patch" #~ msgstr "Appliquer le correctif" #~ msgid "Apply Patch To Directory..." #~ msgstr "Appliquer le correctif pour le repertoire..." #~ msgid "Applying Patch File..." #~ msgstr "Application du fichier correctif..." #~ msgid "Patch File Applied" #~ msgstr "Fichier correctif appliqué" #~ msgid "Branch Manager" #~ msgstr "Gestionnaire de branches" #~ msgid "Branches" #~ msgstr "Branches" #~ msgid "Start Point:" #~ msgstr "Point de départ :" #~ msgid "Keep old branch's history" #~ msgstr "Conserver l'historique de l'ancienne branche" #~ msgid "Add Branch" #~ msgstr "Ajouter une branche" #~ msgid "Branch Detail" #~ msgstr "Détail de la branche" #~ msgid "View unified diff" #~ msgstr "Voir le diff unifié" #~ msgid "Compare side by side" #~ msgstr "Comparaison côte à côte" #~ msgid "More Actions..." #~ msgstr "Plus d'actions..." #~ msgid "Change" #~ msgstr "Changement" #~ msgid "Property Change" #~ msgstr "Changement de propriété" #~ msgid "Open from second revision" #~ msgstr "Ouvrir depuis la seconde révision" #~ msgid "English" #~ msgstr "Anglais" #~ msgid "You must supply a destination path." #~ msgstr "Vous devez spécifier un chemin de destination." #~ msgid "Branch/tag" #~ msgstr "Branch/tag" #~ msgid "Running Branch/tag Command..." #~ msgstr "Exécution de la commande Branch/tag..." #~ msgid "Completed Branch/tag" #~ msgstr "Branch/tag terminé" #~ msgid "The repository location is a required field." #~ msgstr "Le champ 'emplacement du dépôt' est requit." #~ msgid "Switch" #~ msgstr "Basculement" #~ msgid "Running Switch Command..." #~ msgstr "Exécution de la commande de basculement..." #~ msgid "Completed Switch" #~ msgstr "Basculement terminé" #~ msgid "Checkout - %s" #~ msgstr "Checkout - %s" #~ msgid "Running Checkout Command..." #~ msgstr "Exécution de la commande Checkout..." #~ msgid "Create Patch" #~ msgstr "Créer un correctif" #~ msgid "The given path is not a working copy" #~ msgstr "Le chemin indiqué n'est pas une copie de travail" #~ msgid "Creating Patch File..." #~ msgstr "Création du fichier correctif" #~ msgid "Patch File Created" #~ msgstr "Fichier correctif créé" #~ msgid "URL/Path:" #~ msgstr "URL/Chemin :" #~ msgid "Please add your authentication details" #~ msgstr "Merci d'ajouter vos détails d'authentification" #~ msgid "Authentication" #~ msgstr "Authentification" #~ msgid "How do you want to handle this?" #~ msgstr "Comment voulez-vous procéder ?" #~ msgid "Login:" #~ msgstr "Identifiant :" #~ msgid "Merge Manually" #~ msgstr "Merger manuellement" #~ msgid "Password:" #~ msgstr "Mot de passe :" #~ msgid "Text Change" #~ msgstr "Changement du texte" #~ msgid "Pull" #~ msgstr "Récupérer" #~ msgid "label" #~ msgstr "label" #~ msgid "Links" #~ msgstr "Liens" #~ msgid "RabbitVCS" #~ msgstr "RabbitVCS" #~ msgid "Authors:" #~ msgstr "Auteurs :" #~ msgid "Thanks:" #~ msgstr "Remerciements :" #~ msgid "Log" #~ msgstr "Journal" #~ msgid "" #~ "Cleanup Requested....\n" #~ "\n" #~ "Begin working copy cleanup?" #~ msgstr "" #~ "Nettoyage demandé....\n" #~ "\n" #~ "Commencer le nettoyage de la copie de travail ?" #~ msgid "Language:" #~ msgstr "Langage:" #~ msgid "Update Local Repository" #~ msgstr "Mettre à jour le Dépôt local" #~ msgid "Completed" #~ msgstr "Terminé" #~ msgid "Switch Details" #~ msgstr "Détails du basculement" #~ msgid "Create copy from" #~ msgstr "Créer une copie depuis" #~ msgid "Program used to browse repositories" #~ msgstr "Programme utilisé pour parcourir les dépôts" #~ msgid "Show new version on the right side" #~ msgstr "Afficher la nouvelle version sur le coté droit" #~ msgid "Update Depth" #~ msgstr "Mise à jour en profondeur" #~ msgid "Added" #~ msgstr "Ajouté" #~ msgid "Copied" #~ msgstr "Copié" #~ msgid "Deleted" #~ msgstr "Supprimé" #~ msgid "Restored" #~ msgstr "Restauré" #~ msgid "Reverted" #~ msgstr "Revert effectué" #~ msgid "Failed Revert" #~ msgstr "Revert échoué" #~ msgid "Skipped" #~ msgstr "Passé" #~ msgid "Updated" #~ msgstr "À jour" #~ msgid "External" #~ msgstr "Externe" #~ msgid "Modified" #~ msgstr "Modifié" #~ msgid "Replaced" #~ msgstr "Remplacé" #~ msgid "Changed" #~ msgstr "Changé" #~ msgid "Annotated" #~ msgstr "Annoté" #~ msgid "Unlocked" #~ msgstr "Déverrouillé" #~ msgid "Failed Lock" #~ msgstr "Impossible de verrouiller" #~ msgid "Failed Unlock" #~ msgstr "Impossible de déverrouiller" #~ msgid "Inapplicable" #~ msgstr "Inapplicable" #~ msgid "Unchanged" #~ msgstr "Inchangé" #~ msgid "Missing" #~ msgstr "Manquant" #~ msgid "Obstructed" #~ msgstr "Bloqué" #~ msgid "Merged" #~ msgstr "Réuni" rabbitvcs-0.18/po/he.po000066400000000000000000001136321362112712700150030ustar00rootroot00000000000000# Hebrew translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-02-09 10:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Hebrew \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "שליחה" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "הוספה" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "הוספה אל רשימת ההתעלמות" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "מחיקה" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "פתור" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "שחזור" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "ניקיון" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "ייבוא" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "פתיחה" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "סייר אל" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "מעדכן..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "העדכון הושלם" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "נתיב" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "סיומת" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "בטעינה..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "נמצאו %d פריטים" #: ui/add.py:157 msgid "Running Add Command..." msgstr "מריץ פקודת הוספה..." #: ui/add.py:159 msgid "Completed Add" msgstr "ההוספה הסתיימה" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "ייצוא - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "ייצוא" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "מריץ פקודת ייצוא..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "ייצוא הושלם" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "תאריך" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "הודעה" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "ייבוא - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "שדה כתובת המקור נדרש." #: ui/import.py:81 msgid "Running Import Command..." msgstr "מריץ פקודת ייבוא..." #: ui/import.py:89 msgid "Completed Import" msgstr "ייבוא הסתיים" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "שנה שם" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "" #: ui/rename.py:60 msgid "The new name field is required" msgstr "שדה השם הינו הכרחי" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "מריץ פקודת שינוי שם..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "שינוי השם הושלם" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "מצב טקסט" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "מצב הגדרה" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "מרית פקודת שליחה..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "שליחה הושלמה" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "בחירת ספרייה" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "אל" #: ui/dialog.py:261 msgid "Select a File" msgstr "בחירת קובץ" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "מקם מחדש" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "מריץ פקודת מיקום מחדש..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "המיקום מחדש הסתיים" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "מהדורה" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "יוצר" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "מריץ פקודת פתור..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "כן" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "לא ניתן לכתוב הערה לספרייה" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "הערה - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "שורה" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "טקסט" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "פעולה" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "אנגלית" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "בחירת תוכנה" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "האם אתה בטוח שברצונך למחוק את נתיבי המאגר שלך?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "נתיבי המאגר נמחקו" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "האם אתה בטוח שברצונך למחוק את ההודעה הקודמת שלך?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "ההודעה הקודמת נמחקה" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "האם אתה בטוח שבצרונך למחוק את נתוני האימות שלך?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "נתוני האימות נמחקו" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "יש לספק נתיב יעד." #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "נעול" #: ui/lock.py:167 msgid "Get Lock" msgstr "נעל" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "מריץ פקודת נעילה..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "נעילה הסתיימה" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "יצירת תיקון" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "הנתיב שניתן אינו העתק פועל" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "יוצר קובץ תיקון..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "" #: ui/action.py:338 msgid "Finished" msgstr "הסתיים" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - הסיים" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "מנקה..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "הניקיון הסתיים" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "" #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "הצגת דיווח" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/hr.po000066400000000000000000001325301362112712700150160ustar00rootroot00000000000000# Croatian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-04-10 08:37+0000\n" "Last-Translator: Vedran Miletić \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i sekunda" msgstr[1] "%i sekunda" msgstr[2] "%i sekundi" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuta" msgstr[1] "%i minute" msgstr[2] "%i minuta" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i sat" msgstr[1] "%i sati" msgstr[2] "%i sati" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dan" msgstr[1] "%i dana" msgstr[2] "%i dana" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i tjedan" msgstr[1] "%i tjedana" msgstr[2] "%i tjedana" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mjesec" msgstr[1] "%i mjeseci" msgstr[2] "%i mjeseci" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i godina" msgstr[1] "%i godina" msgstr[2] "%i godina" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Pronađi grešku" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Greške" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Otvori komandni prozor" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Osvježi status" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Pronađi greške u povratku" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Povrati na staro sve što pronađeš" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Učini nevažećim" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Prinudno pozovi invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Dodaj oznaku" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Dodaje oznaku ikone" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Preuzmi..-" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Preuzmi radnu kopiju" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Ažuriraj" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Obnovi radnu kopiju" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Pohrani" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Pohrani izmjene u skladište" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Preglednik skladišta" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Pregledaj stablo skladišta" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Provjeri izmjene..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Provjeri izmjene napravljene u skladištu" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Izbornik razlika..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Popis opcija usporedbe" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Prikaži razliku prema osnovi" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Pogledaj izmjene datoteke" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Pogledaj razlike između datoteka/mapa" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Pogledaj razliku između dvije datoteke" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Pogedaj razliku od prošle inačice" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Pogledaj izmjene u datoteci od zadnje promjene" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Usporedi s osnovnom" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "Usporedi s osnovom koristeći usporedni alat (jedan do drugog)" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Usporedi datoteke/mape" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Usporedi razlike između dvije stavke" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Usporedi s prethodnom inačicom" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "Usporedi s prošlom revizijom" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Pokaži promjene..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Prikaži promjene između staza i revizija" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Prikaži dnevnik" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Pokazuje informacije iz dnevnika za datoteku" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Dodaj" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Rasporedi stavke za dodavanje u skladište" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Dodaj na listu zanemarenih" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Obnovi na reviziju..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Obnavlja datoteku na određenu reviziju" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Promijeni ime..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Priloži stavku za promjenu imena u skladištu" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Obriši" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Pripremi stavku kako bi se obrisala iz skladišta" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Vrati izvorno" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Vrati na staro stavku - poništi promjene" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Razriješi" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Označi razriješenom stavku u sukobu" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Vrati" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Vrati nedostajeće" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Premjesti..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Premjesti radnu kopiju na drugi poslužitelj" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Zaključaj..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Lokalno zaključava stavke" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Oslobodi..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Otključaj stavku" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Očisti" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Očisti radnu kopiju" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Izvoz…" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "Izvezi radnu kopiju ili skladište bez informacije o verzijama" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Ovdje napravi skladište" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Napravi skladište u mapi" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Uvezi" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Uvezi stavku u skladište" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Grana/oznaka..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Kopiraj stavku na drugo mjesto unutar skladišta" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Zamijeni..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Zamijeni sidrište radne kopije u skladištu" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Stopi..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Čarobnjak s koracima za stapanje" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Označi..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Dodaj bilješke datoteci" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Napravi zakrpu..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "Napravi objedinjenu datoteku razlika sa svim vašim promjenama" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Primjeni zakrpu..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Primijenjuje datoteku objedinjenih razlika na radnu kopiju" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Svojstva" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Pogledaj svojstva stavke" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Pomoć" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Pogledaj pomoć" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Postavke" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Pogledaj ili promijeni RabiitVCS postavke" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "O programu" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "O RabiitVCS programu" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Otvori" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Otvori datoteku" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Pregledaj" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Pregledaj datoteku ili mapu" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Poništi promjene svojstva" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Vrati vrijednost svojstva na originalnu" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Poništi promjene svojstva (poniruće)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Vrati vrijednost svojstva na originalnu (poniruće)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Obriši svojstvo" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Obriši ovo svojstvo" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Obriši ovo svojstvo (poniruće)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Zanemari predmet po imenu" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Zanemari stavku prema nastavku" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Ažuriram..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Ažuriranje završeno" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Ažuriraj na inačicu" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Preuzmi" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Preuzimanje završeno" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Staza" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Proširenje" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Učitavanje..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Pronađeno %d stavaka" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Dodavanje..." #: ui/add.py:159 msgid "Completed Add" msgstr "Završeno dodavanje" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revizija:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Izvoz - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "URL skladišta i odredišna staza su obavezna polja." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Izvoz" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Izvoz u tijeku..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Izvoz završen" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Primijeni zakrpu" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Primijeni zakrpu na mapu..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Primjena zakrpe..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Zakrpa primijenjena" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Datum" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Poruka" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Uvezi - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "URL skladišta je obavezno polje." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Izrada uvoza u tijeku..." #: ui/import.py:89 msgid "Completed Import" msgstr "Završen uvoz" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Promijeni naziv" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Novo ime:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Polje novog imena je obavezno" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Promjena naziva u tijeku..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Promjena naziva završena" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Status teksta" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Status svojstva" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Pohranjivanje u tijeku..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Pohrana završena" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Pogedaj razliku usporedno" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Testiranje stapanja" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Završen test stapanja" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Izvršavanje stapanja" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Stapanje završeno" #: ui/merge.py:102 msgid "Merge" msgstr "Stopi" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Dogodila se greška u RabbitVCS Nautilus proširenju. Molimo javite RabbitVCS timu detalje greške:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Odaberi mapu" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "do" #: ui/dialog.py:261 msgid "Select a File" msgstr "Odaberi datoteku" #: ui/dialog.py:280 msgid "Save As..." msgstr "Spremi kao..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Da li sigurno želite nastaviti?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "odabrana(e) stavka(e)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Mapa je dodana u skladište" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Izvršavanje vraćanja...." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Vraćanje završeno" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Polja url-ova su obavezna." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Premjesti" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Izvršava se premještanje..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Završeno premještanje" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Inačica" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Vidi ukupnu razliku" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Usporedi jedno do drugog" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Izvršavanje razriješavanja..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Razriješavanje završeno" #: ui/changes.py:49 msgid "More Actions..." msgstr "Više akcija..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Promijeni" #: ui/changes.py:279 msgid "Property Change" msgstr "Promjena svojstva" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Da" #: ui/changes.py:321 msgid "No" msgstr "Ne" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Otvori iz prve revizije" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Otvori iz druge revizije" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Ne možete označiti mapu" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Označi - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Redak" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Tekst" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Polje inačice treba sadržavati broj" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Dnevnik - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "Nije primjenjivo" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Akcija" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopiraj sa staze" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopiraj iz inačice" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Pogledaj razliku u odnosu na radnu kopiju" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Pogledaj razliku između inačica" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Usporedi s radnom kopijlom" #: ui/log.py:806 msgid "Compare revisions" msgstr "Usporedi inačice" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Pogledaj razlike između revizija" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Uredi autora..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Uredi poruku dnevnika..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Uredi svojstva revizije..." #: ui/log.py:1047 msgid "Edit author" msgstr "Uredi autora" #: ui/log.py:1059 msgid "Edit log message" msgstr "Uredi poruku dnevnika" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Napoznato" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Engleski" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Odaberite program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Da li ste sigurni da želite očistiti staze skladišta?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Skladišne staze očišćene" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Da li se sigruni da želite očistiti vaše prethodne poruke?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Prethodne poruke očišćene" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Da li sigurno želite očistiti vaše autentikacijske podatke?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Autentikacijski podaci očišćeni" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "U nemogućnosti pribaviti popis svojstava" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Trebate odabrati odredišnu stazu." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Grana/oznaka" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Izrada grane/oznake" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Završena izrada grane/oznake" #: ui/lock.py:73 msgid "Locked" msgstr "Zaključano" #: ui/lock.py:167 msgid "Get Lock" msgstr "Zaključaj" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Zaključavanje..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Zaključano" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Lokacija skladišta je obavezno polje." #: ui/switch.py:80 msgid "Switch" msgstr "Zamijeni" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Zamijena u tijeku" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Zamjena izvršena" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "najnovije" #: ui/widget.py:860 msgid "Number" msgstr "Broj" #: ui/widget.py:861 msgid "Working Copy" msgstr "Radna verzija" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Poslužitelj" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Preuzimanje - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Preuzimanje u tijeku..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Naziv" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Izradi zakrpu" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Odabrana staza nije radna kopija" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Izrada zakrpe..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Zakrpa napravljena" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Svojstva - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Vrijednost" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Snimanje svojstava nije uspjelo." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Napomena: promjene svojstava se primjenjuju odmah. Možete provjeriti " "i poništiti promjene koristeći skočni izbornik za svaku stavku.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Želite li obrisati označena svojstva iz svih datatoteka \n" "i poddirektorija u ovoj mapi?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Datoteka nije pod sustavom kontrola verzija." #: ui/property_editor.py:112 msgid "Reserved" msgstr "Rezervirano" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Nije moguće postaviti novu vrijednost stvojstva." #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Mime tip" #: ui/action.py:338 msgid "Finished" msgstr "Završeno" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Završeno" #: ui/action.py:365 msgid "Log Message" msgstr "Komentar za dnevnik" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Otključaj" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Otključavanje u tijeku..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Otključavanje završeno" #: ui/browser.py:89 msgid "Size" msgstr "Veličina" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Napravi mapu..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Kopiraj u..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Kopiraj URL u spremnik" #: ui/browser.py:363 msgid "Move to..." msgstr "Premjesti..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Gdje želite kopirati odabrano?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nova lokacija:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Gdje želite premjestiti odabrano?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Čišćenje..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Završeno čišćenje" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Skladište uspješno napravljeno" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Dogodila se pogreška prilikom kreiranja skladišta. Provjerite da li je " "odabrana mapa prazna." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Svojstva za:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Odabrana svojstva biti će primijenjena ponirući." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Obriši svojstva ponirući" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Uredi..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Novo..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL staza:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Osvježi" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Dodaj poruku" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Detalji o certifikatu" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Uredi vrijednost svojstva" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Ime mape" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Poruka" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Molim dopunite svojim autentikacijskim podacima" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Molimo, postavite dateteku s ssl certifikatom" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Prethodne poruke" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Da li sigurno želite obrisati %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "RabbitVCS greška" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Prihvati za stalno" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Prihvati za ovaj put" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Primijeni svojstvo ponirući" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Prijava" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Provjeri certifikat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Potvrda" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Izradi mapu..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Potvrda brisanja" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Uskrati" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Otisak prsta:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Izdavač:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Login:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Zaporka:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Putanja:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Prethodne poruke" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Svojstvo" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Svojstvo:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS greška" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Područje:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL Client Certification" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Spremi autentikaciju" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Promjena teksta" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Stavke će biti biti prebačeni u smeće" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Ispravno:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Vrijednost:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Poveznice" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informacija o verziji" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autori:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Zahvale:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "Datoteka(e) promjene (dvoklik za usporedbu s osnovom)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tablica inačica" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Ograničenje:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Dnevnik" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Osvježi" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Prikazuje inačice:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Zaustavi se na kopiranju" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Potrebno je čišćenje...\n" "\n" "Da li želite pokrenuti čišćenje?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Prijava korisnika" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Poruke dnevnika" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Mogućnosti dnevnika" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Program za usporedbu datoteka" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL Povijest" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Pregledaj..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Izbriši podatke za prijavu korisnika" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Omogući oznake" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Omogući svojstva datoteka" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Omogući poniruću provjeru statusa" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Vanjski programi" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Općenito" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Jezik:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Pisanje dnevnika" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Najmanja razina logiranja" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Broj zapamćenih URL-ova" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Broj spremljenih poruka" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Spremljeni podaci" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Prikaži RabbitVCS alate za traženje grešaka (debugging)" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "Debug izbornik se koristi za traženje grešaka unutar RabbitVCSa" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tip:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Datoteke za zaključavanje" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Molim opišite zašto zaključavate ove datoteke" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Zaključaj datoteke" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Označi sve / Makni sve oznake" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Preuzmi lokote" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Od inančice" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Do inačice" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Pribilježi" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Promijenjene datoteke (dvoklik za usporedbu s osnovom)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Pohrani u:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Prikaži datoteke bez verzije" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Obavijesne poruke" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "Udaljeni URI:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Radna kopija:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Dodaj novo svojstvo" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Zatvori dijalog." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Editor za svojstva" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Osvježi popis svojstava." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Promijeni skladište za radnu kopiju" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Od:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Do:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Mogućnosti" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Inačica" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Preskoči vanjska skladišta" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Ponirući" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Uvoz poruke" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Skladište" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Uključi zanemarene datoteke" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Od URL-a" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Do: (URL i inačica za stapanje)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Raspon inačica" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Do: (URL i inačica za stapanje)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL od kojeg stapamo" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Radna kopija" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Odaberite ovu metodu ako imate neke promjene u grani i želite stopiti svoje " "promjene s drugom granom." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Odaberite ovu metodu ako želite stopiti dvije različite grane u vašu radnu " "kopiju." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Zanemari porijeklo" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Pomoćnik stapanja" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Stopi raspon inačica" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Stopi dva različita stabla" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Samo zabilježi stapanje" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Prikaži dnevnik" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test stapanja" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Koristite dnevnik za odabir revizija koje želite stopiti. Možete i upisati " "revizije odvojene zarezima, a raspon revizija je moguće upisati koristeći " "crticu '-'. \n" "\n" "Primjer: 4-7,9,11,15-HEAD\n" "\n" "Za stapanje svih revizija, polje ostavite nepopunjeno." rabbitvcs-0.18/po/hu.po000066400000000000000000001542331362112712700150250ustar00rootroot00000000000000# Hungarian translation of rabbit-vcs # Copyright (C) 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the rabbit-vcs-package. # Laszlo Csordas , 2010. # Sándor Petrovics, 2018 msgid "" msgstr "" "Project-Id-Version: rabbit-vcs 0.17.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-08 20:40+0100\n" "PO-Revision-Date: 2018-02-10 21:00+0100\n" "Last-Translator: csola48 \n" "Language-Team: hungarian \n" "Language: hu_HU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Poedit 1.8.7.1\n" "X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-Basepath: ..\n" "X-Poedit-SearchPath-0: .\n" #: clients/caja/RabbitVCS.py:218 clients/nautilus-3.0/RabbitVCS.py:214 #: clients/nautilus/RabbitVCS.py:145 clients/nemo/RabbitVCS.py:214 #: extension/RabbitVCS.py:214 msgid "RVCS Status" msgstr "RVCS Állapot" #: clients/caja/RabbitVCS.py:224 clients/nautilus-3.0/RabbitVCS.py:220 #: clients/nautilus/RabbitVCS.py:151 clients/nemo/RabbitVCS.py:220 #: extension/RabbitVCS.py:220 msgid "RVCS Revision" msgstr "RVCS Revizió" #: clients/caja/RabbitVCS.py:230 clients/nautilus-3.0/RabbitVCS.py:226 #: clients/nautilus/RabbitVCS.py:157 clients/nemo/RabbitVCS.py:226 #: extension/RabbitVCS.py:226 msgid "RVCS Author" msgstr "RVCS Szerző" #: clients/caja/RabbitVCS.py:236 clients/nautilus-3.0/RabbitVCS.py:232 #: clients/nautilus/RabbitVCS.py:163 clients/nemo/RabbitVCS.py:232 #: extension/RabbitVCS.py:232 msgid "RVCS Age" msgstr "RVCS Életkor" #: clients/gedit/rabbitvcs-plugin.py:456 msgid "Ignore by File Name" msgstr "Mellőzés fájlnév szerint" #: clients/gedit/rabbitvcs-plugin.py:457 rabbitvcs/util/contextmenuitems.py:737 msgid "Ignore item by filename" msgstr "Tétel mellőzése fájl név szerint" #: clients/gedit/rabbitvcs-plugin.py:461 msgid "Ignore by File Extension" msgstr "Mellőzés fájlkiterjesztés szerint" #: clients/gedit/rabbitvcs-plugin.py:462 msgid "Ignore item by extension" msgstr "Tétel mellőzése kiterjesztés szerint" #: rabbitvcs/services/statuschecker.py:40 msgid "Simple status checker" msgstr "Egyszerű állapot-ellenőrző" #: rabbitvcs/ui/__init__.py:57 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" "A --vcs [svn|git] opció használatával meg kell adnia egy verziókövető " "rendszer" #: rabbitvcs/ui/action.py:120 rabbitvcs/ui/log.py:390 rabbitvcs/ui/log.py:676 msgid "Action" msgstr "Esemény" #: rabbitvcs/ui/action.py:120 rabbitvcs/ui/add.py:80 rabbitvcs/ui/browser.py:90 #: rabbitvcs/ui/changes.py:280 rabbitvcs/ui/changes.py:381 #: rabbitvcs/ui/checkmods.py:109 rabbitvcs/ui/checkmods.py:172 #: rabbitvcs/ui/commit.py:84 rabbitvcs/ui/createpatch.py:89 #: rabbitvcs/ui/lock.py:71 rabbitvcs/ui/log.py:390 rabbitvcs/ui/log.py:676 #: rabbitvcs/ui/markresolved.py:62 rabbitvcs/ui/revert.py:74 #: rabbitvcs/ui/stage.py:65 rabbitvcs/ui/unlock.py:62 #: rabbitvcs/ui/unstage.py:64 msgid "Path" msgstr "Útvonal" #: rabbitvcs/ui/action.py:120 msgid "Mime Type" msgstr "Mime típus" #: rabbitvcs/ui/action.py:376 msgid "Finished" msgstr "Befejezve" #: rabbitvcs/ui/action.py:380 #, python-format msgid "%s - Finished" msgstr "%s - Befejezve" #: rabbitvcs/ui/action.py:403 msgid "Log Message" msgstr "Napló bejegyzés" #: rabbitvcs/ui/add.py:80 rabbitvcs/ui/checkmods.py:109 #: rabbitvcs/ui/checkmods.py:172 rabbitvcs/ui/commit.py:84 #: rabbitvcs/ui/createpatch.py:89 rabbitvcs/ui/lock.py:71 #: rabbitvcs/ui/markresolved.py:62 rabbitvcs/ui/revert.py:74 #: rabbitvcs/ui/stage.py:65 rabbitvcs/ui/unlock.py:62 #: rabbitvcs/ui/unstage.py:64 msgid "Extension" msgstr "Kiterjesztés" #: rabbitvcs/ui/add.py:103 rabbitvcs/ui/commit.py:130 rabbitvcs/ui/lock.py:112 #: rabbitvcs/ui/push.py:119 rabbitvcs/ui/revert.py:107 #: rabbitvcs/ui/unlock.py:86 msgid "Loading..." msgstr "Betöltés..." #: rabbitvcs/ui/add.py:125 rabbitvcs/ui/commit.py:267 rabbitvcs/ui/lock.py:115 #: rabbitvcs/ui/revert.py:111 rabbitvcs/ui/unlock.py:110 #, python-format msgid "Found %d item(s)" msgstr "%d elemet talált" #: rabbitvcs/ui/add.py:208 rabbitvcs/ui/add.py:233 rabbitvcs/ui/branches.py:281 #: rabbitvcs/ui/tags.py:270 rabbitvcs/ui/widget.py:1368 #: rabbitvcs/util/contextmenuitems.py:450 msgid "Add" msgstr "Hozzáadás" #: rabbitvcs/ui/add.py:209 rabbitvcs/ui/add.py:234 msgid "Running Add Command..." msgstr "Hozzáadás parancs fut..." #: rabbitvcs/ui/add.py:211 rabbitvcs/ui/add.py:236 msgid "Completed Add" msgstr "Hozzáadás befejezve" #: rabbitvcs/ui/annotate.py:58 msgid "Cannot annotate a directory" msgstr "Nem lehet jegyzetet fűzni a könyvtárhoz" #: rabbitvcs/ui/annotate.py:64 #, python-format msgid "Annotate - %s" msgstr "Jegyzet - %s" #: rabbitvcs/ui/annotate.py:126 rabbitvcs/ui/annotate.py:227 msgid "Line" msgstr "Sor" #: rabbitvcs/ui/annotate.py:126 rabbitvcs/ui/annotate.py:227 #: rabbitvcs/ui/browser.py:90 rabbitvcs/ui/checkmods.py:174 #: rabbitvcs/ui/log.py:51 rabbitvcs/ui/log.py:373 rabbitvcs/ui/log.py:660 #: rabbitvcs/ui/widget.py:971 msgid "Revision" msgstr "Revízió" #: rabbitvcs/ui/annotate.py:126 rabbitvcs/ui/annotate.py:227 #: rabbitvcs/ui/browser.py:90 rabbitvcs/ui/checkmods.py:174 #: rabbitvcs/ui/log.py:53 rabbitvcs/ui/log.py:373 rabbitvcs/ui/log.py:660 msgid "Author" msgstr "Szerző" #: rabbitvcs/ui/annotate.py:127 rabbitvcs/ui/annotate.py:228 #: rabbitvcs/ui/browser.py:90 rabbitvcs/ui/dialog.py:53 rabbitvcs/ui/log.py:52 #: rabbitvcs/ui/log.py:374 rabbitvcs/ui/log.py:661 rabbitvcs/ui/push.py:77 msgid "Date" msgstr "Dátum" #: rabbitvcs/ui/annotate.py:127 rabbitvcs/ui/annotate.py:228 msgid "Text" msgstr "Szöveg" #: rabbitvcs/ui/annotate.py:142 msgid "The from revision field must be an integer" msgstr "A revízió mező egész szám kell legyen" #: rabbitvcs/ui/applypatch.py:58 rabbitvcs/ui/applypatch.py:117 #: rabbitvcs/ui/applypatch.py:147 msgid "Apply Patch" msgstr "Hibajavítás alkalmazása" #: rabbitvcs/ui/applypatch.py:78 msgid "Apply Patch To Directory..." msgstr "Hibajavítás alkalmazása a könyvtárra" #: rabbitvcs/ui/applypatch.py:118 rabbitvcs/ui/applypatch.py:148 msgid "Applying Patch File..." msgstr "Hibajavító fájl alkalmazása..." #: rabbitvcs/ui/applypatch.py:120 rabbitvcs/ui/applypatch.py:150 msgid "Patch File Applied" msgstr "Hibajavító fájl alkalmazva" #: rabbitvcs/ui/branch.py:93 msgid "You must supply a destination path." msgstr "Meg kell adni a végcél útvonalat." #: rabbitvcs/ui/branch.py:109 msgid "Branch/tag" msgstr "Ágak/címkék..." #: rabbitvcs/ui/branch.py:110 msgid "Running Branch/tag Command..." msgstr "Branch/tag parancs fut..." #: rabbitvcs/ui/branch.py:112 msgid "Completed Branch/tag" msgstr "Branch/tag parancs befejezve" #: rabbitvcs/ui/branches.py:66 msgid "Branch Manager" msgstr "Ágkezelő" #: rabbitvcs/ui/branches.py:67 msgid "Branches" msgstr "Ágak" #: rabbitvcs/ui/branches.py:77 rabbitvcs/ui/widget.py:972 msgid "Branch" msgstr "Ág" #: rabbitvcs/ui/branches.py:101 rabbitvcs/ui/tags.py:96 msgid "Name:" msgstr "Név:" #: rabbitvcs/ui/branches.py:111 msgid "Start Point:" msgstr "Kezdőpont:" #: rabbitvcs/ui/branches.py:130 msgid "Keep old branch's history" msgstr "Régi ágelőzmények megtartása" #: rabbitvcs/ui/branches.py:139 msgid "Set as active branch" msgstr "Beállítás aktív ágként" #: rabbitvcs/ui/branches.py:148 rabbitvcs/ui/branches.py:298 #: rabbitvcs/ui/tags.py:142 rabbitvcs/ui/tags.py:281 msgid "Save" msgstr "Mentés" #: rabbitvcs/ui/branches.py:156 rabbitvcs/ui/merge.py:510 #: rabbitvcs/ui/tags.py:106 rabbitvcs/ui/tags.py:173 msgid "Revision:" msgstr "Revízió:" #: rabbitvcs/ui/branches.py:168 rabbitvcs/ui/merge.py:522 #: rabbitvcs/ui/tags.py:125 rabbitvcs/ui/tags.py:185 msgid "Message:" msgstr "Üzenet:" #: rabbitvcs/ui/branches.py:214 rabbitvcs/ui/remotes.py:123 #: rabbitvcs/ui/tags.py:227 #, python-format msgid "Are you sure you want to delete %s?" msgstr "Biztos, hogy törölni akarja ezt: %s?" #: rabbitvcs/ui/branches.py:287 msgid "Add Branch" msgstr "Ág hozzáadása" #: rabbitvcs/ui/branches.py:312 msgid "Branch Detail" msgstr "Ág részletei" #: rabbitvcs/ui/browser.py:90 msgid "Size" msgstr "Méret" #: rabbitvcs/ui/browser.py:326 msgid "Select" msgstr "Kijelölés" #: rabbitvcs/ui/browser.py:347 msgid "Create folder..." msgstr "Mappa létrehozása..." #: rabbitvcs/ui/browser.py:352 msgid "Copy to..." msgstr "Másolás..." #: rabbitvcs/ui/browser.py:357 msgid "Copy URL to clipboard" msgstr "URL másolása a vágólapra" #: rabbitvcs/ui/browser.py:362 msgid "Move to..." msgstr "Áthelyezés..." #: rabbitvcs/ui/browser.py:471 rabbitvcs/ui/rename.py:54 #: rabbitvcs/ui/rename.py:86 rabbitvcs/ui/rename.py:115 msgid "Rename" msgstr "Átnevezés" #: rabbitvcs/ui/browser.py:471 rabbitvcs/ui/rename.py:54 msgid "New Name:" msgstr "Új név:" #: rabbitvcs/ui/browser.py:532 msgid "Where do you want to copy the selection?" msgstr "Hová akarja másolni a kijelölést?" #: rabbitvcs/ui/browser.py:533 rabbitvcs/ui/browser.py:562 msgid "New Location:" msgstr "Új hely:" #: rabbitvcs/ui/browser.py:561 msgid "Where do you want to move the selection?" msgstr "Hová akarja áthelyezni a kijelölést?" #: rabbitvcs/ui/changes.py:51 msgid "More Actions..." msgstr "További műveletek..." #: rabbitvcs/ui/changes.py:52 rabbitvcs/ui/checkmods.py:252 msgid "View unified diff" msgstr "Egységes összehasonlító nézet" #: rabbitvcs/ui/changes.py:280 rabbitvcs/ui/changes.py:381 msgid "Change" msgstr "Változás" #: rabbitvcs/ui/changes.py:280 msgid "Property Change" msgstr "Tulajdonság változása" #: rabbitvcs/ui/changes.py:325 rabbitvcs/ui/lock.py:123 msgid "Yes" msgstr "Igen" #: rabbitvcs/ui/changes.py:325 msgid "No" msgstr "Nem" #: rabbitvcs/ui/changes.py:427 msgid "Open from first revision" msgstr "Az első revízió megnyitása" #: rabbitvcs/ui/changes.py:432 msgid "Open from second revision" msgstr "A második revízió megnyitása" #: rabbitvcs/ui/changes.py:437 msgid "View unified diff(s)" msgstr "Egységes összehasonlító nézet" #: rabbitvcs/ui/changes.py:442 rabbitvcs/ui/checkmods.py:257 msgid "Compare side by side" msgstr "Párhuzamos összehasonlítás" #: rabbitvcs/ui/checkmods.py:109 rabbitvcs/ui/property_editor.py:113 msgid "Status" msgstr "Állapot" #: rabbitvcs/ui/checkmods.py:173 rabbitvcs/ui/commit.py:85 #: rabbitvcs/ui/createpatch.py:90 rabbitvcs/ui/markresolved.py:63 msgid "Text Status" msgstr "Szöveg állapot" #: rabbitvcs/ui/checkmods.py:173 rabbitvcs/ui/commit.py:85 #: rabbitvcs/ui/createpatch.py:90 rabbitvcs/ui/markresolved.py:63 msgid "Property Status" msgstr "Tulajdonság állapot" #: rabbitvcs/ui/checkout.py:132 rabbitvcs/ui/checkout.py:206 #, python-format msgid "Checkout - %s" msgstr "Lecsekkolás - %s" #: rabbitvcs/ui/checkout.py:156 rabbitvcs/ui/clone.py:59 #: rabbitvcs/ui/export.py:73 rabbitvcs/ui/export.py:142 msgid "The repository URL and destination path are both required fields." msgstr "A tároló URL és a végcél útvonal mezőket ki kell tölteni." #: rabbitvcs/ui/checkout.py:166 rabbitvcs/ui/updateto.py:138 msgid "Checkout" msgstr "Ellenőrzés" #: rabbitvcs/ui/checkout.py:167 msgid "Running Checkout Command..." msgstr "Ellenőrzés parancs fut..." #: rabbitvcs/ui/checkout.py:177 rabbitvcs/ui/updateto.py:145 msgid "Completed Checkout" msgstr "Ellenőrzés befejezve" #: rabbitvcs/ui/clean.py:67 rabbitvcs/util/contextmenuitems.py:692 msgid "Clean" msgstr "Tisztítás" #: rabbitvcs/ui/clean.py:68 msgid "Running Clean Command..." msgstr "Tisztítás parancs fut..." #: rabbitvcs/ui/clean.py:78 msgid "Completed Clean" msgstr "Tisztítás befejezve" #: rabbitvcs/ui/cleanup.py:56 rabbitvcs/util/contextmenuitems.py:514 msgid "Cleanup" msgstr "Tisztítás" #: rabbitvcs/ui/cleanup.py:57 msgid "Cleaning Up..." msgstr "Tisztítás..." #: rabbitvcs/ui/cleanup.py:59 msgid "Completed Cleanup" msgstr "Tisztítás befejezve" #: rabbitvcs/ui/clone.py:48 rabbitvcs/ui/clone.py:67 #: rabbitvcs/util/contextmenuitems.py:662 msgid "Clone" msgstr "Klónozás" #: rabbitvcs/ui/clone.py:68 msgid "Running Clone Command..." msgstr "Klónozásás parancs fut..." #: rabbitvcs/ui/clone.py:75 msgid "Completed Clone" msgstr "Klónozás befejezve" #: rabbitvcs/ui/commit.py:314 rabbitvcs/ui/commit.py:382 #: rabbitvcs/ui/commit.py:445 rabbitvcs/util/contextmenuitems.py:358 msgid "Commit" msgstr "Beküldés" #: rabbitvcs/ui/commit.py:315 rabbitvcs/ui/commit.py:383 #: rabbitvcs/ui/commit.py:446 msgid "Running Commit Command..." msgstr "Beküldés parancs fut..." #: rabbitvcs/ui/commit.py:328 rabbitvcs/ui/commit.py:392 #: rabbitvcs/ui/commit.py:455 msgid "Completed Commit" msgstr "Beküldés befejezve" #: rabbitvcs/ui/commit.py:409 msgid "Close Branch" msgstr "Ág lezárasa" #: rabbitvcs/ui/create.py:52 msgid "Repository successfully created" msgstr "Tároló sikeresen létrehozva" #: rabbitvcs/ui/create.py:54 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "Hiba a tároló készítésekor. Győződjön meg róla, hogy a mappa üres." #: rabbitvcs/ui/create.py:68 rabbitvcs/util/contextmenuitems.py:657 msgid "Initialize Repository" msgstr "A tároló inicializálása" #: rabbitvcs/ui/create.py:69 msgid "Setting up repository..." msgstr "Tároló beállítása..." #: rabbitvcs/ui/create.py:71 msgid "Completed repository setup" msgstr "Tároló beállítása befejeződött" #: rabbitvcs/ui/createpatch.py:69 rabbitvcs/ui/createpatch.py:121 #: rabbitvcs/ui/createpatch.py:168 rabbitvcs/ui/createpatch.py:235 msgid "Create Patch" msgstr "Hibajavítás készítése" #: rabbitvcs/ui/createpatch.py:82 msgid "The given path is not a working copy" msgstr "A megadott útvonal nem a munkapéldányé." #: rabbitvcs/ui/createpatch.py:169 rabbitvcs/ui/createpatch.py:236 msgid "Creating Patch File..." msgstr "Hibajavító fájl készítése..." #: rabbitvcs/ui/createpatch.py:199 rabbitvcs/ui/createpatch.py:265 msgid "Patch File Created" msgstr "Hibajavító fájl elkészítve" #: rabbitvcs/ui/dialog.py:37 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Egy hiba történt a RabbitVCS Nautilus kiterjesztésben. Vegye fel a " "kapcsolatot RabbitVCS team a hiba alábbi részletes " "leírásával:" #: rabbitvcs/ui/dialog.py:53 rabbitvcs/ui/log.py:374 rabbitvcs/ui/log.py:661 #: rabbitvcs/ui/push.py:77 msgid "Message" msgstr "Üzenet" #: rabbitvcs/ui/dialog.py:107 msgid "Select a Folder" msgstr "Dosszié kiválasztása" #: rabbitvcs/ui/dialog.py:137 msgid "to" msgstr "eddig" #: rabbitvcs/ui/dialog.py:277 msgid "Select a File" msgstr "Fájl kiválasztása" #: rabbitvcs/ui/dialog.py:296 msgid "Save As..." msgstr "Mentés másként…" #: rabbitvcs/ui/dialog.py:315 msgid "Are you sure you want to continue?" msgstr "Biztos, hogy folytatni akarja?" #: rabbitvcs/ui/dialog.py:343 msgid "the selected item(s)" msgstr "a kiválasztott tétel/ek/" #: rabbitvcs/ui/dialog.py:414 msgid "Added a folder to the repository" msgstr "Dosszié hozzáadása a tárolóhoz" #: rabbitvcs/ui/diff.py:323 msgid "View diff as side-by-side comparison" msgstr "Összehasonlító nézet, mint párhuzamos összehasonlítás" #: rabbitvcs/ui/export.py:46 rabbitvcs/ui/export.py:125 #, python-format msgid "Export - %s" msgstr "Export - %s" #: rabbitvcs/ui/export.py:93 rabbitvcs/ui/export.py:162 msgid "Export" msgstr "Export" #: rabbitvcs/ui/export.py:94 rabbitvcs/ui/export.py:163 msgid "Running Export Command..." msgstr "Exportálás parancs fut..." #: rabbitvcs/ui/export.py:105 rabbitvcs/ui/export.py:171 msgid "Completed Export" msgstr "Exportálás befejezve" #: rabbitvcs/ui/ignore.py:101 msgid "Ignore file:" msgstr "Mellőzött fájl:" #: rabbitvcs/ui/import.py:41 #, python-format msgid "Import - %s" msgstr "Import - %s" #: rabbitvcs/ui/import.py:63 msgid "The repository URL field is required." msgstr "Tároló URL mező igényelt" #: rabbitvcs/ui/import.py:75 rabbitvcs/util/contextmenuitems.py:540 msgid "Import" msgstr "Import" #: rabbitvcs/ui/import.py:76 msgid "Running Import Command..." msgstr "Importálás parancs fut..." #: rabbitvcs/ui/import.py:84 msgid "Completed Import" msgstr "Importálás befejezve" #: rabbitvcs/ui/lock.py:72 rabbitvcs/vcs/svn/__init__.py:208 msgid "Locked" msgstr "Lezárva" #: rabbitvcs/ui/lock.py:158 msgid "Get Lock" msgstr "Zárolás" #: rabbitvcs/ui/lock.py:159 msgid "Running Lock Command..." msgstr "Zárolás parancs fut..." #: rabbitvcs/ui/lock.py:168 msgid "Completed Lock" msgstr "Zárolás befejezve" #: rabbitvcs/ui/log.py:126 #, python-format msgid "Log - %s" msgstr "Napló - %s" #: rabbitvcs/ui/log.py:305 rabbitvcs/ui/log.py:306 msgid "N/A" msgstr "N/A" #: rabbitvcs/ui/log.py:375 msgid "Color" msgstr "Szín" #: rabbitvcs/ui/log.py:391 msgid "Copy From Path" msgstr "Másolás az útvonalról" #: rabbitvcs/ui/log.py:391 msgid "Copy From Revision" msgstr "Másolás a revízióból" #: rabbitvcs/ui/log.py:660 msgid "Graph" msgstr "Grafikon" #: rabbitvcs/ui/log.py:972 msgid "View diff against working copy" msgstr "Összehasonlító nézet a munkapéldánnyal" #: rabbitvcs/ui/log.py:977 rabbitvcs/util/contextmenuitems.py:414 msgid "View diff against previous revision" msgstr "Összehasonlító nézet az előző revízióval" #: rabbitvcs/ui/log.py:982 msgid "View diff between revisions" msgstr "Összehasonlító nézet revíziók között" #: rabbitvcs/ui/log.py:987 msgid "Compare with working copy" msgstr "Összehasonlítás a munkapéldánnyal" #: rabbitvcs/ui/log.py:992 rabbitvcs/util/contextmenuitems.py:432 msgid "Compare with previous revision" msgstr "Összehasonlítás az előző revízióval" #: rabbitvcs/ui/log.py:997 msgid "Compare revisions" msgstr "Revíziók összehasonlítása" #: rabbitvcs/ui/log.py:1003 msgid "Show changes against previous revision" msgstr "Összehasonlító nézet az előző revízióval" #: rabbitvcs/ui/log.py:1009 msgid "Show changes between revisions" msgstr "Változások mutatása két revízió között" #: rabbitvcs/ui/log.py:1014 msgid "Update to this revision" msgstr "Frissítés erre a revizióra" #: rabbitvcs/ui/log.py:1015 msgid "Update the selected path to this revision" msgstr "A kijelölt útvonal frissítése erre a revizióra" #: rabbitvcs/ui/log.py:1020 msgid "Revert changes from this revision" msgstr "Módosítások visszavonása ebbő a revizióból" #: rabbitvcs/ui/log.py:1021 msgid "Update the selected path by reverse merging the changes" msgstr "A kijelölt útvonal frissítése a módosítások visszavonásával" #: rabbitvcs/ui/log.py:1026 msgid "Copy to clipboard" msgstr "Másolás a vágólapra" #: rabbitvcs/ui/log.py:1027 msgid "Copy to clipboard the full data of these revisions" msgstr "Ezen reviziók telejes adatállományának vágólapra másolása" #: rabbitvcs/ui/log.py:1031 rabbitvcs/ui/log.py:1035 msgid "Edit author..." msgstr "Szerző szerkesztése..." #: rabbitvcs/ui/log.py:1039 msgid "Edit log message..." msgstr "Napló üzenet szerkesztése..." #: rabbitvcs/ui/log.py:1043 msgid "Edit revision properties..." msgstr "Revízió tulajdonságok szerkesztése..." #: rabbitvcs/ui/log.py:1323 msgid "Edit author" msgstr "Szerző szerkesztése" #: rabbitvcs/ui/log.py:1335 msgid "Edit log message" msgstr "Napló üzenet szerkesztése" #: rabbitvcs/ui/markresolved.py:49 rabbitvcs/ui/markresolved.py:103 #: rabbitvcs/util/contextmenuitems.py:485 msgid "Mark as Resolved" msgstr "Megjelölés megoldottként" #: rabbitvcs/ui/markresolved.py:104 msgid "Running Resolved Command..." msgstr "Megoldva parancs fut..." #: rabbitvcs/ui/markresolved.py:107 msgid "Completed Mark as Resolved" msgstr "Megjelölés megoldottként befejezve" #: rabbitvcs/ui/merge.py:106 msgid "Running Merge Test" msgstr "Egyesítés teszt fut" #: rabbitvcs/ui/merge.py:107 msgid "Completed Merge Test" msgstr "Egyesítés teszt befejezve" #: rabbitvcs/ui/merge.py:109 msgid "Running Merge Command" msgstr "Egyesítés parancs fut" #: rabbitvcs/ui/merge.py:110 rabbitvcs/ui/merge.py:568 msgid "Completed Merge" msgstr "Egyesítés befejezve" #: rabbitvcs/ui/merge.py:121 rabbitvcs/ui/merge.py:561 msgid "Merge" msgstr "Egyesítés" #: rabbitvcs/ui/merge.py:476 msgid "No active branch" msgstr "Nincs aktív ág" #: rabbitvcs/ui/merge.py:487 msgid "Author:" msgstr "Szerző" #: rabbitvcs/ui/merge.py:499 rabbitvcs/ui/tags.py:162 msgid "Date:" msgstr "Dátum" #: rabbitvcs/ui/merge.py:562 msgid "Running Merge Command..." msgstr "Egyesítés parancs fut..." #: rabbitvcs/ui/properties.py:56 #, python-format msgid "Properties - %s" msgstr "Tulajdonságok - %s" #: rabbitvcs/ui/properties.py:64 rabbitvcs/ui/property_editor.py:113 #: rabbitvcs/ui/remotes.py:68 msgid "Name" msgstr "Név" #: rabbitvcs/ui/properties.py:64 rabbitvcs/ui/property_editor.py:113 msgid "Value" msgstr "Érték" #: rabbitvcs/ui/properties.py:153 rabbitvcs/ui/property_editor.py:157 #: rabbitvcs/ui/revprops.py:66 msgid "Unable to retrieve properties list" msgstr "Tulajdonság lista nem állítható helyre" #: rabbitvcs/ui/properties.py:174 msgid "There was a problem saving your properties." msgstr "Tulajdonságok mentésénél probléma adódott." #: rabbitvcs/ui/property_editor.py:57 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Figyelem: a tulajdonságok változása azonnal megtörténik. A helyi menü " "segítségével tételenként megtekintheti és visszavonhatja a változásokat.\n" #: rabbitvcs/ui/property_editor.py:62 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Törölni akarja a kiválasztott tulajdonságot minden fájlban ebben " "könyvtárban\n" "és alkönyvtáraiban?" #: rabbitvcs/ui/property_editor.py:103 msgid "File is not under version control." msgstr "Ez a fájl nincs verzió kontroll alatt." #: rabbitvcs/ui/property_editor.py:113 msgid "Reserved" msgstr "Fenntartva" #: rabbitvcs/ui/property_editor.py:181 msgid "Unable to set new value for property." msgstr "A tulajdonság új értékét nem lehet beállítani." #: rabbitvcs/ui/property_page.py:148 msgid "Repository URL" msgstr "Tároló URL" #: rabbitvcs/ui/push.py:100 rabbitvcs/util/contextmenuitems.py:672 msgid "Push" msgstr "Push" #: rabbitvcs/ui/push.py:101 msgid "Running Push Command..." msgstr "Push parancs fut..." #: rabbitvcs/ui/push.py:103 msgid "Completed Push" msgstr "Push befejezve" #: rabbitvcs/ui/push.py:161 msgid "No commits found" msgstr "Nincsenek commit-ok" #: rabbitvcs/ui/relocate.py:72 msgid "The from and to url fields are both required." msgstr "Az URL tartomány határainak megadása szükséges." #: rabbitvcs/ui/relocate.py:82 msgid "Relocate" msgstr "Áthelyez" #: rabbitvcs/ui/relocate.py:83 msgid "Running Relocate Command..." msgstr "Áthelyezés parancs fut..." #: rabbitvcs/ui/relocate.py:90 msgid "Completed Relocate" msgstr "Áthelyezés befejezve" #: rabbitvcs/ui/remotes.py:61 msgid "Remote Repository Manager" msgstr "Távoli tárolókezelő" #: rabbitvcs/ui/remotes.py:62 msgid "Remote Repositories" msgstr "Távoli tároló:" #: rabbitvcs/ui/remotes.py:68 msgid "Host" msgstr "Host" #: rabbitvcs/ui/rename.py:50 msgid "The requested file or folder does not exist." msgstr "A kért fájl vagy mappa nem létezik." #: rabbitvcs/ui/rename.py:62 msgid "The new name field is required" msgstr "Új név mező szükséges" #: rabbitvcs/ui/rename.py:87 rabbitvcs/ui/rename.py:116 msgid "Running Rename Command..." msgstr "Átnevezés parancs fut..." #: rabbitvcs/ui/rename.py:93 rabbitvcs/ui/rename.py:122 msgid "Completed Rename" msgstr "Átnevezés befejezve" #: rabbitvcs/ui/reset.py:97 rabbitvcs/util/contextmenuitems.py:696 msgid "Reset" msgstr "Alaphelyzet" #: rabbitvcs/ui/reset.py:98 msgid "Running Reset Command..." msgstr "Alaphelyzet parancs fut..." #: rabbitvcs/ui/reset.py:105 msgid "Completed Reset" msgstr "Alaphelyzetbe állítás kész" #: rabbitvcs/ui/revert.py:177 rabbitvcs/ui/revert.py:203 #: rabbitvcs/util/contextmenuitems.py:479 msgid "Revert" msgstr "Visszaállítás" #: rabbitvcs/ui/revert.py:178 rabbitvcs/ui/revert.py:204 msgid "Running Revert Command..." msgstr "Visszavonás parancs fut" #: rabbitvcs/ui/revert.py:180 rabbitvcs/ui/revert.py:206 msgid "Completed Revert" msgstr "Visszavonás befejezve" #: rabbitvcs/ui/settings.py:44 rabbitvcs/vcs/svn/__init__.py:222 msgid "Unknown" msgstr "Ismeretlen" #: rabbitvcs/ui/settings.py:46 msgid "There was an error communicating with the status checker service." msgstr "Hiba történt a státuszellenőrző szolgáltatással való kommunikációban" #: rabbitvcs/ui/settings.py:136 msgid "Config file:" msgstr "Beállítási fájl:" #: rabbitvcs/ui/settings.py:326 msgid "Select a program" msgstr "Program kiválasztása" #: rabbitvcs/ui/settings.py:335 msgid "Are you sure you want to clear your repository paths?" msgstr "Biztos, hogy akarja törölni a tároló útvonalakat?" #: rabbitvcs/ui/settings.py:342 msgid "Repository paths cleared" msgstr "Tároló útvonal törölve" #: rabbitvcs/ui/settings.py:346 msgid "Are you sure you want to clear your previous messages?" msgstr "Biztos, hogy akarja törölni a korábbi üzeneteket?" #: rabbitvcs/ui/settings.py:353 msgid "Previous messages cleared" msgstr "Előző üzenet törölve" #: rabbitvcs/ui/settings.py:357 msgid "Are you sure you want to clear your authentication information?" msgstr "Biztos, hogy akarja törölni a hitelesítési információt?" #: rabbitvcs/ui/settings.py:374 msgid "Authentication information cleared" msgstr "Hitelesítési információ törölve" #: rabbitvcs/ui/stage.py:51 rabbitvcs/ui/stage.py:103 #: rabbitvcs/util/contextmenuitems.py:701 msgid "Stage" msgstr "Stage" #: rabbitvcs/ui/stage.py:104 msgid "Running Stage Command..." msgstr "Stage parancs fut..." #: rabbitvcs/ui/stage.py:107 msgid "Completed Stage" msgstr "Stage kész" #: rabbitvcs/ui/switch.py:65 msgid "The repository location is a required field." msgstr "Tároló helye mező kitöltése kötelező." #: rabbitvcs/ui/switch.py:75 msgid "Switch" msgstr "Átváltás" #: rabbitvcs/ui/switch.py:76 msgid "Running Switch Command..." msgstr "Átváltás parancs fut..." #: rabbitvcs/ui/switch.py:84 msgid "Completed Switch" msgstr "Átváltás kész" #: rabbitvcs/ui/tags.py:64 msgid "Tag Manager" msgstr "Címkekezelő" #: rabbitvcs/ui/tags.py:65 msgid "Tags" msgstr "Címkék" #: rabbitvcs/ui/tags.py:76 msgid "Tag" msgstr "Címke" #: rabbitvcs/ui/tags.py:150 msgid "Tagger:" msgstr "Címkéző:" #: rabbitvcs/ui/tags.py:272 msgid "Add Tag" msgstr "Üzenet hozzáadása" #: rabbitvcs/ui/tags.py:290 msgid "Tag Detail" msgstr "Címke részletei" #: rabbitvcs/ui/unlock.py:49 rabbitvcs/ui/unlock.py:128 msgid "Unlock" msgstr "Nyitás" #: rabbitvcs/ui/unlock.py:129 msgid "Running Unlock Command..." msgstr "Nyitás parancs fut..." #: rabbitvcs/ui/unlock.py:132 msgid "Completed Unlock" msgstr "Nyitás befejezve" #: rabbitvcs/ui/unstage.py:51 rabbitvcs/ui/unstage.py:102 #: rabbitvcs/util/contextmenuitems.py:706 msgid "Unstage" msgstr "Unstage" #: rabbitvcs/ui/unstage.py:103 msgid "Running Unstage Command..." msgstr "Unstage parancs fut..." #: rabbitvcs/ui/unstage.py:106 msgid "Completed Unstage" msgstr "Unstage befejezve" #: rabbitvcs/ui/update.py:54 rabbitvcs/ui/update.py:102 #: rabbitvcs/util/contextmenuitems.py:352 msgid "Update" msgstr "Frissítés" #: rabbitvcs/ui/update.py:55 rabbitvcs/ui/update.py:103 #: rabbitvcs/ui/updateto.py:92 msgid "Updating..." msgstr "Frissítés..." #: rabbitvcs/ui/update.py:57 rabbitvcs/ui/update.py:121 #: rabbitvcs/ui/updateto.py:100 msgid "Completed Update" msgstr "Frissítés befejezve" #: rabbitvcs/ui/updateto.py:80 msgid "Rollback To Revision" msgstr "Visszagörgetés revizióra" #: rabbitvcs/ui/updateto.py:81 msgid "Rolling Back..." msgstr "Visszagörgetés..." #: rabbitvcs/ui/updateto.py:89 msgid "Completed Rollback" msgstr "Visszagörgetés kész" #: rabbitvcs/ui/updateto.py:91 msgid "Update To Revision" msgstr "Revízió frissítése" #: rabbitvcs/ui/updateto.py:117 msgid "What revision/branch do you want to checkout?" msgstr "Melyik reviziót/ágat szeretné lecsekkolni?" #: rabbitvcs/ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "%s lecsekkol..." #: rabbitvcs/ui/widget.py:970 rabbitvcs/ui/widget.py:976 msgid "HEAD" msgstr "HEAD" #: rabbitvcs/ui/widget.py:977 msgid "Number" msgstr "Szám" #: rabbitvcs/ui/widget.py:980 msgid "Working Copy" msgstr "Munkapéldány" #: rabbitvcs/ui/widget.py:1205 msgid "Repository:" msgstr "Tároló" #: rabbitvcs/ui/widget.py:1224 msgid "Branch:" msgstr "Ág:" #: rabbitvcs/ui/widget.py:1250 msgid "Host:" msgstr "Host:" #: rabbitvcs/ui/widget.py:1363 msgid "Add line:" msgstr "Sor hozzáadása" #: rabbitvcs/util/contextmenuitems.py:304 msgid "Debug" msgstr "Hibakeresés" #: rabbitvcs/util/contextmenuitems.py:309 msgid "Bugs" msgstr "Program hiba" #: rabbitvcs/util/contextmenuitems.py:314 msgid "Open Shell" msgstr "Héjprogram megnyitása" #: rabbitvcs/util/contextmenuitems.py:320 msgid "Refresh Status" msgstr "Frissített állapot" #: rabbitvcs/util/contextmenuitems.py:325 msgid "Debug Revert" msgstr "Nyomkövetés visszafelé" #: rabbitvcs/util/contextmenuitems.py:326 msgid "Reverts everything it sees" msgstr "Minden látható visszavonása" #: rabbitvcs/util/contextmenuitems.py:332 msgid "Invalidate" msgstr "Érvénytelenítés" #: rabbitvcs/util/contextmenuitems.py:333 msgid "Force an invalidate_extension_info() call" msgstr "Egy érvénytelen kiterjesztés információ lehívásának kényszerítése" #: rabbitvcs/util/contextmenuitems.py:339 msgid "Add Emblem" msgstr "Jelkép hozzáadása" #: rabbitvcs/util/contextmenuitems.py:340 msgid "Add an emblem" msgstr "Egy jelkép hozzáadása" #: rabbitvcs/util/contextmenuitems.py:346 msgid "Checkout..." msgstr "Lecsekkolás..." #: rabbitvcs/util/contextmenuitems.py:347 msgid "Check out a working copy" msgstr "Munkapéldány ellenőrzése" #: rabbitvcs/util/contextmenuitems.py:353 msgid "Update a working copy" msgstr "Munkapéldány frissítése" #: rabbitvcs/util/contextmenuitems.py:359 msgid "Commit modifications to the repository" msgstr "Módosítás beküldése a tárolóba" #: rabbitvcs/util/contextmenuitems.py:364 msgid "RabbitVCS" msgstr "RabbitVCS" #: rabbitvcs/util/contextmenuitems.py:369 msgid "RabbitVCS SVN" msgstr "RabbitVCS SVN" #: rabbitvcs/util/contextmenuitems.py:374 msgid "RabbitVCS Git" msgstr "RabbitVCS Git" #: rabbitvcs/util/contextmenuitems.py:379 msgid "RabbitVCS Hg" msgstr "RabbitVCS Hg" #: rabbitvcs/util/contextmenuitems.py:384 msgid "Repository Browser" msgstr "Tároló böngészés" #: rabbitvcs/util/contextmenuitems.py:385 msgid "Browse a repository tree" msgstr "Tároló fa böngészése" #: rabbitvcs/util/contextmenuitems.py:390 msgid "Check for Modifications..." msgstr "Módosítások ellenőrzése..." #: rabbitvcs/util/contextmenuitems.py:391 msgid "Check for modifications made to the repository" msgstr "Tárolóhoz készített módosítások ellenőrzése" #: rabbitvcs/util/contextmenuitems.py:396 msgid "Diff Menu..." msgstr "Összehasonlító menü..." #: rabbitvcs/util/contextmenuitems.py:397 msgid "List of comparison options" msgstr "Összehasonlító lista beállítások" #: rabbitvcs/util/contextmenuitems.py:402 msgid "View diff against base" msgstr "Összehasonlító nézet a bázissal" #: rabbitvcs/util/contextmenuitems.py:403 msgid "View the modifications made to a file" msgstr "Fájlhoz készített módosítás nézete" #: rabbitvcs/util/contextmenuitems.py:408 msgid "View diff between files/folders" msgstr "Összehasonlító nézet fájlok/dossziék között" #: rabbitvcs/util/contextmenuitems.py:409 msgid "View the differences between two files" msgstr "Összehasonlító nézet két fájl között" #: rabbitvcs/util/contextmenuitems.py:415 msgid "View the modifications made to a file since its last change" msgstr "Egy fájl módosítások megtkintése az utolsó változás óta" #: rabbitvcs/util/contextmenuitems.py:420 msgid "Compare with base" msgstr "Összehasonlítás a bázissal" #: rabbitvcs/util/contextmenuitems.py:421 msgid "Compare with base using side-by-side comparison tool" msgstr "Összehasonlítás a bázissal a párhuzamos összehasonlító eszközzel" #: rabbitvcs/util/contextmenuitems.py:426 msgid "Compare files/folders" msgstr "Fájl/dosszié összehasonlítása" #: rabbitvcs/util/contextmenuitems.py:427 msgid "Compare the differences between two items" msgstr "Különbségek összehasonlítása két tétel között" #: rabbitvcs/util/contextmenuitems.py:433 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" "Összehasonlítás az előző revízió használatával a párhuzamos összehasonlító " "eszközzel" #: rabbitvcs/util/contextmenuitems.py:438 msgid "Show Changes..." msgstr "Változások mutatása..." #: rabbitvcs/util/contextmenuitems.py:439 msgid "Show changes between paths and revisions" msgstr "Változások mutatása az útvonal és a revízió között" #: rabbitvcs/util/contextmenuitems.py:444 msgid "Show Log" msgstr "Napló mutatása" #: rabbitvcs/util/contextmenuitems.py:445 msgid "Show a file's log information" msgstr "Fájl napló információ mutatása" #: rabbitvcs/util/contextmenuitems.py:451 msgid "Schedule items to be added to the repository" msgstr "A tárolóhoz hozzáadandó elemek ütemezése" #: rabbitvcs/util/contextmenuitems.py:456 msgid "Add to ignore list" msgstr "Hozzáadás a mellőzött fájl listához" #: rabbitvcs/util/contextmenuitems.py:461 msgid "Update to revision..." msgstr "Revíziófrissítés..." #: rabbitvcs/util/contextmenuitems.py:462 msgid "Update a file to a specific revision" msgstr "Egy fájl frissítése speciális revízióra" #: rabbitvcs/util/contextmenuitems.py:467 msgid "Rename..." msgstr "Átnevezés..." #: rabbitvcs/util/contextmenuitems.py:468 msgid "Schedule an item to be renamed on the repository" msgstr "A tárolóban átnevezendő elemek ütemezése" #: rabbitvcs/util/contextmenuitems.py:473 msgid "Delete" msgstr "Törlés" #: rabbitvcs/util/contextmenuitems.py:474 msgid "Schedule an item to be deleted from the repository" msgstr "A tárolóból törlendő elemek ütmezése" #: rabbitvcs/util/contextmenuitems.py:480 msgid "Revert an item to its unmodified state" msgstr "Egy tétel visszaállítás a módosítás elötti állapotára" #: rabbitvcs/util/contextmenuitems.py:486 msgid "Mark a conflicted item as resolved" msgstr "Egy konfliktusos tétel megoldottként való megjelölése" #: rabbitvcs/util/contextmenuitems.py:491 msgid "Restore" msgstr "Visszaállítva" #: rabbitvcs/util/contextmenuitems.py:492 msgid "Restore a missing item" msgstr "Hiányzó tétel visszaállítása" #: rabbitvcs/util/contextmenuitems.py:496 msgid "Relocate..." msgstr "Áthelyezés..." #: rabbitvcs/util/contextmenuitems.py:497 msgid "Relocate your working copy" msgstr "Munkapéldány áthelyezése" #: rabbitvcs/util/contextmenuitems.py:502 msgid "Get Lock..." msgstr "Zárolás..." #: rabbitvcs/util/contextmenuitems.py:503 msgid "Locally lock items" msgstr "Helyi zárolt tételek" #: rabbitvcs/util/contextmenuitems.py:508 msgid "Release Lock..." msgstr "Zárolás felodása..." #: rabbitvcs/util/contextmenuitems.py:509 msgid "Release lock on an item" msgstr "Egy tétel zárolásának feloldása" #: rabbitvcs/util/contextmenuitems.py:515 msgid "Clean up working copy" msgstr "Munkapéldány tisztítása" #: rabbitvcs/util/contextmenuitems.py:520 msgid "Export..." msgstr "Export..." #: rabbitvcs/util/contextmenuitems.py:521 msgid "Export a working copy or repository with no versioning information" msgstr "Egy munkapéldány vagy tároló exportálása verzióinformáció nélkül" #: rabbitvcs/util/contextmenuitems.py:534 msgid "Create Repository here" msgstr "Tároló készítése ide" #: rabbitvcs/util/contextmenuitems.py:535 msgid "Create a repository in a folder" msgstr "Tároló készítése ebben a mappában" #: rabbitvcs/util/contextmenuitems.py:541 msgid "Import an item into a repository" msgstr "Egy tétel importálása a tárolóba" #: rabbitvcs/util/contextmenuitems.py:550 msgid "Branch/tag..." msgstr "Ágak/címkék..." #: rabbitvcs/util/contextmenuitems.py:551 msgid "Copy an item to another location in the repository" msgstr "Egy tétel másolása másik helyre a tárolóban" #: rabbitvcs/util/contextmenuitems.py:556 msgid "Switch..." msgstr "Átváltás..." #: rabbitvcs/util/contextmenuitems.py:557 msgid "Change the repository location of a working copy" msgstr "Munkapéldány helyének megváltoztatása a tárolóban" #: rabbitvcs/util/contextmenuitems.py:562 msgid "Merge..." msgstr "Egyesítés..." #: rabbitvcs/util/contextmenuitems.py:563 msgid "A wizard with steps for merging" msgstr "Egyesítővarázsló" #: rabbitvcs/util/contextmenuitems.py:568 msgid "Annotate..." msgstr "Jegyzet..." #: rabbitvcs/util/contextmenuitems.py:569 msgid "Annotate a file" msgstr "Jegyzet egy fájlhoz" #: rabbitvcs/util/contextmenuitems.py:574 msgid "Create Patch..." msgstr "Hibajavítás készítése..." #: rabbitvcs/util/contextmenuitems.py:575 msgid "Creates a unified diff file with all changes you made" msgstr "" "Egységes összehasonlító fájl készítése, amely minden változást tartalmaz" #: rabbitvcs/util/contextmenuitems.py:580 msgid "Apply Patch..." msgstr "Hibajavítás alkalmazása..." #: rabbitvcs/util/contextmenuitems.py:581 msgid "Applies a unified diff file to the working copy" msgstr "Egységes összehasonlító fájl alkalmazása a munkapéldányban" #: rabbitvcs/util/contextmenuitems.py:586 msgid "Properties" msgstr "Tulajdonságok" #: rabbitvcs/util/contextmenuitems.py:587 msgid "View the properties of an item" msgstr "Egy tétel tulajdonságainak megtekintése" #: rabbitvcs/util/contextmenuitems.py:592 msgid "Help" msgstr "Súgó" #: rabbitvcs/util/contextmenuitems.py:593 msgid "View help" msgstr "Súgó megjelenítése" #: rabbitvcs/util/contextmenuitems.py:598 msgid "Settings" msgstr "Beállítások" #: rabbitvcs/util/contextmenuitems.py:599 msgid "View or change RabbitVCS settings" msgstr "RabbitVCS beállítások megtekintése vagy módosítása" #: rabbitvcs/util/contextmenuitems.py:604 msgid "About" msgstr "Névjegy" #: rabbitvcs/util/contextmenuitems.py:605 msgid "About RabbitVCS" msgstr "RabbitVCS névjegye" #: rabbitvcs/util/contextmenuitems.py:610 msgid "Open" msgstr "Megnyit" #: rabbitvcs/util/contextmenuitems.py:611 msgid "Open a file" msgstr "Fájl megnyitása" #: rabbitvcs/util/contextmenuitems.py:619 msgid "Browse to" msgstr "Böngészés" #: rabbitvcs/util/contextmenuitems.py:620 msgid "Browse to a file or folder" msgstr "Fájl vagy dosszié böngészése" #: rabbitvcs/util/contextmenuitems.py:625 msgid "Revert property" msgstr "Tulajdonság visszaállítása" #: rabbitvcs/util/contextmenuitems.py:627 msgid "Revert this property to its original state" msgstr "Eredeti tulajdonságok visszaállítása" #: rabbitvcs/util/contextmenuitems.py:631 msgid "Revert property (recursive)" msgstr "Tulajdonságok visszaállítása (rekurzívan)" #: rabbitvcs/util/contextmenuitems.py:633 msgid "Revert this property to its original state (recursive)" msgstr "Ezen tulajdonság eredeti állapotba való visszaállítása (rekurzívan)" #: rabbitvcs/util/contextmenuitems.py:638 msgid "Delete property" msgstr "Tulajdonság törlése" #: rabbitvcs/util/contextmenuitems.py:640 msgid "Delete this property" msgstr "Ezen tulajdonság törlése" #: rabbitvcs/util/contextmenuitems.py:644 msgid "Delete property (recursive)" msgstr "Tulajdonság törlése (rekurzívan)" #: rabbitvcs/util/contextmenuitems.py:646 msgid "Delete this property (recursive)" msgstr "Ezen tulajdonság törlése (rekurzívan)" #: rabbitvcs/util/contextmenuitems.py:651 msgid "Edit details" msgstr "Részletek szerkesztése" #: rabbitvcs/util/contextmenuitems.py:653 msgid "Show and edit property details" msgstr "Részletek megjelenítése és szerkesztése" #: rabbitvcs/util/contextmenuitems.py:667 msgid "Fetch/Pull" msgstr "Fetch/Pull" #: rabbitvcs/util/contextmenuitems.py:677 msgid "Branches" msgstr "Ágak" #: rabbitvcs/util/contextmenuitems.py:682 msgid "Tags" msgstr "Címkék" #: rabbitvcs/util/contextmenuitems.py:687 msgid "Remotes" msgstr "Távoli tárolók" #: rabbitvcs/util/contextmenuitems.py:711 msgid "Edit conflicts" msgstr "Konfliktusok szerkesztése" #: rabbitvcs/util/contextmenuitems.py:756 msgid "Ignore item by file extension" msgstr "Mellőzött tétel fájl kiterjesztés szerint" #: rabbitvcs/util/helper.py:135 msgid "(no date)" msgstr "(nincs adat)" #: rabbitvcs/util/helper.py:139 msgid "just now" msgstr "épp most" #: rabbitvcs/util/helper.py:141 #, python-format msgid "%d minute(s) ago" msgstr "%d perce" #: rabbitvcs/util/helper.py:751 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i mp" msgstr[1] "%i mp" #: rabbitvcs/util/helper.py:754 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i perc" msgstr[1] "%i perc" #: rabbitvcs/util/helper.py:757 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i óra" msgstr[1] "%i óra" #: rabbitvcs/util/helper.py:760 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i nap" msgstr[1] "%i nap" #: rabbitvcs/util/helper.py:763 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i hét" msgstr[1] "%i hét" #: rabbitvcs/util/helper.py:766 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i hónap" msgstr[1] "%i hónap" #: rabbitvcs/util/helper.py:769 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i év" msgstr[1] "%i év" #: rabbitvcs/vcs/__init__.py:36 #, python-format msgid "" "The output from '%s' was not able to be processed.\n" "%s" msgstr "" "A(z) '%s' kimenetét nem sikerült feldolgozni.\n" "%s" #: rabbitvcs/vcs/git/__init__.py:777 rabbitvcs/vcs/svn/__init__.py:1189 msgid "(no author)" msgstr "(nincs szerző)" #: rabbitvcs/vcs/git/__init__.py:922 rabbitvcs/vcs/svn/__init__.py:1703 msgid "Patched" msgstr "Hibajavítása kész" #: rabbitvcs/vcs/git/__init__.py:926 rabbitvcs/vcs/svn/__init__.py:1707 msgid "Patch Failed" msgstr "Hibajavítás nem sikerült" #: rabbitvcs/vcs/git/__init__.py:931 rabbitvcs/vcs/svn/__init__.py:1715 msgid "Rejected Patch" msgstr "Elutasított hibajavítás" #: rabbitvcs/vcs/status.py:273 msgid "RabbitVCS status for" msgstr "RabbitVCS státusz" #: rabbitvcs/vcs/svn/__init__.py:187 rabbitvcs/vcs/svn/__init__.py:196 #: rabbitvcs/vcs/svn/__init__.py:203 msgid "Added" msgstr "Hozzáadva" #: rabbitvcs/vcs/svn/__init__.py:188 msgid "Copied" msgstr "Átmásolva" #: rabbitvcs/vcs/svn/__init__.py:189 rabbitvcs/vcs/svn/__init__.py:195 #: rabbitvcs/vcs/svn/__init__.py:204 msgid "Deleted" msgstr "Törölve" #: rabbitvcs/vcs/svn/__init__.py:190 msgid "Restored" msgstr "Helyreállítva" #: rabbitvcs/vcs/svn/__init__.py:191 msgid "Reverted" msgstr "Visszaállítva" #: rabbitvcs/vcs/svn/__init__.py:192 msgid "Failed Revert" msgstr "Visszaállítás sikertelen" #: rabbitvcs/vcs/svn/__init__.py:193 msgid "Resolved" msgstr "Megoldva" #: rabbitvcs/vcs/svn/__init__.py:194 msgid "Skipped" msgstr "Kihagyva" #: rabbitvcs/vcs/svn/__init__.py:197 msgid "Updated" msgstr "Frissítve" #: rabbitvcs/vcs/svn/__init__.py:198 rabbitvcs/vcs/svn/__init__.py:200 msgid "Completed" msgstr "Befejezve" #: rabbitvcs/vcs/svn/__init__.py:199 rabbitvcs/vcs/svn/__init__.py:201 msgid "External" msgstr "Külső" #: rabbitvcs/vcs/svn/__init__.py:202 msgid "Modified" msgstr "Módosítva" #: rabbitvcs/vcs/svn/__init__.py:205 msgid "Replaced" msgstr "Lecserélve" #: rabbitvcs/vcs/svn/__init__.py:206 rabbitvcs/vcs/svn/__init__.py:226 msgid "Changed" msgstr "Módosítva" #: rabbitvcs/vcs/svn/__init__.py:207 msgid "Annotated" msgstr "Megjegyzés hozzáfűzve" #: rabbitvcs/vcs/svn/__init__.py:209 msgid "Unlocked" msgstr "Zárolás feloldva" #: rabbitvcs/vcs/svn/__init__.py:210 msgid "Failed Lock" msgstr "Zárolás sikertelen" #: rabbitvcs/vcs/svn/__init__.py:211 msgid "Failed Unlock" msgstr "Sikertelen zárolás" #: rabbitvcs/vcs/svn/__init__.py:221 msgid "Inapplicable" msgstr "Nem alkalmazható" #: rabbitvcs/vcs/svn/__init__.py:223 msgid "Unchanged" msgstr "Változatlan" #: rabbitvcs/vcs/svn/__init__.py:224 msgid "Missing" msgstr "Hiányzó" #: rabbitvcs/vcs/svn/__init__.py:225 msgid "Obstructed" msgstr "Akadályba ütközik" #: rabbitvcs/vcs/svn/__init__.py:227 msgid "Merged" msgstr "Egyesítve" #: rabbitvcs/vcs/svn/__init__.py:228 msgid "Conflicted" msgstr "Konfliktusos" #~ msgid "Resolve" #~ msgstr "Feloldás" #~ msgid "Running Resolve Command..." #~ msgstr "Feloldás parancs fut..." #~ msgid "Completed Resolve" #~ msgstr "Feloldás befejezve" #~ msgid "English" #~ msgstr "angol" #~ msgid "Properties for:" #~ msgstr "Tulajdonságok ehhez:" #~ msgid "Selected properties will be applied recursively." #~ msgstr "Kiválasztott tulajdonságok rekurzívan lesznek használva." #~ msgid "Delete properties recursively" #~ msgstr "Rekurzív tulajdonságok törlése" #~ msgid "Edit..." #~ msgstr "Szerkesztés..." #~ msgid "New..." #~ msgstr "Új..." #~ msgid "URL/Path:" #~ msgstr "URL/Útvonal" #~ msgid "Load/Refresh" #~ msgstr "Betöltés/Frissítés" #~ msgid "URL:" #~ msgstr "URL:" #~ msgid "Add Message" #~ msgstr "Üzenet hozzáadása" #~ msgid "Certificate Details" #~ msgstr "Tanúsítvány részletei" #~ msgid "Edit Property Details" #~ msgstr "Tulajdonság részleteinek szerkesztése" #~ msgid "Folder Name" #~ msgstr "Dosszié neve" #~ msgid "Message" #~ msgstr "Üzenet" #~ msgid "Please add your authentication details" #~ msgstr "Adja meg az Ön azonosítóit" #~ msgid "Please provide your ssl certification file" #~ msgstr "Kérjük adja meg az Ön SSL igazoló fájlját" #~ msgid "Previous Messages" #~ msgstr "Korábbi üzenetek" #~ msgid "" #~ "Are you sure you want to delete %item%?" #~ msgstr "" #~ "Akarja törölni a/z/ %item% tételt?" #~ msgid "RabbitVCS Error" #~ msgstr "RabbitVCS Error" #~ msgid "Accept Forever" #~ msgstr "Mindig elfogad" #~ msgid "Accept Once" #~ msgstr "Egyszer elfogad" #~ msgid "Apply property recursively" #~ msgstr "Tulajdonság megadása rekurzívan" #~ msgid "Authentication" #~ msgstr "Hitelesítés" #~ msgid "Check Certificate" #~ msgstr "Tanúsítvány ellenőrzése" #~ msgid "Confirmation" #~ msgstr "Megerősítés" #~ msgid "Create Folder..." #~ msgstr "Dosszié készítése..." #~ msgid "Delete Confirmation" #~ msgstr "Megerősítés törlése..." #~ msgid "Deny" #~ msgstr "Visszautasít" #~ msgid "Fingerprint:" #~ msgstr "Ujjlenyomat:" #~ msgid "Issuer:" #~ msgstr "Kibocsájtó:" #~ msgid "Login:" #~ msgstr "Felhasználó név:" #~ msgid "Password:" #~ msgstr "Jelszó:" #~ msgid "Path:" #~ msgstr "Útvonal:" #~ msgid "Previous Messages" #~ msgstr "Előző üzenet" #~ msgid "Property" #~ msgstr "Tulajdonság" #~ msgid "Property:" #~ msgstr "Tulajdonság:" #~ msgid "RabbitVCS Error" #~ msgstr "RabbitVCS hiba" #~ msgid "Realm:" #~ msgstr "Övezet:" #~ msgid "SSL Client Certification" #~ msgstr "SSL kliens igazolás" #~ msgid "Save Authentication" #~ msgstr "Hitelesítés mentése" #~ msgid "Text Change" #~ msgstr "Szöveg változás" #~ msgid "The item(s) will be sent to the trash can." #~ msgstr "A tétel a kukába kerül." #~ msgid "Valid:" #~ msgstr "Érvényeség:" #~ msgid "Value:" #~ msgstr "Érték:" #~ msgid "Links" #~ msgstr "Link" #~ msgid "Version Information" #~ msgstr "Verzió információ" #~ msgid "RabbitVCS" #~ msgstr "RabbitVCS" #~ msgid "Authors:" #~ msgstr "Szerzők:" #~ msgid "Thanks:" #~ msgstr "Köszönet:" #~ msgid "VCS:" #~ msgstr "VCS:" #~ msgid "100" #~ msgstr "100" #~ msgid "Affected File(s) (double-click to compare with base)" #~ msgstr "" #~ "Érintett fájl/ok/ (kettős klikkantással összehasonlítás a bázissal)" #~ msgid "Revisions Table" #~ msgstr "Revíziós tábla" #~ msgid "Limit:" #~ msgstr "Határ:" #~ msgid "Log" #~ msgstr "Napló" #~ msgid "Refresh" #~ msgstr "Frissítés" #~ msgid "Showing Revisions:" #~ msgstr "Revíziók mutatása:" #~ msgid "Stop on copy" #~ msgstr "Másolás megállítása" #~ msgid "" #~ "Cleanup Requested....\n" #~ "\n" #~ "Begin working copy cleanup?" #~ msgstr "" #~ "Tisztítást igényelt....\n" #~ "\n" #~ "Kezdődhet a munkapéldány tisztítása?" #~ msgid "Authentication" #~ msgstr "Azonosítás" #~ msgid "Log Messages" #~ msgstr "Napló üzenetek" #~ msgid "Logging Options" #~ msgstr "Naplózási beállítások" #~ msgid "Memory usage: " #~ msgstr "Memória használat:" #~ msgid "Program used to compare files" #~ msgstr "Program a fájlok összehasonlításához" #~ msgid "RabbitVCS" #~ msgstr "RabbitVCS" #~ msgid "URL History" #~ msgstr "URL előzmények" #~ msgid "Browse..." #~ msgstr "Böngészés..." #~ msgid "Clear your authentication information" #~ msgstr "Az Ön azonosítási információinak törlése" #~ msgid "Enable emblems" #~ msgstr "Jelképek engedélyezve" #~ msgid "Enable file attributes" #~ msgstr "Fájl attributomok engedélyezve" #~ msgid "Enable recursive status checks" #~ msgstr "Rekurzív állapotellenőrzés engedélyezve" #~ msgid "External Programs" #~ msgstr "Külső programok" #~ msgid "General" #~ msgstr "Általános" #~ msgid "Git" #~ msgstr "Git" #~ msgid "Language:" #~ msgstr "Nyelv:" #~ msgid "Logging" #~ msgstr "Naplózás" #~ msgid "Minimum level to log" #~ msgstr "Minimális naplóbejegyzés" #~ msgid "Number of URLs to remember" #~ msgstr "Megjegyzett URL-ek száma" #~ msgid "Number of messages to remember" #~ msgstr "Megjegyzett üzenetek száma" #~ msgid "Saved Data" #~ msgstr "Mentett adat" #~ msgid "Show RabbitVCS debugging tools" #~ msgstr "RabbitVCS nyomkövető eszköz mutatása" #~ msgid "The debug menu is used to diagnose problems with RabbitVCS itself" #~ msgstr "A nyomkövetés menü a problémák diagnózisára a RabbitVCS-t használja" #~ msgid "Type:" #~ msgstr "Típus:" #~ msgid "Files to lock" #~ msgstr "Zárolt fájlok" #~ msgid "Please describe why you are locking these files" #~ msgstr "Írja le, miért akarja zárolni ezeket a fájlokat?" #~ msgid "Lock Files" #~ msgstr "Zárolt fájlok" #~ msgid "Select / Deselect all" #~ msgstr "Kiválasztás / Összes kiválasztás" #~ msgid "Steal the locks" #~ msgstr "Zárolások ellopása" #~ msgid "From Revision" #~ msgstr "Revíziótól" #~ msgid "To Revision" #~ msgstr "Revízióig" #~ msgid "Annotate" #~ msgstr "Jegyzet" #~ msgid "Changed Files (double-click to compare with base)" #~ msgstr "" #~ "Változott fájlok (kettős klikkantással összehasonlítás a bázissal)" #~ msgid "Commit to:" #~ msgstr "Beküldés" #~ msgid "Show unversioned files" #~ msgstr "Verziókezelésen kívüli fájlok mutatása" #~ msgid "Notification Messages" #~ msgstr "Értesítés" #~ msgid "Remote URI:" #~ msgstr "Távoli URI:" #~ msgid "Working Copy:" #~ msgstr "Munkapéldány:" #~ msgid "Add a new property." #~ msgstr "Egy új tulajdonság hozzáadása" #~ msgid "Close this dialog." #~ msgstr "Párbeszéd bezárása." #~ msgid "Property Editor" #~ msgstr "Tulajdonság szerkesztő" #~ msgid "Refresh the list of properties." #~ msgstr "Tulajdonságok listájának frissítése." #~ msgid "Change the repository of your working copy" #~ msgstr "Tároló cseréje az Ön munkapéldányhoz" #~ msgid "From:" #~ msgstr "Innen:" #~ msgid "To:" #~ msgstr "Eddig:" #~ msgid "Options" #~ msgstr "Opciók" #~ msgid "Revision" #~ msgstr "Revízió" #~ msgid "Omit Externals" #~ msgstr "Külső tárolók kihagyása" #~ msgid "Recursive" #~ msgstr "Rekurzív" #~ msgid "Import Message" #~ msgstr "Import üzenet" #~ msgid "Repository" #~ msgstr "Tároló" #~ msgid "Include ignored files" #~ msgstr "Mellőzött fájlokat tartalmaz" #~ msgid "From URL" #~ msgstr "Ettől az URL-től" #~ msgid "From: (URL and revision to merge)" #~ msgstr "Innen: (URL és revízió egyesítve)" #~ msgid "Revision Range" #~ msgstr "Revíziós terület" #~ msgid "To: (URL and revision to merge)" #~ msgstr "Eddig: (URL és revízió egyesítve)" #~ msgid "URL to merge from" #~ msgstr "URL egyesítve innen" #~ msgid "Working Copy" #~ msgstr "Munkapéldány" #~ msgid "" #~ "Choose this method if you have made some changes to a branch and wish to " #~ "merge your changes with another branch." #~ msgstr "" #~ "Válassza ezt a módszert, ha Önnek sok változása van a branchban és " #~ "egyesíteni kívánja a módosításokat egy másik branchcsal." #~ msgid "" #~ "Choose this method if you wish to merge two different branches into your " #~ "working copy." #~ msgstr "" #~ "Válassza ezt a módszert, ha két különböző branchot kíván egyesíteni a " #~ "munkapéldányában." #~ msgid "Ignore ancestry" #~ msgstr "Eredet mellőzése" #~ msgid "Merge Assistant" #~ msgstr "Egyesítés segéd" #~ msgid "Merge a range of revisions" #~ msgstr "Egy revíziós terület egyesítése" #~ msgid "Merge two different trees" #~ msgstr "Két különböző fa egyesítése" #~ msgid "Only record the merge" #~ msgstr "Csak rögzítése az egyesítésnek" #~ msgid "Show log" #~ msgstr "Napló mutatása" #~ msgid "Test Merge" #~ msgstr "Egyesítés teszt" #~ msgid "" #~ "Use the log dialog to select the revisions that you wish to merge. Or " #~ "write out the revisions manually, each separated by a comma. You can " #~ "specify a revision range by a dash. \n" #~ "\n" #~ "Example: 4-7,9,11,15-HEAD\n" #~ "\n" #~ "To merge all revisions, leave the box empty." #~ msgstr "" #~ "A kiválasztott revíziók egyesítéséhez használja a napló bejegyzést vagy " #~ "írja ki a revíziókat kézzel azokat vesszővel elválasztva. Egy tartomány " #~ "megadásához kötőjelet használhat.\n" #~ "\n" #~ "Például: 4-7,9,11,15-HEAD\n" #~ "\n" #~ "Az összes revízió egyesítéséhez hagyja üresen a szövegdobozt." rabbitvcs-0.18/po/it.po000066400000000000000000001366241362112712700150310ustar00rootroot00000000000000# Italian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-10-26 11:05+0000\n" "Last-Translator: timendum \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i secondo" msgstr[1] "%i secondi" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuto" msgstr[1] "%i minuti" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i ora" msgstr[1] "%i ore" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i giorno" msgstr[1] "%i giorni" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i settimana" msgstr[1] "%i settimane" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mese" msgstr[1] "%i mesi" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i anno" msgstr[1] "%i anni" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Debug" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Apri Shell" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Aggiorna Stato" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Debug Ripristino" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Ripristina tutto ciò che vedi" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Invalida" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Forza una chiamata a invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Aggiungi icona" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Aggiungi un'icona" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Checkout..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Preleva una Copia di Lavoro" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Aggiorna" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Aggiorna la Copia di Lavoro" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Commit" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Invia le modifiche al Repository" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Sfoglia Repository" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Sfoglia l'albero del repository" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Controlla modifiche..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Controlla modifiche fatte nel repository" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Menu Differenze..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Visualizza opzioni di confronto" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Visualizza differenze con la base" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Visualizza le modifiche fatte al file" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Visualizza differenze tra file/cartelle" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Visualizza differenze tra due file" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Visualizza le differenze con la revisione precedente" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Visualizza le modifiche fatte al file dall'ultimo cambiamento" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Confronta con la base" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "Confronta con la base affiancando le finestre" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Confronta file/cartelle" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Confronta le differenze tra due oggetti" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Compara con la versione precedente" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "Confronta con la revisione precedente affiancando le finestre" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Visualizza modifiche..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Visualizza modifiche tra percorsi e revisioni" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Visualizza Log" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Visualizza il file log" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Aggiungi" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Schedula oggetti da aggiungere al repository" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Aggiungi in ignora" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Aggiorna alla revisione..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Aggiorna il file alla specifica revisione" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Rinonima..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Schedula un oggetto da essere rinonimato nel repository" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Cancella" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Schedula un oggetto da essere cancellato dal repository" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Ripristina" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Ripristina gli oggetti nel loro stato non modificato" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Risolvi" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Segna un oggetto in conflitto come risolto" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Ripristina" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Ripristina oggetto mancante" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Ricolloca..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Ricolloca la tua copia di lavoro" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Blocca..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Blocca gli oggetti localmente" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Sblocca..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Sblocca l'oggetto" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Pulisci" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Pulisci la copia di lavoro" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Esporta..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" "Esporta la copia di lavoro o repository senza le informazioni di versione" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Crea un Repository qua" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Crea un Repositori in una cartella" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importa" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importa un oggetto in un repository" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Branch/tag..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Copia un oggetto in un altra parte del repository" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Scambia..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Cambia la locazione del repository della copia di lavoro" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Merge..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Procedura guidata per il merge" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Annota..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Annota un file" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Crea Patch..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "Crea un file unico con le differenza di tutte le modifiche fatte" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Applica Patch..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Applica il file unico con le differenza alla copia di lavoro" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Proprieta" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Visualizza le proprieta di un oggetto" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Aiuto" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Visualizza aiuto" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Opzioni" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Visualizza o cambia le opzioni di RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Informazioni su" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Informazioni su RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Apri" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Apri un file" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Sfoglia" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Sfoglia file o cartella" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Ripristina proprietà" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Ripristina questa proprietà con il suo stato originale" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Ripristina proprietà (ricorsivo)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Ripristina questa proprietà con il suo stato originale (ricorsivo)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Cancella proprietà" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Cancella questa proprietà" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Cancella questa proprietà (ricorsivo)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Ignora oggetto dal nome file" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Ignora oggetto dall'estensione" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Aggiornamento in corso..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Aggiornamento completato" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Aggiorna alla Revisione" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Checkout" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Checkout completato" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Percorso" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Estensione" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Caricamento..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Trovati %d oggetti" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Esecuzione del comando Aggiungi..." #: ui/add.py:159 msgid "Completed Add" msgstr "Aggiunta completata" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revisione:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Esporta - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" "I campi URL e percorso di destinazione del repository sono entrambi " "obbligatori." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Esporta" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Esecuzione del comando di Esportazione..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Esportazione Completata" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Applica Patch" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Applica Path Alla Cartella" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Applica Patch al File..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Patch al File Applicata" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Data" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Messaggio" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importa - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Il campo URL del repository è obbligatorio." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Esecuzione del comando di Importazione..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importazione completata" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Rinomina" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nuiovo Nome:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Il campo nuovo nome è obbligatorio." #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Esecuzione del comando Rinomina..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Rinomina Completata" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Stato Testo" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Stato Proprieta" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Esecuzione del comando Commit..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Commit Completato" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Visualizza le differenze affiancate" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Esecuzione del Merge Test..." #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Test del Merge Completato" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Esecuzione del comando Merge..." #: ui/merge.py:91 msgid "Completed Merge" msgstr "Merge Completato" #: ui/merge.py:102 msgid "Merge" msgstr "Merge" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Si è verificato un errore nell'estensione RabbitVCS Nautilus. Contatta il RabbitVCS team con i dettagli dell'errore specificati sotto:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Seleziona una Cartella" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "a" #: ui/dialog.py:261 msgid "Select a File" msgstr "Seleziona un File" #: ui/dialog.py:280 msgid "Save As..." msgstr "Salva con nome..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Sei sicuro di voler continuare ?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "oggetti selezionati" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Aggiungi una cartella al repository" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Esecuzione del comando di Ripristino..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Ripristino completato" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "I campi da e url sono entrambi obbligatori" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Ricolloca" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Esecuzione del comando di Ricollocamento" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Ricollocamento Completato" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisione" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autore" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Visualizza differenze unite" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Confronta affiancato" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Esecuzione del comando Risolvi..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Risoluzione Completata" #: ui/changes.py:49 msgid "More Actions..." msgstr "Altre azioni..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Modifica" #: ui/changes.py:279 msgid "Property Change" msgstr "Cambia Proprietà" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Si" #: ui/changes.py:321 msgid "No" msgstr "No" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Apri dalla prima revisione" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Apri dalla seconda revisione" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Non posso annotare una cartella" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Annota - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linea" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Testo" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Il campo da revisione deve essere un intero" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Log - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Azione" #: ui/log.py:338 msgid "Copy From Path" msgstr "Copia dal Percorso" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Copia dalla Revisione" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Visualizza le differenze con la copia di lavoro" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Guarda differenze tra le versioni" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Compara con la copia locale" #: ui/log.py:806 msgid "Compare revisions" msgstr "Confronta le revisioni" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Visualizza le modifiche tra le revisioni" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Modifica autore..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Modifica messaggio di log..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Modifica le proprietà della revisione..." #: ui/log.py:1047 msgid "Edit author" msgstr "Modifica autore" #: ui/log.py:1059 msgid "Edit log message" msgstr "Modifica messaggio di log" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Sconosciuto" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Inglese" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Seleziona un programma" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Sei sicuro di voler pulire i percorsi del tuo repository?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Percorsi del repository puliti" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Sei sicuro di voler cancellare i tuoi messaggi precedenti?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Messaggi precedenti cancellati" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" "Sei sicuro di voler cancellare le tue informazioni di autenticazione?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Informazioni di autenticazione cancellate" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Impossibile caricare le proprietà" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Devi specificare un percorso di destinazione" #: ui/branch.py:115 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Esecuzione del comando Branch/tag..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Branch/tag completato" #: ui/lock.py:73 msgid "Locked" msgstr "Bloccato" #: ui/lock.py:167 msgid "Get Lock" msgstr "Blocca" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Esecuzione del comando Blocca..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Blocco Completato" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "La locazione del repository è un campo obbligatorio" #: ui/switch.py:80 msgid "Switch" msgstr "Scambia" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Esecuzione del comando di Scambio..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Scambio completato" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "Numero" #: ui/widget.py:861 msgid "Working Copy" msgstr "Copia lavoro" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Host:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Checkout - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Esecuzione del comando Checkout..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nome" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Crea Patch" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Il percorso non è la copia di lavoro" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Crea Patch File..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Patch File Creato" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Proprieta - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valore" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Errore nel salvataggio delle proprietà" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Note: le modifiche alle proprietà sono applicate subito. Puoi " "rivedere o tornare indietro usando il menu contestuale per ogni elemento.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Vuoi cancellare la proprietà selezionata da tutti i file e sotto-cartelle\n" "sotto questa cartella?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "File senza controllo versione" #: ui/property_editor.py:112 msgid "Reserved" msgstr "Riservato" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Impossibile inserire valore della proprietà" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Tipo Mime" #: ui/action.py:338 msgid "Finished" msgstr "Finito" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Finiti" #: ui/action.py:365 msgid "Log Message" msgstr "Messaggio di log" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Sblocca" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Esecuzione del comando Sblocca..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Sblocco completato" #: ui/browser.py:89 msgid "Size" msgstr "Dimensione" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Crea cartella" #: ui/browser.py:353 msgid "Copy to..." msgstr "Copia in..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Copia l'URL nella clipboard" #: ui/browser.py:363 msgid "Move to..." msgstr "Sposta in..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Dove vuoi copiare la selezione?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nuova Destinazione:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Dove vuoi muovere la selezione?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Pulizia in corso..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Pulizia Completata" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repository creato con successo" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "C'è stato un errore nella creazione del repository. Verifica che la cartella " "sia vuota." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Proprieta per:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" "Le proprietà selezionate non possono essere applicate ricorsivamente." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Cancella le proprietà ricorsivamente" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Modifica..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nuovo..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Path" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Carica/Aggiorna" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Aggiungi Messaggio" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Dettagli del Certificato" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Modifica Proprieta Dettagli" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Nome Cartella" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Messggio" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Aggiungi i tuoi dettagli di autenticazione" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "File SSL di certificazione necessario" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Messaggi Precedenti" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Sei sicuro di voler cancellare %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "Errore RabbitVCS" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Accetta Sempre" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Accetta una Volta" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Applica le proprietà ricorsivamente" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autenticazione" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Controlla Certificato" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Conferma" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Crea cartella..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Cancella Conferma" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Nega" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Fingerprint:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Emittente" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Login:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Password:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Percorso:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Messaggi Precedenti" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Proprieta" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Proprieta:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "Errore RabbitVCS" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Dominio:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL Client Certificatione" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Salva Autenticazione" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Testo Modificato" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Gli oggetti verranno inviati al cestino." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Valido:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valore:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Links" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informazioni della Versione" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autori:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Grazie:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "File Modificati (doppio click per confrontarli con la base)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tabella Revisioni" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limiti:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Log" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Aggiorna" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Revisioni:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Ferma su copia" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Richiesta di pulizia....\n" "\n" "Iniziare una pulizia nella copia di lavoro?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autenticazione" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Messaggi del log" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Opzioni di Log" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Programma usato per confrontare i file" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Cronologia URL" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Sfoglia..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Elimina i dati di autenticazione" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Abilita icone" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Abilita gli attributi dei file" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Abilita il controllo ricorsivo degli stati" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programmi esterni" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Generale" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Lingua:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Logging" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Livello minimo per log" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Numero di URL da ricordare" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Numero di messaggi da ricordare" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Dati salvati" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Mostra gli strumenti di debugging di RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "Il menu di debug è usato per diagnosticare problemi con RabbitVCS" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tipo:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "File da bloccare" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Descrivi perchè vuoi bloccare questi files" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "File Bloccati" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Selezione / Deseleziona tutti" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Ruba il bloccaggio" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Dalla Revisione" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Alla Revisione" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Annota" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "File Modificati (doppio click per confrontarli con la base)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Commit a:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Visualizza i file non versionati" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Messaggi di Notifica" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "URI remota:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Copia di Lavoro:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Aggiungi una nuova proprietà." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Chiudi la finestra." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Modifica delle proprietà" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Aggiorna la lista delle proprietà." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Cambia il repository della tua copia di lavoro" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Da:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "A:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opzioni" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revisione" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Ometti esterni" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Ricorsivo" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importa Messaggio" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repository" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Includi file ignorati" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Da URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Da: (URL e revisione a merge)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Intervallo Revisioni" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "a: (URL e revisione a merge)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL sorgente da effettuare il Merge" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Copia di Lavoro" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Seleziona questo metodo se hai fatto qualche cambiamento al branch e vuoi " "effettuare un merge tra le tue modifiche e un altro branch." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Seleziona questo metodo se vuoi effettuare un merge tra due differenti " "branch nella tua copia di lavoro." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignora Antenati" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Assistente al Merge" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Effettua un Merge per un intervallo di revisioni" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Effettua un merge di due differenti alberi" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Registra solo il merge" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Visualizza Log" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Testa il Merge" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Usa la finestra del log per selezionare le revisioni su cui vuoi effettuare " "il merge. Oppure scrivi le revisioni manualmente, \n" "ognuna separata da una virgola. Pure specificare un intervallo con un " "trattino.\n" "\n" "Esempio: 4-7,9,11,15-HEAD\n" "\n" "Per eseguire il merge di tutte le revisioni, lascia il box vuoto." #~ msgid "Completed" #~ msgstr "Completato" #~ msgid "Create copy from" #~ msgstr "Crea copia da" #~ msgid "Program used to browse repositories" #~ msgstr "Programma usato per sfogliare i repository" #~ msgid "Destination:" #~ msgstr "Destinazione:" #~ msgid "Deleted" #~ msgstr "Cancellato" #~ msgid "Copied" #~ msgstr "Copiato" #~ msgid "Added" #~ msgstr "Aggiunto" #~ msgid "Restored" #~ msgstr "Ripristinato" #~ msgid "Resolved" #~ msgstr "Risolto" #~ msgid "Updated" #~ msgstr "Aggiornato" #~ msgid "External" #~ msgstr "Esterno" #~ msgid "Modified" #~ msgstr "Modificato" #~ msgid "Replaced" #~ msgstr "Sostituito" #~ msgid "Changed" #~ msgstr "Cambiato" #~ msgid "Skipped" #~ msgstr "Saltato" #~ msgid "Conflicted" #~ msgstr "Conflitto" #~ msgid "Unchanged" #~ msgstr "Invariato" #~ msgid "Missing" #~ msgstr "Mancante" #~ msgid "(no author)" #~ msgstr "(nessun autore)" #~ msgid "Show new version on the right side" #~ msgstr "Visualizza la nuova versione nel lato destro" #~ msgid "Update Depth" #~ msgstr "Aggiorna Profondita" #~ msgid "Failed Unlock" #~ msgstr "Sblocco fallito" #~ msgid "Failed Lock" #~ msgstr "Blocco fallito" #~ msgid "Inapplicable" #~ msgstr "Inapplicabile" #~ msgid "Annotated" #~ msgstr "Appuntato" #~ msgid "Unlocked" #~ msgstr "Sbloccato" #~ msgid "Switch Details" #~ msgstr "Dettagli Scambio" #~ msgid "Reverted" #~ msgstr "Ripristina..." #~ msgid "Failed Revert" #~ msgstr "Ripristino fallito" #~ msgid "Merged" #~ msgstr "Merged" #~ msgid "Obstructed" #~ msgstr "Bloccato" rabbitvcs-0.18/po/ja.po000066400000000000000000001313501362112712700147760ustar00rootroot00000000000000# Japanese translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-12-02 16:25+0000\n" "Last-Translator: yamafuji mitsugu \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i 秒" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i分" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i時間" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i日" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i週" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%iヶ月" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i年" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "デバッグ" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "バグ" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "シェルを開く" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "状態を更新" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "無効にする" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "invalidate_extension_info() 呼び出しを強制する" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "エンブレムを追加" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "エンブレムを追加" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "作業コピーをチェックアウト" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "更新" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "作業コピーを更新" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "コミット" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "レポジトリへの変更をコミット" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "ファイルに対する変更を見る" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "ログを表示" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "ファイルのログ情報を見る" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "追加" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "無視リストに追加" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "特定のリビジョンへ更新..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "特定のリビジョンへ更新..." #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "リネーム..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "レポジトリへのアイテムのリネームを予定する" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "削除" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "レポジトリへのアイテムの削除を予定する" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "元に戻す" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "未変更の状態に戻す" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "解消" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "競合するアイテムを解決済みにマークする" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "復元" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "再配置..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "作業コピーを再配置" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "ロックを取得..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "ローカルでアイテムをロック" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "ロックを開放..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "アイテム上でロックを開放" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "クリーンアップ" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "作業コピーをクリーンアップ" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "バージョン情報無しで,作業コピーまたはレポジトリをエクスポートする" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "ここにレポジトリを作成" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "フォルダ内にレポジトリを作成" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "インポート" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "レポジトリにアイテムをインポート" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "ブランチ/タグ..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "レポジトリ内の別の場所にアイテムをコピーする" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "切り替え..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "作業コピーのレポジトリの場所を変更する" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "マージ..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "マージウィザード" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "注釈..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "ファイルに注釈" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "属性" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "アイテムのプロパティを見る" #: util/contextmenuitems.py:545 msgid "Help" msgstr "ヘルプ" #: util/contextmenuitems.py:546 msgid "View help" msgstr "ヘルプの閲覧" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "設定" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "RabbitVCSの設定" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "RabbitVCSについて" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "RabbitVCSについて" #: util/contextmenuitems.py:563 msgid "Open" msgstr "開く" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "参照" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "更新中..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "更新完了" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "特定のリビジョンへ更新" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "チェックアウト" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "チェックアウト完了" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "パス" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "拡張" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "ロード中..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "%d個のアイテムが見つかりました" #: ui/add.py:157 msgid "Running Add Command..." msgstr "追加中..." #: ui/add.py:159 msgid "Completed Add" msgstr "追加完了" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "エクスポート - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "レポジトリのURLとチェックアウト先の両方の入力が必要です." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "エクスポート" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "エクスポート中..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "エクスポート完了" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "ブランチ 詳細" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "日付" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "メッセージ" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "インポート - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "レポジトリURLを入力してください" #: ui/import.py:81 msgid "Running Import Command..." msgstr "インポート中..." #: ui/import.py:89 msgid "Completed Import" msgstr "インポート完了" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "リネーム" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "新しい名前:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "新しい名前を入力してください" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "リネームを実行中..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "リネームの完了" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "テキストの状態" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "属性の状態" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "コミット中" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "コミット完了" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "状態" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "マージテスト中" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "マージテスト完了" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "マージ中" #: ui/merge.py:91 msgid "Completed Merge" msgstr "マージ完了" #: ui/merge.py:102 msgid "Merge" msgstr "マージ" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "フォルダを選択" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "to" #: ui/dialog.py:261 msgid "Select a File" msgstr "ファイルを選択" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "本当に続けますか?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "選択されたアイテム" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "元に戻しています" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "元に戻しました" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "FROMフィールドとURLフィールドの両方に入力してください" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "再配置" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "再配置中..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "再配置完了" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "リビジョン" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "作者" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "解消中..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "解消完了" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "はい" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "ディレクトリに注釈できません" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "注釈 - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "行" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "テキスト" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "元リビジョン番号は整数でなければなりません" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "ログ - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "アクション" #: ui/log.py:338 msgid "Copy From Path" msgstr "パスからコピー" #: ui/log.py:338 msgid "Copy From Revision" msgstr "リビジョンからコピー" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "不明" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "英語" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "プログラムを選択" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "本当にレポジトリのパスをクリアしますか?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "レポジトリのパスはクリアされました" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "本当にログメッセージを削除しますか?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "ログメッセージは削除されました" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "本当に認証情報を削除しますか?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "認証情報は削除されました" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "送り先パスを設定してください." #: ui/branch.py:115 msgid "Branch/tag" msgstr "ブランチ/タグ" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "ブランチ/タグ コマンドを実行中..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "ブランチ/タグ の完了" #: ui/lock.py:73 msgid "Locked" msgstr "ロック" #: ui/lock.py:167 msgid "Get Lock" msgstr "ロックを取得" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "ロック中..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "ロック完了" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "レポジトリの場所を入力してください" #: ui/switch.py:80 msgid "Switch" msgstr "切り替え" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "切り替え中..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "切り替え完了" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "最新" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "ホスト:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "チェックアウト - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "チェックアウト中..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "名前" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "与えられたパスはワーキングコピーではありません" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "修正を作成完了" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "プロパティ - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "値" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Mimeタイプ" #: ui/action.py:338 msgid "Finished" msgstr "完了" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - 完了" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "ロック解除" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "ロック解除中" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "ロック解除完了" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "クリーンアップ中..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "クリーンアップ完了" #: ui/create.py:46 msgid "Repository successfully created" msgstr "レポジトリの作成に成功しました" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "リポジトリ作成中にエラーが発生しました.フォルダが空であるか確認してください." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "属性:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "編集..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "新規..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/パス:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "メッセージの追加" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "証明書の詳細" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "プロパティの詳細を編集" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "メッセージ" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "認証の詳細を追加してください" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "以前のメッセージ" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "本当に%iつのアイテムを削除しますか%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "今後受け入れる" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "一度だけ受け入れる" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "認証" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "証明書をチェックする" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "確認" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "削除の確認" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "拒否" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "フィンガープリント:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "発行者:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "ログイン:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "パスワード:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "以前のメッセージ" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "属性" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "属性:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "領域:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "認証を保存する" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "その(それらの)アイテムはゴミ箱へ送られます" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "有効:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "値:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "関連リンク" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "バージョン情報" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "著者:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "謝辞:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "リビジョン一覧" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "期限:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "ログ" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "更新" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "表示しているリビジョン:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "コピーが発生したら停止" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "クリーンアップが要求されました....\n" "\n" "作業コピーをクリーンアップしますか?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "認証" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "ログメッセージ" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "ログオプション" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "ファイルの比較に使用するプログラム" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL履歴" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "閲覧..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "認証履歴を削除" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "エンブレムを有効にする" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "ファイル属性を有効にする" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "再帰的な状態チェックを有効にする" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "外部プログラム" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "一般" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "言語:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "ログ" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "次のレベル以上を記録する" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "記録するURLの数" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "記録するメッセージの数" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "データの保存" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "種類:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "ロックすファイル" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "ファイルをロックする理由を入力してください" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "ロックするファイル" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "全て選択/全て非選択" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "ロックを横取りする" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "元リビジョン" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "先リビジョン" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "注釈" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "コミット先:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "バージョン管理外のファイルを表示する" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "通知メッセージ" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "作業コピーのレポジトリを変更する" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "元:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "先:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "オプション" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "リビジョン" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "外部参照を除外する" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "再帰的" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "メッセージをインポートする" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "レポジトリ" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "除外ファイルを含める" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "元URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "元: (マージするURLとリビジョン)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "リビジョンの範囲" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "先: (マージするURLとリビジョン)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "マージ元のURL" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "作業コピー" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "ブランチに変更を加え,それを別のブランチに変更をマージする場合,このメソッドを選択してください." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "2つの異なるブランチを作業コピーにマージする場合,このメソッドを選択してください." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "系統情報を無視する" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "マージアシスタント" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "リビジョンの範囲をマージ" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "異なる2つのツリーをマージ" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "マージのみ記録する" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "ログを表示" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "マージをテストする" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "マージしたいリビジョンの選択にログダイアログを利用する,もしくは,マージするリビジョンをコンマで区切って入力してください.リビジョンの範囲はハイフンで指定" "することができます.\n" "\n" "例: 4-7,9,11,15-HEAD\n" "\n" "すべてのリビジョンをマージするには,入力ボックスを空のままにしてください." #~ msgid "Completed" #~ msgstr "完了" #~ msgid "(no author)" #~ msgstr "(作者なし)" #~ msgid "Switch Details" #~ msgstr "詳細の切り替え" #~ msgid "Create copy from" #~ msgstr "次の場所からコピー" #~ msgid "Program used to browse repositories" #~ msgstr "レポジトリの閲覧に使用するプログラム" #~ msgid "Show new version on the right side" #~ msgstr "新しいバージョンを右側に表示する" #~ msgid "Destination:" #~ msgstr "送り先:" #~ msgid "Update Depth" #~ msgstr "更新" #~ msgid "Added" #~ msgstr "追加" #~ msgid "Copied" #~ msgstr "コピー" #~ msgid "Deleted" #~ msgstr "削除" #~ msgid "Restored" #~ msgstr "復元" #~ msgid "Reverted" #~ msgstr "元に戻す" #~ msgid "Failed Revert" #~ msgstr "元に戻せませんでした" #~ msgid "Resolved" #~ msgstr "解消" #~ msgid "Skipped" #~ msgstr "スキップ" #~ msgid "Updated" #~ msgstr "更新" #~ msgid "External" #~ msgstr "外部" #~ msgid "Modified" #~ msgstr "変更" #~ msgid "Replaced" #~ msgstr "置換" #~ msgid "Changed" #~ msgstr "変更" #~ msgid "Annotated" #~ msgstr "注釈" #~ msgid "Unlocked" #~ msgstr "ロック解除" #~ msgid "Failed Lock" #~ msgstr "ロック失敗" #~ msgid "Failed Unlock" #~ msgstr "ロック解除失敗" #~ msgid "Inapplicable" #~ msgstr "適用不可" #~ msgid "Unchanged" #~ msgstr "変更無" #~ msgid "Missing" #~ msgstr "紛失" #~ msgid "Obstructed" #~ msgstr "妨害" #~ msgid "Merged" #~ msgstr "マージ" #~ msgid "Conflicted" #~ msgstr "競合" rabbitvcs-0.18/po/nb.po000066400000000000000000001325021362112712700150030ustar00rootroot00000000000000# Norwegian Bokmal translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-03-14 08:38+0000\n" "Last-Translator: Arne \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i sekund" msgstr[1] "%i sekunder" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minutt" msgstr[1] "%i minutter" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i time" msgstr[1] "%i timer" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dag" msgstr[1] "%i dager" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i uke" msgstr[1] "%i uker" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i måned" msgstr[1] "%i måneder" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i år" msgstr[1] "%i år" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Avlus" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Feil" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Åpne skall" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Oppfrisk status" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Avlus tilbakestilling" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Tilbakestill alt den ser" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Innvalider" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Tving et invalidate_extension_info() kall" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Legg til emblem" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Legg til et emblem" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Sjekk ut..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Sjekk ut en arbeidskopi" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "RVCS Oppdater" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Oppdatert en arbeidskopi" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "RVCS Send inn" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Send inn endringer til et arkiv" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Arkivleser" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Bla gjennom ett arkivtre" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Sjekk for endringer..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Sjekk for endringer i arkivet" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Differansemeny..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Liste over sammenlikningsopsjoner" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Vis en differanse i forhold til basen" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Vis endringene gjort i en fil" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Vis differansen mellom filer/mapper" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Vis differansen mellom to filer" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Vis differanse i forhold til tidligere revisjon" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Vis endringene i en fil siden den ble sist lagret" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Sammenlikne med basen" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" "Sammenlikne med basen ved bruk av verktøy for å sammenlikne ved siden av " "hverandre" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Sammelikn filer/mapper" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Sammenlikn differansen mellom to elementer" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Sammenlikne med forrige versjon" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" "Sammenlikne med tidligere revisjon ved bruk av verktøy for å sammenlikne ved " "siden av hverandre" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Vis endringer..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Vis endringer mellom stier og revisjoner" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Vis logg" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Vis en fils loggeinformasjon" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Legg til" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Tidsplanlegg elementer som skal legges til i arkivet" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Legg til ignoreringsliste" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Oppdater til revisjon..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Oppdatert en fil til en spesifikk revisjon" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Endre navn..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Tidsplanlegg et element for omnavning i arkivet" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Slett" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Tidsplanlegg et element for sletting fra arkivet" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Tilbakestill" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Tilbakestill et element til dens uendrere tilstand" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Løs" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Marker et element i konflikt som løst" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Gjenopprett" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Gjenopprett et manglende element" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Omplasser..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Omplasser din arbeidskopi" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Ta lås..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Lås elementer lokalt" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Frigi lås..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Frigi lås på et element" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Rensk opp" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Rensk opp en arbeidskopi" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Eksporter..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "Eksporter en arbeidskopi eller et arkiv uten versjonsinformasjon" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Lag et arkiv her" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Lag et arkiv i en mappe" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Import" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importer et element til et arkiv" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Gren/merke..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Kopier et element til en annen plassering i arkivet" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Flytt..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Flytt plasseringen av en arbeidskopi i arkivet" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Flett..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "En hjelper for fletting" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Kommenter..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Kommenter en fil" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Lag lapp (patch)..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "Lager en forent differansefil med alle endringene du har gjort" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Anvend lapp (patch)..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Anvend en samlet differansefil på arbeidskopien" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Egenskaper" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Vis egenskapene til et element" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Hjelp" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Vis hjelp" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Innstillinger" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Vis eller endre RabbitVCS innstillinger" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Om" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Om RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Åpne" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Åpne en fil" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Bla til" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Bla til en fil eller mappe" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Tilbakestill egenskap" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Tilbakestill denne egenskapen til dens originale tilstand" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Tilbakestill egenskap (rekursivt)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" "Tilbakestill denne egenskapen til dens originale tilstand (rekursivt)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Slett egenskap" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Slett denne egenskap" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Slett denne egenskapen" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Ignorer element basert på filnavn" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Ignorer element basert på filetternavn" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Oppdaterer..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Fullført oppdatering" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Oppdater til revisjon" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Sjekk ut" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Utsjekk fullført" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Sti" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Filetternavn" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Laster..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Funnet %d element(er)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Kjører \"legg til\" kommando..." #: ui/add.py:159 msgid "Completed Add" msgstr "Fullført \"legg til\"" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revisjon:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Eksportert - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "ArkivURL og målsti er begge påkrevde felt." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Eksporter" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Kjører eksportkommando..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Fullført eksport" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Anvend lapp (patch)" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Anvend lapp (patch) på katalog..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Anvender lappefil (patch)..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Lappefil anvendt" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Dato" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Melding" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importer - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "ArkivURLfelt er påkrevet" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Kjører importkommando..." #: ui/import.py:89 msgid "Completed Import" msgstr "Import fullført" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Endre navn" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nytt navn:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Det nye navnefeltet er påkrevet." #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Kjører omnavningskommando..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Fullført omnavning" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Tekststatus" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Egenskapstatus" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Kjører innsendingskommando..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Fullført innsending" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Vis differanse som en \"ved siden av hverandre\" sammenlikning" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Kjører flettetest" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Fullført flettingstest" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Kjører flettekommando" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Fullført fletting" #: ui/merge.py:102 msgid "Merge" msgstr "Flett" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "En feil oppstod i RabbitVCS-utvidelsen. Vennligst kontakt RabbitVCS team med feildetaljene under:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Velg en mappe" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "til" #: ui/dialog.py:261 msgid "Select a File" msgstr "Velg en fil" #: ui/dialog.py:280 msgid "Save As..." msgstr "Lagre som..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Er du sikker på at du vil fortsette?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "det/de valgte element" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "La til en mappe i arkivet" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Kjører tilbakestillkommando..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Fullført tilbakestill" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Fra og til -URLfeltene er begge påkrevet." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Omplasser" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Kjører omplasseringskommando..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Fullført ommplassering" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisjon" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Opphavsmann" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Vis samlet differanse" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Sammenlikne ved siden av hverandre" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Kjører løs-kommando..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Fullfør løs" #: ui/changes.py:49 msgid "More Actions..." msgstr "Flere handlinger..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Endre" #: ui/changes.py:279 msgid "Property Change" msgstr "Endre egenskap" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Ja" #: ui/changes.py:321 msgid "No" msgstr "Nei" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Åpne fra første revisjon" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Åpne fra andre revisjon" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Kan ikke kommentere en katalog" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Kommenter - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linje" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Tekst" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "\"Fra revisjon\" -feltet må være et heltall" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Logg - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "I/T" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Handling" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopier fra sti" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopier fra revisjon" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Vis differanse i forhold til arbeidskopi" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Vis differanse mellom revisjoner" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Sammenlikne med arbeidskopi" #: ui/log.py:806 msgid "Compare revisions" msgstr "Sammenlikne revisjoner" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Vis endringer mellom revisjoner" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Rediger forfatter..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Rediger loggemelding..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Rediger revisjonsegenskaper..." #: ui/log.py:1047 msgid "Edit author" msgstr "Rediger forfatter" #: ui/log.py:1059 msgid "Edit log message" msgstr "Rediger loggemelding" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Ukjent" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Engelsk" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Velg et program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Er du sikker på at du vil nullstille arkivstien?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Arkivsti nullstilt" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Er du sikker på at du vil nullstille din forrige melding?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Forrige melding nullstilt" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Er du sikker på at du vil nullstille autentiseringsinformasjonen?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Autentiseringsinformasjonen nullstilt" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Får ikke tak i egenskapsliste" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Du må oppgi en målsti." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Gren/merke" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Kjører gren/merke-kommando..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Fullført gren/merke" #: ui/lock.py:73 msgid "Locked" msgstr "Låst" #: ui/lock.py:167 msgid "Get Lock" msgstr "Lås" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Kjører låsekommando..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Fullført låsing" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Arkivplasseringen er et påkrevet felt." #: ui/switch.py:80 msgid "Switch" msgstr "Flytt" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Kjører flyttekommando..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Fullført flytting" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HODE" #: ui/widget.py:860 msgid "Number" msgstr "Nummer" #: ui/widget.py:861 msgid "Working Copy" msgstr "Arbeidskopi" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Vert:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Sjekk ut - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Kjører utsjekkommando..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Navn" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Lag lapp (patch)" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Den oppgitte stien peker ikke til en arbeidskopi" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Lager lappefil (patch)..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Lappefil (patch) laget" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Egenskaper - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Verdi" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Det oppstod et problem med lagring av egenskapene." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Merknad: egenskapsendringer utføres umiddelbart. Du kan se over og " "angre endringer vha. snarveimenyen på hvert element.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Ønsker du å slette valgte egenskaper fra alle filer og mapper\n" "under denne mappen?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Fila er ikke underlagt versjonskontroll." #: ui/property_editor.py:112 msgid "Reserved" msgstr "Reservert" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Klarer ikke å sette ny verdi for egenskap." #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Mimetype" #: ui/action.py:338 msgid "Finished" msgstr "Fullført" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - fullført" #: ui/action.py:365 msgid "Log Message" msgstr "Loggmelding" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Lås opp" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Kjører lås opp kommando..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Fullfør lås opp" #: ui/browser.py:89 msgid "Size" msgstr "Størrelse" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Lag mappe..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Kopier til..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Kopier URL til utklippsbord" #: ui/browser.py:363 msgid "Move to..." msgstr "Flytt til..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Hvor ønsker du å kopiere utvalget til?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Ny plassering" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Hvor ønsker du å flytte utvalget?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Rensker opp..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Opprensking fullført" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Arkiv vellykket opprettet" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "En feil oppstod ved opprettelse av arkiv. Sørg for at den oppgitte mappen er " "tom." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Egenskaper for:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Valgte egenskaper vil bli anvendt rekursivt." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Slett egenskaper rekursivt" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Rediger..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Ny..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Sti:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Last/oppdater" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Legg til melding" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Sertifikatdetaljer" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Rediger egenskapsdetaljer" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Mappenavn" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Melding" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" "Vennligst legg til dine autentiseringsdetaljer (identifikasjon)" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Vennligst oppgi din ssl sertifikatfil" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Forrige melding" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Er du sikker på at du vil slette %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "RabbitVCS feil" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Aksepter for alltid" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Aksepter en gang" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Anvend egenskap rekursivt" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autentisering" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Sjekk sertifikat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Bekreftelse" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Opprett mappe..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Slettebekreftelse" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Avvis" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Fingeravtrykk:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Utsteder:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Logg inn:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Passord:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Sti:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Tidligere meldinger" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Egenskap" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Egenskap:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS feil" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Område:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL klientsertifikat" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Lagre autentisering" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Tekstendring" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Elementene vil bli sendt til søppeldunken." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Gyldig:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Verdi:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Lenker" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Versjonsinformasjon" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Forfattere:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Takk:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "Berørte fil(er) (dobbeltklikk for å sammenlikne med basen)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revisjonstabell" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Grense:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Logg" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Oppdater" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Viser revisjoner:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Stopp ved kopi" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Opprensking forespurt...\n" "\n" "Start arbeidskopiopprensking?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autentisering" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Loggmeldinger" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Loggeopsjoner" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Program benyttet for å sammenlikne filer" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL historikk" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Bla gjennom..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Fjern all autentiseringsinformasjonen" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Muliggjør emblemer" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Muliggjør filattributter" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Muliggjør rekkursiv statussjekk" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Eksterne programmer" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Generelt" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Språk:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Logging" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Minimumsnivå for logging" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Antall URLer som huskes" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Antall meldinger som huskes" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Lagrede data" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Vis RabbitVCS sine avlusingsverktøy" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "Avlusingsmenyen benyttes for å diangostisere problemer med RabbitVCS selv" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Type:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Filer til låsing" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Vennligst beskriv hvorfor du låser disse filene" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Lås filer" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Velg/avvelg alt" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Stjel låser" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Fra revisjon" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Til revisjon" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Kommenter" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Endrede filer (dobbeltklikk for å sammenlikne med basen)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Send inn til:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Vis ikke-versjonerte filer" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Varslingsmeldinger" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "Fjerntliggende URI:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Arbeidskopi:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Legg til en egenskap." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Lukk dette dialogvindu." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Egenskpasredigering" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Oppdatert egenskapslisten" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Endre arkiv for arbeidskopien" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Fra:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Til:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Alternativer" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revisjon" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Utelat eksterne" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Rekursiv" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importmelding" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Arkiv" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Inkluder ignorerte filer" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Fra URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Fra: (URL og revisjon som skal flettes)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Revisjonsutvalg" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Til: (URL og revisjon som skal flettes)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL det skal flettes fra" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Arbeidskopi" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Velg denne metoden hvis du har gjort endringer i grenen og ønsker å flette " "dine endringer med en annen gren." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Velg denne metoden hvis du ønsker å flette to forskjellige grener inn i din " "arbeidskopi." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorer stamfedre" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Fletteassistent" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Flett et utvalg av revisjoner" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Flett to forskjellige trær" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Kun marker fletting (ikke utfør)" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Vis logg" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Testflett" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Bruk loggknappen (til høyre for revisjonsutvalgsfeltet) til å velge " "revisjonen du ønsker å flette. Eller skriv revisjonene manuelt, hver " "separert med komma. Du kan spesifisere et revisjonsutvalg med en bindestrek. " "\n" "\n" "Eksempel: 4-7,9,11,15-HEAD\n" "\n" "La boksen være tom for å flette alle revisjoner." #~ msgid "Deleted" #~ msgstr "Slettet" #~ msgid "Copied" #~ msgstr "Kopiert" rabbitvcs-0.18/po/nl.po000066400000000000000000001372751362112712700150310ustar00rootroot00000000000000# Dutch translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-12-09 15:20+0000\n" "Last-Translator: Reinout van Schouwen \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Language: Dutch\n" #: util/helper.py:109 msgid "just now" msgstr "nu net" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "%d minu(u)t(en) geleden" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i seconde" msgstr[1] "%i seconden" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuut" msgstr[1] "%i minuten" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i uur" msgstr[1] "%i uur" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dag" msgstr[1] "%i dagen" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i week" msgstr[1] "%i weken" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i maand" msgstr[1] "%i maanden" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i jaar" msgstr[1] "%i jaar" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Debuggen" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Fouten" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Shell openen" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Verversingsstatus" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Debug-terugdraaien" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Alles in zicht terugdraaien" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Ongeldig maken" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Aanroep van invalidate_extension_info() afdwingen" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Embleem toevoegen" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Een embleem toevoegen…" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Uitchecken…" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Een werkversie uitchecken" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Updaten" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Een werkversie updaten" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Commit" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Aanpassingen committen in het repository" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "RabbitVCS SVN" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "RabbitVCS Git" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Bladeren door repository" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Een repository-boom doorbladeren" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Controleren op aanpassingen…" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Controleren op wijzigingen die aan het repository zijn gemaakt" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Diff-menu…" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Lijst van vergelijkingsopties" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Diff ten opzichte van basis bekijken" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "De wijzigingen aan een bestand bekijken" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Diff tussen bestanden/mappen bekijken" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "De verschillen tussen twee bestanden bekijken" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Diff ten opzichte van eerdere revisie bekijken" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "De aanpassingen aan een bestand sinds de laatste wijziging bekijken" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Vergelijken met basis" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" "Met basisversie vergelijken met behulp van naast-elkaar-vergelijkprogramma" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Bestanden/mappen vergelijken" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "De verschillen tussen twee items vergelijken" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Vergelijken met eerdere revisie" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" "Vergelijken met eerdere revisie met behulp van naast-elkaar-" "vergelijkprogramma" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Wijzigingen weergeven…" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Wijzigingen tussen paden en revisies tonen" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Logboek tonen" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "De logboekinformatie over een bestand tonen" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Toevoegen" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Items klaarzetten om toegevoegd te worden aan het repository" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Voeg toe aan negeer lijst" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Updaten naar revisie…" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Updaten naar een specifieke revisie" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Hernoemen…" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Een item klaarzetten om hernoemd te worden in het repository" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Verwijderen" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Een item klaarzetten om verwijderd te worden uit het repository" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Terugdraaien" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Een item terugzetten naar zijn ongemodificeerde staat" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Oplossen" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Een item in conflict markeren als opgelost" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Terugzetten" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Een ontbrekend item herstellen" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Verhuizen…" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Uw werkversie verhuizen" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Blokkering verkrijgen…" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Items lokaal blokkeren" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Blokkering vrijgeven…" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Blokkering op een item vrijgeven" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Opruimen" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Werkversie opschonen" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exporteren…" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" "Een werkversie of repository exporteren zonder versiebeheer-informatie" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Hier een repository aanmaken" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Repository in een map aanmaken" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importeren" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Item importeren in een repository" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Branch/tag…" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Een item kopiëren naar een andere locatie in het repository" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Wisselen…" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "De repository-locatie van een werkversie wijzigen" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Samenvoegen…" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Een wizard met samenvoegstappen" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Annoteren…" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Een bestand annoteren" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Patch aanmaken…" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" "Maakt een geünificeerd diff-bestand met al de wijzigingen die u gemaakt heeft" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Patch toepassen…" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Past een geünificeerd diff-bestand toe op de werkversie" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Eigenschappen" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "De eigenschappen van een item bekijken" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Hulp" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Hulp weergeven" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Instellingen" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "RabbitVCS-instellingen bekijken of wijzigen" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Over" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Info over RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Open" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Bestand openen" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Bladeren naar" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Naar een bestand of map navigeren" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Eigenschap terugdraaien" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Deze eigenschap terugdraaien naar haar oorspronkelijke staat" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Eigenschap terugdraaien (recursief)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" "Deze eigenschap terugdraaien naar haar oorspronkelijke staat (recursief)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Eigenschap verwijderen" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Deze eigenschap verwijderen" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "Eigenschap verwijderen (recursief)" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Deze eigenschap verwijderen (recursief)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "Details bewerken" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "Eigenschapdetails tonen en bewerken" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "Repository initialiseren" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "Klonen" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "Fetch/Pull" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "Push" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "Branches" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "Tags" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Item negeren per bestandsnaam" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Item negeren per extensie" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Updaten..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Update is voltooid" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "Terugdraaien naar revisie" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "Terugdraaien…" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "Terugdraaien voltooid" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Updaten naar revisie" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Uitchecken" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "Uitchecken van %s…" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Uitchecken voltooid" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Pad" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Extensie" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Laden..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "%d item(s) gevonden" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Wordt toegevoegd..." #: ui/add.py:159 msgid "Completed Add" msgstr "Toevoegen klaar" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "Bestand negeren:" #: ui/tags.py:62 msgid "Tag Manager" msgstr "Tagbeheer" #: ui/tags.py:63 msgid "Tags" msgstr "Tags" #: ui/tags.py:74 msgid "Tag" msgstr "Tag" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "Name:" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revisie:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "Message:" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "Opslaan" #: ui/tags.py:153 msgid "Tagger:" msgstr "Tagger:" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "Datum:" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "Wilt u %s echt verwijderen?" #: ui/tags.py:275 msgid "Add Tag" msgstr "Tag toevoegen" #: ui/tags.py:293 msgid "Tag Detail" msgstr "Tagdetail" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exporteren — %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "De repository URL en doel pad velden zijn beide verplicht." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exporteren" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Wordt geëxporteerd..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Export is klaar" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Patch toepassen" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Patch op map toepassen..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Patchbestand toepassen..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Patchbestand toegepast" #: ui/branches.py:62 msgid "Branch Manager" msgstr "Branchbeheer" #: ui/branches.py:63 msgid "Branches" msgstr "Branches" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "Branch" #: ui/branches.py:110 msgid "Start Point:" msgstr "Startpunt:" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "Geschiedenis van oude branch behouden" #: ui/branches.py:138 msgid "Set as active branch" msgstr "Als actieve branch instellen" #: ui/branches.py:280 msgid "Add Branch" msgstr "Branch toevoegen" #: ui/branches.py:304 msgid "Branch Detail" msgstr "Branchdetail" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Datum" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Boodschap" #: ui/push.py:97 msgid "Running Push Command..." msgstr "Uitvoeren Push-opdracht…" #: ui/push.py:99 msgid "Completed Push" msgstr "Push voltooid" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importeren — %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Het repository URL veld is verplicht." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Wordt geïmporteerd..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importeren klaar" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "Het bestand of de map die werd gevraagd bestaat niet." #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Hernoemen" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nieuwe naam:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Het veld 'nieuwe naam' is verplicht." #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Uitvoeren rename-opdracht…" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Hernoemen voltooid" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Tekst-status" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Eigenschapsstatus" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Commit-opdracht uitvoeren…" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Commit voltooid" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Diff als naast-elkaar-vergelijking bekijken" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Samenvoegtest draaien" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Samenvoegtest voltooid" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Bezig met uitvoeren van merge-opdracht" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Samenvoegen voltooid" #: ui/merge.py:102 msgid "Merge" msgstr "Samenvoegen" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "Auteur:" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Er is een fout opgetreden in de RabbitVCS Nautilus-extensie. Neem contact op " "met het RabbitVCS-team met de hieronder vermelde " "foutdetails:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Selecteer een map" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "naar" #: ui/dialog.py:261 msgid "Select a File" msgstr "Selecteer een bestand" #: ui/dialog.py:280 msgid "Save As..." msgstr "Opslaan als…" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Weet je zeker dat je wil verdergaan?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "de geselecteerde item(s)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Map toegevoegd aan het repository" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Bezig met uitvoeren revert-opdracht…" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Terugdraaien voltooid" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "Uitvoeren van kloon-opdracht…" #: ui/clone.py:73 msgid "Completed Clone" msgstr "Klonen voltooid" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "De 'vanaf' en 'tot' url velden zijn beide verplicht." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Verhuizen" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Uitvoeren relocate-opdracht…" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Verhuizen voltooid" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisie" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Auteur" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Geünificeerde diff bekijken" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Naast elkaar vergelijken" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Bezig met uitvoeren resolve-opdracht…" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Oplossen voltooid" #: ui/changes.py:49 msgid "More Actions..." msgstr "Meer acties..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Verandering" #: ui/changes.py:279 msgid "Property Change" msgstr "Eigenschap-wijziging" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Ja" #: ui/changes.py:321 msgid "No" msgstr "Nee" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Openen vanaf eerste revisie" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Openen vanaf tweede revisie" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Kan een map niet annoteren" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Annoteren — %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Regel" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Tekst" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "De 'vanaf' revisie moet een integer zijn." #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Logboek — %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N.v.t." #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Actie" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopiëren van pad" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopiëren van revisie" #: ui/log.py:556 msgid "Graph" msgstr "Grafiek" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Diff ten opzichte van werkversie bekijken" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Diff tussen revisies tonen" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Vergelijken met werkversie" #: ui/log.py:806 msgid "Compare revisions" msgstr "Revisies vergelijken" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "Wijzigingen tonen ten opzichte van vorige revisie" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Wijzigingen tussen revisies tonen" #: ui/log.py:823 msgid "Update to this revision" msgstr "Updaten naar deze revisie" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "Het geselecteerde pad updaten naar deze revisie" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Auteur bewerken…" #: ui/log.py:837 msgid "Edit log message..." msgstr "Logboekmelding bewerken…" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Revisie-eigenschappen bewerken…" #: ui/log.py:1047 msgid "Edit author" msgstr "Auteur bewerken" #: ui/log.py:1059 msgid "Edit log message" msgstr "Logboekmelding bewerken" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Onbekend" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" "Er is een fout opgetreden bij het communiceren met de statuscontroledienst." #: ui/settings.py:59 msgid "English" msgstr "Engels" #: ui/settings.py:119 msgid "Config file:" msgstr "Configuratiebestand:" #: ui/settings.py:294 msgid "Select a program" msgstr "Selecteer een programma" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Weet u zeker dat u uw repositorypaden wilt wissen?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Repository paden gewist" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Weet u zeker dat u uw vorige berichten wilt wissen?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Vorige berichten gewist" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Weet u zeker dat u uw authenticatie-informatie wilt wissen?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Authenticatie-informatie gewist" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Niet in staat eigenschappenlijst op te halen" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Een doel pad is verplicht." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Branch/tag wordt uitgevoerd..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Branch/tag is klaar" #: ui/lock.py:73 msgid "Locked" msgstr "Vergrendeld" #: ui/lock.py:167 msgid "Get Lock" msgstr "Vergrendelen" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Wordt vergrendeld..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Vergrendelen is klaar" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "De repository-locatie is een vereist veld." #: ui/switch.py:80 msgid "Switch" msgstr "Wisselen" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Bezig met uitvoeren switch-opdracht…" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Wisselen voltooid" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "Nummer" #: ui/widget.py:861 msgid "Working Copy" msgstr "Werkversie" #: ui/widget.py:1056 msgid "Repository:" msgstr "Repository:" #: ui/widget.py:1075 msgid "Branch:" msgstr "Branch:" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Hostcomputer:" #: ui/widget.py:1194 msgid "Add line:" msgstr "Regel toevoegen:" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Uitchecken — %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Uitvoeren checkout-opdracht…" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "Afstandrepository-beheer" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "Repository's op afstand" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Naam" #: ui/remotes.py:66 msgid "Host" msgstr "Host" #: ui/property_page.py:126 msgid "Repository URL" msgstr "Repository-URL" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Patch aanmaken" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Het gegeven pad is geen werk kopie" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Bezig met maken van patch-bestand…" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Patch-bestand aangemaakt" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Eigenschappen — %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Waarde" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Er trad een probleem op bij het opslaan van uw eigenschappen." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Merk op: veranderingen aan eigenschappen worden direct doorgevoerd. U " "kunt veranderingen herzien en ongedaan maken met behulp van het contextmenu " "voor elk item.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Wilt u de geselecteerde eigenschappen van alle bestanden en submappen\n" "onder deze map verwijderen?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Bestand is niet onder versiebeheer" #: ui/property_editor.py:112 msgid "Reserved" msgstr "Gereserveerd" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Niet in staat nieuwe waarde voor eigenschap in te stellen." #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" "U dient een versiecontrolesysteem op te geven met de optie --vcs [svn|git]" #: ui/action.py:118 msgid "Mime Type" msgstr "Mime type" #: ui/action.py:338 msgid "Finished" msgstr "Klaar" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - klaar" #: ui/action.py:365 msgid "Log Message" msgstr "Logboekmelding" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Ontgrendelen" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Bezig met uitvoeren unlock-opdracht…" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Unlock voltooid" #: ui/browser.py:89 msgid "Size" msgstr "Grootte" #: ui/browser.py:326 msgid "Select" msgstr "Selecteren" #: ui/browser.py:348 msgid "Create folder..." msgstr "Map maken..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Kopiëren naar..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Locatie naar het klembord kopiëren" #: ui/browser.py:363 msgid "Move to..." msgstr "Verplaatsen naar..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Waarheen wilt u de selectie kopiëren?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nieuwe locatie:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Waarheen wilt u de selectie verplaatsen?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Wordt opgeruimd..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Opruimen voltooid" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repository succesvol aangemaakt" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Er is een fout opgetreden bij het aanmaken van het repository. Zorg ervoor " "dat de opgegeven map leeg is." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Eigenschappen voor:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Geselecteerde eigenschappen worden recursief toegepast." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Eigenschappen recursief verwijderen" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Bewerken..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nieuw…" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Pad:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Laden/verversen" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "Er is een conflict gevonden in het volgende bestand:" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Boodschap Toevoegen" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Certificaatdetails" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Eigenschapdetails bewerken" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "Voer naam- en e-maildetails in" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Mapnaam" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Bericht" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Gelieve uw authenticatiedetails toe te voegen" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Geef alstublieft uw ssl certification-bestand" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Eerdere berichten" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Weet u zeker dat u %item% wilt " "verwijderen?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "RabbitVCS-fout" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Voor altijd accepteren" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "Van mij accepteren" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Eenmalig accpeteren" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "Van hen accepteren" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Eigenschap recursief toepassen" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Authenticatie" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "Annuleren" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Certificaat controleren" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Bevestiging" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "Beslissing op conflictoplossing" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Map aanmaken…" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Verwijderen bevestigen" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Weigeren" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "E-mail:" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Vingerafdruk:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "Hoe wilt u dit afhandelen?" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Uitgever:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Aanmeldnaam:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "Handmatig samenvoegen" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "Naam en e-mail" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Wachtwoord:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Pad:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Vorige boodschappen" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Eigenschap" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Eigenschap:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS-fout" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Omgeving:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL-gebruikerscertificaat" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Authenticatie opslaan" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Tekstwijziging" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "De item(s) worden in de prullenbak gegooid." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Geldig:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Waarde:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "Informatie over pull" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "Wijzigingen samenvoegen in lokale branch" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "Pull" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "label" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Koppelingen" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Versie Informatie" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Auteurs:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Met dank aan:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "Inhoudstatus:" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "Eigenschapsstatus:" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "VCS:" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" "Betrokken bestand(en) (dubbelklik om te vergelijken met basis)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revisietabel" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limiet:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Logboek" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Verversen" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Getoonde revisies:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Op kopie stoppen" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Opschonen aangevraagd…\n" "\n" "Beginnen met opschonen van werkversie?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Authenticatie" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "Checkertype:" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "Configuratie-editor" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Logboekberichten" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Logboek-opties" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "Geheugengebruik: " #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "Andere informatie" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "Proces-ID:" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Programma voor bestandsvergelijking" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL-geschiedenis" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Bladeren…" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Uw authenticatie-informatie wissen" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Emblemen inschakelen…" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Bestandskenmerken inschakelen" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Recursieve statuscontroles inschakelen" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Externe programma's" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Algemeen" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "Git" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Taal:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Logboek" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Minimumniveau voor loggen" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Het aantal te onthouden URLs" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Het aantal te onthouden berichten" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "Informatie verversen" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "Checker herstarten" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Opgeslagen data" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "RabbitVCS-debughulpprogramma's tonen" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "Nieuwe versie tonen aan de linkerkant" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "Statuschecker" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "Stopchecker" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "Het debugmenu is bedoeld om problemen met RabbitVCS zelf te diagnosticeren" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Type:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Te vergrendelen bestanden" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Beschrijf waarom u deze bestanden vergrendelt" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Bestanden vergrendelen" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Alles (de)selecteren" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "De blokkeringen stelen" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Van Revisie" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Naar Revisie" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Annoteren" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "Bestanden negeren en uitsluiten van gevolgd worden" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "Negeren" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Gewijzigde bestanden (dubbelklik om met basis te vergelijken)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Committen naar:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Bestanden buiten versiebeheer tonen" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Meldingen" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "URI op afstand:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Werkversie:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Nieuwe eigenschap toevoegen." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Dit dialoogvenster sluiten." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Eigenschappen-editor" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "De eigenschappenlijst verversen" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Het repository van uw werkversie veranderen" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Van:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Naar:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opties" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "Lokale repository updaten" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revisie" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Externen overslaan" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Recursief" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "Terugdraaien naar opgegeven revisienummer" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Bericht importeren" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repository" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Genegeerde bestanden meenemen" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Van URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Van: (Samen te voegen URL en revisie)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Revisiebereik" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Naar: (samen te voegen URL en revisie)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL waarvandaan samen te voegen" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Werkversie" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Gebruik deze methode als u wijzigingen hebt gemaakt aan een branch en uw " "wijzigingen wilt samenvoegen met een andere branch." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Gebruik deze methode als u twee verschillende branches wilt samenvoegen naar " "uw werkversie." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Voorgeschiedenis negeren" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Samenvoeg-assistent" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Een reeks revisies samenvoegen" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Twee verschillende bomen samenvoegen" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Alleen het samvoegen opnemen" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Toon log" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test-samenvoegen" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" #~ msgid "Completed" #~ msgstr "Klaar" #~ msgid "(no author)" #~ msgstr "(geen auteur)" rabbitvcs-0.18/po/oc.po000066400000000000000000001130101362112712700147760ustar00rootroot00000000000000# Occitan (post 1500) translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-05-06 06:27+0000\n" "Last-Translator: Cédric VALMARY (Tot en òc) \n" "Language-Team: Occitan (post 1500) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i segonda" msgstr[1] "%i segondas" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuta" msgstr[1] "%i minutas" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i ora" msgstr[1] "%i oras" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i jorn" msgstr[1] "%i jorns" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i setmana" msgstr[1] "%i setmanas" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mes" msgstr[1] "%i meses" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i annada" msgstr[1] "%i annadas" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Desbugatge" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Metre a jorn" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Validar" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Apondre" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Tornar nomenar..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Suprimir" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Restablir" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Restablir" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Netejar" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exportar..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importar" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Bascuolar..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Fusionar..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Crear un correctiu..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Aplicar lo correctiu..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Proprietats" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Ajuda" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Paramètres" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "A prepaus" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Dobrir" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Dobrir un fichièr" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "En cors de mesa a jorn..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Camin" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Extension" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Cargament en cors..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/add.py:157 msgid "Running Add Command..." msgstr "" #: ui/add.py:159 msgid "Completed Add" msgstr "" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revision :" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exportar" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Data" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Messatge" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importacion - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Tornar nomenar" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nom novèl :" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Estat" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "Fusionar" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "a" #: ui/dialog.py:261 msgid "Select a File" msgstr "Seleccionatz un fichièr" #: ui/dialog.py:280 msgid "Save As..." msgstr "Enregistrar jos..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revision" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "D'accions mai..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Modificar" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Òc" #: ui/changes.py:321 msgid "No" msgstr "Non" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linha" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Tèxte" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Accion" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Desconegut" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Anglés" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "Varrolhat" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "Numèro" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Òste :" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nom" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Proprietats - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valor" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "Reservat" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Tipe MIME" #: ui/action.py:338 msgid "Finished" msgstr "Acabat" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:365 msgid "Log Message" msgstr "Messatge del jornal" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Desvarrolhar" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "Talha" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "Copiar cap a..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Copiar l'URL dins lo quichapapièrs" #: ui/browser.py:363 msgid "Move to..." msgstr "Desplaçar cap a..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Modificar..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Novèl..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL :" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Messatge" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autentificacion" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Confirmacion" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Crear un dorsièr..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Refusar" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Nom d'utilizaire :" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Senhal :" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Camin :" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Proprietat" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Proprietat :" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Domeni :" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valor :" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autors :" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limit :" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Jornal" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Refrescar" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autentificacion" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Percórrer..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programas extèrnes" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "General" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Lenga :" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Archivatge" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tipe :" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Anotar" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Messatges de notificacion" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "De :" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Cap a :" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opcions" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revision" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Recursiu" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/pl.po000066400000000000000000001272421362112712700150240ustar00rootroot00000000000000# Polish translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-11-18 22:00+0000\n" "Last-Translator: Mateusz Boś \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i sekundy" msgstr[1] "%i sekund" msgstr[2] "%i sekund" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuta" msgstr[1] "%i minut" msgstr[2] "%i minut" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i godzina" msgstr[1] "%i godzin" msgstr[2] "%i godzin" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dzień" msgstr[1] "%i dni" msgstr[2] "%i dni" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i tydzień" msgstr[1] "%i tygodni" msgstr[2] "%i tygodni" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i miesiąc" msgstr[1] "%i miesięcy" msgstr[2] "%i miesięcy" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i rok" msgstr[1] "%i lata" msgstr[2] "%i lata" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Debuguj" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Błędy" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Otwórz Powłokę" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Odśwież Status" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Dodaj Symbol" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Dodaj Symbole" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Zaktualizuj" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Zaktualizuj kopię roboczą" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Zatwierdź" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Zatwierdź zmiany w repozytorium" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Przeglądarka repozytorium" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Przeglądaj repozytorium" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Zobacz zmiany w pliku" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Zobacz różnice pomiędzy plikami/folderami" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Zobacz różnice pomiędzy dwoma plikami" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Pokaż różnice względem poprzedniej wersji" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Porównaj z poprzednią wersją" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Pokaż zmiany..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Dodaj" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Dodaj do ignorowanych" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Zaktualizuj do wersji..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Zmień nazwę..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Usuń" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Przywróć" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Rozwiąż" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Przywróć" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Oczyść" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Eksportuj..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importuj" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Przełącz..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Właściwości" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Pomoc" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Ustawienia" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "O programie" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "O RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Otwórz" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Otwórz plik" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Przywróć właściwość" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Przywróć właściwość do oryginalnej postaci" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Przywróć właściwość (rekursywnie)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Usuń właściwość" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Usuń tą właściwość" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Usuń tą właściwość (rekursywnie)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Uaktualnianie..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Uaktualniono." #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Uaktualnij do wersji" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Pobierz" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Zakończono pobieranie" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Ścieżka" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Rozszerzenie" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Ładowanie..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Znaleziono %d obiekt(y/ów)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Wykonywanie \"dodaj\"..." #: ui/add.py:159 msgid "Completed Add" msgstr "Zakończono \"dodaj\"" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Wersja:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Eksportuj - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "Zarówno URL repozytorium, jak i ścieżka docelowa są wymagane." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Eksportuj" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Wykonywanie \"eksport\"" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Zakończono \"eksport\"" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Zastosuj łatę" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Zastosuj łatę do katalogu..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Stosowanie łaty..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Łata została zastosowana" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Data" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Wiadomość" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importuj - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Pole URL repozytorium jest wymagane" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Wykonywanie \"importuj\"" #: ui/import.py:89 msgid "Completed Import" msgstr "Zakończono \"importuj\"" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Zmień nazwę" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nowa nazwa:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Pole nowa nazwa jest wymagane" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Trwa zmienianie nazwy..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Zmieniono nazwę" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Status Tekstowy" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Wykonywanie \"zatwierdź\"..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Zakończono \"zatwierdź\"" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Wykonywanie 'Złącz'" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Zakończono 'Złącz'" #: ui/merge.py:102 msgid "Merge" msgstr "Scal" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Wystąpił błąd w rozszerzeniu RabbitVCS. Proszę skontaktować się z autorami RabbitVCS podając szczegóły błędu widoczne poniżej:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Wybierz katalog" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "do" #: ui/dialog.py:261 msgid "Select a File" msgstr "Wybierz plik" #: ui/dialog.py:280 msgid "Save As..." msgstr "Zapisz jako...." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Czy na pewno chcesz kontynuować?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "zaznaczone obiekty" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Dodano katalog do repozytorium" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Wykonywanie \"przywróć\"" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Zakończono \"przywróć\"" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Pola z i do są wymagane" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Przenieś" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Trwa przenoszenie..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Przenoszenie zakończone" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Wersja" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Porównaj obok siebie" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Wykonywanie komendy rozwiąż" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Zakończono \"rozwiąż\"" #: ui/changes.py:49 msgid "More Actions..." msgstr "Więcej akcji..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Zmień" #: ui/changes.py:279 msgid "Property Change" msgstr "Zmiana właściwości" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Tak" #: ui/changes.py:321 msgid "No" msgstr "Nie" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Otwórz z pierwszej rewizji" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Otwórz z drugiej rewizji" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Nie można adnotować katalogu" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Adnotuj - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linia" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Tekst" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Pole od rewizji musi być liczbą całkowitą" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Log - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "Nie dotyczy" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Akcja" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopiuj ze ścieżki" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopiuj z wersji" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Pokaż różnice względem kopii roboczej" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Pokaż różnice pomiedzy wersjami" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Porównaj z kopią roboczą" #: ui/log.py:806 msgid "Compare revisions" msgstr "Porównaj wersje" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Pokaż zmiany pomiędzy wersjami" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Edytuj autora..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Edytuj opis zmian..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Edytuj właściwości wersji" #: ui/log.py:1047 msgid "Edit author" msgstr "Edytuj autora" #: ui/log.py:1059 msgid "Edit log message" msgstr "Edytuj opis zmian" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Nieznane" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "angielski" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Wybierz program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Czy na pewno chcesz wyczyścić ścieżki do repozytoriów?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Ścieżki do repozytoriów zostały wyczyszczone" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Czy na pewno chcesz wyczyścić poprzednie wiadomości" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Poprzednie wiadomości zostały wyczyszczone" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Czy na pewno chcesz wyczyścić swoje dane autentykacji?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Dane uwierzytelniania zostały wyczyszczone" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Nie udało się pobrać listy właściwości" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Musisz podać ścieżkę docelową." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Utwórz gałąź/etykietę" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Tworzę gałąź/etykietę..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Utworzono gałąź/etykietę" #: ui/lock.py:73 msgid "Locked" msgstr "Zablokowany" #: ui/lock.py:167 msgid "Get Lock" msgstr "Załóż blokadę" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Wykonywanie \"zablokuj\"" #: ui/lock.py:177 msgid "Completed Lock" msgstr "Zakończono \"zablokuj\"" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Położenie repozytorium jest polem wymaganym" #: ui/switch.py:80 msgid "Switch" msgstr "Przełącz" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Wykonywanie \"przełącz\"..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Zakończono \"przełącz\"" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "GŁÓWNA" #: ui/widget.py:860 msgid "Number" msgstr "Numer" #: ui/widget.py:861 msgid "Working Copy" msgstr "Kopia robocza" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Host:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Pobierz - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Wykonywanie 'Pobierz' ..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nazwa" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Utwórz łatę" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Podana ścieżka nie wskazuje na kopię roboczą" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Tworzenie pliku łaty..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Plik łaty został utworzony" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Właściwości - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Wartość" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Wystąpił błąd przy próbie zapisu właściwości" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Uwaga: zmiany właściwości są stosowane natychmiast. Możesz przejrzeć " "i cofnąć zmiany używając menu kontekstowego dla każdego obiektu\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Czy chcesz usunąć wskazane właściwości ze wszystkich plików i podkatalogów\n" "zawartych w tym katalogu?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Plik nie jest objęty kontrolą wersji" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Nie udało się zmienić właściwości" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Typ MIME" #: ui/action.py:338 msgid "Finished" msgstr "Zakończono" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Zakończono" #: ui/action.py:365 msgid "Log Message" msgstr "Wpis dziennika" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Odblokuj" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Wykonywanie \"odblokuj\"..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Zakończono \"odblokuj\"" #: ui/browser.py:89 msgid "Size" msgstr "Rozmiar" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Utwórz katalog" #: ui/browser.py:353 msgid "Copy to..." msgstr "Skopiuj do..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Skopiuj URL do schowka" #: ui/browser.py:363 msgid "Move to..." msgstr "Przenieś do.." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Gdzie chcesz skopiować zaznaczenie?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nowe położenie:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Gdzie chcesz przenieść zaznaczenie?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Oczyszczanie..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Zakończono oczyszczanie" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Pomyślnie utworzono repozytorium" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Wystąpił błąd w czasie tworzenia repozytorium. Upewnij się, że podany " "katalog jest pusty." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Właściwości dla:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Wybrane właściwości będą stosowana rekursywnie." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Usuń właściwości rekursywnie" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Zmień..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nowa..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Ścieżka:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Załaduj / Odśwież" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Dodaj wiadomość" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Szczegóły certyfikatu" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Zmień właściwość" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Nazwa katalogu" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Wiadomość" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Proszę dodaj swoje dane uwierzytelniania" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Proszę podać plik certyfikatu SSL" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Poprzednie wiadomości" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Czy na pewno chcesz usunąć %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "Błąd RabbitVCS" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Zawsze akceptuj" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Zaakceptuj tylko tym razem" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Zastosuj właściwość rekursywnie" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Uwierzytelnianie" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Sprawdź certyfikat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Potwierdzenie" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Utwórz katalog..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Potwierdzenie usunięcia" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Odrzuć" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Odcisk klucza:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Wystawca:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Login:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Hasło:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Ścieżka:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Poprzednie wiadomości" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Właściwość" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Właściwość:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "Błąd RabbitVCS" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Dziedzina:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Zapisz dane logowania" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Zmiana Tekstu" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Obiekty zostaną wysłane do kosza" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Poprawny:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Wartość:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Linki" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informacje o wersji" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autorzy:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Podziękowania:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "Dotknięte pliki (kliknij dwukrotnie by porównać z bazą)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tablica wersji" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limit:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Log" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Odśwież" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Pokazuję wersje:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Zażądano oczyszczania\n" "\n" "Rozpocząć oczyszczanie kopii roboczej?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Uwierzytelnianie" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Zapis Wiadomości" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Opcje zapisywania wiadomości" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Program używany do porównywania plików" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Historia Adresów URL" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Przeglądaj..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Wyczyść dane uwierzytelniania" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Włącz symbole" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Włącz atrybuty plików" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Włącz rekursywne sprawdzanie statusów" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Zewnętrzne programy" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Główne" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Język:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Zapisywanie Wiadomości" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Minimalny poziom do zapisywania wiadomości" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Ilość URL-i do zapamiętania" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Ilość wiadomości do zapamiętania" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Zapisane dane" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Zobacz narzędzia debugowania RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "Menu debugowania jest używane do diagnozowania problemów z samym RabbitVCS" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Rodzaj:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Pliki do zablokowania" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Opisz, dlaczego blokujesz te pliki" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Zablokuj pliki" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Zaznacz / Odznacz wszystkie" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Przejmij blokady" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Od wersji" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Do wersji" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Dodaj komentarz" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Zmienione pliki (kliknij dwukrotnie, by porównać z bazą)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Zatwierdź do:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Pokaż pliki niewersjonowane" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Powiadomienie o wiadomościach" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "Zdalny URI:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Kopia robocza:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Dodaj nową właściwość." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Zamknij." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Edytor właściwości" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Odśwież listę właściwości." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Zmiana repozytorium twojej kopii roboczej" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Z:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Do:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opcje" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Wersja" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Pomiń zewnętrzne" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Rekursywnie" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Wpisz Wiadomość" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repozytorium" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Włącz pliki ignorowane" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Z URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Od: (URL i rewizja do złączenia)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Zakres wersji" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Do: (URL i rewizja do złączenia)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Kopia robocza" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Wybierz tą metodę, jeżeli dokonałeś zmian w gałęzi i chciałbyś połączyć je z " "inną gałęzią." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Wybierz tą metodę, jeżeli chcesz połączyć dwie różne gałęzie do twojej kopii " "roboczej." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Asystent łączenia" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Scal zakres rewizji" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Scal dwa różne drzewa" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Tylko zanotuj scalenie" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Pokaż logi" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test Scalania" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/pt_BR.po000066400000000000000000001405141362112712700154140ustar00rootroot00000000000000# Brazilian Portuguese translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-12-06 05:15+0000\n" "Last-Translator: Fernando P Silveira \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "há pouco" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "%d minutos(s) atrás" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i segundo" msgstr[1] "%i segundos" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minuto" msgstr[1] "%i minutos" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i hora" msgstr[1] "%i horas" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dia" msgstr[1] "%i dias" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i semana" msgstr[1] "%i semanas" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mês" msgstr[1] "%i meses" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i ano" msgstr[1] "%i anos" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Depurar" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Abrir Shell" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Atualizar Status" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Reverter depuração" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Reverter tudo que ve" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Invalidar" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Forçar uma chamada invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Adicionar Emblema" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Adicionar um emblema" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Obter..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Obter uma cópia de trabalho" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Atualizar" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Atualizar uma cópia de trabalho" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Enviar" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Enviar modificações para o repositório" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "RabbitVCS SVN" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "RabbitVCS Git" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "Navegador de Repositório" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Procurar uma árvore de repositório" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Verificando se existem modificações..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Verificando se existem modificações efetuados para o repositório" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Menu do diferenciador" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Lista de opções de comparação" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Diferenciações comparadas à base" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Visualizar as alterações feitas em um arquivo" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Ver diferenciações entre arquivos/pastas" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Ver as diferenças emtre dois arquivos" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Veja a diferenciação de encontro com a revisão prévia" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" "Ver as modificações realizadas em um arquivo desde a última alteração" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Comparar com a base" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "Comparar com a base usando a ferramenta de comparação lado a lado" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Comparar arquivos/pastas" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Comparar as diferenças entre dois itens" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Compare com a revisão prévia" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" "Comparar com prévia revisão usando a ferramenta de comparação lado a lado" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Mostrar Alterações..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Mostrar alterações entre caminhos e revisões" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Mostrar Log" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Mostrar as informações de um arquivo de log" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Adicionar" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Programar itens para serem adicionaos ao repositório" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Adicionar à lista de ignorados" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Atualizar para revisão..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Atualizar um arquivo para uma revisão específica" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Renomear..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Agendar um item para ser renomeado no repositório" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Apagar" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Agendar um item para ser deletado do repositório" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Reverter" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Reverter um item para seu estado inalterado" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Resolver" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Marcar um item conflitante como resolvido" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Restaurar" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Recuperar um item em falta" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Realocar..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Realocar sua cópia de trabalho" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Bloquear..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Itens bloqueados localmente" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Liberar Bloqueio..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Liberar bloqueio de um item" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Limpeza" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Limpeza de cópia de trabalho" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exportar..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" "Exportar uma cópia de trabalho ou repositório sem informações de " "versionamento" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Criar Repositório aqui" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Criar um repositório no diretório" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importar" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importar um item em um respositório" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Branch/tag..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Copiar um item para outro lugar no repositório" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Mudar..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Mudar o lugar do repositório de um cópia de trabalho" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Mesclar..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Um assistente com passos para mesclar" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Comentário..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Comentar um arquivo" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Criar Remendo..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "Cria um arquivo diff unificado com todas as mudanças que vocẽ fez" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Aplicar remendo" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" "Aplicar um arquivo com resultado de equalidade unificado para a cópia de " "trabalho" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Propriedades" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Visualizar as propriedades de um item" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Ajuda" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Visualizar ajudar" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Configurações" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Visualizar ou alterar as configurações do RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Sobre" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Sobre o RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Abrir" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Abrir um arquivo" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Navegue para" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Procurar em um arquivo ou pasta" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Reverter propriedade" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Reverter esta propriedade ao seu estado original" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Reverter propriedade (recursivo)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Reverter esta propriedade ao seu estado original (recursivo)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Excluir propriedade" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Excluir esta propriedade" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "Apagar propriedade (recursivo)" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Excluir esta propriedade (recursivo)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "Editar detalhes" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "Exibir e editar detalhes da propriedade" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "Iniciar repositório" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "Clonar" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "Ramificações" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "Palavras-chave" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "Remotos" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "Ignorar item por nome de arquivo" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Ignorar item por extensão de arquivo" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Atualizando..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Atualização Completada" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Atualizando para Revisão" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Obter" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Obter Concluído" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Caminho" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Extensão" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Carregando..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Encontrado(s) %d item(ns)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Rodando Comando Adicionar..." #: ui/add.py:159 msgid "Completed Add" msgstr "Adicionar Concluído" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "Ignorar arquivo:" #: ui/tags.py:62 msgid "Tag Manager" msgstr "Gerenciador de palavras-chave" #: ui/tags.py:63 msgid "Tags" msgstr "Palavras-chave" #: ui/tags.py:74 msgid "Tag" msgstr "Palavra-chave" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "Nome:" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revisão:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "Mensagem:" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "Salvar" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "Data:" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "Tem certeza que quer apagar %s?" #: ui/tags.py:275 msgid "Add Tag" msgstr "Adicionar palavra-chave" #: ui/tags.py:293 msgid "Tag Detail" msgstr "Detalhe da palavra-chave" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exportado - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "Os campos URL do repositório e caminho de destino são necessários." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exportar" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Rodando Comando Exportar" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Exportar Concluído" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Aplicar remendo" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Aplicar remendo para o diretório..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Aplicando a linha de remendo..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Linha de remendo aplicada" #: ui/branches.py:62 msgid "Branch Manager" msgstr "Gerenciador de ramificações" #: ui/branches.py:63 msgid "Branches" msgstr "Ramificações" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "Ramificação" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Data" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Mensagem" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importado - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "O campo URL do repositório é necessário." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Rodando Comando Importar..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importar Concluído" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Renomear" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Novo Nome:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "O nome do novo campo é requerido" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Rodando Comando Renomear.." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Renomear Completado" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Texto de Status" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Propriedades de Status" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Rodando Comando Enviar..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Enviar Concluído" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Estado" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Ver diferenciação por comparação lado a lado" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Executando Teste de Merge" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Teste de Merge Concluído" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Executando Merge" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Merge Concluído" #: ui/merge.py:102 msgid "Merge" msgstr "Merge" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "Ocorreu um erro na extensão do RabbitVCS Nautilus.Por favor contate o Time RabbitVCS com os detalhes do erro listados abaixo:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Selecionar um diretório" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "para" #: ui/dialog.py:261 msgid "Select a File" msgstr "Selecionar um arquivo" #: ui/dialog.py:280 msgid "Save As..." msgstr "Salvar como..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Tem certeza que deseja continuar?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "O(s) item(ns) selecionado(s)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Adicionado uma pasta ao repositório" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Rodando Comando Reverter..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Reverter Concluído" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "As URL origem e destino são necessárias" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Realocar" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Rodando Comando Realocar" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Relocar Concluído" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revisão" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Visão da unificação pelo diferenciador" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Comparação lado a lado" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Rodando Comando Resolver" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Resolver Concluído" #: ui/changes.py:49 msgid "More Actions..." msgstr "Mais ações..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Alteração" #: ui/changes.py:279 msgid "Property Change" msgstr "Alteração de Propriedade" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Sim" #: ui/changes.py:321 msgid "No" msgstr "Não" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Abrir da primeira versão" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Abrir da segunda versão" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Não é possível comentar um diretório" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Comentar - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linha" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Texto" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "O campo revisão de origem deve um inteiro" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Log - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/D" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Ação" #: ui/log.py:338 msgid "Copy From Path" msgstr "Copiar do Caminho" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Copiar da versão" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Veja a diferenciação de encontro com a cópia em uso" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Veja a diferenciação entre as revisões" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Compare com a versão local" #: ui/log.py:806 msgid "Compare revisions" msgstr "Compare revisões" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Mostrar mudanças entre as revisões" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Edite o autor..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Edite a mensagem do relatório..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Editar propriedades de revisão" #: ui/log.py:1047 msgid "Edit author" msgstr "Edite o autor" #: ui/log.py:1059 msgid "Edit log message" msgstr "Edite a mensagem do relatório" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Desconhecido" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Inglês" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Selecione um programa" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Tem certeza de que deseja apagar seu caminho do repositório?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Caminho do repositório apagado" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Tem certeza que deseja apagar sua mensagem anterior?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Mensagem anterior apagada" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Tem certeza que deseja apagar sua informação de autenticação?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Informação de autenticação apagada" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Incapaz de recuperar a lista de propriedades" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Você deve informar uma pasta de destino." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Rodando comando Branch/tag..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Branch/tag Completada" #: ui/lock.py:73 msgid "Locked" msgstr "Bloqueado" #: ui/lock.py:167 msgid "Get Lock" msgstr "Bloquear" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Bloqueando..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Bloqueado" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "O campo repositório local é necessário" #: ui/switch.py:80 msgid "Switch" msgstr "Trocar" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Rodando Comando Trocar" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Trocar Concluído" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "Número" #: ui/widget.py:861 msgid "Working Copy" msgstr "Cópia em uso." #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Servidor:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Checkout - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Executando Checkout..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Chave" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Criar Patch" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "O caminho informado não é de uma cópia de trabalho" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Criando arquivo de remendo" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Arquivo de remendo criado" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Propriedades - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valor" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Houve um problema ao salvar suas propriedades." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" "Nota: Alterações das propriedades são aplicadas instantâneamente. " "Você precisa rever e anular as alterações efetuadas usando o menu de " "contexto para cada item.\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" "Você deseja deletar as propriedades selecionadas para todos os arquivos e " "subdiretórios\n" "contidos neste diretório?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "O arquivo não está sob o controle da versão." #: ui/property_editor.py:112 msgid "Reserved" msgstr "Reservado" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Incapaz de ajustar um novo valor à propriedade." #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Tipo Mime" #: ui/action.py:338 msgid "Finished" msgstr "Concluído" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Finalizado" #: ui/action.py:365 msgid "Log Message" msgstr "Mensagem de log" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Desbloquear" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Rodando Comando Desbloquear" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Desbloquear Completado" #: ui/browser.py:89 msgid "Size" msgstr "Tamanho" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Criar pasta..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Copiar para..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Copiar a URL para a área de transferência" #: ui/browser.py:363 msgid "Move to..." msgstr "Mover para..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Onde você quer copiar a seleção?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nova Localização" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Onde você quer mover a seleção?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Limpando..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Limpeza Concluída" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repositório criado com sucesso" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Ocorreu um erro criando o repositório. Tenha certeza que o diretório " "informando está vazio." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Propriedades para:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "As propriedades selecionadas serão aplicadas recursivamente." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Apagar propriedades recursivamente" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Editar..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Novo..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Caminho:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Carreage/Renovar" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Adicionar Mensagem" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Detalhes do Certificado" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Editar Detalhes da Propriedade" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Nome da Pasta" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Mensagem" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Por favor, adicionar detalhes da sua autenticação" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Por favor forneça seu arquivo de certificação SSL" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Mensagem Anterior" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Tem certeza que deseja deleter %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "Erro do RRabbitVCS" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Aceitar Sempre" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Aceitar uma vez" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Aplicar propriedade recursivamente" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autenticação" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Verificar Certificado" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Confirmação" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Criar pasta..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Confirmação de Remoção" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Negar" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Impressão digital:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Emissor:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Login:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Senha:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Caminho:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Mensagem Anterior" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Propriedade" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Propriedade:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "Erro do RabbitVCS" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Domínio:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "Certificação SSL do cliente" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Salvar Autenticação" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Alteração do texto" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "O(s) item(ns) pode(m) ser enviado(s) para lixeira." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Validar:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valor:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Links" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informações da Versão" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autores:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Agradecimentos:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "Arquivo(s) afetado(s) (duplo clique para comparar com a base)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tabela de Revisões" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limite:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Log" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Atualizar" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Mostrando Revisões:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Parar em cópia" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Limpeza Solicitada ....\n" "\n" "Começar a limpeza da cópia de trabalho?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autenticação" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Mensagens de Log" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Opções de Log" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Programa utilizado para comparar arquivos" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Histórico de URL(s)" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Procurar..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Apagar sua informação de autenticação" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Ativar emblemas" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Ativar atributos de arquivo" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Ativar checagem recursiva de status" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programas Externos" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Geral" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Idioma:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Gravando Log" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Nível médio para log" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Número de URLs para se lembrar" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Número de mensagens para se lembrar" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Data Salva" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Mostrar ferramentas de debug do RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" "O menu de debug é usado para diagnosticar problemas com o próprio RabbitVCS" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tipo:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Arquivos para bloquear" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" "Por favor, descreva porque você está bloqueando esses arquivos" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Bloquear Arquivos" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Selecionar / Deselecionar tudo" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Roubar os bloqueios" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Da Revisão" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Para Revisão" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Comentar" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Arquivos alterados (duplo clique para comparar com a base)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Enviar para:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Mostrar arquivos não versionados" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Mensagens de Notificação" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "URI Remota:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Cópia em uso" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Adicione uma nova propriedade." #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Fechar esta janela." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Editor de Propriedade" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Atualizar a lista de propriedades." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Alterar o repositório da sua cópia de trabalho" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "De:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Para:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opções" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revisão" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Omitir os Externos" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Recursivo" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importar Mensagem" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repositório" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Incluir arquivos ignorados" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Da URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "De: (URL e revisão para mesclagem)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Intervalo de Revisões" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Para: (URL e revisão para mesclagem)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL de origem para mesclagem" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Cópia de Trabalho" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Escolha este método se você fez algumas alterações para um branch e deseja " "mesclar suas alterações com outro branch." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Escolha este método se você deseja mesclar dois diferentes branches em sua " "cópia de trabalho." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorar ancestral" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Assistente de Mesclagem" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Mesclar um intervalo de revisões" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Mesclar duas árvores diferentes" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Somente gravar a mesclagem" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Mostrar Log" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Testar Mesclagem" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Utilize o diálogo de log para selecionar as revisões que você deseja " "mesclar. Ou, escreve manualmente as revisões, separando por vírgula. Você " "pode especificar um intervalo de visões utilizando um traço.\n" "\n" "Examplo: 4-7,9,11,15-HEAD\n" "\n" "Para mesclar todas as revisões, deixa a caixa vazia." #~ msgid "Completed" #~ msgstr "Concluído" #~ msgid "(no author)" #~ msgstr "(sem autor)" #~ msgid "Switch Details" #~ msgstr "Mudar Detalhes" #~ msgid "Create copy from" #~ msgstr "\t Criar cópia de" #~ msgid "Program used to browse repositories" #~ msgstr "Programa utilizado para navegar nos repositórios" #~ msgid "Show new version on the right side" #~ msgstr "Mostrar a nova versão do lado direito" #~ msgid "Update Depth" #~ msgstr "Atualizar Profundidade" #~ msgid "Destination:" #~ msgstr "Destino:" #~ msgid "Deleted" #~ msgstr "Deletado" #~ msgid "Copied" #~ msgstr "Copiado" #~ msgid "Added" #~ msgstr "Adicionado" #~ msgid "Reverted" #~ msgstr "Revertido" #~ msgid "Restored" #~ msgstr "Restaurado" #~ msgid "Failed Revert" #~ msgstr "Falha ao Reverter" #~ msgid "Resolved" #~ msgstr "Resolvido" #~ msgid "Failed Unlock" #~ msgstr "Falha ao Desbloquear" #~ msgid "Failed Lock" #~ msgstr "Falha ao Bloquear" #~ msgid "External" #~ msgstr "Externo" #~ msgid "Modified" #~ msgstr "Modificado" #~ msgid "Replaced" #~ msgstr "Substituído" #~ msgid "Changed" #~ msgstr "Alterado" #~ msgid "Skipped" #~ msgstr "Ignorado" #~ msgid "Updated" #~ msgstr "Atualizado" #~ msgid "Annotated" #~ msgstr "Comentado" #~ msgid "Unlocked" #~ msgstr "Desbloqueado" #~ msgid "Conflicted" #~ msgstr "Conflitante" #~ msgid "Inapplicable" #~ msgstr "Inaplicável" #~ msgid "Unchanged" #~ msgstr "Não modificado" #~ msgid "Merged" #~ msgstr "Mesclado" #~ msgid "Obstructed" #~ msgstr "Obstruído" #~ msgid "Missing" #~ msgstr "Faltando" rabbitvcs-0.18/po/ro.po000066400000000000000000001162071362112712700150300ustar00rootroot00000000000000# Romanian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-02-09 10:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Romanian \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 % 100 > 19) || ((n % 100 " "== 0) && (n != 0))) ? 2: 1));\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i secundă" msgstr[1] "%i de secunde" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minut" msgstr[1] "%i minute" msgstr[2] "%i de minute" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i oră" msgstr[1] "%i ore" msgstr[2] "%i de ore" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Depanează" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Stare Reîmprospătare" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Invalidează" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Adaugă Emblemă" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Adauga o emblemă" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Actualizare" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Vizualizează modificările aduse unui fișier" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Arată Jurnal" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Adăugare" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Adaugă la lista de ignorat" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Redenumește..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Șterge" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Restaurează" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Rezolvă" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Restaurează" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Ștergere" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importă" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Comutare..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Adnotează..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Adnotează un fișier" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Proprietăți" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Vizualizează proprietățile unui articol" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Ajutor" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Vizualizează ajutor" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Setări" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Vizualizează sau modifică setaările RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Despre" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Despre RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Deschide" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Caută în" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "În curs de actualizare..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Actualizare completă" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Actualizați la revizia" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Cale" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Extensie" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Se încarcă..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Găsit %d articol(e)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Rulează Comanda Adăugare..." #: ui/add.py:159 msgid "Completed Add" msgstr "Adăugare Finalizată" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exportă- %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exportă" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Export Terminat" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Data" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Mesaj" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importă - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Câmpul URL depozitar este necesar." #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "Import Terminat" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Redenumire" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nume Nou:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Este necesar câmpul pentru noul nume" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Rulează Comanda Redenumire" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Redenumire efectuată" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Stare Text" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Stare Propietate" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Stare" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Selectează un Director" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "" #: ui/dialog.py:261 msgid "Select a File" msgstr "Selectează un fișier" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Ești sigur că vrei sa continui?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Câmpurile url de la și la sunt amândouă necesare" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Mută" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Rulează Comanda Mută" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Mutare Finalizată" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revizia" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Da" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Nu se poate adnota un director" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Adnotează - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Linia" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Text" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/D" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Acțiune" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Necunoscut" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Engleză" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Selectează un program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Ești sigur că vrei să ștergi căile tale către depozitar?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Căile către depozitar șterse" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Ești sigur că vrei sa îți ștergi mesajul anterior?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Mesaj anterior șters" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Vrei să îți ștergi informațiile de autentificare?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Informații de autentificare șterse" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Trebuie să furnizați o cale pentru destinație." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Domeniu/etichetă" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Rulează comanda Domeniu/etichetă" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Domeniu/etichetă finalizat" #: ui/lock.py:73 msgid "Locked" msgstr "Blocat" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "Blocare Terminată" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "Comută" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Gazdă:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nume" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Propietăți + %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valoare" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "" #: ui/action.py:338 msgid "Finished" msgstr "Terminat" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Terminat" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Deblochează" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Se șterge..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Ștergere Finalizată" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Proprietăți pentru:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Proprietățile selectate vor fi aplicate recursiv." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Editează..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nou..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Adaugă Mesaj" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Detalii Certificat" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Mesaj" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Mesaje Anterioare" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Ești sigur că vrei să ștergi %articol%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Acceptă O data" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autentificare" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Verifică Certificat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Confirmare" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Confirmare ștergere" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Interzice" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Amprentă:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Emitent:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Logare:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Parolă:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Mesaje Anterioare" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Proprietate" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Proprietate:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Domeniu:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Valid:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valoare:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autori:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Mulțumiri" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limită:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Jurnal" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Reîmprospătare" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autentificare" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Mesaje Jurnal" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Istorie URL" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Răsfoiește..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Activează embleme" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Activează atribute fișier" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programe Externe" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "General" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Limbă:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Logare" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Număr mesaje de reținut" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Date Salvate" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Arată uneltele de depanare RabitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Tip:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Selecteză/Deselecteză tot" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Adnotează" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Mesaje de notifcare" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Din:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opțiuni" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Recursiv" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importă Mesaj" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Include fișiere ignorate" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Din URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignoră antecedent" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Asistent Ămbinare" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Înregistrează doar îmbinarea" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Arată jurnal" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test Îmbinare" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/ru.po000066400000000000000000001413241362112712700150340ustar00rootroot00000000000000# Russian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-12-03 19:19+0000\n" "Last-Translator: Sergey Sedov \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "прямо сейчас" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "%d минут(ы) назад" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i секунда" msgstr[1] "%i секунды" msgstr[2] "%i секунд" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i минута" msgstr[1] "%i минуты" msgstr[2] "%i минут" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i час" msgstr[1] "%i часа" msgstr[2] "%i часов" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Отладка" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Ошибки" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Открыть терминал" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Обновить статус" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Отладка отмены изменений" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Отменяет изменения во всем что видит" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Добавить Иконку" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Добавить иконку" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Извлечь..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Извлечение рабочей копии" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Обновить" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Обновить рабочую копию" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Зафиксировать" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Зафиксировать изменения в репозитории" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Сравнить с предудыщей ревизией" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Показать лог" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Показать лог файла" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Добавить" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Добавить в игнор" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Обновить до ревизии..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Обновить файл до определенной ревизии" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Переименовать..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Удалить" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Откатить изменения" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Вернуть к исходному состоянию" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Разрешить конфликт" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Пометить конфликт как улаженный" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Восстановить" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Переселить..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Перебазировать рабочую копию" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Блокировка..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Разблокировка..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Разблокировать элемент" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Зачистить" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Зачистить рабочую копию" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" "Экспортировать рабочую копию или репозиторий без информации о версионности" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Создать репозиторий здесь" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Создать репозиторий в папке" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Импорт" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Импортировать элемент в репозиторий" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Ветка/тэг..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Копировать элемент в другое место в репозитории" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Переключить..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Сменить адрес репозитория рабочей копии" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Слияние..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Пошаговый мастер слияния" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Комментировать..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Комментировать файл" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Свойства" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Помощь" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Посмотреть помощь" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Настройки" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Просмотреть или изменить настройки RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "О программе" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "О RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Открыть" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Просмотреть" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Обновление..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Обновление завершено" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Обновить до ревизии" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Извлечь" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Извлечение завершено" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Путь" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Расширение" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Загрузка..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Найдено %d элементов" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Добавление..." #: ui/add.py:159 msgid "Completed Add" msgstr "Добавлено" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Экспорт - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "Поля URL репозитория и путь назначения - обязательны." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Экспорт" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Экспортирование..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Экспорт завершен" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Применить патч" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Применить патч к каталогу..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Применение патча.." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Патч применен" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Дата" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Сообщение" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Импорт - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Поле URL - обязательно" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Импортирование..." #: ui/import.py:89 msgid "Completed Import" msgstr "Импорт завершен" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Переименовать" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Новое имя:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Новое имя обазятельно!" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Переименовывание..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Переименовано" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Состояние текста" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Состояние" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Фиксация..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Фиксация завершена" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Состояние" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Запуск теста на слияние" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Тест слияния завершен" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Запуск слияния" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Слияние завершено" #: ui/merge.py:102 msgid "Merge" msgstr "Слить" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "В расширении RabbitVCS для Nautilus произошла ошибка. Свяжитесь с командой RabbitVCS и передайте детали ошибки ниже" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Выбор каталога" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "до" #: ui/dialog.py:261 msgid "Select a File" msgstr "Выбрать файл" #: ui/dialog.py:280 msgid "Save As..." msgstr "Сохранить как..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Вы действительно хотите продолжить?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "выбранные элементы" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "добавить папку в репозитори" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Восстановление исходного состояния..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Исходное состояние восстановлено" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Поля URL и От - обязательны" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Переселить" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Переселение" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Переселение завершено" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Ревизия" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Автор" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Просмотреть diff" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Сравнить рядом" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Разрешение конфликта..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Конфликт решен" #: ui/changes.py:49 msgid "More Actions..." msgstr "Дополнительные действия ..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "изменение" #: ui/changes.py:279 msgid "Property Change" msgstr "Изменение свойства" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Да" #: ui/changes.py:321 msgid "No" msgstr "Нет" #: ui/changes.py:410 msgid "Open from first revision" msgstr "открыть с первой ревизии" #: ui/changes.py:415 msgid "Open from second revision" msgstr "открыть со второй ревизии" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Нельзя комментировать каталоги" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Комментировать - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Строка" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Текст" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Начальная ревизия должно быть целое число" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Лог - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "Н/Д" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Действие" #: ui/log.py:338 msgid "Copy From Path" msgstr "Копия из пути" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Копия из ревизии" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Показать отличия между ревизиями" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "Сравнить ревизии" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Показать отличия между ревизиями" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Английский" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Выбор программы" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Вы действительно хотите удалить адреса репозиториев?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Адреса репозиториев удалены" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Вы точно хотите удалить ваши предыдущие сообщения?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Предыдущие сообщения удалены" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Вы точно хотите удалить информацию об аутентификации?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Информация о аутентификации удалена" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Вы должны задать путь назначения." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Ветка/тэг" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Создание ветки/тэга..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Ветка/тэг создана" #: ui/lock.py:73 msgid "Locked" msgstr "Блокирован" #: ui/lock.py:167 msgid "Get Lock" msgstr "Заблокировать" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Блокировка..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Заблокировано" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Укажите адрес репозитория" #: ui/switch.py:80 msgid "Switch" msgstr "Переключить" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Переключение" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Переключение завершено" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "Ведущая" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Хост:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Извлечь - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Извлечение исходников..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Имя" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Создать патч" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Заданный путь не является рабочей копией" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Создания файла патча" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Патч создан" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Свойства - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Значение" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Тип mime" #: ui/action.py:338 msgid "Finished" msgstr "Завершено" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Завершено" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Разблокировать" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Снатие блокировки..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Блокировка снята" #: ui/browser.py:89 msgid "Size" msgstr "Размер" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Создать каталог..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Копировать в..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Скопировать адрес в буфер" #: ui/browser.py:363 msgid "Move to..." msgstr "Переместить в..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Куда вы хотите скопировать выделенное?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Новое место:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Куда вы хотите переместить выделенное?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Зачистка..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Зачистка завершена" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Репозиторий успешно создан" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "Ошибка при создании репозитория. Убедитесь что папка пуста." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Свойства для:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Выбранные свойства будут применены рекурсивно." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Удалять свойства рекурсивно" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Редактирование..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Новый..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Путь:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Добавить сообщение" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Свойства сертификата" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Редактирование свойства" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Сообщение" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Пожалуйста добавьте информацию об аутентификации" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Предыдущие сообщения" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Вы действительно хотите удалить %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Принять навсегда" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Принять единожды" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Применять свойства рекурсивно" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Аутентификация" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Проверить сертификат" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Подтверждение" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Удалить подтверждение" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Запретить" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Fingerprint:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Имя пользоввателя:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Пароль:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Предыдущие сообщения" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Свойство" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Свойство:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Область:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Сохранить аутентификацию" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Элементы будут отправлены в корзину" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Действителен:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Значение:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Ссылки" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Информация о версии" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Авторы:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Спасибо:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Таблица ревизий" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Огрничение" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Лог" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Обновить" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Отображенные ревизии:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Остановиться на копировании" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Вызвана зачистка...\n" "\n" "Начать зачистку рабочей копии?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Аутентификация" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Сообщения лога" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Настройки журнала" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Программа используемая для сравнения файлов" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "История URL" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Обзор..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Удалить информацию об аутентификации" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Разрешить иконки" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Разрешить атрибуты файлов" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Разрешить рекурсивную проверку статуса" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Внешние Программы" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Общие" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Язык:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Журнал" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Максимальный уровень журнала" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Сколько URL'ов запоминать" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Сколько сообщений запоминать" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Сохраненные даныне" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Показать утилиты отладки RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "Меню отладки используется для диагностики неполадок RabbitVCS" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Тип:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Файлы на блокировки" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Пожалуйста опишите причину блокировки этих файлов" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Блокировать файлы" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Выбрать / Снять выбор для всего" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Скрыть блокировки" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Из ревизии" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Комментировать" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Зафиксировать в:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Показать файлы без версии" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Сообщения оповещений" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Изменить репозиторий вашей рабочей копии" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Из:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "В:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Настройки" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Ревизия" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Без внешних включений" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Рекурсивно" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Сообщение Импортирования" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Репозиторий" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Включить игнорируемые файлы" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Из URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Из: (URL и ревизия для слития)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Диапозон ревизий" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "В: (URL и ревизия для слияния)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL для слияния из" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Рабочая копия" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Выберите этот метод если вы вносили изменения в ветку и желаете слить свои " "изменения с другой веткой." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Выберите этот метод если вы хотите слить две разных ветки в свою рабочую " "копию." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Игнорировать предков" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Помощник Слияния" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Слить диапозон ревизий" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Слить два различных дерева" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Только зарегистрировать слияние" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Показать лог" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Пробное слияние" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Используйте диалог лога для выбора ревизий для слияния. Или впишите ревизии " "вручную через запятую. Вы можете указать диапазон через тире \n" "\n" "Пример: 4-7,9,11,15-HEAD\n" "\n" "Оставьте пустым для слияния всех ревизий." #~ msgid "Completed" #~ msgstr "Завершено" #~ msgid "(no author)" #~ msgstr "(без автора)" #~ msgid "Program used to browse repositories" #~ msgstr "Программа для просмотра репозиториев" #~ msgid "Show new version on the right side" #~ msgstr "Показывать новую версию справа" #~ msgid "Update Depth" #~ msgstr "Глубина обновления" #~ msgid "Added" #~ msgstr "Добавлено" #~ msgid "Merged" #~ msgstr "Слито" #~ msgid "Create copy from" #~ msgstr "Создать копию из" #~ msgid "Missing" #~ msgstr "Пропущен" #~ msgid "Unchanged" #~ msgstr "Не изменен" #~ msgid "External" #~ msgstr "Внешний" #~ msgid "Replaced" #~ msgstr "Заменен" #~ msgid "Skipped" #~ msgstr "Пропущен" #~ msgid "Updated" #~ msgstr "Обновлен" #~ msgid "Unlocked" #~ msgstr "Разблокирован" #~ msgid "Deleted" #~ msgstr "Удален" #~ msgid "Restored" #~ msgstr "Восстановлен" #~ msgid "Resolved" #~ msgstr "Улажен" #~ msgid "Destination:" #~ msgstr "Назначение:" #~ msgid "Annotated" #~ msgstr "Прокомментировано" rabbitvcs-0.18/po/sk.po000066400000000000000000001261151362112712700150240ustar00rootroot00000000000000# Slovak translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-02-09 10:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Správa o ladení" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Chyby" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Otvoriť shell" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Obnoviť stav" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Vráti všetko viditeľné" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Zruší" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Pridať znak" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Pridať nejaký znak" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Pozrite sa na pracovnú kópiu" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Aktualizácia" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Aktualizovať pracovnú kópiu" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Odovzdať" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Rešpektovať zmeny repozitára" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Zobrazenie zmien do súboru" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Zobraziť záznam" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Pridať" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Pridať do zoznamu ignorovaných" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Aktualizácia revízie" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Aktualizácia súboru do určenej revízie" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Premenovať" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Odstrániť" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Späť" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Vrátiť položku do jej nezmeneného stavu" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Riešenie" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Označiť položku v rozpore ako vyriešenú" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Obnoviť" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Premiestniť..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Premiestniť vašu pracovnú kópiu" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Lokálny zámok položky" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Vydanie zámku ..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Vydanie zámku na položku" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Čistenie" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Vyčistiť pracovnú kópiu" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "Exportovať pracovnú kópiu alebo repozitáre bez informácie o verzii" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Vytvoriť repozitáre tu" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Vytvoriť repozitáre v priečinku" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Import" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importovať položky do repozitára" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Branch/tag..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Kopírovať položku na iné miesto v repozitári" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Prepni..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Zmeniť umiestnenie repozitára pracovnej kópie" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Zlúčiť..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "A sprievodca s krokmi pre zlúčenie" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Komentovať..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Komentovať súbor" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Vlastnosti" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Pozrieť vlastnosti položky" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Pomocník" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Pozrieť pomocníka" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Nastavenia" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Pozrieť alebo zmeniť nastavenia RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "O" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "O RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Otvoriť" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Prehľadávať" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Aktualizácia..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Aktualizácia dokončená" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Aktualizovať revíziu" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Vyskúšanie" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Vyskúšanie ukončené" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Cesta" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Rozšírenie" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Načítavam..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Nájdená %d položka(y)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Spúšťam príkaz na pridanie" #: ui/add.py:159 msgid "Completed Add" msgstr "Pridanie ukončené" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Export - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Export" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Spúšťam príkaz na export" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Export ukončený" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Dátum" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Spráava" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Import - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Spúšťam príkaz na importovanie" #: ui/import.py:89 msgid "Completed Import" msgstr "Import ukončený" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Premenovať" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nový názov" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Vyžadovaný je nový názov poľa" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Spúšťam príkaz na premenovanie..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Premenovanie dokončené" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Stav textu" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Stav objektu" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Spúšťam príkaz na odovzdanie" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Odovzdanie ukončené" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Stav" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Spúšťam test zlúčenia" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Test zlúčenia ukončený" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Spúšťam príkaz na zlúčenie" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Zlúčenie ukončené" #: ui/merge.py:102 msgid "Merge" msgstr "Zlúčenie" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Vyber priečinok" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "do" #: ui/dialog.py:261 msgid "Select a File" msgstr "Vyber súbor" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Ste si istý že chcete pokračovať?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "vybraná položka(y)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Spúšťam spätný príkaz" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Návrat ukončený" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Premiestniť" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Spúšťam príkaz na premiestnenie..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Premiestnenie ukončené" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revízia" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Autor" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Spúšťam príkaz na riešenie" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Riešenie ukončené" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Ano" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Nemožno komentovať adresár" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Komentovať -%s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Riadok" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Text" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Záznam - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "N/A" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Akcia" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopírovať zo záznamu" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopírovať z revízie" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Neznáme" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Anglicky" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Vyberte program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Ste si istí, že chcete vymazať vašu cestu k repozitárom?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Cesta k repozitárom vymazaná" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Ste si istý, že chcete vymazať vaše predchádzajúce správy?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Predchádzajúce správy vymazané" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Ste si istí, že chcete vymazať vaše autentizačný údaje?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Autentizačný údaje vymazané" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Musíte zadať cieľ umiestnenia." #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "Zamknutý" #: ui/lock.py:167 msgid "Get Lock" msgstr "Zamknite" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Spúšťam príkaz na zamknutie" #: ui/lock.py:177 msgid "Completed Lock" msgstr "Zamknutie ukončené" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "Prepnúť" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Spúšťam príkaz na prepnutie" #: ui/switch.py:89 msgid "Completed Switch" msgstr "Prepnutie dokončené" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Hostiteľ:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Vyskúšanie - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Spúšťam test na vyskúšanie" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Názov" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Vlastnosti - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Hodnota" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "" #: ui/action.py:338 msgid "Finished" msgstr "Dokončené" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Dokončené" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Odomknúť" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Spúšťam príkaz na odomknutie" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Odomknutie dokončené" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Vyčistené..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Čistenie ukončené" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repozitár úspešne vytvorený" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Došlo ku chybe pri vytváraní repozitára. Uistite sa, či je príslušná zložka " "prázdna." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Vlastnosti pre:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Vybrané vlastnosti budú použité rekurzívne." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Odstrániť vlastnosti rekurzívne" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Editovať..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nový..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Cesta:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Pridať správu" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Podrobnosti certifikátu" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Upraviť vlastnosť podrobností" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Správa" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Prosím pridajte vaše podrobnosti o overení" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Predchádzajúce správy" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "Naozaj chcete zmazať %položku%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Prijať navždy" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Prijať iba teraz" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autentizácia" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Skontrolujte Certifikát" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Potvrdenie" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Odstráň potvrdenie" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Odmietnuť" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Odtlačok prsta:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Emitent:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Prihlasovacie meno:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Heslo:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Predchádzajúca správa" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Vlastnosť" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Vlastnosť:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Oblasť:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Uložiť overenie" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Položka(y) bude zaslaná do koša." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Platné:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Hodnota:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Linky" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Informácie o verzii" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Autori:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Poďakovanie" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revízna tabuľka" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limit:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Záznam" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Obnoviť" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Zobraziť revízie:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Stop na kópiu" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Požadované čistenie....\n" "\n" "Otvorenie pracovnej kópie čistenia?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autentizácia" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Záznam správ" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Možnosti zaznamenávania" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Program používaný na porovnávanie súborov" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL História" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Prehľadávať..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Vymazať vaše overovacie informácie" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Povoliť emblémy" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Povoliť atribúty súborov" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Povoliť kontrolu rekurzívneho stavu" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Externé programy" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Všeobecné" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Jazyk:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Prihlásenie" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Počet adries URL k zapamätaniu" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Počet správ k zapamätaniu" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Uložené údaje" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Typ" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Súbory na zamknutie" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Opíšte prosím, prečo tieto súbory zamykáte" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Zamknúť súbory" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Vybrať / Zrušiť všetko" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Prevziať zámky" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Z Revízie" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Do Revízie" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Komentovať" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Odovzdať do:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Zobraziť neverziované súbory" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Oznamovacie Správy" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Zmeniť repozitár vašej pracovnej kópie" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Z..." #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Do:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Voľby" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revízia" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Rekurzívny" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Import správy" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Repozitáre" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Zahrnúť ignorované súbory" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "z URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Od: (URL a revíziu zlúčiť)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Rozsah revízie" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Do: (URL a revíziu zlúčiť)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL zlúčiť od" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Pracovná kopia" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Vyberte túto možnosť, ak ste urobili nejaké zmeny vo vetvách a chcete zlúčiť " "vaše zmeny s inou vetvou." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Vyberte túto možnosť, ak chcete zlúčiť dve rôzne vetvy do vašej pracovnej " "kópie." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorovať rod" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Zlúčiť pomocníka" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Zlúčiť niekoľko revízií" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Zlúčenie dvoch rôznych stromov" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Iba záznam zlúčenia" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Ukázať záznam" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test zlúčenia" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" #~ msgid "Completed" #~ msgstr "Ukončené" #~ msgid "(no author)" #~ msgstr "(bez autora)" #~ msgid "Switch Details" #~ msgstr "Prepnúť detaily" #~ msgid "Create copy from" #~ msgstr "Vytvoriť kópiu z" #~ msgid "Show new version on the right side" #~ msgstr "Zobraziť novú verziu na pravej strane" #~ msgid "Destination:" #~ msgstr "Destinácia:" #~ msgid "Deleted" #~ msgstr "Odstránené" #~ msgid "Copied" #~ msgstr "Skopírované" #~ msgid "Added" #~ msgstr "Pridané" #~ msgid "Restored" #~ msgstr "Obnovené" #~ msgid "Reverted" #~ msgstr "Vrátenie" #~ msgid "Failed Revert" #~ msgstr "Chybné vrátennie" #~ msgid "Resolved" #~ msgstr "Vyriešené" #~ msgid "External" #~ msgstr "Vonkajšie" #~ msgid "Failed Unlock" #~ msgstr "Zlyhalo odomknutie" #~ msgid "Failed Lock" #~ msgstr "Zlyhalo zamknutie" #~ msgid "Updated" #~ msgstr "Aktualizované" #~ msgid "Modified" #~ msgstr "Modifikované" #~ msgid "Replaced" #~ msgstr "Nahradené" #~ msgid "Changed" #~ msgstr "Zmenené" #~ msgid "Skipped" #~ msgstr "Preskočené" #~ msgid "Annotated" #~ msgstr "Poznamenané" #~ msgid "Unlocked" #~ msgstr "Odomknuté" #~ msgid "Conflicted" #~ msgstr "V rozpore" #~ msgid "Inapplicable" #~ msgstr "Nepoužitelné" #~ msgid "Missing" #~ msgstr "Stratené" #~ msgid "Merged" #~ msgstr "Zlúčené" #~ msgid "Obstructed" #~ msgstr "Upchané" #~ msgid "Unchanged" #~ msgstr "Nezmenené" #~ msgid "Program used to browse repositories" #~ msgstr "Program používaný na prezeranie repozitára" rabbitvcs-0.18/po/sl.po000066400000000000000000001126611362112712700150260ustar00rootroot00000000000000# Slovenian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-02-09 10:19+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: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Posodobi" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Potrdi" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Dodaj" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Dodaj na seznam 'ignore'" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Izbriši" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Povrni" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Razreši" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Obnovi" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Počisti" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Uvozi" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Brskaj" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Posodabljanje ..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Posdabljanje končano" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Poveži in pridobi iz repozitorija" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Povezovanje z repozitorijem in pridobivanje zaključeno" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Pot" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Končnica" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Nalaganje ..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Najdeno %d element(ov)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Zaganjam dodajanje..." #: ui/add.py:159 msgid "Completed Add" msgstr "Končano dodajanje." #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Izvozi - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Izvozi" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Izvoz zaključen" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Sporočilo" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Uvozi - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "Uvoz zaključen" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Stanje besedila" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Stanje lastnosti" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Zaganjam Potrdi" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Končano potrjevanje" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "Spoji" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Izberi mapo" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "v" #: ui/dialog.py:261 msgid "Select a File" msgstr "Izberite datoteko" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Razrešitev zaključena" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Da" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Besedilo" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Dnevnik - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "Ni na voljo" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Dejanje" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopiraj iz revizije" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Izberi program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Ali ste prepričani, da želite izbrisati poti repozitorijev?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Poti repozitorijev izbrisane." #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Ali ste prepričani, da želite izbrisati prejšnja sporočila?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Prejšnja sporočila izbrisana" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Določiti morate ciljno pot." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Vejitev/oznaka" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "Zaklenjeno" #: ui/lock.py:167 msgid "Get Lock" msgstr "Prevzami zaklepanje" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "Zaklepanje zaključeno" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "Preklopi" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Poveži in pridobi iz repozitorija - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Povezovanje z repozitorijem in pridobivanje..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Naziv" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Izdelaj obliž (patch)" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Vrednost" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Vrsta MIME" #: ui/action.py:338 msgid "Finished" msgstr "Zaključeno" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Zaključeno" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Odkleni" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Čiščenje..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Čiščenje zaključeno" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Repozitorij je izdelan" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "" #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Od:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Za:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Pokaži dnevnik" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/sr.po000066400000000000000000001111271362112712700150300ustar00rootroot00000000000000# Serbian translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-06-24 21:05+0000\n" "Last-Translator: Игор Миловановић \n" "Language-Team: Serbian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Додај" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "" #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Путања" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Проширење" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Учитавам..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/add.py:157 msgid "Running Add Command..." msgstr "" #: ui/add.py:159 msgid "Completed Add" msgstr "" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Примени закрпу" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Датум" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "" #: ui/dialog.py:261 msgid "Select a File" msgstr "" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Ревизија" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Аутор" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Ред" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Текст" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Акција" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "MIME тип" #: ui/action.py:338 msgid "Finished" msgstr "Завршен" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:365 msgid "Log Message" msgstr "Лог порука" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "Величина" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "" #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/sv.po000066400000000000000000001313031362112712700150320ustar00rootroot00000000000000# Swedish translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-04-13 19:52+0000\n" "Last-Translator: Andreas Dahlberg \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i sekund" msgstr[1] "%i sekunder" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minut" msgstr[1] "%i minuter" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i timme" msgstr[1] "%i timmar" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i dag" msgstr[1] "%i dagar" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i vecka" msgstr[1] "%i veckor" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i månad" msgstr[1] "%i månader" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i år" msgstr[1] "%i år" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Felsök" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Buggar" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Öppna Skal" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Uppdatera Status" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Debug återställ" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Återställer allt den ser" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Ogiltigförklara" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Tvinga fram ett invalidate_extension_info() anrop" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Lägg till emblem" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Lägg till ett emblem" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Hämta en arbetskopia" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Uppdatera" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Uppdatera en arbetskopia" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Skicka" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Skicka ändringar till arkivet" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Skillnadsmeny..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Se skillanden mot grunden" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Visa ändringar som gjorts i en fil" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Se skillnaden mellan filer/mappar" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Se skillnaden mellan två filer" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Visa skillnaden mot tidigare revision" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Se filändringar sedan senaste ändring" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Jämför med grunden" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Jämför filer/mappar" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Jämför skillnaden mellan två objekt" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Jämför med föregående revision" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Visa ändringar..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Visa Logg" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Visa en fils logginformation" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "Lägg till" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Lägg till ignoreringslista" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Uppdatera till revision..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Uppdatera till angiven version" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Byt namn..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Schemalägg ett objekt som ska byta namn i arkivet" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Ta bort" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Schemalägg ett objekt som ska tas bort från arkivet" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Återställ" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Återställ ett objekt till dess omodifierade form" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Lös" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Markera ett tvistande objektet som löst" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Återställ" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Återställ ett saknat objekt" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Flytta..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Flytta din arbetskopia" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Hämta Lås..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Lås objekt lokalt" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Släpp lås..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Släpp lås på ett objekt" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Rensa" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Rensa upp arbetskopia" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exportera..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "Exportera en fungerande kopia eller arkiv utan versionsinformation" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Skapa arkiv här" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Skapa ett arkiv i en mapp" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importera" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importera ett objekt till ett arkiv" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "Gren/tagg..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "Kopiera et objekt till en annan plats i arkivet" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Växla..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Ändra arkivets plats för en arbets kopia" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Sammanfoga..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "En guide med åtgärder för sammanfogning" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Kommentera..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Kommentera en fil" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Egenskaper" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Visa egenskaperna för ett objekt" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Hjälp" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Visa Hjälp" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Inställningar" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "Visa eller ändra RabbitVCS inställningar" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Om" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "Om RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Öppna" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Bläddra till" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Uppdaterar..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Uppdatering färdig" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Uppdatera till revision" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Hämta" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Färdig Hämta" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "Sökväg" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "Tillägg" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "Laddar..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Hittade %d objekt" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Kör Lägg till..." #: ui/add.py:159 msgid "Completed Add" msgstr "Färdig Lägga till" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "Revision:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exportera - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "Arkivets URL och destination sökvägen är obligatoriska fält." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exportera" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Kör Exportera..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Färdig Exportera" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "Datum" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "Meddelande" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "Importera - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Arkivets URL fält krävs." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Kör Importera..." #: ui/import.py:89 msgid "Completed Import" msgstr "Färdig Importera" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Byt namn" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nytt namn:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Det nya namnet är ett obligatoriskt fält" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Kör Byt namn..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Namnbyte genomfört" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Textstatus" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Egenskap status" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Kör Skicka..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Färdig Skicka" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Status" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Kör Sammanfogningstest..." #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Färdig Sammanfogningstest" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Kör Sammanfoga..." #: ui/merge.py:91 msgid "Completed Merge" msgstr "Färdig Sammanfoga" #: ui/merge.py:102 msgid "Merge" msgstr "Sammanfoga" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Välj en mapp" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "till" #: ui/dialog.py:261 msgid "Select a File" msgstr "Välj en fil" #: ui/dialog.py:280 msgid "Save As..." msgstr "Spara som..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Är du säker på att du vill fortsätta?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "de markerade objekten" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Kör Återställ..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Färdig Återställ" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "Både från och till url-fälten krävs." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Omlokalisera" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Kör omlokalisering..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Omlokalisering färdig" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "Revision" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "Författare" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Jämför sida vid sida" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Kör Lös..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Färdig Lös" #: ui/changes.py:49 msgid "More Actions..." msgstr "Mer åtgärder..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "Egenskapsändring" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Ja" #: ui/changes.py:321 msgid "No" msgstr "Nej" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Det går inte att kommentera en katalog" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Kommentar - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Rad" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Text" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Från version fältet måste vara ett heltal" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Logg - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "Ej tillgänglig" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "Åtgärd" #: ui/log.py:338 msgid "Copy From Path" msgstr "Kopiera från sökväg" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Kopiera från version" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Visa skillnaden mot arbetskopian" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Se skillnaden mellan revisioner" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Jämför med arbetskopia" #: ui/log.py:806 msgid "Compare revisions" msgstr "Jämför revisioner" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Visa ändringar mellan revisioner" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "Ändra skapare..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Redigera loggmeddelande..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Redigera revisionsinställningar..." #: ui/log.py:1047 msgid "Edit author" msgstr "Ändra skapare" #: ui/log.py:1059 msgid "Edit log message" msgstr "Redigera loggmeddelande" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Okänd" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Engelska" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Välj ett program" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Är du säker på att du vill rensa dina arkivs sökvägar?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Arkivets sökvägar rensade" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Är du säker på att du vill rensa dina tidigare meddelanden?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Tidigare meddelanden rensade" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "Är du säker på att du vill rensa din autentiseringsinformation?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Autentiseringsinformation rensad" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Du måste ange en destinationssökväg." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Gren/tagg" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Kör Gren/tagg kommando..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Färdig Gren/tagg..." #: ui/lock.py:73 msgid "Locked" msgstr "Låst" #: ui/lock.py:167 msgid "Get Lock" msgstr "Hämta lås" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Kör Hämta lås..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Färdig Hämta lås" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Arkivets plats är ett obligatoriskt fält." #: ui/switch.py:80 msgid "Switch" msgstr "Växla" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Kör Växla..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Färdig Växla" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "Nummer" #: ui/widget.py:861 msgid "Working Copy" msgstr "Arbetskopia" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Värd:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "Hämta - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Kör Hämta..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Namn" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Den angivna sökvägen är inte en arbetskopia" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Egenskaper - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Värde" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Ett problem uppstod när dina inställningar skulle sparas." #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Filen är inte versionskontrollerad" #: ui/property_editor.py:112 msgid "Reserved" msgstr "Reserverad" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "Mime-typ" #: ui/action.py:338 msgid "Finished" msgstr "Färdig" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Färdigt" #: ui/action.py:365 msgid "Log Message" msgstr "Loggmeddelande" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Lås upp" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Kör Lås upp..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Färdig Lås upp" #: ui/browser.py:89 msgid "Size" msgstr "Storlek" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Skapa mapp..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Kopiera till..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Kopiera URL till urklipp" #: ui/browser.py:363 msgid "Move to..." msgstr "Flytta till..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Ny plats:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Rensar upp..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Rensning färdig" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Arkivet skapades" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" "Det blev fel när arkivet skulle skapas. Kontrollera att den angivna mappen " "är tom." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Egenskaper för:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Radera inställningar rekursivt" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Redigera..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Ny..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Sökväg:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Ladda/Uppdatera" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Lägg till Meddelande" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Certifikatdetaljer" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Redigera egenskapsdetaljer" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Mappnamn" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Meddelande" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Lägg till autentiseringsdetaljer" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Föregående Meddelanden" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Är du säker på att du vill ta bort %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Acceptera för alltid" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Acceptera en gång" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Verkställ inställningar rekursivt" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Autentisering" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Kontrollera certifikat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Bekräftelse" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Skapa mapp..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Radera Bekräftelse" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Neka" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Fingeravtryck:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Utgivare:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Användarnamn:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Lösenord:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Sökväg:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "Föregående meddelande" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Egenskap" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Egenskap:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS Fel" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Rike:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Spara autentisering" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Dessa objekt kommer att skickas till papperskorgen." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Giltig:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Värde:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Länkar" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Versionsinformation" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Upphovsmän:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Tack:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "Påverkade filer (dubbelklicka för att jämföra med grunden)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revisionstabell" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Gräns:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Logg" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Uppdatera" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Visar revisioner:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Stopp vid kopia" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Rensning begärd ....\n" "\n" "Börja rensa i arbets kopian?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Autentisering" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "Loggmeddelanden" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Logg alternativ" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Program som används för att jämföra filer" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL Historik" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Bläddra..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Rensa autentiseringsinformation" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Aktivera emblem" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Aktivera filattribut" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Aktivera rekursiva statuskontroller" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Externa program" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Allmänt" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Språk:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Loggning" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Lägsta nivå att logga" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Antal URLer att minnas" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Antal meddelande att minnas" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Sparad data" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Visa RabbitsVCS felsökningsverktyg" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Typ:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Filer att låsa" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Beskriv varför du låser dessa filer" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Lås filer" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Markera / Avmarkera alla" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Stjäl låsen" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Från revision" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Till revision" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Kommentar" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "Ändrade filer" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Skicka till:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Visa oversionerade filer" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Notifieringsmeddelanden" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Arbetskopia:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Egenskapseditor" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Ändra arkiv till din arbetskopia" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Från:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Till:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Alternativ" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revision" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Uteslut externa" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Rekursiv" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Importera meddelande" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Arkiv" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Inkludera ignorerade filer" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Från URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Från: (URL och revision sammanfogning)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Revisionsspan" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Till: (URL och revision att sammanfoga)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL att sammanfoga från" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Arbetskopia" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" "Välj denna metod om du har gjort ändringar i en gren och vill sammanfoga " "dina ändringar med en annan gren." #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" "Välj den här metoden om du vill sammanfoga två olika grenar i din " "arbetskopia." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorera anor" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Sammanfogningsassistent" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Sammanfoga ett span av revisioner" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Sammanfoga två olika träd" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Registrera endast sammanfogningen" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Visa logg" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Test sammanfoga" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "Använd logg dialogrutan för att välja de revisioner som du vill sammanfoga. " "Eller skriv ut revisionerna manuellt, separerade med ett kommatecken. Du kan " "ange ett revisionsspan med ett bindestreck.\n" "\n" "Exempel: 4-7,9,11,15-HEAD\n" "\n" "För att sammanfoga alla revisioner, lämna rutan tom." #~ msgid "(no author)" #~ msgstr "(ingen författare)" #~ msgid "Create copy from" #~ msgstr "Skapa kopia från" #~ msgid "Completed" #~ msgstr "Färdig" #~ msgid "Switch Details" #~ msgstr "Växlings detaljer" #~ msgid "Program used to browse repositories" #~ msgstr "Program som används för att bläddra i arkiv" #~ msgid "Show new version on the right side" #~ msgstr "Visa nya versionen på höger sida" #~ msgid "Added" #~ msgstr "Tillagd" #~ msgid "Copied" #~ msgstr "Kopierad" #~ msgid "Deleted" #~ msgstr "Borttagen" #~ msgid "Restored" #~ msgstr "Återställd" #~ msgid "Resolved" #~ msgstr "Löst" #~ msgid "External" #~ msgstr "Extern" #~ msgid "Modified" #~ msgstr "Modifierad" #~ msgid "Replaced" #~ msgstr "Ersatt" #~ msgid "Changed" #~ msgstr "Ändrad" #~ msgid "Annotated" #~ msgstr "Kommenterad" #~ msgid "Unlocked" #~ msgstr "Upplåst" #~ msgid "Failed Lock" #~ msgstr "Misslyckades låsa" #~ msgid "Failed Unlock" #~ msgstr "Misslyckades låsa upp" #~ msgid "Inapplicable" #~ msgstr "Oapplicerbart" #~ msgid "Unchanged" #~ msgstr "Oförändrad" #~ msgid "Missing" #~ msgstr "Saknas" #~ msgid "Obstructed" #~ msgstr "Blockerad" #~ msgid "Merged" #~ msgstr "Sammanfogad" #~ msgid "Conflicted" #~ msgstr "Tvistande" #~ msgid "Update Depth" #~ msgstr "Uppdateringsdjup" #~ msgid "Destination:" #~ msgstr "Mål:" #~ msgid "Reverted" #~ msgstr "Backad" #~ msgid "Failed Revert" #~ msgstr "Misslyckad backning" #~ msgid "Skipped" #~ msgstr "Överhoppad" #~ msgid "Updated" #~ msgstr "Uppdaterad" rabbitvcs-0.18/po/th.po000066400000000000000000001104351362112712700150200ustar00rootroot00000000000000# Thai translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-02-09 10:19+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "" #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "" #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/add.py:157 msgid "Running Add Command..." msgstr "" #: ui/add.py:159 msgid "Completed Add" msgstr "" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "" #: ui/dialog.py:261 msgid "Select a File" msgstr "" #: ui/dialog.py:280 msgid "Save As..." msgstr "" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "" #: ui/changes.py:279 msgid "Property Change" msgstr "" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "" #: ui/changes.py:321 msgid "No" msgstr "" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "" #: ui/log.py:338 msgid "Copy From Path" msgstr "" #: ui/log.py:338 msgid "Copy From Revision" msgstr "" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "" #: ui/lock.py:167 msgid "Get Lock" msgstr "" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:177 msgid "Completed Lock" msgstr "" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "" #: ui/action.py:338 msgid "Finished" msgstr "" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:365 msgid "Log Message" msgstr "" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "" #: ui/browser.py:353 msgid "Copy to..." msgstr "" #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:363 msgid "Move to..." msgstr "" #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "" #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "" #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "" #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/po/zh_CN.po000066400000000000000000001273711362112712700154150ustar00rootroot00000000000000# Chinese (Simplified) translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-08-14 14:07+0000\n" "Last-Translator: Jiehan Zheng \n" "Language-Team: Chinese (Simplified) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i 秒" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i 分钟" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i 小时" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i 天" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i 周" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i 月" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i 年" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "调试" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "打开 Shell" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "刷新状态" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "调试还原" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "还原看到的每个文件" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "使无效" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "强行调用 invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "添加徽章" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "添加一个徽章" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "检出(Checkout)..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "检出工作版本" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "更新" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "更新工作版本" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "提交" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "提交修改至源码库" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "RabbitVCS" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "版本库浏览器" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "浏览源码库源码树" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "检查修改..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "检查至源码库的修改" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "比较菜单..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "比较选项列表" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "查看相对于 Base 的差异" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "查看对文件的修改" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "查看文件/文件夹之间的差异" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "查看两个文件之间的差异" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "查看相对于前一个版本的差异" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "查看自从上一次修改后对文件的改动" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "与 Base 进行比较" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "使用并排比较工具与 Base 进行比较" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "比较文件/文件夹" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "比较两个项目间的差异" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "与前一个版本进行比较" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "使用并排比较工具与前一个版本进行比较" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "显示修改..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "显示路径与版本间的改动" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "显示日志" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "显示文件日志信息" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "添加" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "计划要添加至仓库的项" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "添加至忽略列表" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "更新到版本..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "更新文件至指定版本" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "重命名..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "计划一个项目在源码库被重命名" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "删除" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "计划一个项目在源码库被删除" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "恢复" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "还原项目到其未修改的状态" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "解决" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "标记冲突条目为已解决" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "恢复" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "恢复丢失项目" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "重定位..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "重定位您的工作副本" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "获得锁..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "本地锁定项目" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "释放锁..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "释放项目的锁" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "清理" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "清理工作副本" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "导出..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "导出工作副本或源码库,而不包含任何版本信息" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "在这里创建源码库" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "在文件夹中创建一个源码库" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "导入" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "导入一个项目至源码库" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "分支/标签..." #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "复制一个项目到源码库中其它位置" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "切换..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "改变工作副本源码库的位置" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "合并..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "一个由几个步骤组成的合并向导" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "批注..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "批注一个文件" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "生成补丁..." #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "对您所有的修改创建一个 unified diff 文件" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "应用补丁..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "应用 unified diff 至工作副本" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "属性" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "查看一个项目的属性" #: util/contextmenuitems.py:545 msgid "Help" msgstr "帮助" #: util/contextmenuitems.py:546 msgid "View help" msgstr "查看帮助" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "设置" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "查看或更改 RabbitVCS 设置" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "关于" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "关于 RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "打开" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "打开一个文件" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "浏览至" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "浏览至一个文件或文件夹" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "还原属性" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "还原该属性至其原状态" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "还原属性 (递归的)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "还原该属性至其原状态 (递归的)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "删除属性" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "删除该属性" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "删除该属性 (递归的)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "按文件名忽略项目" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "按扩展名忽略项目" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "更新..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "完成的更新" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "更新到修订版" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "检出" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "完成签出" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "路径" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "扩展" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "加载中..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "已找到 %d 项" #: ui/add.py:157 msgid "Running Add Command..." msgstr "正执行 Add 命令" #: ui/add.py:159 msgid "Completed Add" msgstr "Add 完成" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "版本:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "导出 - %s" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "“仓库 URL”和“目的地路径”均必填。" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "导出" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "正运行 Export 命令" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Export 完成" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "应用补丁" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "对目录应用补丁..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "从文件应用补丁..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "已应用补丁文件" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "日期" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "消息" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "导入 - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "“仓库 URL”必填。" #: ui/import.py:81 msgid "Running Import Command..." msgstr "正运行 Import 命令" #: ui/import.py:89 msgid "Completed Import" msgstr "Import 完成" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "重命名" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "新名字:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "新名称一栏必填" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "正运行重命名命令" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "重命名完成" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "文本状态" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "属性状态" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "正在运行提交命令..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "提交完成" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "状态" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "并排比较查看差异" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "运行合并测试" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "完成合并测试" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "正在运行合并命令" #: ui/merge.py:91 msgid "Completed Merge" msgstr "合并完成" #: ui/merge.py:102 msgid "Merge" msgstr "合并" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" "RabbitVCS Nautilus 扩展发生了一个错误。请联系RabbitVCS 团队并提供下列错误细节:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "选择一个文件夹" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "到" #: ui/dialog.py:261 msgid "Select a File" msgstr "选择一个文件" #: ui/dialog.py:280 msgid "Save As..." msgstr "另存为…" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "您确定要继续吗?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "已选择的项" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "添加一个文件夹到版本库" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "运行还原命令..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "完成还原" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "来自和到 URL 栏均为必填" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "重新分配" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "正运行重分配命令" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "重分配完毕" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "修订版" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "作者" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "查看统一差异" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "并排比较" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "正运行 Resolve 命令" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Resolve 完成" #: ui/changes.py:49 msgid "More Actions..." msgstr "更多操作..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "更改" #: ui/changes.py:279 msgid "Property Change" msgstr "属性改变" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "确定" #: ui/changes.py:321 msgid "No" msgstr "否" #: ui/changes.py:410 msgid "Open from first revision" msgstr "从第一个版本打开" #: ui/changes.py:415 msgid "Open from second revision" msgstr "从第二个版本打开" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "不能给目录加注释" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "注释 - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "明细" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "文本" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "来自修订版一栏必须为整数" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "日志 - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "不可用" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "操作" #: ui/log.py:338 msgid "Copy From Path" msgstr "复制自路径" #: ui/log.py:338 msgid "Copy From Revision" msgstr "复制自版本" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "查看相对于工作版本的差异" #: ui/log.py:791 msgid "View diff between revisions" msgstr "查看版本间差异" #: ui/log.py:796 msgid "Compare with working copy" msgstr "与工作版本进行比较" #: ui/log.py:806 msgid "Compare revisions" msgstr "比较版本" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "显示版本之间的更改" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "编辑作者..." #: ui/log.py:837 msgid "Edit log message..." msgstr "编辑日志消息..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "编辑版本属性..." #: ui/log.py:1047 msgid "Edit author" msgstr "编辑作者" #: ui/log.py:1059 msgid "Edit log message" msgstr "编辑日志消息" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "未知" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "英语" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "选择一个程序" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "您确定要清空您的仓库路径?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "仓库路径已清空" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "您确定要清空您之前的消息?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "以往消息已清空" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "您确定要清空您的认证信息?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "认证信息已清空" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "无法获取属性列表" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "必须提供目标路径。" #: ui/branch.py:115 msgid "Branch/tag" msgstr "分支/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "正运行 Branch/tag 命令..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "完成的 分支/tag" #: ui/lock.py:73 msgid "Locked" msgstr "已锁定" #: ui/lock.py:167 msgid "Get Lock" msgstr "获得 Lock" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "正运行 Lock 命令" #: ui/lock.py:177 msgid "Completed Lock" msgstr "Lock 完成" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "仓库地址栏必填。" #: ui/switch.py:80 msgid "Switch" msgstr "切换" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "正在运行切换命令..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "切换完成" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "HEAD" #: ui/widget.py:860 msgid "Number" msgstr "" #: ui/widget.py:861 msgid "Working Copy" msgstr "工作副本" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "主机:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "签出 - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "正在运行签出命令" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "名称" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "生成补丁" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "指定路径不是工作副本" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "正在生成补丁文件..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "已生成补丁文件" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "属性 - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "值" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "保存属性时出现了一个问题。" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "注意: 属性修改会立即被应用。您可以使用每项的上下文菜单来回顾或撤销修改。\n" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "您想从该目录下所有文件和子目录中删除选中的属性么?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "文件不受版本控制" #: ui/property_editor.py:112 msgid "Reserved" msgstr "保留的" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "不能为属性设置新值" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "MIME 类型" #: ui/action.py:338 msgid "Finished" msgstr "已完成" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - 完成" #: ui/action.py:365 msgid "Log Message" msgstr "日志信息" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "解锁" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "正在运行解锁命令..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "解锁完成" #: ui/browser.py:89 msgid "Size" msgstr "文件大小" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "创建目录..." #: ui/browser.py:353 msgid "Copy to..." msgstr "复制到 ..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "复制URL到剪切板" #: ui/browser.py:363 msgid "Move to..." msgstr "移动到..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "将选区复制到哪?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "新位置:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "将选区移动到哪?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "正清理" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "清理完成" #: ui/create.py:46 msgid "Repository successfully created" msgstr "版本仓库创建成功" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "版本库创建过程中出现错误。请确认所指定目录是空的。" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "属性属于:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "选中的属性将会被递归应用。" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "递归删除属性" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "编辑..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "新建..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/路径:" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "加载/刷新" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "添加消息" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "认证细节" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "编辑属性细节" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "文件夹名称" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "消息" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "请添加您的认证细节" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "请提供您的 SSL 证书文件" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "前一个消息" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "您确实要删除 %item% 吗?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "RabbitVCS 错误" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "总是接受" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "接受一次" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "递归应用属性" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "认证" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "检查证书" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "确认" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "创建文件夹..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "删除确认" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "拒绝" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "指纹:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "颁发者:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "登录:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "密码:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "路径:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "前一个消息" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "属性" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "属性:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS 错误" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "域:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL 客户端证书" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "保存认证" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "文本更改" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "这些会被发送到回收站" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "有效:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "值:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "链接" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "版本信息" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "作者:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "感谢:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "受影响的文件 (双击会比较 Base)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "版本表" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "限制:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "日志" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "刷新" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "正在显示版本:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "终止于复制" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "清理请求....\n" "\n" "开始工作副本清理么?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "身份验证" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "日志信息" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "日志选项" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "用于比较文件的程序" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL 历史" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "浏览..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "清除你的认证信息" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "启用徽章" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "启用文件属性" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "启用递归状态检查" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "外部程序" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "常规" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "语言:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "日志" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "最小日志级别" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "记住的 URL 数目" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "记住的信息数量" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "已保存的数据" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "显示 RabbitVCS 调试工具" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "调试菜单用于诊断 RabbitVCS 自身的问题" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "类型:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "要锁定的文件" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "请描述您锁定这些文件的原因" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "锁定文件" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "选择 / 取消选择 全部" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "偷锁" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "从版本" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "至版本" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "注释" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "更改的文件 (双击会比较 Base)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "提交给:" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "显示非版本控制的文件" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "通知信息" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "远程 URI:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "工作副本:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "添加一个新的属性。" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "关闭这个对话框。" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "属性编辑器" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "刷新属性列表" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "改变您工作副本的属性" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "从:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "至:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "选项" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "版本" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "省略外部" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "递归" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "导入消息" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "版本库" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "包括已忽略的文件" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "来自URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "来自:(URL 和要合并的版本)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "版本范围" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "至:(URL 和要合并的版本)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "要合并自 URL" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "工作副本" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "如果您对某个分支进行了修改,并且想将这些修改与另一分支合并,选择这种方法。" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "如果您想合并两个不同的分支到您的工作副本的话,请选择这个方法。" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "忽略早期的" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "合并助手" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "合并一个范围的版本" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "合并两个不同的源码树" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "仅记录合并" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "显示日志" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "测试合并" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" "使用日志对话框来选择您想合并的版本。或者手动指定版本,用逗号分割。您可以通过减号\"-\"来指定一个版本范围。\n" "\n" "例如:4-7,9,11,15-HEAD\n" "\n" "要合并所有分支请保持空白。" rabbitvcs-0.18/po/zh_TW.po000066400000000000000000001125531362112712700154430ustar00rootroot00000000000000# Chinese (Traditional) translation for rabbitvcs # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the rabbitvcs package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: rabbitvcs\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-06-09 03:20+0000\n" "Last-Translator: Yu - Sian , Liu \n" "Language-Team: Chinese (Traditional) \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i 分鐘" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i 小時" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "偵錯" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "問題回報" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "更新" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "提交" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:330 ui/glade/property_page.glade.h:4 msgid "RabbitVCS" msgstr "" #: util/contextmenuitems.py:335 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:340 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:345 ui/glade/browser.glade.h:2 msgid "Repository Browser" msgstr "" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "顯示日誌" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:411 ui/add.py:156 ui/tags.py:273 #: ui/branches.py:274 ui/widget.py:1199 ui/glade/add.glade.h:1 msgid "Add" msgstr "加入" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "重新命名..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "刪除" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "還原" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "解決" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "還原" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "清除" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "" #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "匯入" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:503 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:504 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:528 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "屬性" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:545 msgid "Help" msgstr "" #: util/contextmenuitems.py:546 msgid "View help" msgstr "" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "設定" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "關於" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:563 msgid "Open" msgstr "" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:606 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:610 msgid "Initialize Repository" msgstr "" #: util/contextmenuitems.py:615 ui/clone.py:47 ui/clone.py:65 msgid "Clone" msgstr "" #: util/contextmenuitems.py:620 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:625 ui/push.py:96 msgid "Push" msgstr "" #: util/contextmenuitems.py:630 msgid "Branches" msgstr "" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:666 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "更新中..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "取出" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/changes.py:279 #: ui/changes.py:364 ui/log.py:337 ui/log.py:572 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/action.py:118 #: ui/unlock.py:61 ui/browser.py:89 msgid "Path" msgstr "路徑" #: ui/add.py:72 ui/commit.py:205 ui/commit.py:313 ui/revert.py:62 #: ui/revert.py:128 ui/checkmods.py:67 ui/resolve.py:61 ui/lock.py:72 #: ui/createpatch.py:119 ui/createpatch.py:215 ui/unlock.py:61 msgid "Extension" msgstr "" #: ui/add.py:95 ui/commit.py:93 ui/lock.py:115 ui/unlock.py:85 #: ui/glade/dialogs.glade.h:33 msgid "Loading..." msgstr "載入中..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "找到 %d 個項目" #: ui/add.py:157 msgid "Running Add Command..." msgstr "執行加入..." #: ui/add.py:159 msgid "Completed Add" msgstr "完整加入" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: ui/tags.py:63 msgid "Tags" msgstr "" #: ui/tags.py:74 msgid "Tag" msgstr "" #: ui/tags.py:99 ui/branches.py:100 ui/glade/dialogs.glade.h:38 #: ui/glade/property_page.glade.h:2 msgid "Name:" msgstr "" #: ui/tags.py:109 ui/tags.py:176 ui/branches.py:155 ui/merge.py:438 #: ui/merge.py:488 ui/glade/browser.glade.h:3 msgid "Revision:" msgstr "修訂版:" #: ui/tags.py:128 ui/tags.py:188 ui/branches.py:167 ui/merge.py:450 #: ui/merge.py:500 msgid "Message:" msgstr "" #: ui/tags.py:145 ui/tags.py:284 ui/branches.py:147 ui/branches.py:291 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "" #: ui/tags.py:275 msgid "Add Tag" msgstr "" #: ui/tags.py:293 msgid "Tag Detail" msgstr "" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:131 ui/clone.py:57 ui/checkout.py:163 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "匯出" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "" #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "" #: ui/branches.py:62 msgid "Branch Manager" msgstr "" #: ui/branches.py:63 msgid "Branches" msgstr "" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "" #: ui/branches.py:110 msgid "Start Point:" msgstr "" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "" #: ui/branches.py:304 msgid "Branch Detail" msgstr "" #: ui/push.py:76 ui/dialog.py:54 ui/annotate.py:128 ui/annotate.py:229 #: ui/log.py:327 ui/log.py:557 ui/browser.py:89 msgid "Date" msgstr "日期" #: ui/push.py:76 ui/dialog.py:54 ui/log.py:327 ui/log.py:557 #: ui/glade/dialogs.glade.h:36 msgid "Message" msgstr "訊息" #: ui/push.py:97 msgid "Running Push Command..." msgstr "" #: ui/push.py:99 msgid "Completed Push" msgstr "" #: ui/import.py:40 #, python-format msgid "Import - %s" msgstr "匯入 - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "" #: ui/import.py:81 msgid "Running Import Command..." msgstr "" #: ui/import.py:89 msgid "Completed Import" msgstr "" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "重新命名" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "新名稱:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "完成提交" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "狀態" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "" #: ui/merge.py:91 msgid "Completed Merge" msgstr "" #: ui/merge.py:102 msgid "Merge" msgstr "合併" #: ui/merge.py:415 ui/merge.py:465 msgid "Author:" msgstr "" #: ui/dialog.py:38 #, python-format msgid "" "An error has occurred in the RabbitVCS Nautilus extension. Please contact " "the RabbitVCS team with the error details listed below:" msgstr "" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "選擇一個資料夾" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "到" #: ui/dialog.py:261 msgid "Select a File" msgstr "選取檔案" #: ui/dialog.py:280 msgid "Save As..." msgstr "另存為..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:48 #: ui/log.py:326 ui/log.py:556 ui/widget.py:854 ui/browser.py:89 #: ui/glade/merge.glade.h:17 msgid "Revision" msgstr "修訂版本" #: ui/checkmods.py:69 ui/annotate.py:127 ui/annotate.py:228 ui/log.py:326 #: ui/log.py:556 ui/browser.py:89 msgid "Author" msgstr "作者" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "" #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "" #: ui/changes.py:49 msgid "More Actions..." msgstr "" #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "更改" #: ui/changes.py:279 msgid "Property Change" msgstr "屬性改變" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "是" #: ui/changes.py:321 msgid "No" msgstr "否" #: ui/changes.py:410 msgid "Open from first revision" msgstr "" #: ui/changes.py:415 msgid "Open from second revision" msgstr "" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "文字" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "紀錄 - %s" #: ui/log.py:270 ui/log.py:271 ui/glade/log.glade.h:7 msgid "N/A" msgstr "無" #: ui/log.py:337 ui/log.py:572 ui/action.py:118 msgid "Action" msgstr "動作" #: ui/log.py:338 msgid "Copy From Path" msgstr "從路徑複製" #: ui/log.py:338 msgid "Copy From Revision" msgstr "從修訂版本中複製" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "" #: ui/log.py:791 msgid "View diff between revisions" msgstr "" #: ui/log.py:796 msgid "Compare with working copy" msgstr "" #: ui/log.py:806 msgid "Compare revisions" msgstr "比較修訂版間差異" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "" #: ui/log.py:823 msgid "Update to this revision" msgstr "" #: ui/log.py:824 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:829 ui/log.py:833 msgid "Edit author..." msgstr "" #: ui/log.py:837 msgid "Edit log message..." msgstr "" #: ui/log.py:841 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1047 msgid "Edit author" msgstr "" #: ui/log.py:1059 msgid "Edit log message" msgstr "" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "不明" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "英文" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:325 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "" #: ui/branch.py:115 msgid "Branch/tag" msgstr "" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "" #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "" #: ui/lock.py:73 msgid "Locked" msgstr "已鎖定" #: ui/lock.py:167 msgid "Get Lock" msgstr "取得鎖定" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "執行上鎖命令" #: ui/lock.py:177 msgid "Completed Lock" msgstr "完成上鎖" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "" #: ui/switch.py:80 msgid "Switch" msgstr "轉換" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "" #: ui/switch.py:89 msgid "Completed Switch" msgstr "" #: ui/widget.py:853 ui/widget.py:859 ui/glade/merge.glade.h:10 msgid "HEAD" msgstr "" #: ui/widget.py:860 msgid "Number" msgstr "數字" #: ui/widget.py:861 msgid "Working Copy" msgstr "" #: ui/widget.py:1056 msgid "Repository:" msgstr "" #: ui/widget.py:1075 msgid "Branch:" msgstr "" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "主機:" #: ui/widget.py:1194 msgid "Add line:" msgstr "" #: ui/checkout.py:139 ui/checkout.py:213 #, python-format msgid "Checkout - %s" msgstr "" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "名稱" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/property_page.py:126 msgid "Repository URL" msgstr "" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "屬性 - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "值" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/property_editor.py:56 msgid "" "Note: changes to properties are applied instantly. You may review and " "undo changes using the context menu for each item.\n" msgstr "" #: ui/property_editor.py:61 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:112 msgid "Reserved" msgstr "保留" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/__init__.py:50 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/action.py:118 msgid "Mime Type" msgstr "MIME 類型" #: ui/action.py:338 msgid "Finished" msgstr "已完成" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - 已完成" #: ui/action.py:365 msgid "Log Message" msgstr "紀錄訊息" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "解除鎖定" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "大小" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "新增資料夾" #: ui/browser.py:353 msgid "Copy to..." msgstr "複製到..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "複製網址到剪貼簿" #: ui/browser.py:363 msgid "Move to..." msgstr "移動到..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/create.py:46 msgid "Repository successfully created" msgstr "" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "編輯..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "新增..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "" #: ui/glade/browser.glade.h:4 msgid "URL:" msgstr "URL:" #: ui/glade/dialogs.glade.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "驗證" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "確認" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "建立資料夾..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "確認刪除" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "取消" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "指紋:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "帳號:" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "密碼:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "路徑:" #: ui/glade/dialogs.glade.h:42 ui/glade/lock.glade.h:4 #: ui/glade/commit.glade.h:5 ui/glade/import.glade.h:5 msgid "Previous Messages" msgstr "之前的訊息" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "屬性" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "属性:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "領域:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "數值:" #: ui/glade/pull.glade.h:1 msgid "Pull Information" msgstr "" #: ui/glade/pull.glade.h:2 ui/glade/git-update.glade.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "作者:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "鳴謝:" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "" #: ui/glade/property_page.glade.h:3 msgid "Property status:" msgstr "" #: ui/glade/property_page.glade.h:5 msgid "VCS:" msgstr "" #: ui/glade/log.glade.h:1 msgid "100" msgstr "100" #: ui/glade/log.glade.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "限制:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "紀錄" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "重新整理" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "驗證" #: ui/glade/settings.glade.h:2 msgid "Checker type:" msgstr "" #: ui/glade/settings.glade.h:3 msgid "Configuration Editor" msgstr "" #: ui/glade/settings.glade.h:4 msgid "Log Messages" msgstr "日誌訊息" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "" #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "瀏覽..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "外部程式" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "一般" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "語言:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "紀錄" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "" #: ui/glade/settings.glade.h:31 msgid "Status Checker" msgstr "" #: ui/glade/settings.glade.h:32 msgid "Stop Checker" msgstr "" #: ui/glade/settings.glade.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "類型:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "註解" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "通知訊息" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "" #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "屬性編輯器" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "從:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "到:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "選項" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "遞迴進入子目錄" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "從 URL 新增" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "" #: ui/glade/merge.glade.h:8 msgid "" "Choose this method if you have made some changes to a branch and wish to " "merge your changes with another branch." msgstr "" #: ui/glade/merge.glade.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "" #: ui/glade/merge.glade.h:20 msgid "" "Use the log dialog to select the revisions that you wish to merge. Or write " "out the revisions manually, each separated by a comma. You can specify a " "revision range by a dash. \n" "\n" "Example: 4-7,9,11,15-HEAD\n" "\n" "To merge all revisions, leave the box empty." msgstr "" rabbitvcs-0.18/rabbitvcs/000077500000000000000000000000001362112712700154025ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/__init__.py000066400000000000000000000070431362112712700175170ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import gettext as _gettext from locale import getdefaultlocale, getlocale, LC_MESSAGES # Hack to make RabbitVCS win in the battle against TortoiseHg try: import mercurial.demandimport mercurial.demandimport.enable = lambda: None except Exception as e: pass version = "0.18" APP_NAME = "RabbitVCS" TEMP_DIR_PREFIX = "rabbitvcs-" LOCALE_DIR = "%s/locale" % os.path.dirname(os.path.dirname(os.path.realpath(__file__))) if not os.path.exists(LOCALE_DIR): LOCALE_DIR = "/usr/share/locale" WEBSITE = "http://www.rabbitvcs.org/" langs = [] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(":") if getdefaultlocale()[0] != None: langs += [getdefaultlocale()[0]] _gettext.bindtextdomain(APP_NAME, LOCALE_DIR) _gettext.textdomain(APP_NAME) current_translation = None class gettext(object): @staticmethod def set_language(langs): global current_translation current_translation = _gettext.translation(APP_NAME, LOCALE_DIR, languages = langs, fallback = True) @staticmethod def gettext(message): if not current_translation: return message return current_translation.gettext(message) @staticmethod def ngettext(msgid1, msgid2, n): return gettext.gettext(msgid1 if n == 1 else msgid2) gettext.set_language(langs) def package_name(): """ Report the application name in a form appropriate for building package files. """ return APP_NAME.lower() def package_version(): """ Report the version number of the application, minus any name extensions. """ app_version = version.split('-')[0] # TODO: sanity-check app_version: make sure it's just digits and dots return app_version def package_identifier(): """ Return a package identifier suitable for use in a package file. """ return "%s-%s" % (package_name(), package_version()) def package_prefix(): """ Return the prefix of the local RabbitVCS installation """ try: from rabbitvcs.buildinfo import rabbitvcs_prefix return rabbitvcs_prefix except ImportError as e: return "" def get_icon_path(): """ Return the path to the icon folder """ try: from rabbitvcs.buildinfo import icon_path return icon_path except ImportError as e: return "%s/data/icons/hicolor" % os.path.dirname(os.path.dirname(os.path.realpath(__file__))) rabbitvcs-0.18/rabbitvcs/debug/000077500000000000000000000000001362112712700164705ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/debug/__init__.py000066400000000000000000000016761362112712700206130ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # rabbitvcs-0.18/rabbitvcs/debug/pythonconsole.py000066400000000000000000000311701362112712700217500ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # pythonconsole.py -- Console widget # Widely stolen from Pluma's Python console. # Copyright (C), 1998 James Henstridge # Copyright (C), 2005 Adam Hooper # Copyright (C) 2006 - Steve Frécinaux import string import sys import re import traceback import gi gi.require_version("Gtk", "3.0") from gi.repository import GLib, Gtk, Gdk, Pango from rabbitvcs.util.strings import S class PythonConsole(Gtk.ScrolledWindow): __gsignals__ = { "grab-focus" : "override", } DEFAULT_FONT = "Monospace" _RE_SPACES = re.compile(r"^\s+") def __init__(self, exit=lambda: None, namespace={}): Gtk.ScrolledWindow.__init__(self) self.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.set_shadow_type(Gtk.ShadowType.IN) self.view = Gtk.TextView() self.view.set_editable(True) self.view.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.add(self.view) self.view.show() buffer = self.view.get_buffer() self.namespace = namespace self.exit = exit self.block_command = False # Chose a monospace font. fontname = self.DEFAULT_FONT for f in self.get_pango_context().list_families(): name = f.get_name() if f.get_name() in ["Courier New", "Courier Mono"]: fontname = name break self.modify_font(Pango.FontDescription(fontname)) # Init first line buffer.create_mark("input-line", buffer.get_end_iter(), True) buffer.insert(buffer.get_end_iter(), ">>> ") buffer.create_mark("input", buffer.get_end_iter(), True) # Init history self.history = [""] self.history_pos = 0 self.current_command = "" self.namespace["__history__"] = self.history # Set up hooks for standard output. self.stdout = OutFile(self, sys.stdout.fileno()) self.stderr = OutFile(self, sys.stderr.fileno()) # Signals self.view.connect("key-press-event", self._key_press_event_cb) buffer.connect("mark-set", self.__mark_set_cb) def do_grab_focus(self): self.view.grab_focus() def _key_press_event_cb(self, view, event): modifier_mask = Gtk.accelerator_get_default_mod_mask() event_state = event.state & modifier_mask keyname = Gdk.keyval_name(event.keyval) if keyname == "d" and event_state == Gdk.ModifierType.CONTROL_MASK: self.exit() elif (keyname == "Return" and event_state == Gdk.ModifierType.CONTROL_MASK): # Get the command buffer = view.get_buffer() inp_mark = buffer.get_mark("input") inp = buffer.get_iter_at_mark(inp_mark) cur = buffer.get_end_iter() line = buffer.get_text(inp, cur, False) self.current_command = self.current_command + line + "\n" self.history_add(line) # Prepare the new line cur = buffer.get_end_iter() buffer.insert(cur, "\n... ") cur = buffer.get_end_iter() buffer.move_mark(inp_mark, cur) # Keep indentation of precendent line spaces = self._RE_SPACES.match(line) if spaces is not None: buffer.insert(cur, line[spaces.start():spaces.end()]) cur = buffer.get_end_iter() buffer.place_cursor(cur) GLib.idle_add(self.scroll_to_end) return True elif keyname == "Return": # Get the marks buffer = view.get_buffer() lin_mark = buffer.get_mark("input-line") inp_mark = buffer.get_mark("input") # Get the command line inp = buffer.get_iter_at_mark(inp_mark) cur = buffer.get_end_iter() line = buffer.get_text(inp, cur, False) self.current_command = self.current_command + line + "\n" self.history_add(line) buffer.insert(cur, "\n") cur_strip = self.current_command.rstrip() if cur_strip.endswith(":") \ or (self.current_command[-2:] != "\n\n" and self.block_command): # Unfinished block command self.block_command = True com_mark = "... " elif cur_strip.endswith("\\"): com_mark = "... " else: # Eval the command self.__run(self.current_command) self.current_command = "" self.block_command = False com_mark = ">>> " # Prepare the new line cur = buffer.get_end_iter() buffer.move_mark(lin_mark, cur) buffer.insert(cur, com_mark) cur = buffer.get_end_iter() buffer.move_mark(inp_mark, cur) buffer.place_cursor(cur) GLib.idle_add(self.scroll_to_end) return True elif keyname == "KP_Down" or keyname == "Down": # Next entry from history view.emit_stop_by_name("key_press_event") self.history_down() GLib.idle_add(self.scroll_to_end) return True elif keyname == "KP_Up" or keyname == "Up": # Previous entry from history view.emit_stop_by_name("key_press_event") self.history_up() GLib.idle_add(self.scroll_to_end) return True elif keyname == "KP_Left" or keyname == "Left" or \ keyname == "BackSpace": buffer = view.get_buffer() inp = buffer.get_iter_at_mark(buffer.get_mark("input")) cur = buffer.get_iter_at_mark(buffer.get_insert()) if inp.compare(cur) == 0: if not event_state: buffer.place_cursor(inp) return True return False # For the console we enable smart/home end behavior inconditionally # since it is useful when editing python elif ((keyname == "KP_Home" or keyname == "Home") and event_state == event_state & (Gdk.ModifierType.SHIFT_MASK|Gdk.ModifierType.CONTROL_MASK)): # Go to the begin of the command instead of the begin of the line buffer = view.get_buffer() iter = buffer.get_iter_at_mark(buffer.get_mark("input")) ins = buffer.get_iter_at_mark(buffer.get_insert()) while iter.get_char().isspace(): iter.forward_char() if iter.equal(ins): iter = buffer.get_iter_at_mark(buffer.get_mark("input")) if event_state & Gdk.ModifierType.SHIFT_MASK: buffer.move_mark_by_name("insert", iter) else: buffer.place_cursor(iter) return True elif ((keyname == "KP_End" or keyname == "End") and event_state == event_state & (Gdk.ModifierType.SHIFT_MASK|Gdk.ModifierType.CONTROL_MASK)): buffer = view.get_buffer() iter = buffer.get_end_iter() ins = buffer.get_iter_at_mark(buffer.get_insert()) iter.backward_char() while iter.get_char().isspace(): iter.backward_char() iter.forward_char() if iter.equal(ins): iter = buffer.get_end_iter() if event_state & Gdk.ModifierType.SHIFT_MASK: buffer.move_mark_by_name("insert", iter) else: buffer.place_cursor(iter) return True def __mark_set_cb(self, buffer, iter, name): input = buffer.get_iter_at_mark(buffer.get_mark("input")) pos = buffer.get_iter_at_mark(buffer.get_insert()) self.view.set_editable(pos.compare(input) != -1) def get_command_line(self): buffer = self.view.get_buffer() inp = buffer.get_iter_at_mark(buffer.get_mark("input")) cur = buffer.get_end_iter() return buffer.get_text(inp, cur, False) def set_command_line(self, command): buffer = self.view.get_buffer() mark = buffer.get_mark("input") inp = buffer.get_iter_at_mark(mark) cur = buffer.get_end_iter() buffer.delete(inp, cur) buffer.insert(inp, command) self.view.grab_focus() def history_add(self, line): if line.strip() != "": self.history_pos = len(self.history) self.history[self.history_pos - 1] = line self.history.append("") def history_up(self): if self.history_pos > 0: self.history[self.history_pos] = self.get_command_line() self.history_pos = self.history_pos - 1 self.set_command_line(self.history[self.history_pos]) def history_down(self): if self.history_pos < len(self.history) - 1: self.history[self.history_pos] = self.get_command_line() self.history_pos = self.history_pos + 1 self.set_command_line(self.history[self.history_pos]) def scroll_to_end(self): iter = self.view.get_buffer().get_end_iter() self.view.scroll_to_iter(iter, 0.0, False, 0.5, 0.5) return False def write(self, text): buffer = self.view.get_buffer() buffer.insert(buffer.get_end_iter(), text) GLib.idle_add(self.scroll_to_end) def eval(self, command, display_command=False): buffer = self.view.get_buffer() lin = buffer.get_mark("input-line") buffer.delete(buffer.get_iter_at_mark(lin), buffer.get_end_iter()) if isinstance(command, list) or isinstance(command, tuple): for c in command: if display_command: self.write(">>> " + c + "\n") self.__run(c) else: if display_command: self.write(">>> " + c + "\n") self.__run(command) cur = buffer.get_end_iter() buffer.move_mark_by_name("input-line", cur) buffer.insert(cur, ">>> ") cur = buffer.get_end_iter() buffer.move_mark_by_name("input", cur) self.view.scroll_to_iter(buffer.get_end_iter(), 0.0, False, 0.5, 0.5) def __run(self, command): sys.stdout, self.stdout = self.stdout, sys.stdout sys.stderr, self.stderr = self.stderr, sys.stderr # eval and exec are broken in how they deal with utf8-encoded # strings so we have to explicitly decode the command before # passing it along command = S(command).unicode() try: try: r = eval(command, globals(), self.namespace) if not r is None: print(repr(r)) except SystemExit: self.exit() except SyntaxError: exec(command, globals(), self.namespace) except SystemExit: self.exit() except: if hasattr(sys, "last_type") and sys.last_type == SystemExit: self.exit() else: traceback.print_exc() sys.stdout, self.stdout = self.stdout, sys.stdout sys.stderr, self.stderr = self.stderr, sys.stderr class OutFile: """ A fake output file object. """ def __init__(self, console, fn): self.fn = fn self.console = console def close(self): pass def flush(self): pass def fileno(self): return self.fn def isatty(self): return 0 def read(self, a): return "" def readline(self): return "" def readlines(self): return [] def write(self, s): self.console.write(s) def writelines(self, l): self.console.write(l) def seek(self, a): raise IOError(29, "Illegal seek") def tell(self): raise IOError(29, "Illegal seek") truncate = tell rabbitvcs-0.18/rabbitvcs/services/000077500000000000000000000000001362112712700172255ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/services/__init__.py000066400000000000000000000000001362112712700213240ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/services/checkerservice.py000066400000000000000000000427161362112712700225760ustar00rootroot00000000000000# # Copyright (C) 2009 Jason Heeris # Copyright (C) 2009 by Bruce van der Kooij # Copyright (C) 2009 by Adam Plumb # # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ The checker service for RabbitVCS background status checks. This file can be run as a Python script, in which case it starts a background VCS status checking service that can be called via DBUS. It also contains class definitions to call these methods from within a separate Python process. This currently works like so: 1. Nautilus loads our extension, RabbitVCS 2. RabbitVCS creates a StatusCheckerStub 3. StatusCheckerStub calls start(), which is a wrapper for a more general service starter convenience method 4. The service starter method looks for a DBUS object with the given service name and object path; if none is found, it creates it by running this script RabbitVCS can then call the stub methods, getting status info via the CheckStatus method itself, or more likely from a callback upon completion of a status check. NOTE: as a general rule, the data piped between processes or sent over DBUS should be kept to a minimum. Use convenience methods to condense and summarise data wherever possible (this is the case in the actual status cache and checker code). """ from __future__ import absolute_import import os, os.path import sys import json import locale from gi.repository import GObject from gi.repository import GLib import dbus import dbus.mainloop.glib import dbus.service import rabbitvcs.util.decorators import rabbitvcs.util._locale from rabbitvcs.util import helper from rabbitvcs.util.strings import S import rabbitvcs.services.service from rabbitvcs.services.statuschecker import StatusChecker import rabbitvcs.vcs.status from rabbitvcs.util.log import Log log = Log("rabbitvcs.services.checkerservice") from rabbitvcs import version as SERVICE_VERSION INTERFACE = "org.google.code.rabbitvcs.StatusChecker" OBJECT_PATH = "/org/google/code/rabbitvcs/StatusChecker" SERVICE = "org.google.code.rabbitvcs.RabbitVCS.Checker" TIMEOUT = 60*15*100 # seconds def find_class(module, name): """ Given a module name and a class name, return the actual type object. """ # From Python stdlib pickle module source __import__(module) mod = sys.modules[module] klass = getattr(mod, name) return klass def encode_status(status): """ Before encoding a status object to JSON, we need to turn it into something simpler. """ return status.__getstate__() def decode_status(json_dict): """ Once we get a JSON encoded string out the other side of DBUS, we need to reconstitute the original object. This method is based on the pickle module in the Python stdlib. """ cl = find_class(json_dict['__module__'], json_dict['__type__']) st = None if cl in rabbitvcs.vcs.status.STATUS_TYPES: st = cl.__new__(cl) st.__setstate__(json_dict) elif 'path' in json_dict: log.warning("Could not deduce status class: %s" % json_dict['__type__']) st = rabbitvcs.vcs.status.Status.status_error(json_dict['path']) else: raise TypeError("RabbitVCS status object has no path") return st def output_and_flush(*args): # Idle output function. sys.stdout.write(*args) sys.stdout.flush() class StatusCheckerService(dbus.service.Object): """ StatusCheckerService objects wrap a StatusCheckerPlus instance, exporting methods that can be called via DBUS. There should only be a single such object running in a separate process from the GUI (ie. do not create this in the Nautilus extension code, you should use a StatusCheckerStub there instead). """ def __init__(self, connection, mainloop): """ Creates a new status checker wrapper service, with the given DBUS connection. The mainloop argument is needed for process management (eg. calling Quit() for graceful exiting). @param connection: the DBUS connection (eg. session bus, system bus) @type connection: a DBUS connection object @param mainloop: the main loop that DBUS is using @type mainloop: any main loop with a quit() method """ dbus.service.Object.__init__(self, connection, OBJECT_PATH) self.encoder = json.JSONEncoder(default=encode_status, separators=(',', ':')) self.mainloop = mainloop # Start the status checking daemon so we can do requests in the # background self.status_checker = StatusChecker() @dbus.service.method(INTERFACE) def ExtraInformation(self): return self.status_checker.extra_info() @dbus.service.method(INTERFACE) def MemoryUsage(self): own_mem = helper.process_memory(os.getpid()) checker_mem = self.status_checker.get_memory_usage() return own_mem + checker_mem @dbus.service.method(INTERFACE) def SetLocale(self, language = None, encoding = None): return rabbitvcs.util._locale.set_locale(language, encoding) @dbus.service.method(INTERFACE) def PID(self): return os.getpid() @dbus.service.method(INTERFACE) def CheckerType(self): return self.status_checker.CHECKER_NAME @dbus.service.method(INTERFACE, in_signature='aybbb', out_signature='s') def CheckStatus(self, path, recurse=False, invalidate=False, summary=False): """ Requests a status check from the underlying status checker. Path is given as an array of bytes instead of a string because dbus does not support strings with invalid characters. """ status = self.status_checker.check_status(S(bytearray(path)), recurse=recurse, summary=summary, invalidate=invalidate) return self.encoder.encode(status) @dbus.service.method(INTERFACE, in_signature='aay', out_signature='s') def GenerateMenuConditions(self, paths): upaths = [] for path in paths: upaths.append(S(bytearray(path))) path_dict = self.status_checker.generate_menu_conditions(upaths) return json.dumps(path_dict) @dbus.service.method(INTERFACE) def CheckVersionOrDie(self, version): """ If the version passed does not match the version of RabbitVCS available when this service started, the service will exit. The return value is None if the versions match, else it's the PID of the service (useful for waiting for the process to exit). """ if not self.CheckVersion(version): log.warning("Version mismatch, quitting checker service " \ "(service: %s, extension: %s)" \ % (SERVICE_VERSION, version)) return self.Quit() return None @dbus.service.method(INTERFACE) def CheckVersion(self, version): """ Return True iff the version of RabbitVCS imported by this service is the same as that passed in (ie. used by extension code). """ return version == SERVICE_VERSION @dbus.service.method(INTERFACE) def Quit(self): """ Quits the service, performing any necessary cleanup operations. You can call this from the command line with: dbus-send --print-reply \ --dest=org.google.code.rabbitvcs.RabbitVCS.Checker \ /org/google/code/rabbitvcs/StatusChecker \ org.google.code.rabbitvcs.StatusChecker.Quit If calling this programmatically, then you can do "os.waitpid(pid, 0)" on the returned PID to prevent a zombie process. """ self.status_checker.quit() log.debug("Quitting main loop...") self.mainloop.quit() return self.PID() class StatusCheckerStub(object): """ StatusCheckerStub objects contain methods that call an actual status checker running in another process. These objects should be created by the GUI as needed (eg. the nautilus extension code). The inter-process communication is via DBUS. """ def __init__(self): """ Creates an object that can call the VCS status checker via DBUS. If there is not already a DBUS object with the path "OBJECT_PATH", we create one by starting a new Python process that runs this file. """ # We need this to for the client to be able to do asynchronous calls dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) self.session_bus = dbus.SessionBus() self.decoder = json.JSONDecoder(object_hook=decode_status) self.status_checker = None self._connect_to_checker() def _connect_to_checker(self): # Start the status checker, if it's not running this should start it up. # Otherwise it leaves it alone. start() # Try to get a new checker try: self.status_checker = self.session_bus.get_object(SERVICE, OBJECT_PATH) # Sets the checker locale. self.status_checker.SetLocale(*locale.getlocale(locale.LC_MESSAGES)) except dbus.DBusException as ex: # There is not much we should do about this... log.exception(ex) def assert_version(self, version): """ This will use the CheckVersionOrDie method to ensure that either the checker service currently running has the correct version, or that it is quit and restarted. Note that if the version of the newly started checker still doesn't match, nothing is done. """ try: pid = self.status_checker.CheckVersionOrDie(version) except dbus.DBusException as ex: log.exception(ex) self._connect_to_checker() else: if pid is not None: try: os.waitpid(pid, 0) except OSError: # Process already gone... pass start() self._connect_to_checker() try: if not self.status_checker.CheckVersion(version): log.warning("Version mismatch even after restart!") except dbus.DBusException as ex: log.exception(ex) self._connect_to_checker() def check_status_now(self, path, recurse=False, invalidate=False, summary=False): status = None try: json_status = self.status_checker.CheckStatus(bytearray(S(path).bytes()), recurse, invalidate, summary, dbus_interface=INTERFACE, timeout=TIMEOUT) status = self.decoder.decode(json_status) # Test client error problems :) # raise dbus.DBusException("Test") except dbus.DBusException as ex: log.exception(ex) status = rabbitvcs.vcs.status.Status.status_error(path) # Try to reconnect self._connect_to_checker() return status def check_status_later(self, path, callback, recurse=False, invalidate=False, summary=False): def real_reply_handler(json_status): # Note that this a closure referring to the outer functions callback # parameter status = self.decoder.decode(json_status) path1 = S(path) path2 = S(status.path) assert path1 == path2, "Status check returned the wrong path "\ "(asked about %s, got back %s)" % \ (path1.display(), path2.display()) callback(status) def reply_handler(*args, **kwargs): # The callback should be performed as a low priority task, so we # keep Nautilus as responsive as possible. GLib.idle_add(real_reply_handler, *args, **kwargs) def error_handler(dbus_ex): log.exception(dbus_ex) self._connect_to_checker() callback(rabbitvcs.vcs.status.Status.status_error(path)) try: self.status_checker.CheckStatus(bytearray(S(path).bytes()), recurse, invalidate, summary, dbus_interface=INTERFACE, timeout=TIMEOUT, reply_handler=reply_handler, error_handler=error_handler) except dbus.DBusException as ex: log.exception(ex) callback(rabbitvcs.vcs.status.Status.status_error(path)) # Try to reconnect self._connect_to_checker() # @rabbitvcs.util.decorators.deprecated # Can't decide whether this should be deprecated or not... -JH def check_status(self, path, recurse=False, invalidate=False, summary=False, callback=None): """ Check the VCS status of the given path. This is a pass-through method to the check_status method of the DBUS service (which is, in turn, a wrapper around the real status checker). """ if callback: GLib.idle_add(self.check_status_later, path, callback, recurse, invalidate, summary) return rabbitvcs.vcs.status.Status.status_calc(path) else: return self.check_status_now(path, recurse, invalidate, summary) def generate_menu_conditions(self, provider, base_dir, paths, callback): def real_reply_handler(obj): # Note that this a closure referring to the outer functions callback # parameter path_dict = json.loads(obj) callback(provider, base_dir, paths, path_dict) def reply_handler(*args, **kwargs): # The callback should be performed as a low priority task, so we # keep Nautilus as responsive as possible. GLib.idle_add(real_reply_handler, *args, **kwargs) def error_handler(dbus_ex): log.exception(dbus_ex) self._connect_to_checker() callback(provider, base_dir, paths, {}) bpaths = [bytearray(S(p).bytes()) for p in paths] try: self.status_checker.GenerateMenuConditions(bpaths, dbus_interface=INTERFACE, timeout=TIMEOUT, reply_handler=reply_handler, error_handler=error_handler) except dbus.DBusException as ex: log.exception(ex) callback(provider, base_dir, paths, {}) # Try to reconnect self._connect_to_checker() def generate_menu_conditions_async(self, provider, base_dir, paths, callback): GLib.idle_add(self.generate_menu_conditions, provider, base_dir, paths, callback) return {} def start(): """ Starts the checker service, via the utility method in "service.py". """ rabbitvcs.services.service.start_service(os.path.abspath(__file__), SERVICE, OBJECT_PATH) def Main(): """ The main point of entry for the checker service. This will set up the DBUS and glib extensions, the gobject/glib main loop, and start the service. """ global log log = Log("rabbitvcs.services.checkerservice:main") log.debug("Checker: starting service: %s (%s)" % (OBJECT_PATH, os.getpid())) # We need this to for the client to be able to do asynchronous calls dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) # The following calls are required to make DBus thread-aware and therefore # support the ability run threads. helper.gobject_threads_init() dbus.mainloop.glib.threads_init() # This registers our service name with the bus session_bus = dbus.SessionBus() service_name = dbus.service.BusName(SERVICE, session_bus) mainloop = GLib.MainLoop() checker_service = StatusCheckerService(session_bus, mainloop) GLib.idle_add(output_and_flush, "Started status checker service\n") mainloop.run() log.debug("Checker: ended service: %s (%s)" % (OBJECT_PATH, os.getpid())) if __name__ == "__main__": rabbitvcs.util._locale.initialize_locale() # import cProfile # import rabbitvcs.util.helper # profile_data_file = os.path.join( # rabbitvcs.util.helper.get_home_folder(), # "checkerservice.stats") # cProfile.run("Main()", profile_data_file) Main() rabbitvcs-0.18/rabbitvcs/services/service.py000066400000000000000000000061411362112712700212410ustar00rootroot00000000000000# # Copyright (C) 2009 Jason Heeris # Copyright (C) 2009 by Bruce van der Kooij # Copyright (C) 2009 by Adam Plumb # # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Simple utility module for starting DBUS services. This module contains helper functions for starting DBUS services. Usually they would be used from within a constructor. """ from __future__ import absolute_import import sys import subprocess import dbus from rabbitvcs.util.log import Log log = Log("rabbitvcs.services.service") def start_service(script_file, dbus_service_name, dbus_object_path): """ This function is used to start a service that exports a DBUS object. If the DBUS object can be found already, nothing is done and the function returns True. Otherwise we try to start the given script file and wait until we receive a newline over stdout. The "wait for newline" mechanism ensures any function calling this one will not try to access the object via DBUS until it is ready. It is recommended to use something like glib.idle_add(sys.stdout.write, "Started service\n") glib.idle_add(sys.stdout.flush) mainloop.run() That way a newline will be sent when the mainloop is started. @param script_file: the Python script file to run if the DBUS object does not already exist @type script_file: a Python script file that will create the DBUS object and send a newline over stdout when it is ready @param dbus_service_name: the name of the DBUS service to request @type dbus_service_name: string (confirming to the DBUS service format) @param dbus_object_path: the DBUS object path to request @type dbus_object_path: string (confirming to the DBUS object path format) @rtype: boolean @return: Whether or not the service was successfully started. """ object_exists = False try: session_bus = dbus.SessionBus() obj = session_bus.get_object(dbus_service_name, dbus_object_path) object_exists = True except dbus.DBusException: proc = subprocess.Popen([sys.executable, script_file], stdin=subprocess.PIPE, stdout=subprocess.PIPE) pid = proc.pid log.debug("Started process: %i" % pid) # Wait for subprocess to send a newline, to tell us it's ready proc.stdout.readline() # We don't care what the message is object_exists = True return object_exists rabbitvcs-0.18/rabbitvcs/services/statuschecker.py000066400000000000000000000043621362112712700224540ustar00rootroot00000000000000# # Copyright (C) 2009 Jason Heeris # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Very simple status checking class. Useful when you can't get any of the others to work, or you need to prototype things. """ from __future__ import absolute_import import rabbitvcs.vcs import rabbitvcs.vcs.status from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log log = Log("rabbitvcs.services.statuschecker") class StatusChecker(object): """ A class for performing status checks. """ # All subclasses should override this! This is to be displayed in the # settings dialog CHECKER_NAME = _("Simple status checker") def __init__(self): """ Initialises status checker. Obviously. """ self.vcs_client = rabbitvcs.vcs.create_vcs_instance() self.conditions_dict_cache = {} def check_status(self, path, recurse, summary, invalidate): """ Performs a status check, blocking until the check is done. """ path_status = self.vcs_client.status(path, summary, invalidate) return path_status def generate_menu_conditions(self, paths, invalidate=False): from rabbitvcs.util.contextmenu import MainContextMenuConditions conditions = MainContextMenuConditions(self.vcs_client, paths) return conditions.path_dict def extra_info(self): return None def get_memory_usage(self): """ Returns any additional memory of any subprocesses used by this checker. In other words, DO NOT return the memory usage of THIS process! """ return 0 def quit(self): # We will exit when the main process does pass rabbitvcs-0.18/rabbitvcs/test.py000066400000000000000000000024061362112712700167350ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import unittest import doctest import rabbitvcs.util.helper if __name__ == "__main__": suite = unittest.TestSuite() for module in (rabbitvcs.util.helper,): suite.addTest(doctest.DocTestSuite(module)) runner = unittest.TextTestRunner() runner.run(suite) rabbitvcs-0.18/rabbitvcs/tests/000077500000000000000000000000001362112712700165445ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/tests/__init__.py000066400000000000000000000016761362112712700206670ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # rabbitvcs-0.18/rabbitvcs/tests/nautilus.py000066400000000000000000000006041362112712700207620ustar00rootroot00000000000000""" Dummy nautilus module for testing. It should provide the bare minimum to get the RabbitVCS extension to load properly. """ class InfoProvider(object): pass class MenuProvider(object): pass class ColumnProvider(object): pass class NautilusVFSFile(object): def add_string_attribute(self, key, value): """Pretend to add a string attribute.""" pass rabbitvcs-0.18/rabbitvcs/tests/test_rabbitvcs.py000066400000000000000000000132461362112712700221420ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Unit tests for the top-level rabbitvcs package. """ from __future__ import absolute_import # make sure the current working copy is in sys.path before anything else from os.path import abspath, dirname, join, normpath import sys toplevel = normpath(join(dirname(abspath(__file__)), '..', '..')) sys.path.insert(0, toplevel) from unittest import TestCase, main import traceback from . import nautilus import pysvn import rabbitvcs from rabbitvcs.util.extensions.nautilus import RabbitVCS class RabbitVCSTest(TestCase): """ Main RabbitVCS tests. """ def test_package_name(self): """Make sure the package name is reported properly.""" result = rabbitvcs.package_name() self.assertEqual(result, "rabbitvcs") def test_package_version(self): """Make sure the package version is reported properly.""" result = rabbitvcs.package_version() for character in result: if not (character.isdigit() or character == '.'): self.fail("Not all characters in package version " "'%s' were digits or dots." % result) def test_package_identifier(self): """Make sure the package identifier is reported properly.""" result = rabbitvcs.package_identifier() version = rabbitvcs.package_version() self.assertEqual(result, "rabbitvcs-%s" % version) class FakeVersion(object): """ Fake revision info for FakeInfo, below. """ def __init__(self, number): self.number = number class FakeInfo(object): """ Fake pysvn.Client.info() response. """ def __init__(self): self.data = {'text_status': pysvn.wc_status_kind.none, 'commit_revision': FakeVersion(1234), 'commit_author': None, 'commit_time': 0.0, 'url': None, } class FakeClient(object): """ Fake pysvn.Client that can have its behavior controlled. """ instance_count = 0 send_empty_info = True def __init__(self, *args, **kwargs): FakeClient.instance_count += 1 def info(self, path): if self.send_empty_info: return None else: return FakeInfo() def status(self, path, recurse=False): """Return a fake status, as a list.""" return [FakeInfo()] class FakeLog(object): """ Fake logger that allows us to pick the log messages out from within unit tests. """ def __init__(self, prefix): self.prefix = prefix self.messages = [] def exception(self): """ Log an exception. Just add the (exc_type, message, traceback) tuple onto the list of messages. """ info = sys.exc_info() self.messages.append(info) class RabbitVCSPySvnTest(TestCase): """ RabbitVCS tests that involve pysvn in such a way that we need to fiddle with pysvn stuff for the tests to work. """ def setUp(self): self.oldClient = pysvn.Client pysvn.Client = FakeClient FakeClient.instance_count = 0 self.oldLog = RabbitVCS.log self.logger = FakeLog("rabbitvcs") RabbitVCS.log = self.logger self.nsvn = RabbitVCS.RabbitVCS() def test_update_columns_missing_info(self): """ Test the behavior of update_columns() when the info() call returns None. See http://code.google.com/p/rabbitvcs/issues/detail?id=119 The desired behavior is that an error message is logged which indicates that the given path is not under source control. """ path = "awesomepath" FakeClient.send_empty_info = True item = nautilus.NautilusVFSFile() self.nsvn.update_columns(item, path) self.assertEqual(FakeClient.instance_count, 2) self.assertEqual(len(self.logger.messages), 1) last_message = self.logger.messages[-1] self.assertEqual(str(last_message[1]), "The path 'awesomepath' does not " "appear to be under source control.") def test_update_columns_correct_info(self): """ Test the side effects of update_columns() when things happen normally. """ path = "excellentpath" FakeClient.send_empty_info = False item = nautilus.NautilusVFSFile() self.nsvn.update_columns(item, path) self.assertEqual(FakeClient.instance_count, 2) if len(self.logger.messages) > 0: for e,m,t in self.logger.messages: traceback.print_exception(e, m, t) self.fail() def tearDown(self): RabbitVCS.log = self.oldLog pysvn.Client = self.oldClient if __name__ == "__main__": main() rabbitvcs-0.18/rabbitvcs/ui/000077500000000000000000000000001362112712700160175ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/ui/__init__.py000066400000000000000000000204511362112712700201320ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ UI layer. """ from __future__ import absolute_import import os from six.moves import range from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, Gdk, GLib sa.restore() from rabbitvcs import APP_NAME, LOCALE_DIR, gettext _ = gettext.gettext import rabbitvcs.vcs.status REVISION_OPT = (["-r", "--revision"], {"help":"specify the revision number"}) BASEDIR_OPT = (["-b", "--base-dir"], {}) QUIET_OPT = (["-q", "--quiet"], { "help": "Run the add command quietly, with no UI.", "action": "store_true", "default": False }) VCS_OPT = (["--vcs"], {"help":"specify the version control system"}) VCS_OPT_ERROR = _("You must specify a version control system using the --vcs [svn|git] option") #: Maps statuses to emblems. STATUS_EMBLEMS = { rabbitvcs.vcs.status.status_normal : "rabbitvcs-normal", rabbitvcs.vcs.status.status_modified : "rabbitvcs-modified", rabbitvcs.vcs.status.status_added : "rabbitvcs-added", rabbitvcs.vcs.status.status_deleted : "rabbitvcs-deleted", rabbitvcs.vcs.status.status_ignored :"rabbitvcs-ignored", rabbitvcs.vcs.status.status_read_only : "rabbitvcs-locked", rabbitvcs.vcs.status.status_locked : "rabbitvcs-locked", rabbitvcs.vcs.status.status_unknown : "rabbitvcs-unknown", rabbitvcs.vcs.status.status_missing : "rabbitvcs-complicated", rabbitvcs.vcs.status.status_replaced : "rabbitvcs-modified", rabbitvcs.vcs.status.status_complicated : "rabbitvcs-complicated", rabbitvcs.vcs.status.status_calculating : "rabbitvcs-calculating", rabbitvcs.vcs.status.status_error : "rabbitvcs-error", rabbitvcs.vcs.status.status_unversioned : "rabbitvcs-unversioned" } class GtkBuilderWidgetWrapper(object): def __init__(self, gtkbuilder_filename = None, gtkbuilder_id = None, claim_domain=True): if gtkbuilder_filename: self.gtkbuilder_filename = gtkbuilder_filename if gtkbuilder_id: self.gtkbuilder_id = gtkbuilder_id self.claim_domain = claim_domain self.tree = self.get_tree() self.tree.connect_signals(self) def get_tree(self): path = "%s/xml/%s.xml" % ( os.path.dirname(os.path.realpath(__file__)), self.gtkbuilder_filename ) tree = Gtk.Builder() tree.add_from_file(path) if self.claim_domain: tree.set_translation_domain(APP_NAME) return tree def get_widget(self, id = None): if not id: id = self.gtkbuilder_id return self.tree.get_object(id) class InterfaceView(GtkBuilderWidgetWrapper): """ Every ui window should inherit this class and send it the "self" variable, the Gtkbuilder filename (without the extension), and the id of the main window widget. When calling from the __main__ area (i.e. a window is opened via CLI, call the register_gtk_quit method to make sure the main app quits when the app is destroyed or finished. """ def __init__(self, *args, **kwargs): GtkBuilderWidgetWrapper.__init__(self, *args, **kwargs) self.do_gtk_quit = False # On OSX, there is a glitch where GTK applications do not always come to the front # when a launched (and methods like 'present()' don't appear to work correctly). # So until GTK on OSX is fixed let's work around this issue... import platform if platform.system() == 'Darwin': try: import subprocess subprocess.Popen('osascript -e "tell application \\"Python\\" to activate"', shell=True) except: pass def hide(self): window = self.get_widget(self.gtkbuilder_id) if window: window.set_property('visible', False) def show(self): window = self.get_widget(self.gtkbuilder_id) if window: window.set_property('visible', True) def destroy(self): self.close() def close(self, threaded=False): window = self.get_widget(self.gtkbuilder_id) if window is not None: if threaded: helper.run_in_main_thread(window.destroy) else: window.destroy() if self.do_gtk_quit: Gtk.main_quit() def register_gtk_quit(self): window = self.get_widget(self.gtkbuilder_id) self.do_gtk_quit = True # This means we've already been closed if window is None: GLib.idle_add(Gtk.main_quit) def gtk_quit_is_set(self): return self.do_gtk_quit def on_destroy(self, widget): self.destroy() def on_cancel_clicked(self, widget): self.close() def on_close_clicked(self, widget): self.close() def on_refresh_clicked(self, widget): return True def on_key_pressed(self, widget, event, *args): if event.keyval == Gdk.keyval_from_name('Escape'): self.on_cancel_clicked(widget) return True if (event.state & Gdk.ModifierType.CONTROL_MASK and Gdk.keyval_name(event.keyval).lower() == "w"): self.on_cancel_clicked(widget) return True if (event.state & Gdk.ModifierType.CONTROL_MASK and Gdk.keyval_name(event.keyval).lower() == "q"): self.on_cancel_clicked(widget) return True if (event.state & Gdk.ModifierType.CONTROL_MASK and Gdk.keyval_name(event.keyval).lower() == "r"): self.on_refresh_clicked(widget) return True def change_button(self, id, label = None, icon = None): """ Replace label and/or icon of the named button. """ button = self.get_widget(id) if label: button.set_label(label) if icon: image = Gtk.Image.new_from_icon_name(icon, Gtk.IconSize.BUTTON) button.set_image(image) class InterfaceNonView(object): """ Provides a way for an interface to handle quitting, etc without having to have a visible interface. """ def __init__(self): self.do_gtk_quit = False def close(self): try: Gtk.main_quit() except RuntimeError: raise SystemExit() def register_gtk_quit(self): self.do_gtk_quit = True def gtk_quit_is_set(self): return self.do_gtk_quit class VCSNotSupportedError(Exception): """Indicates the desired VCS is not valid for a given action""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) def main(allowed_options=None, description=None, usage=None): from os import getcwd from sys import argv from optparse import OptionParser from rabbitvcs.util.helper import get_common_directory parser = OptionParser(usage=usage, description=description) if allowed_options: for (option_args, option_kwargs) in allowed_options: parser.add_option(*option_args, **option_kwargs) (options, args) = parser.parse_args(argv) # Convert "." to current working directory paths = args[1:] for i in range(0, len(paths)): if paths[i] == ".": paths[i] = getcwd() if not paths: paths = [getcwd()] if parser.has_option("--base-dir") and not options.base_dir: options.base_dir = get_common_directory(paths) return (options, paths) rabbitvcs-0.18/rabbitvcs/ui/about.py000066400000000000000000000067501362112712700175130ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # license = """\ RabbitVCS 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. RabbitVCS 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 RabbitVCS; If not, see . """ import os.path import string import re from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, GdkPixbuf sa.restore() import rabbitvcs from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import pysvn import configobj from rabbitvcs import gettext from six.moves import map _ = gettext.gettext class About(object): """ This class provides an interface to the About window. """ def __init__(self): self.about = Gtk.AboutDialog() self.about.set_name(rabbitvcs.APP_NAME) self.about.set_program_name(rabbitvcs.APP_NAME) self.about.set_version(rabbitvcs.version) self.about.set_website("http://www.rabbitvcs.org") self.about.set_website_label("http://www.rabbitvcs.org") doc_path_root = "/usr/share/doc" doc_path_regex = re.compile("rabbitvcs") for dir in os.listdir(doc_path_root): if doc_path_regex.search(dir): # Find all the doc directories containing "rabbitvcs" tmp_authors_path = os.path.join(doc_path_root, dir, "AUTHORS") if os.path.exists(tmp_authors_path): authors_path = tmp_authors_path # At this point we have found a likely-looking AUTHORS break if not authors_path: # Assumes the user is running RabbitVCS through an svn checkout # and the doc files are two directories up (from rabbitvcs/ui). doc_path = os.path.dirname(os.path.realpath(__file__)).split('/') doc_path = '/'.join(doc_path[:-2]) authors_path = os.path.join(doc_path, "AUTHORS") authors = open(authors_path, "r").read() self.about.set_authors(authors.split("\n")) pixbuf = GdkPixbuf.Pixbuf.new_from_file(rabbitvcs.get_icon_path() + "/scalable/apps/rabbitvcs.svg") self.about.set_logo(pixbuf) versions = [] versions.append("Subversion - %s" % ".".join(list(map(str,pysvn.svn_version)))) versions.append("Pysvn - %s" % ".".join(list(map(str,pysvn.version)))) versions.append("ConfigObj - %s" % str(configobj.__version__)) self.about.set_comments("\n".join(versions)) self.about.set_license(license) def run(self): self.about.show_all() self.about.run() self.about.destroy() if __name__ == "__main__": window = About() window.run() rabbitvcs-0.18/rabbitvcs/ui/action.py000066400000000000000000000573051362112712700176600ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from __future__ import division from __future__ import absolute_import import threading from os.path import basename import shutil import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GObject, Gdk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util import rabbitvcs.vcs from rabbitvcs.util import helper from rabbitvcs.util.strings import S from rabbitvcs.ui.dialog import MessageBox from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.action") class VCSNotifier(InterfaceView): """ Provides a base class to handle threaded/gtk_unsafe calls to our vcs """ def __init__(self, callback_cancel=None, visible=True): InterfaceView.__init__(self) if visible: self.show() self.callback_cancel = callback_cancel self.was_canceled_by_user = False self.canceled = False def set_canceled_by_user(self, was_canceled_by_user): self.was_canceled_by_user = was_canceled_by_user def toggle_ok_button(self, sensitive): pass def append(self, entry): pass def focus_on_ok_button(self): pass class DummyNotifier(object): def __init__(self): pass def close(self): pass def set_canceled_by_user(self, was_canceled_by_user): pass @gtk_unsafe def exception_callback(self, e): log.exception(e) MessageBox(str(e)) class MessageCallbackNotifier(VCSNotifier): """ Provides an interface to handle the Notification UI. """ gtkbuilder_filename = "notification" gtkbuilder_id = "Notification" def __init__(self, callback_cancel=None, visible=True, client_in_same_thread=True): """ @type callback_cancel: def @param callback_cancel: A method to call when cancel button is clicked. @type visible: boolean @param visible: Show the notification window. Defaults to True. """ VCSNotifier.__init__(self, callback_cancel, visible) self.client_in_same_thread = client_in_same_thread self.table = rabbitvcs.ui.widget.Table( self.get_widget("table"), [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Action"), _("Path"), _("Mime Type")] ) self.pbar = rabbitvcs.ui.widget.ProgressBar( self.get_widget("pbar") ) self.pbar.start_pulsate() self.finished = False def on_destroy(self, widget): if self.callback_cancel is not None: self.callback_cancel() self.canceled = True self.close() def on_cancel_clicked(self, widget): if self.canceled or self.finished: self.close() if self.callback_cancel is not None: self.callback_cancel() self.canceled = True def on_ok_clicked(self, widget): self.close() @gtk_unsafe def toggle_ok_button(self, sensitive): self.finished = True self.get_widget("ok").set_sensitive(sensitive) self.get_widget("saveas").set_sensitive(sensitive) @gtk_unsafe def append(self, entry): self.table.append(entry) self.table.scroll_to_bottom() def get_title(self): return self.get_widget("Notification").get_title() @gtk_unsafe def set_title(self, title): self.get_widget("Notification").set_title(title) @gtk_unsafe def set_header(self, header): self.set_title(header) self.get_widget("action").set_markup( "%s" % header ) @gtk_unsafe def focus_on_ok_button(self): self.get_widget("ok").grab_focus() def exception_callback(self, e): self.append(["", str(e), ""]) def on_saveas_clicked(self, widget): self.saveas() @gtk_unsafe def enable_saveas(self): self.get_widget("saveas").set_sensitive(True) @gtk_unsafe def disable_saveas(self): self.get_widget("saveas").set_sensitive(False) def saveas(self, path=None): if path is None: from rabbitvcs.ui.dialog import FileSaveAs dialog = FileSaveAs() path = dialog.run() if path is not None: fh = open(path, "w") fh.write(self.table.generate_string_from_data()) fh.close() class LoadingNotifier(VCSNotifier): gtkbuilder_filename = "dialogs/loading" gtkbuilder_id = "Loading" def __init__(self, callback_cancel=None, visible=True): VCSNotifier.__init__(self, callback_cancel, visible) self.pbar = rabbitvcs.ui.widget.ProgressBar( self.get_widget("pbar") ) self.pbar.start_pulsate() def on_destroy(self, widget): self.close() def on_loading_cancel_clicked(self, widget): self.set_canceled_by_user(True) if self.callback_cancel is not None: self.callback_cancel() self.close() def get_title(self): return self.get_widget("Loading").get_title() @gtk_unsafe def set_title(self, title): self.get_widget("Loading").set_title(title) def set_header(self, header): self.set_title(header) @gtk_unsafe def exception_callback(self, e): if not self.was_canceled_by_user: log.exception(e) MessageBox(str(e)) class VCSAction(threading.Thread): """ Provides a central interface to handle vcs actions & callbacks. Loads UI elements that require user interaction. """ def __init__(self, client, register_gtk_quit=False, notification=True, run_in_thread=True): self.run_in_thread = run_in_thread if run_in_thread is True: threading.Thread.__init__(self) self.message = None self.queue = rabbitvcs.util.FunctionQueue() self.login_tries = 0 self.cancel = False self.has_loader = False self.has_notifier = False if notification: self.notification = MessageCallbackNotifier( self.set_cancel, notification, client_in_same_thread=self.client_in_same_thread ) self.has_notifier = True elif run_in_thread: visible = run_in_thread self.notification = LoadingNotifier(self.set_cancel, visible=visible) self.has_loader = True else: self.notification = DummyNotifier() self.pbar_ticks = None self.pbar_ticks_current = -1 # Tells the notification window to do a Gtk.main_quit() when closing # Is used when the script is run from a command line if register_gtk_quit: self.notification.register_gtk_quit() def schedule(self): if self.run_in_thread: self.start() else: self.run() def set_pbar_ticks(self, num): """ Set the total number of ticks to represent in the progress bar. Each time the notify method is called, update the pbar fraction. If this function isn't called, the progress bar just pulsates. @type num: integer @param num: The number of ticks in the progress bar. """ self.pbar_ticks = num def set_progress_fraction(self, fraction): """ An alternative method to access the progress bar directly. @type percentage: int @param percentage: The percentage value to set the progress bar. """ if self.has_notifier: self.notification.pbar.update(fraction) def set_header(self, header): self.notification.set_header(header) def cancel(self): """ PySVN calls this callback method frequently to see if the user wants to cancel the action. If self.cancel is True, then it will cancel the action. If self.cancel is False, it will continue. """ return self.cancel def set_cancel(self, cancel=True): """ Used as a callback function by the Notification UI. When the cancel button is clicked, it sets self.cancel to True, and the cancel callback method returns True. """ self.cancel = cancel self.notification.set_canceled_by_user(True) self.queue.cancel_queue() def finish(self, message=None): """ This is called when the final notifcation message has been received, or it is called manually when no final notification message is expected. It sets the current "status", and enables the OK button to allow the user to leave the window. @type message: string @param message: A message to show the user. """ if self.has_notifier: self.notification.append( ["", _("Finished"), ""] ) self.notification.focus_on_ok_button() title = self.notification.get_title() self.notification.set_title(_("%s - Finished") % title) self.set_status(message) self.notification.pbar.stop_pulsate() self.notification.pbar.update(1) self.notification.toggle_ok_button(True) def get_log_message(self): """ A callback method that retrieves a supplied log message. Returns a list where the first element is True/False. Returning true tells the action to continue, false tells it to cancel. The second element is the log message, which is specified by self.message. self.message is set by calling the self.set_log_message() method from the UI interface class. @rtype: (boolean, string) @return: (True=continue/False=cancel, log message) """ should_continue = True message = self.message if message is None: settings = rabbitvcs.util.settings.SettingsManager() message = settings.get_multiline("general", "default_commit_message") result = helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.TextChange(_("Log Message"), message).run()) should_continue = (result[0] == Gtk.ResponseType.OK) message = result[1] if isinstance(message, bytes): message = message.decode() if not should_continue: self.set_cancel() return should_continue, message def get_login(self, realm, username, may_save): """ A callback method that requests a username/password to login to a password-protected repository. This method runs the Authentication dialog, which provides a username, password, and saving widget. The dialog returns a tuple, which is returned directly to the VCS caller. If the login fails greater than three times, cancel the action. The dialog must be called from within a threaded block, otherwise it will not be responsive. @type realm: string @param realm: The realm of the repository. @type username: string @param username: Username passed by the vcs caller. @type may_save: boolean @param may_save: Whether or not the authentication can be saved. @rtype: (boolean, string, string, boolean) @return: (True=continue/False=cancel, username,password, may_save) """ if self.login_tries >= 3: return (False, "", "", False) result = helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.Authentication(realm, may_save).run()) if result is not None: self.login_tries += 1 return result def get_ssl_trust(self, data): """ A callback method that requires the user to either accept or deny a certificate from an ssl secured repository. It opens a dialog that shows the user information about the ssl certificate and then gives them the option of denying, accepting, or accepting once. The dialog must be called from within a threaded block, otherwise it will not be responsive. @type data: dictionary @param data: A dictionary with SSL certificate info. @rtype: (boolean, int, boolean) @return: (True=Accept/False=Deny, number of accepted failures, remember) """ result = 0 if data: result = helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.Certificate( data["realm"], data["hostname"], data["issuer_dname"], data["valid_from"], data["valid_until"], data["finger_print"] ).run()) if result == 0: #Deny return (False, 0, False) elif result == 1: #Accept Once return (True, data["failures"], False) elif result == 2: #Accept Forever return (True, data["failures"], True) def get_ssl_password(self, realm, may_save): """ A callback method that is used to get an ssl certificate passphrase. The dialog must be called from within a threaded block, otherwise it will not be responsive. @type realm: string @param realm: The certificate realm. @type may_save: boolean @param may_save: Whether or not the passphrase can be saved. @rtype: (boolean, string, boolean) @return: (True=continue/False=cancel, password, may save) """ return helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.CertAuthentication( realm, may_save ).run()) def get_client_cert(self, realm, may_save): """ A callback method that is used to get an ssl certificate. The dialog must be called from within a threaded block, otherwise it will not be responsive. @type realm: string @param realm: The certificate realm. @type may_save: boolean @param may_save: Whether or not the passphrase can be saved. @rtype: (boolean, string, boolean) @return: (True=continue/False=cancel, password, may save) """ return helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.SSLClientCertPrompt( realm, may_save ).run()) def set_log_message(self, message): """ Set this action's log message from the UI interface. self.message is referred to when the VCS does the get_log_message callback. @type message: string @param message: Set a log message. """ self.message = message @gtk_unsafe def set_status(self, message): """ Set the current status of the VCS action. Currently, this method is called at the beginning and end of each action, to display what is going on. Currently, it just appends the status message to the notification window. In the future, I may set up a progress bar and put the status message there. @type message: string @param message: A status message. """ if message is not None: self.notification.get_widget("status").set_text(S(message).display()) def append(self, func, *args, **kwargs): """ Append a function call to the action queue. """ self.queue.append(func, *args, **kwargs) def get_result(self, index): """ Retrieve the result of a single function call by specifying the order in which the function was in the queue. @type index: int @param index: The queue index """ return self.queue.get_result(index) def __queue_exception_callback(self, e): """ Used internally when an exception is raised within the queue @type e: Exception @param e: The exception object passed by the FunctionQueue """ self.notification.exception_callback(e) if self.has_notifier: self.finish() if self.has_loader: self.stop() def stop(self): if self.notification: self.notification.close() def run(self): """ The central method that drives this class. It runs the before and after methods, as well as the main vcs method. """ if self.has_loader: self.queue.append(self.notification.close, threaded=True) self.queue.set_exception_callback(self.__queue_exception_callback) self.queue.start() def run_single(self, func, *args, **kwargs): try: try: returner = func(*args, **kwargs) except Exception as e: self.__queue_exception_callback(e) returner = None finally: self.stop() return returner def stop_loader(self): self.stop() class SVNAction(VCSAction): def __init__(self, client, register_gtk_quit=False, notification=True, run_in_thread=True): self.client_in_same_thread = False self.client = client self.client.set_callback_cancel(self.cancel) self.client.set_callback_notify(self.notify) self.client.set_callback_get_log_message(self.get_log_message) self.client.set_callback_get_login(self.get_login) self.client.set_callback_ssl_server_trust_prompt(self.get_ssl_trust) self.client.set_callback_ssl_client_cert_password_prompt(self.get_ssl_password) self.client.set_callback_ssl_client_cert_prompt(self.get_client_cert) VCSAction.__init__(self, client, register_gtk_quit, notification, run_in_thread) def notify(self, data): """ This method is called every time the VCS function wants to tell us something. It passes us a dictionary of useful information. When this method is called, it appends some useful data to the notifcation window. TODO: We need to implement this in a more VCS-agnostic way, since the supplied data dictionary is pysvn-dependent. I'm going to implement something in lib/vcs/svn.py soon. """ if self.has_notifier: self.conflict_filter(data) if self.pbar_ticks is not None: self.pbar_ticks_current += 1 frac = self.pbar_ticks_current / self.pbar_ticks if frac > 1: frac = 1 self.notification.pbar.update(frac) is_known_action = False if data["action"] in self.client.NOTIFY_ACTIONS: action = self.client.NOTIFY_ACTIONS[data["action"]] is_known_action = True else: action = data["action"] # Determine if this action denotes completedness is_complete_action = False for item in self.client.NOTIFY_ACTIONS_COMPLETE: if str(data["action"]) == str(item): is_complete_action = True break if (is_known_action and is_complete_action and "revision" in data and data["revision"]): self.notification.append( ["", "Revision %s" % data["revision"].number, ""] ) elif "path" in data: self.notification.append([ action, data["path"], data["mime_type"] ]) def conflict_filter(self, data): if "content_state" in data and str(data["content_state"]) == "conflicted": position = self.queue.get_position() self.queue.insert(position+1, self.edit_conflict, data) def edit_conflict(self, data): helper.launch_ui_window("editconflicts", [data["path"]], block=True) class GitAction(VCSAction): def __init__(self, client, register_gtk_quit=False, notification=True, run_in_thread=True): self.client_in_same_thread = True self.client = client VCSAction.__init__(self, client, register_gtk_quit, notification, run_in_thread) self.client.set_callback_notify(self.notify) self.client.set_callback_progress_update(self.set_progress_fraction) self.client.set_callback_get_user(self.get_user) self.client.set_callback_get_cancel(self.cancel) def notify(self, data): if self.has_notifier: if data: self.conflict_filter(data) if isinstance(data, dict): self.notification.append([ data["action"], data["path"], data["mime_type"] ]) else: self.notification.append(["", data, ""]) def get_user(self): return helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.NameEmailPrompt().run()) def conflict_filter(self, data): if str(data).startswith("ERROR:"): path = data[27:] helper.launch_ui_window("editconflicts", [path], block=True) class MercurialAction(VCSAction): def __init__(self, client, register_gtk_quit=False, notification=True, run_in_thread=True): self.client_in_same_thread = True self.client = client self.client.set_callback_notify(self.notify) self.client.set_callback_get_user(self.get_user) self.client.set_callback_get_cancel(self.cancel) VCSAction.__init__(self, client, register_gtk_quit, notification, run_in_thread) def notify(self, data): if self.has_notifier: if data: self.conflict_filter(data) if isinstance(data, dict): self.notification.append([ data["action"], data["path"], data["mime_type"] ]) else: self.notification.append(["", data, ""]) def get_user(self): return helper.run_in_main_thread(lambda: rabbitvcs.ui.dialog.NameEmailPrompt().run()) def conflict_filter(self, data): if str(data).startswith("ERROR:"): path = data[27:] helper.launch_ui_window("editconflicts", [path], block=True) def vcs_action_factory(client, register_gtk_quit=False, notification=True, run_in_thread=True): if client.vcs == rabbitvcs.vcs.VCS_GIT: return GitAction(client, register_gtk_quit, notification, run_in_thread) else: return SVNAction(client, register_gtk_quit, notification, run_in_thread) rabbitvcs-0.18/rabbitvcs/ui/add.py000066400000000000000000000221331362112712700171220ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import six.moves._thread from time import sleep from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkFilesContextMenu, GtkContextMenuCaller import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util import helper from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs.util.log import Log from rabbitvcs.vcs.status import Status log = Log("rabbitvcs.ui.add") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class Add(InterfaceView, GtkContextMenuCaller): """ Provides an interface for the user to add unversioned files to a repository. Also, provides a context menu with some extra functionality. Send a list of paths to be added """ TOGGLE_ALL = True def __init__(self, paths, base_dir=None): InterfaceView.__init__(self, "add", "Add") self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.items = [] self.show_ignored = False # TODO Remove this when there is svn support for path in paths: if rabbitvcs.vcs.guess(path)['vcs'] == rabbitvcs.vcs.VCS_SVN: self.get_widget("show_ignored").set_sensitive(False) columns = [[GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, "", _("Path"), _("Extension")]] self.setup(self.get_widget("Add"), columns) self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), columns[0], columns[1], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 2 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event, "key-event": self.on_files_table_key_event } ) self.initialize_items() def setup(self, window, columns): self.statuses = self.vcs.statuses_for_add(self.paths) # # Helpers # def load(self): status = self.get_widget("status") helper.run_in_main_thread(status.set_text, _("Loading...")) self.items = self.vcs.get_items(self.paths, self.statuses) if self.show_ignored: for path in self.paths: # TODO Refactor # TODO SVN support # TODO Further fix ignore patterns if rabbitvcs.vcs.guess(path)['vcs'] == rabbitvcs.vcs.VCS_GIT: git = self.vcs.git(path) for ignored_path in git.client.get_all_ignore_file_paths(path): should_add = True for item in self.items: if item.path == os.path.realpath(ignored_path): should_add = False if should_add: self.items.append(Status(os.path.realpath(ignored_path), 'unversioned')) self.populate_files_table() helper.run_in_main_thread(status.set_text, _("Found %d item(s)") % len(self.items)) def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path) ]) def toggle_ignored(self): self.show_ignored = not self.show_ignored self.initialize_items() # Overrides the GtkContextMenuCaller method def on_context_menu_command_finished(self): self.initialize_items() def initialize_items(self): """ Initializes the activated cache and loads the file items in a new thread """ try: six.moves._thread.start_new_thread(self.load, ()) except Exception as e: log.exception(e) def delete_items(self, widget, event): paths = self.files_table.get_selected_row_items(1) if len(paths) > 0: proc = helper.launch_ui_window("delete", paths) self.rescan_after_process_exit(proc, paths) # # UI Signal Callbacks # def on_select_all_toggled(self, widget): self.TOGGLE_ALL = not self.TOGGLE_ALL for row in self.files_table.get_items(): row[0] = self.TOGGLE_ALL def on_show_ignored_toggled(self, widget): self.toggle_ignored() def on_files_table_row_activated(self, treeview, event, col): paths = self.files_table.get_selected_row_items(1) helper.launch_diff_tool(*paths) def on_files_table_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) == "Delete": self.delete_items(treeview, event) def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_files_table_popup_menu(treeview, event) def show_files_table_popup_menu(self, treeview, event): paths = self.files_table.get_selected_row_items(1) GtkFilesContextMenu(self, event, self.base_dir, paths).show() class SVNAdd(Add): def __init__(self, paths, base_dir=None): Add.__init__(self, paths, base_dir) self.svn = self.vcs.svn() def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Add")) self.action.append(self.action.set_status, _("Running Add Command...")) self.action.append(self.svn.add, items) self.action.append(self.action.set_status, _("Completed Add")) self.action.append(self.action.finish) self.action.schedule() class GitAdd(Add): def __init__(self, paths, base_dir=None): Add.__init__(self, paths, base_dir) self.git = self.vcs.git(paths[0]) def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Add")) self.action.append(self.action.set_status, _("Running Add Command...")) self.action.append(self.git.add, items) self.action.append(self.action.set_status, _("Completed Add")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNAdd, rabbitvcs.vcs.VCS_GIT: GitAdd } def add_factory(paths, base_dir): guess = rabbitvcs.vcs.guess (paths[0]) return classes_map[guess["vcs"]](paths,base_dir) class AddQuiet(object): def __init__(self, paths): self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.action = rabbitvcs.ui.action.SVNAction( self.svn ) self.action.append(self.svn.add, paths) self.action.schedule() if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT, QUIET_OPT (options, paths) = main( [BASEDIR_OPT, QUIET_OPT], usage="Usage: rabbitvcs add [path1] [path2] ..." ) if options.quiet: AddQuiet(paths) else: window = add_factory(paths,options.base_dir)#Add(paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/annotate.py000066400000000000000000000675561362112712700202250ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from datetime import datetime import time from random import random, uniform from rabbitvcs.util import helper from gi import require_version require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, GLib sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.log import log_dialog_factory from rabbitvcs.ui.action import SVNAction, GitAction from rabbitvcs.ui.widget import Clickable, Table, TYPE_MARKUP, TYPE_HIDDEN from rabbitvcs.ui.dialog import MessageBox, Loading from rabbitvcs.util.contextmenu import GtkContextMenu from rabbitvcs.util.contextmenuitems import * from rabbitvcs.util.strings import S from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs.util.highlighter import highlight from rabbitvcs.util.settings import SettingsManager import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log logger = Log("rabbitvcs.ui.annotate") LUMINANCE = 0.90 class Annotate(InterfaceView): """ Provides a UI interface to annotate items in the repository or working copy. Pass a single path to the class when initializing """ def __init__(self, path, revision=None): if os.path.isdir(path): MessageBox(_("Cannot annotate a directory")) raise SystemExit() return InterfaceView.__init__(self, "annotate", "Annotate") self.get_widget("Annotate").set_title(_("Annotate - %s") % path) self.vcs = rabbitvcs.vcs.VCS() sm = SettingsManager() self.datetime_format = sm.get("general", "datetime_format") self.colorize = sm.get("general", "enable_colorize") self.log_by_order = [] self.log_by_revision = {} self.author_background = {} self.history = [revision or "HEAD"] self.history_index = 0 self.loading_dialog = None self.table = self.build_table() self.revision = self.get_widget("revision") self.history_first = Clickable(self.get_widget("history_first")) self.history_prev = Clickable(self.get_widget("history_prev")) self.history_next = Clickable(self.get_widget("history_next")) self.history_last = Clickable(self.get_widget("history_last")) self.history_first.connect("single-click", self.on_history_first) self.history_prev.connect("single-click", self.on_history_prev) self.history_prev.connect("long-click", self.history_popup_menu) self.history_next.connect("single-click", self.on_history_next) self.history_next.connect("long-click", self.history_popup_menu) self.history_last.connect("single-click", self.on_history_last) self.set_history_sensitive() def build_table(self): treeview = self.get_widget("table") table = Table( treeview, [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, TYPE_MARKUP, TYPE_HIDDEN, TYPE_HIDDEN], [_("Revision"), _("Author"), _("Date"), _("Line"), _("Text"), "revision color", "author color"], callbacks = { "mouse-event": self.on_annotate_table_mouse_event } ) table.allow_multiple() table.get_column(3).get_cells()[0].set_property("xalign", 1.0) treeview.connect("query-tooltip", self.on_query_tooltip, (0, (0, 1, 2))) treeview.set_has_tooltip(True) if self.colorize: for i, n in [(1, 6), (4, 5)]: column = table.get_column(i) cell = column.get_cells()[0] column.add_attribute(cell, "background", n) return table def on_close_clicked(self, widget): self.close() def on_save_clicked(self, widget): self.save() def on_revision_focus_out_event(self, widget, event, data=None): self.show_revision(widget.get_text()) def on_revision_key_press_event(self, widget, event, data=None): if event.state == 0 and Gdk.keyval_name(event.keyval) == "Return": self.show_revision(widget.get_text()) return False def on_show_log_clicked(self, widget, data=None): log_dialog_factory(self.path, ok_callback=self.on_log_closed) def on_log_closed(self, data): if data: self.show_revision(data) def on_annotate_table_mouse_event(self, treeview, event, data=None): if event.button == 1: if event.type == Gdk.EventType._2BUTTON_PRESS: revisions = self.table.get_selected_row_items(0) if len(revisions) == 1: if revisions[0]: self.show_revision(revisions[0]) elif event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_annotate_table_popup_menu(treeview, event, data) def on_query_tooltip(self, treeview, x, y, kbdmode, tooltip, data=None): if kbdmode: return False try: position, enabled_columns = data enabled_columns[0] except (TypeError, ValueError, IndexError): return False bx, by = treeview.convert_widget_to_bin_window_coords(x, y) t = treeview.get_path_at_pos(bx, by) if t is None: return False path, column, cellx, celly = t columns = treeview.get_columns() try: pos = columns.index(column) except ValueError: return False if not pos in enabled_columns: return False revision = treeview.get_model()[path][position] if not revision: return False revision = str(revision) if not revision in self.log_by_revision: return False log = self.log_by_revision[revision] message = helper.format_long_text(log.message, line1only=True) if not message: return False tooltip.set_text(S(message).display()) treeview.set_tooltip_cell(tooltip, path) return True def on_history_first(self, clickable, widget, event, *args): forceload = self.history[self.history_index] != self.history[0] self.history_index = 0 self.show_revision(forceload=forceload) def on_history_prev(self, clickable, widget, event, *args): forceload = (self.history[self.history_index] != self.history[self.history_index - 1]) self.history_index -= 1 self.show_revision(forceload=forceload) def on_history_next(self, clickable, widget, event, *args): forceload = (self.history[self.history_index] != self.history[self.history_index + 1]) self.history_index += 1 self.show_revision(forceload=forceload) def on_history_last(self, clickable, widget, event, *args): forceload = self.history[self.history_index] != self.history[-1] self.history_index = len(self.history) - 1 self.show_revision(forceload=forceload) def history_popup_menu(self, clickable, widget, event, *args): menu = Gtk.Menu() width = 0 for i, revision in list(enumerate(self.history))[:self.history_index + 6][-11:]: message = "" revision = self.short_revision(revision) if revision in self.log_by_revision: log = self.log_by_revision[revision] message = helper.format_long_text(log.message, cols=32, line1only=True) revision = helper.html_escape(revision) message = helper.html_escape(message) if i == self.history_index: revision = "" + revision + "" message = "" + message + "" row = Gtk.Grid() cell1 = Gtk.Label() cell1.set_properties(xalign=0, yalign=.5) cell1.set_markup(revision) row.attach(cell1, 0, 0, 1, 1) cell2 = Gtk.Label() cell2.set_properties(xalign=0, yalign=.5) cell2.set_markup(message) row.attach(cell2, 1, 0, 1, 1) menuitem = Gtk.MenuItem() menuitem.add(row) menuitem.connect("activate", self.on_history_menu_activate, i) menu.add(menuitem) menu.show_all() menu.popup_at_pointer(event) for menuitem in menu.get_children(): w = menuitem.get_child().get_child_at(0, 0).get_allocation().width if width < w: width = w width += 4 for menuitem in menu.get_children(): menuitem.get_child().get_child_at(0, 0).set_size_request(width, -1) def on_history_menu_activate(self, menu, index): forceload = self.history[self.history_index] != self.history[index] self.history_index = index self.show_revision(forceload=forceload) def set_history_sensitive(self): self.history_first.set_sensitive(self.history_index > 0) self.history_prev.set_sensitive(self.history_index > 0) last = len(self.history) - 1 self.history_next.set_sensitive(self.history_index < last) self.history_last.set_sensitive(self.history_index < last) def show_revision(self, revision=None, forceload=False): if revision is None: revision = self.history[self.history_index] revision = S(S(revision).strip()) self.revision.set_text(revision.display()) if revision.lower() != self.history[self.history_index].lower(): forceload = True self.history_index += 1 self.history = self.history[:self.history_index] + [revision] self.set_history_sensitive() if forceload: self.load(revision) def enable_saveas(self): self.get_widget("save").set_sensitive(True) def disable_saveas(self): self.get_widget("save").set_sensitive(False) def save(self, path=None): if path is None: from rabbitvcs.ui.dialog import FileSaveAs dialog = FileSaveAs() path = dialog.run() if path is not None: fh = open(path, "w") fh.write(self.generate_string_from_result()) fh.close() def launch_loading(self): self.loading_dialog = Loading() GLib.idle_add(self.loading_dialog.run) def kill_loading(self): GLib.idle_add(self.loading_dialog.destroy) def show_annotate_table_popup_menu(self, treeview, event, data): revisions = list(set(self.table.get_selected_row_items(0))) AnnotateContextMenu(self, event, self.path, revisions).show() def set_log(self): self.log_by_order = self.action.get_result(1) self.log_by_order.reverse() self.log_by_revision = {} self.author_background = {} for n, log in enumerate(self.log_by_order): setattr(log, "n", n) c = self.randomHSL() c = helper.HSLtoRGB(*c) setattr(log, "background", helper.html_color(*c)) self.log_by_revision[self.short_revision(log.revision)] = log author = S(log.author.strip()) if author: c = self.randomHSL() c = helper.HSLtoRGB(*c) self.author_background[author] = helper.html_color(*c) def previous_revision(self, revision): revision = self.short_revision(revision) n = self.log_by_revision[revision].n if n: return self.short_revision(self.log_by_order[n - 1].revision) return None def next_revision(self, revision): revision = self.short_revision(revision) n = self.log_by_revision[revision].n if n < len(self.log_by_order) - 1: return self.short_revision(self.log_by_order[n + 1].revision) return None def compare_revision_order(self, rev1, rev2): return self.log_by_revision[rev1].n - self.log_by_revision[rev2].n def randomHSL(self): return (uniform(0.0, 360.0), uniform(0.5, 1.0), LUMINANCE) def get_vcs_name(self): vcs = rabbitvcs.vcs.VCS_DUMMY if hasattr(self, "svn"): vcs = rabbitvcs.vcs.VCS_SVN elif hasattr(self, "git"): vcs = rabbitvcs.vcs.VCS_GIT return vcs class SVNAnnotate(Annotate): def __init__(self, path, revision=None): Annotate.__init__(self, path, revision) self.svn = self.vcs.svn() self.path = path self.show_revision(forceload=True) # # Helper methods # def load(self, revision): revision = revision.lower() rev = self.svn.revision("HEAD") if revision.isdigit(): rev = self.svn.revision("number", number=int(revision)) self.launch_loading() self.action = SVNAction( self.svn, notification=False ) self.action.append( self.svn.annotate, self.path, to_revision=rev ) if not self.log_by_order: self.action.append(self.svn.log, self.path) self.action.append(self.set_log) self.action.append(self.populate_table) self.action.append(self.enable_saveas) self.action.schedule() self.kill_loading() def blame_info(self, item): revision = item["revision"].number if revision <= 0: return ("", "", "") revision = str(revision) # remove fractional seconds and timezone information from # the end of the string provided by pysvn: # * timezone should be always "Z" (for UTC), "%Z" is not yet # yet supported by strptime # * fractional could be parsed with "%f" since python 2.6 # but this precision is not needed anyway # * the datetime module does not include strptime until python 2.4 # so this workaround is required for now datestr = item["date"][0:-8] try: date = datetime(*time.strptime(datestr,"%Y-%m-%dT%H:%M:%S")[:-2]) date = helper.format_datetime(date, self.datetime_format) except: date = "" return revision, date, S(item["author"].strip()) def populate_table(self): blamedict = self.action.get_result(0) lines = highlight(self.path, [item["line"] for item in blamedict]) self.table.clear() for i, item in enumerate(blamedict): revision, date, author = self.blame_info(item) author_color = self.author_background.get(author, "#FFFFFF") try: revision_color = self.log_by_revision[revision].background except KeyError: revision_color = "#FFFFFF" self.table.append([ revision, author, date, str(int(item["number"]) + 1), lines[i], revision_color, author_color ]) def generate_string_from_result(self): blamedict = self.action.get_result(0) text = "" for item in blamedict: revision, date, author = self.blame_info(item) text += "%s\t%s\t%s\t%s\t%s\n" % ( str(int(item["number"]) + 1), revision, author, date, item["line"] ) return text def short_revision(self, revision): revision = str(revision).lower() return revision if revision != "head" else "HEAD" class GitAnnotate(Annotate): def __init__(self, path, revision=None): Annotate.__init__(self, path, revision) self.git = self.vcs.git(path) self.path = path self.show_revision(forceload=True) # # Helper methods # def launch_loading(self): self.loading_dialog = Loading() GLib.idle_add(self.loading_dialog.run) def kill_loading(self): GLib.idle_add(self.loading_dialog.destroy) def load(self, revision): self.launch_loading() self.action = GitAction( self.git, notification=False ) self.action.append( self.git.annotate, self.path, self.git.revision(revision) ) if not self.log_by_order: self.action.append(self.git.log, self.path) self.action.append(self.set_log) self.action.append(self.populate_table) self.action.append(self.enable_saveas) self.action.schedule() self.kill_loading() def populate_table(self): blamedict = self.action.get_result(0) lines = highlight(self.path, [item["line"] for item in blamedict]) self.table.clear() for i, item in enumerate(blamedict): revision = item["revision"][:7] author = S(item["author"].strip()) author_color = self.author_background.get(author, "#FFFFFF") try: revision_color = self.log_by_revision[revision].background except KeyError: revision_color = "#FFFFFF" self.table.append([ revision, author, helper.format_datetime(item["date"], self.datetime_format), str(item["number"]), lines[i], revision_color, author_color ]) def generate_string_from_result(self): blamedict = self.action.get_result(0) text = "" for item in blamedict: text += "%s\t%s\t%s\t%s\t%s\n" % ( str(item["number"]), item["revision"][:7], item["author"], helper.format_datetime(item["date"], self.datetime_format), item["line"] ) return text def short_revision(self, revision): revision = str(revision)[:7].lower() return revision if revision != "head" else "HEAD" class MenuShowRevision(MenuItem): identifier = "RabbitVCS::Show_Revision" label = _("Show this revision") tooltip = _("Annotate this file's revision") icon = "rabbitvcs-annotate" class MenuViewRevision(MenuItem): identifier = "RabbitVCS::View_Revision" label = _("Annotate this revision in another window") tooltip = _("Annotate this file's revision in another window") icon = "rabbitvcs-annotate" class MenuShowNextRevision(MenuItem): identifier = "RabbitVCS::Show_Next_Revision" label = _("Show next revision") tooltip = _("Annotate the revision following this one") icon = "rabbitvcs-annotate" class MenuDiffWorkingCopy(MenuItem): identifier = "RabbitVCS::Diff_Working_Copy" label = _("View diff against working copy") tooltip = _("View this revision's diff against working copy") icon = "rabbitvcs-diff" class MenuCompareWorkingCopy(MenuItem): identifier = "RabbitVCS::Compare_Working_Copy" label = _("Compare against working copy") tooltip = _("Compare this revision against working copy") icon = "rabbitvcs-compare" class MenuDiffPreviousRevision(MenuItem): identifier = "RabbitVCS::Diff_Previous_Revision" label = _("View diff against previous revision") tooltip = _("View this revision's diff against previous revision") icon = "rabbitvcs-diff" class MenuComparePreviousRevision(MenuItem): identifier = "RabbitVCS::Compare_Previous_Revision" label = _("Compare against previous revision") tooltip = _("Compare this revision against previous revision") icon = "rabbitvcs-compare" class MenuDiffRevisions(MenuItem): identifier = "RabbitVCS::Diff_Revisions" label = _("View diff between revisions") tooltip = _("View diff between selected revisions") icon = "rabbitvcs-diff" class MenuCompareRevisions(MenuItem): identifier = "RabbitVCS::Compare_Revisions" label = _("Compare revisions") tooltip = _("Compare selected revisions") icon = "rabbitvcs-compare" class AnnotateContextMenuConditions(object): def __init__(self, caller, vcs, path, revisions): self.caller = caller self.vcs = vcs self.path = path self.revisions = revisions self.vcs_name = caller.get_vcs_name() def show_revision(self, data=None): return len(self.revisions) == 1 def view_revision(self, data=None): return len(self.revisions) == 1 def show_next_revision(self, data=None): return (len(self.revisions) == 1 and not self.caller.next_revision(self.revisions[0]) is None) def diff_working_copy(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1) def compare_working_copy(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1) def diff_previous_revision(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1 and not self.caller.previous_revision(self.revisions[0]) is None) def compare_previous_revision(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1 and not self.caller.previous_revision(self.revisions[0]) is None) def diff_revisions(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 2) def compare_revisions(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 2) class AnnotateContextMenuCallbacks(object): def __init__(self, caller, vcs, path, revisions): self.caller = caller self.vcs = vcs self.path = path self.revisions = revisions self.vcs_name = self.caller.get_vcs_name() def show_revision(self, widget, data=None): self.caller.show_revision(self.revisions[0]) def view_revision(self, widget, data=None): helper.launch_ui_window("annotate", [ self.path, "--vcs=%s" % self.caller.get_vcs_name(), "-r", self.revisions[0]]) def show_next_revision(self, widget, data=None): self.caller.show_revision(self.caller.next_revision(self.revisions[0])) def diff_working_copy(self, widget, data=None): helper.launch_ui_window("diff", [ "%s@%s" % (self.path, S(self.revisions[0])), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_working_copy(self, widget, data=None): path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, S(self.revisions[0])), self.path, "--vcs=%s" % self.caller.get_vcs_name() ]) def diff_previous_revision(self, widget, data=None): prev = self.caller.previous_revision(self.revisions[0]) helper.launch_ui_window("diff", [ "%s@%s" % (self.path, S(prev)), "%s@%s" % (self.path, S(self.revisions[0])), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_previous_revision(self, widget, data=None): prev = self.caller.previous_revision(self.revisions[0]) path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, S(prev)), "%s@%s" % (self.path, S(self.revisions[0])), "--vcs=%s" % self.caller.get_vcs_name() ]) def diff_revisions(self, widget, data=None): rev1 = self.revisions[0] rev2 = self.revisions[-1] if self.caller.compare_revision_order(rev1, rev2) > 0: rev1, rev2 = rev2, rev1 helper.launch_ui_window("diff", [ "%s@%s" % (self.path, S(rev1)), "%s@%s" % (self.path, S(rev2)), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_revisions(self, widget, data=None): rev1 = self.revisions[0] rev2 = self.revisions[-1] if self.caller.compare_revision_order(rev1, rev2) > 0: rev1, rev2 = rev2, rev1 path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, S(rev1)), "%s@%s" % (self.path, S(rev2)), "--vcs=%s" % self.caller.get_vcs_name() ]) class AnnotateContextMenu(object): """ Defines context menu items for a table's rows """ def __init__(self, caller, event, path, revisions=[]): """ @param caller: The calling object @type caller: object @param path: The loaded path @type path: string @param event: The triggering Gtk.Event @type event: Gtk.Event @param revisions: The selected revisions @type revisions: list of rabbitvcs.vcs.Revision object """ self.caller = caller self.event = event self.path = path self.revisions = revisions self.vcs = rabbitvcs.vcs.VCS() self.conditions = AnnotateContextMenuConditions( self.caller, self.vcs, self.path, self.revisions ) self.callbacks = AnnotateContextMenuCallbacks( self.caller, self.vcs, self.path, self.revisions ) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuShowRevision, None), (MenuViewRevision, None), (MenuShowNextRevision, None), (MenuDiffWorkingCopy, None), (MenuCompareWorkingCopy, None), (MenuDiffPreviousRevision, None), (MenuComparePreviousRevision, None), (MenuDiffRevisions, None), (MenuCompareRevisions, None), ] def show(self): if len(self.revisions) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNAnnotate, rabbitvcs.vcs.VCS_GIT: GitAnnotate } def annotate_factory(vcs, path, revision=None): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] return classes_map[vcs](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs annotate url [-r REVISION]" ) window = annotate_factory(options.vcs, paths[0], options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/applypatch.py000066400000000000000000000123361362112712700205430ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction import rabbitvcs.vcs from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.applypatch") from rabbitvcs import gettext _ = gettext.gettext class ApplyPatch(InterfaceNonView): """ This class provides a handler to the apply patch functionality. """ def __init__(self, paths): InterfaceNonView.__init__(self) self.paths = paths self.vcs = rabbitvcs.vcs.VCS() self.common = helper.get_common_directory(paths) def choose_patch_path(self): path = None dialog = Gtk.FileChooserDialog( title = _("Apply Patch"), parent = None, action = Gtk.FileChooserAction.OPEN) dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) dialog.add_button(_("_Open"), Gtk.ResponseType.OK) dialog.set_default_response(Gtk.ResponseType.OK) response = dialog.run() if response == Gtk.ResponseType.OK: path = dialog.get_filename() dialog.destroy() return path def choose_patch_dir(self): if len(self.paths) == 1 and os.path.isdir(self.paths[0]): return self.paths[0] dir = None dialog = Gtk.FileChooserDialog( title = _("Apply Patch To Directory..."), parent = None, action = Gtk.FileChooserAction.SELECT_FOLDER) dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) dialog.add_button(_("_Select"), Gtk.ResponseType.OK) dialog.set_default_response(Gtk.ResponseType.OK) response = dialog.run() if response == Gtk.ResponseType.OK: dir = dialog.get_filename() dialog.destroy() return dir class SVNApplyPatch(ApplyPatch): def __init__(self, paths): ApplyPatch.__init__(self, paths) self.svn = self.vcs.svn() def start(self): path = self.choose_patch_path() # If empty path, means we've cancelled if not path: return base_dir = self.choose_patch_dir() if not base_dir: return ticks = 2 self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Apply Patch")) self.action.append(self.action.set_status, _("Applying Patch File...")) self.action.append(self.svn.apply_patch, path, base_dir) self.action.append(self.action.set_status, _("Patch File Applied")) self.action.append(self.action.finish) self.action.schedule() class GitApplyPatch(ApplyPatch): def __init__(self, paths): ApplyPatch.__init__(self, paths) self.git = self.vcs.git(paths[0]) def start(self): path = self.choose_patch_path() # If empty path, means we've cancelled if not path: return base_dir = self.choose_patch_dir() if not base_dir: return ticks = 2 self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Apply Patch")) self.action.append(self.action.set_status, _("Applying Patch File...")) self.action.append(self.git.apply_patch, path, base_dir) self.action.append(self.action.set_status, _("Patch File Applied")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNApplyPatch, rabbitvcs.vcs.VCS_GIT: GitApplyPatch } def applypatch_factory(paths): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs applypatch [path1] [path2] ...") window = applypatch_factory(paths) window.register_gtk_quit() window.start() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/branch.py000066400000000000000000000116071362112712700176330ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S import rabbitvcs.vcs import rabbitvcs.vcs.status from rabbitvcs import gettext _ = gettext.gettext class SVNBranch(InterfaceView): """ Provides a UI interface to copy/branch/tag items in the repository or working copy. Pass a single path to the class when initializing """ def __init__(self, path, revision=None): InterfaceView.__init__(self, "branch", "Branch") self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.path = path self.revision = revision status = self.vcs.status(self.path) repo_paths = helper.get_repository_paths() self.from_urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("from_urls"), repo_paths ) self.to_urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("to_urls"), helper.get_repository_paths() ) repository_url = self.svn.get_repo_url(path) self.from_urls.set_child_text(repository_url) self.to_urls.set_child_text(repository_url) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message") ) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, revision=revision, url_combobox=self.from_urls, expand=True ) if (self.revision is None and status.has_modified()): self.revision_selector.set_kind_working() def on_ok_clicked(self, widget): src = self.from_urls.get_active_text() dest = self.to_urls.get_active_text() if dest == "": rabbitvcs.ui.dialog.MessageBox(_("You must supply a destination path.")) return revision = self.revision_selector.get_revision_object() self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_log_message(self.message.get_text()) self.action.append( helper.save_log_message, self.message.get_text() ) self.action.append(self.action.set_header, _("Branch/tag")) self.action.append(self.action.set_status, _("Running Branch/tag Command...")) self.action.append(self.svn.copy, src, dest, revision) self.action.append(self.action.set_status, _("Completed Branch/tag")) self.action.append(self.action.finish) self.action.schedule() def on_previous_messages_clicked(self, widget, data=None): dialog = rabbitvcs.ui.dialog.PreviousMessages() message = dialog.run() if message is not None: self.message.set_text(S(message).display()) def on_repo_browser_clicked(self, widget, data=None): from rabbitvcs.ui.browser import SVNBrowserDialog SVNBrowserDialog(self.from_urls.get_active_text(), callback=self.on_repo_browser_closed) def on_repo_browser_closed(self, new_url): self.from_urls.set_child_text(new_url) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNBranch } def branch_factory(vcs, path, revision=None): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] return classes_map[vcs](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, args) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs branch [url_or_path]" ) window = branch_factory(options.vcs, args[0], options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/branches.py000066400000000000000000000270101362112712700201560ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction from rabbitvcs.ui.log import log_dialog_factory import rabbitvcs.ui.widget from rabbitvcs.ui.dialog import DeleteConfirmation from rabbitvcs.util.strings import S import rabbitvcs.vcs from xml.sax import saxutils from rabbitvcs import gettext _ = gettext.gettext STATE_ADD = 0 STATE_EDIT = 1 class GitBranchManager(InterfaceView): """ Provides a UI interface to manage items """ state = STATE_ADD def __init__(self, path, revision=""): InterfaceView.__init__(self, "manager", "Manager") self.path = path self.get_widget("right_side").show() self.get_widget("Manager").set_size_request(695, -1) self.get_widget("Manager").set_title(_("Branch Manager")) self.get_widget("items_label").set_markup(_("Branches")) self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.revision = self.git.revision(revision) self.selected_branch = None self.items_treeview = rabbitvcs.ui.widget.Table( self.get_widget("items_treeview"), [rabbitvcs.ui.widget.TYPE_MARKUP], [_("Branch")], callbacks={ "mouse-event": self.on_treeview_mouse_event, "key-event": self.on_treeview_key_event } ) self.initialize_detail() self.load() if self.revision: revision_branches = self.git.branch_list(self.revision) if revision_branches: self.show_edit(revision_branches[0].name) else: self.show_add() else: self.show_add() def initialize_detail(self): self.detail_container = self.get_widget("detail_container") self.detail_grid = Gtk.Grid() self.detail_grid.set_row_spacing(4) self.detail_grid.set_column_spacing(6) self.detail_grid.set_hexpand(True) row = 0 # Set up the Branch line label = Gtk.Label(label = _("Name:")) label.set_properties(xalign=0, yalign=.5) self.branch_entry = Gtk.Entry() self.branch_entry.set_hexpand(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.branch_entry, 1, row, 2, 1) branch_name_row = row row = row + 1 # Set up the Commit-sha line label = Gtk.Label(label = _("Start Point:")) label.set_properties(xalign=0, yalign=.5) self.start_point_entry = Gtk.Entry() self.start_point_entry.set_size_request(300, -1) self.start_point_entry.set_hexpand(True) self.log_dialog_button = Gtk.Button() self.log_dialog_button.connect("clicked", self.on_log_dialog_button_clicked) image = Gtk.Image() image.set_from_icon_name("rabbitvcs-show_log", Gtk.IconSize.SMALL_TOOLBAR) self.log_dialog_button.set_image(image) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.start_point_entry, 1, row, 1, 1) self.detail_grid.attach(self.log_dialog_button, 2, row, 1, 1) start_point_row = row row = row + 1 # Set up the Track line self.track_checkbox = Gtk.CheckButton(label = _("Keep old branch's history")) self.detail_grid.attach(self.track_checkbox, 1, row, 2, 1) track_row = row row = row + 1 # Set up the checkout line self.checkout_checkbox = Gtk.CheckButton(label = _("Set as active branch")) self.detail_grid.attach(self.checkout_checkbox, 1, row, 2, 1) checkout_row = row row = row + 1 # Set up Save button self.save_button = Gtk.Button(label=_("Save")) self.save_button.set_halign(Gtk.Align.START) self.save_button.connect("clicked", self.on_save_clicked) self.detail_grid.attach(self.save_button, 1, row, 1, 1) save_row = row row = row + 1 # Set up the Revision line label = Gtk.Label(label = _("Revision:")) label.set_properties(xalign=0,yalign=0) self.revision_label = Gtk.Label(label = "") self.revision_label.set_properties(xalign=0, selectable=True) self.revision_label.set_line_wrap(True) self.revision_label.set_hexpand(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.revision_label, 1, row, 2, 1) revision_row = row row = row + 1 # Set up the Log Message line label = Gtk.Label(label = _("Message:")) label.set_properties(xalign=0, yalign=0) self.message_label = Gtk.Label(label = "") self.message_label.set_properties(xalign=0, yalign=0, selectable=True) self.message_label.set_line_wrap(True) self.message_label.set_hexpand(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.message_label, 1, row, 2, 1) message_row = row row = row + 1 self.add_rows = [branch_name_row, track_row, save_row, start_point_row, checkout_row] self.view_rows = [branch_name_row, revision_row, message_row, save_row, checkout_row] self.detail_grid.show() self.detail_container.add(self.detail_grid) def load(self): self.items_treeview.clear() self.branch_list = self.git.branch_list() for item in self.branch_list: name = saxutils.escape(item.name) if item.tracking: name = "%s" % name self.items_treeview.append([name]) def on_add_clicked(self, widget): self.show_add() def on_delete_clicked(self, widget): items = self.items_treeview.get_selected_row_items(0) selected = [] for branch in items: selected.append(saxutils.unescape(branch).replace("", "").replace("", "")) confirm = rabbitvcs.ui.dialog.Confirmation(_("Are you sure you want to delete %s?" % ", ".join(selected))) result = confirm.run() if result == Gtk.ResponseType.OK or result == True: for branch in selected: self.git.branch_delete(branch) self.load() self.show_add() def on_save_clicked(self, widget): if self.state == STATE_ADD: branch_name = self.branch_entry.get_text() branch_track = self.track_checkbox.get_active() start_point = self.git.revision(self.start_point_entry.get_text()) self.git.branch(branch_name, revision=start_point) elif self.state == STATE_EDIT: branch_name = self.branch_entry.get_text() branch_track = self.track_checkbox.get_active() if self.selected_branch.name != branch_name: self.git.branch_rename(self.selected_branch.name, branch_name) if self.checkout_checkbox.get_active(): self.git.checkout([], self.git.revision(branch_name)) self.load() self.show_edit(branch_name) def on_treeview_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, event) def on_treeview_mouse_event(self, treeview, event, *args): self.on_treeview_event(treeview, event) def on_treeview_event(self, treeview, event, *args): selected = self.items_treeview.get_selected_row_items(0) if len(selected) > 0: if len(selected) == 1: branch_name = selected[0] if branch_name.startswith(""): branch_name = branch_name[3:-4] self.show_edit(branch_name) self.get_widget("delete").set_sensitive(True) else: self.show_add() def show_rows(self, rows): self.detail_grid.hide() for w in self.detail_grid.get_children(): if self.detail_grid.child_get_property(w, "top-attach") in rows: w.show_all() else: w.hide() self.detail_grid.show() def show_add(self): self.state = STATE_ADD revision = "HEAD" if self.revision: active_branch = self.git.get_active_branch() if active_branch: revision = S(active_branch.name) self.items_treeview.unselect_all() self.branch_entry.set_text("") self.save_button.set_label(_("Add")) self.start_point_entry.set_text(S(revision).display()) self.track_checkbox.set_active(True) self.checkout_checkbox.set_sensitive(True) self.checkout_checkbox.set_active(False) self.show_rows(self.add_rows) self.get_widget("detail_label").set_markup(_("Add Branch")) def show_edit(self, branch_name): self.state = STATE_EDIT branch_name = saxutils.unescape(branch_name) self.selected_branch = None for item in self.branch_list: if item.name == branch_name: self.selected_branch = item break self.save_button.set_label(_("Save")) if self.selected_branch: self.branch_entry.set_text(S(self.selected_branch.name).display()) self.revision_label.set_text(S(self.selected_branch.revision).display()) self.message_label.set_text(S(self.selected_branch.message.rstrip("\n")).display()) if self.selected_branch.tracking: self.checkout_checkbox.set_active(True) self.checkout_checkbox.set_sensitive(False) else: self.checkout_checkbox.set_active(False) self.checkout_checkbox.set_sensitive(True) self.show_rows(self.view_rows) self.get_widget("detail_label").set_markup(_("Branch Detail")) def on_log_dialog_button_clicked(self, widget): log_dialog_factory( self.path, ok_callback=self.on_log_dialog_closed ) def on_log_dialog_closed(self, data): if data: self.start_point_entry.set_text(S(data).display()) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs branch-manager path [-r revision]" ) window = GitBranchManager(paths[0], revision=options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/browser.py000066400000000000000000000525621362112712700200660ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path import six import locale from datetime import datetime from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkContextMenu, GtkContextMenuCaller, \ GtkFilesContextMenuConditions from rabbitvcs.util.contextmenuitems import * import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.vcs import rabbitvcs.util.settings from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import gtk_unsafe log = Log("rabbitvcs.ui.browser") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class SVNBrowser(InterfaceView, GtkContextMenuCaller): def __init__(self, url): InterfaceView.__init__(self, "browser", "Browser") self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() sm = rabbitvcs.util.settings.SettingsManager() self.datetime_format = sm.get("general", "datetime_format") self.url = "" if self.svn.is_in_a_or_a_working_copy(url): action = rabbitvcs.ui.action.SVNAction(self.svn, notification=False, run_in_thread=False) self.url = S(action.run_single(self.svn.get_repo_url, url)) elif self.svn.is_path_repository_url(url): self.url = S(url) self.urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("urls"), helper.get_repository_paths() ) if self.url: self.urls.set_child_text(helper.unquote_url(self.url)) # We must set a signal handler for the Gtk.Entry inside the combobox # Because glade will not retain that information self.urls.set_child_signal( "key-release-event", self.on_urls_key_released ) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, url_combobox=self.urls, expand=True ) self.items = [] self.list_table = rabbitvcs.ui.widget.Table( self.get_widget("list"), [rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_INT, GObject.TYPE_INT, GObject.TYPE_STRING, GObject.TYPE_FLOAT], ["", _("Path"), _("Revision"), _("Size"), _("Author"), _("Date")], filters=[{ "callback": self.file_filter, "user_data": { "column": 1 } },{ "callback": self.revision_filter, "user_data": { "column": 2 } },{ "callback": self.size_filter, "user_data": { "column": 3 } },{ "callback": self.date_filter, "user_data": { "column": 5 } }], filter_types=[GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], callbacks={ "file-column-callback": self.file_column_callback, "row-activated": self.on_row_activated, "mouse-event": self.on_list_table_mouse_event }, flags={ "sortable": True } ) self.url_clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) self.repo_root_url = None if self.url: helper.save_repository_path(url) self.load() def load(self): self.url = self.urls.get_active_text() self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) revision = self.revision_selector.get_revision_object() self.action.append( self.svn.list, helper.quote_url(self.url), revision=revision, recurse=False) self.action.append(self.init_repo_root_url) self.action.append(self.populate_table, 0) self.action.schedule() @gtk_unsafe def populate_table(self, item_index=0): self.list_table.clear() self.items = self.action.get_result(item_index) self.items.sort(key = self.sort_files_key) self.list_table.append([S(".."), "..", 0, 0, "", 0]) for item,locked in self.items[1:]: self.list_table.append([ S(item.path), item.path, item.created_rev.number, item.size, item.last_author, item.time ]) def init_repo_root_url(self): if self.repo_root_url is None and self.svn.is_in_a_or_a_working_copy(self.url): action = rabbitvcs.ui.action.SVNAction(self.svn, notification=False, run_in_thread=False) self.repo_root_url = action.run_single(self.svn.get_repo_root_url, self.url) def on_refresh_clicked(self, widget): helper.save_repository_path(self.urls.get_active_text()) self.load() def create_folder(self, where): from rabbitvcs.ui.dialog import NewFolder dialog = NewFolder() result = dialog.run() if result is None: return (folder_name, log_message) = result new_url = where.rstrip("/") + "/" + folder_name self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append(self.svn.mkdir, new_url, log_message) self.action.append(self.svn.list, where, recurse=False) self.action.append(self.populate_table, 1) self.action.schedule() def on_create_folder_here_clicked(self, widget): self.create_folder(self.urls.get_active_text()) def on_row_activated(self, treeview, data, col): path = self.list_table.get_selected_row_items(0)[0] if path == "..": path = self.url.split("/")[0:-1] self.url = "/".join(path) else: self.url = path if self.file_column_callback(self.url) == "dir" or self.url != path: self.urls.set_child_text(helper.unquote_url(self.url)) self.load() else: self._open([self.url]) def on_urls_key_released(self, widget, event, *args): if Gdk.keyval_name(event.keyval) == "Return": helper.save_repository_path(self.urls.get_active_text()) self.load() def file_column_callback(self, filename): """ Determine the node kind (dir or file) from our retrieved items list """ filename = S(filename).unicode() if filename == six.u(".."): return "dir" for item,locked in self.items: if S(item.path).unicode() == filename: return self.svn.NODE_KINDS_REVERSE[item.kind] return None def sort_files_key(self, x): """ Return a key to sort the browser listing so that folders are on top and then sort alphabetically. """ kind = self.svn.NODE_KINDS_REVERSE[x[0].kind] != "dir" return (kind, locale.strxfrm(S(x[0].repos_path))) def file_filter(self, row, column, user_data=None): """ Table filter to just show the basename of the item path """ if row[column]: return os.path.basename(row[column]) return row[column] def size_filter(self, row, column, user_data=None): """ Table filter to convert the item size to a "pretty" filesize """ if self.file_column_callback(row[0]) == "file": return helper.pretty_filesize(int(row[column])) return "" def revision_filter(self, row, column, user_data=None): """ Table filter to convert revision to a desired format """ if row[0] == "..": return "" return row[column] def date_filter(self, row, column, user_data=None): """ Table filter to convert the item date to something readable """ if row[0] == "..": return "" if row[column]: change_time = datetime.fromtimestamp(float(row[column])) return str(S(helper.format_datetime(change_time, self.datetime_format))) return str(row[column]) def on_list_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_list_table_popup_menu(treeview, event) def show_list_table_popup_menu(self, treeview, event): paths = self.list_table.get_selected_row_items(0) if len(paths) == 0: paths.append(self.url) BrowserContextMenu(self, event, None, self.vcs, paths).show() def set_url_clipboard(self, url): self.url_clipboard.set_text(S(url).display(), -1) def get_repo_root_url(self): return self.repo_root_url def get_url(self): return self.urls.get_active_text() def _open(self, paths): self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) exported_paths = [] for path in paths: export_path = helper.get_tmp_path(os.path.basename(paths[0])) exported_paths.append(export_path) self.action.append(self.svn.export, paths[0], export_path, revision=self.revision_selector.get_revision_object()) for path in exported_paths: self.action.append(helper.open_item, path) self.action.schedule() class SVNBrowserDialog(SVNBrowser): def __init__(self, path, callback=None): """ Override the normal Browser class so that we can hide the window as we need. Also, provide a callback for when the close button is clicked so that we can get some desired data. """ self.callback = callback SVNBrowser.__init__(self, path) self.change_button("close", _("_Select"), "rabbitvcs-ok") def on_destroy(self, widget): pass def on_close_clicked(self, widget, data=None): self.hide() if self.callback is not None: path = self.urls.get_active_text() selected = self.list_table.get_selected_row_items(0) if len(selected) > 0: path = selected[0] self.callback(path) class MenuCreateRepositoryFolder(MenuItem): identifier = "RabbitVCS::Create_Repository_Folder" label = _("Create folder...") icon = "folder-new" class MenuBrowserCopyTo(MenuItem): identifier = "RabbitVCS::Browser_Copy_To" label = _("Copy to...") icon = "edit-copy" class MenuBrowserCopyUrlToClipboard(MenuItem): identifier = "RabbitVCS::Browser_Copy_Url_To_Clipboard" label = _("Copy URL to clipboard") icon = "rabbitvcs-asynchronous" class MenuBrowserMoveTo(MenuItem): identifier = "RabbitVCS::Browser_Move_To" label = _("Move to...") icon = "document-save-as" class BrowserContextMenuConditions(GtkFilesContextMenuConditions): def __init__(self, vcs, paths, caller): GtkFilesContextMenuConditions.__init__(self, vcs, paths) self.caller = caller def is_parent_selected(self): for path in self.paths: if os.path.split(path.rstrip("/"))[1] == "..": return True return False def _open(self, data1=None, data2=None): return True def show_log(self, data1=None, data2=None): return True def annotate(self, data1=None, data2=None): if self.path_dict["length"] == 1: return (self.caller.file_column_callback(self.paths[0]) == "file") return False def checkout(self, data1=None, data2=None): return True def export(self, data1=None, data2=None): return True def rename(self, data1=None): if self.path_dict["length"] > 1 or self.is_parent_selected(): return False revision = self.caller.revision_selector.get_revision_object() return revision.kind == "head" def delete(self, data1=None, data2=None): revision = self.caller.revision_selector.get_revision_object() return revision.kind == "head" and not self.is_parent_selected() def create_repository_folder(self, data1=None): if self.path_dict["length"] == 1 and not self.is_parent_selected(): return (self.caller.file_column_callback(self.paths[0]) == "dir") return (self.path_dict["length"] == 0) def browser_copy_to(self, data1=None, data2=None): return not self.is_parent_selected() def browser_copy_url_to_clipboard(self, data1=None, data2=None): return (self.path_dict["length"] == 1) def browser_move_to(self, data1=None, data2=None): revision = self.caller.revision_selector.get_revision_object() return revision.kind == "head" and not self.is_parent_selected() class BrowserContextMenuCallbacks(object): def __init__(self, caller, base_dir, vcs, paths=[]): self.caller = caller self.base_dir = base_dir self.vcs = vcs self.svn = self.vcs.svn() self.paths = paths self.guess = rabbitvcs.vcs.VCS_SVN def __update_browser_url(self, url): # Make sure the Browser variables are updated with the new path self.caller.urls.set_child_text(url) self.caller.url = url def __get_browser_revision(self): return self.caller.revision_selector.get_revision_object() def __generate_sources_list(self): # Generates a list of tuples where the first element is a path and the # second element is a primitive revision object # Used for the copy_to menu item sources = [] for path in self.paths: sources.append((path,self.__get_browser_revision().primitive())) return sources def _open(self, data=None, user_data=None): self.caller._open(self.paths) def show_log(self, data=None, user_data=None): helper.launch_ui_window("log", ["--vcs=%s" % self.guess, self.paths[0]]) def annotate(self, data=None, user_data=None): urlrev = self.paths[0] revision = self.__get_browser_revision() if revision.kind == "number": urlrev += "@" + revision.value helper.launch_ui_window("annotate", ["--vcs=%s" % self.guess, urlrev]) def checkout(self, data=None, user_data=None): args = [self.paths[0]] revision = self.__get_browser_revision() if revision.kind == "number": args = ["-r", revision.value] + args helper.launch_ui_window("checkout", args) def export(self, data=None, user_data=None): args = [self.paths[0]] revision = self.__get_browser_revision() if revision.kind == "number": args = ["-r", revision.value] + args helper.launch_ui_window("export", args) def rename(self, data=None, user_data=None): (base, filename) = os.path.split(self.paths[0]) from rabbitvcs.ui.dialog import OneLineTextChange dialog = OneLineTextChange(_("Rename"), _("New Name:"), filename) (result, new_name) = dialog.run() if result == Gtk.ResponseType.CANCEL: return new_url = base.rstrip("/") + "/" + new_name path_to_refresh = self.caller.get_url() if self.paths[0] == path_to_refresh: path_to_refresh = new_url self.__update_browser_url(path_to_refresh) self.caller.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.caller.action.append(self.svn.move, self.paths[0], new_url) self.caller.action.append(self.svn.list, path_to_refresh, recurse=False) self.caller.action.append(self.caller.populate_table, 1) self.caller.action.schedule() def delete(self, data=None, user_data=None): path_to_refresh = self.caller.get_url() if self.paths[0] == path_to_refresh: # If the deleted path is the same as the current path, go to the parent path_to_refresh = path_to_refresh.split("/")[0:-1] path_to_refresh = "/".join(path_to_refresh) self.__update_browser_url(path_to_refresh) self.caller.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.caller.action.append(self.svn.remove, self.paths) self.caller.action.append(self.svn.list, path_to_refresh, recurse=False) self.caller.action.append(self.caller.populate_table, 1) self.caller.action.schedule() def create_repository_folder(self, data=None, user_data=None): self.caller.create_folder(self.paths[0]) def browser_copy_to(self, data=None, user_data=None): from rabbitvcs.ui.dialog import OneLineTextChange dialog = OneLineTextChange( _("Where do you want to copy the selection?"), _("New Location:"), self.caller.get_url() ) result = dialog.run() if result is None: return (response, new_url) = result if response == Gtk.ResponseType.CANCEL: return sources = self.__generate_sources_list() self.caller.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.caller.action.append(self.svn.copy_all, sources, new_url, copy_as_child=True) self.caller.action.append(self.svn.list, self.caller.get_url(), recurse=False) self.caller.action.append(self.caller.populate_table, 1) self.caller.action.schedule() def browser_copy_url_to_clipboard(self, data=None, user_data=None): self.caller.set_url_clipboard(self.paths[0]) def browser_move_to(self, data=None, user_data=None): from rabbitvcs.ui.dialog import OneLineTextChange dialog = OneLineTextChange( _("Where do you want to move the selection?"), _("New Location:"), self.caller.get_url() ) result = dialog.run() if result is None: return (response, new_url) = result if response == Gtk.ResponseType.CANCEL: return self.caller.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.caller.action.append(self.svn.move_all, self.paths, new_url, move_as_child=True) self.caller.action.append(self.svn.list, self.caller.get_url(), recurse=False) self.caller.action.append(self.caller.populate_table, 1) self.caller.action.schedule() class BrowserContextMenu(object): def __init__(self, caller, event, base_dir, vcs, paths=[]): self.caller = caller self.event = event self.paths = paths self.base_dir = base_dir self.vcs = vcs self.svn = self.vcs.svn() self.conditions = BrowserContextMenuConditions( self.vcs, paths, self.caller ) self.callbacks = BrowserContextMenuCallbacks( self.caller, self.base_dir, self.vcs, paths ) self.structure = [ (MenuOpen, None), (MenuSeparator, None), (MenuShowLog, None), (MenuAnnotate, None), (MenuExport, None), (MenuCheckout, None), (MenuSeparator, None), (MenuCreateRepositoryFolder, None), (MenuSeparator, None), (MenuRename, None), (MenuDelete, None), (MenuBrowserCopyTo, None), (MenuBrowserCopyUrlToClipboard, None), (MenuBrowserMoveTo, None) ] def show(self): if len(self.paths) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNBrowser, rabbitvcs.vcs.VCS_DUMMY: SVNBrowser } def browser_factory(path): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path) if __name__ == "__main__": from rabbitvcs.ui import main (options, url) = main( usage="Usage: rabbitvcs browser [url]" ) window = browser_factory(url[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/changes.py000066400000000000000000000454461362112712700200160ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget from rabbitvcs.util.contextmenu import GtkContextMenu from rabbitvcs.util.contextmenuitems import * from rabbitvcs.util.strings import S import rabbitvcs.ui.action from rabbitvcs.ui.dialog import MessageBox from rabbitvcs import gettext _ = gettext.gettext class Changes(InterfaceView): """ Show how files and folders are different between revisions. TODO: - Deal with the revision arguments in a smarter way so we can pass in revisions like HEAD. Currently, if a revision is passed it assumes it is a number """ selected_rows = [] MORE_ACTIONS_ITEMS = [ _("More Actions..."), _("View unified diff") ] def __init__(self, path1=None, revision1=None, path2=None, revision2=None): InterfaceView.__init__(self, "changes", "Changes") self.vcs = rabbitvcs.vcs.VCS() self.MORE_ACTIONS_CALLBACKS = [ None, self.on_more_actions_view_unified_diff ] self.more_actions = rabbitvcs.ui.widget.ComboBox( self.get_widget("more_actions"), self.MORE_ACTIONS_ITEMS ) self.more_actions.set_active(0) repo_paths = helper.get_repository_paths() self.first_urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("first_urls"), repo_paths ) self.first_urls_browse = self.get_widget("first_urls_browse") self.second_urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("second_urls"), repo_paths ) self.second_urls_browse = self.get_widget("second_urls_browse") # # UI Signal Callback Methods # def on_close_clicked(self, widget): self.close() def on_refresh_clicked(self, widget): self.load() def on_first_urls_changed(self, widget, data=None): self.check_first_urls() self.check_refresh_button() def on_second_urls_changed(self, widget, data=None): self.check_second_urls() self.check_refresh_button() def on_first_urls_browse_clicked(self, widget, data=None): pass def on_first_repo_chooser_closed(self, new_url): self.first_urls.set_child_text(new_url) self.check_first_urls() self.check_refresh_button() def on_second_urls_browse_clicked(self, widget, data=None): pass def on_second_repo_chooser_closed(self, new_url): self.second_urls.set_child_text(new_url) self.check_second_urls() self.check_refresh_button() def on_changes_table_cursor_changed(self, treeview, data=None): self.on_changes_table_event(treeview, data) def on_changes_table_button_released(self, treeview, event, *args): if event.type == Gdk.EventType.BUTTON_RELEASE: self.on_changes_table_event(treeview, event, *args) def on_changes_table_event(self, treeview, event, *args): selection = treeview.get_selection() (liststore, indexes) = selection.get_selected_rows() self.selected_rows = [] for tup in indexes: self.selected_rows.append(tup[0]) if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_changes_table_popup_menu(treeview, event) def on_more_actions_changed(self, widget, data=None): index = self.more_actions.get_active() if index < 0: return callback = self.MORE_ACTIONS_CALLBACKS[index] if callback is not None: callback() def on_changes_table_row_doubleclicked(self, treeview, data=None, col=None): selection = treeview.get_selection() (liststore, indexes) = selection.get_selected_rows() self.selected_rows = [] for tup in indexes: self.selected_rows.append(tup[0]) self.view_selected_diff(sidebyside=True) # # Helper methods # def get_first_revision(self): return self.first_revision_selector.get_revision_object() def get_second_revision(self): return self.second_revision_selector.get_revision_object() def show_changes_table_popup_menu(self, treeview, event): ChangesContextMenu(self, event).show() def check_ui(self): self.check_first_urls() self.check_second_urls() self.check_refresh_button() def can_first_browse_urls(self): return (self.first_urls.get_active_text() != "") def can_second_browse_urls(self): return (self.second_urls.get_active_text() != "") def check_refresh_button(self): can_click_refresh = ( self.can_first_browse_urls() and self.can_second_browse_urls() ) self.get_widget("refresh").set_sensitive(can_click_refresh) def check_first_urls(self): can_browse_urls = self.can_first_browse_urls() self.first_urls_browse.set_sensitive(can_browse_urls) def check_second_urls(self): can_browse_urls = self.can_second_browse_urls() self.second_urls_browse.set_sensitive(can_browse_urls) def enable_more_actions(self): self.more_actions.set_sensitive(True) def disable_more_actions(self): self.more_actions.set_sensitive(False) def view_selected_diff(self, sidebyside=False): for row in self.selected_rows: url1 = self.changes_table.get_row(row)[0] url2 = url1 if url1 == ".": url1 = "" url2 = "" url1 = helper.url_join(self.first_urls.get_active_text(), url1) url2 = helper.url_join(self.second_urls.get_active_text(), url2) rev1 = self.get_first_revision() rev2 = self.get_second_revision() helper.launch_ui_window("diff", [ "%s@%s" % (url1, S(rev1)), "%s@%s" % (url2, S(rev2)), "%s" % (sidebyside and "-s" or ""), "--vcs=%s" % self.get_vcs_name() ]) # # More Actions callbacks # def on_more_actions_view_unified_diff(self): url1 = self.first_urls.get_active_text() rev1 = self.get_first_revision() rev2 = self.get_second_revision() url2 = self.second_urls.get_active_text() helper.launch_ui_window("diff", [ "%s@%s" % (url1, S(rev1)), "%s@%s" % (url2, S(rev2)), "--vcs=%s" % self.get_vcs_name() ]) def get_vcs_name(self): vcs = rabbitvcs.vcs.VCS_DUMMY if hasattr(self, "svn"): vcs = rabbitvcs.vcs.VCS_SVN elif hasattr(self, "git"): vcs = rabbitvcs.vcs.VCS_GIT return vcs class SVNChanges(Changes): def __init__(self, path1=None, revision1=None, path2=None, revision2=None): Changes.__init__(self, path1, revision1, path2, revision2) self.svn = self.vcs.svn() if path1 is not None: self.first_urls.set_child_text(self.svn.get_repo_url(path1)) if path2 is not None: self.second_urls.set_child_text(self.svn.get_repo_url(path2)) elif path1 is not None: self.second_urls.set_child_text(self.svn.get_repo_url(path1)) self.first_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("first_revision_container"), self.svn, revision=revision1, url_combobox=self.first_urls, expand=True ) self.second_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("second_revision_container"), self.svn, revision=revision2, url_combobox=self.second_urls, expand=True ) self.changes_table = rabbitvcs.ui.widget.Table( self.get_widget("changes_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Path"), _("Change"), _("Property Change")], flags={ "sortable": True, "sort_on": 1 }, callbacks={ "mouse-event": self.on_changes_table_button_released } ) self.check_ui() if path1 and revision1 and path2 and revision2: self.load() def load(self): first_url = self.first_urls.get_active_text() first_rev = self.get_first_revision() second_rev = self.get_second_revision() second_url = self.second_urls.get_active_text() self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append(self.disable_more_actions) self.action.append( self.svn.diff_summarize, first_url, first_rev, second_url, second_rev ) self.action.append(helper.save_repository_path, first_url) self.action.append(helper.save_repository_path, second_url) self.action.append(self.populate_table) self.action.append(self.enable_more_actions) self.action.schedule() def populate_table(self): # returns a list of dicts(path, summarize_kind, node_kind, prop_changed) summary = self.action.get_result(1) self.changes_table.clear() for item in summary: prop_changed = (item["prop_changed"] == 1 and _("Yes") or _("No")) path = item["path"] if path == "": path = "." self.changes_table.append([ path, str(item["summarize_kind"]), prop_changed ]) def on_first_urls_browse_clicked(self, widget, data=None): from rabbitvcs.ui.browser import SVNBrowserDialog SVNBrowserDialog(self.first_urls.get_active_text(), callback=self.on_first_repo_chooser_closed) def on_second_urls_browse_clicked(self, widget, data=None): from rabbitvcs.ui.browser import SVNBrowserDialog SVNBrowserDialog(self.second_urls.get_active_text(), callback=self.on_second_repo_chooser_closed) class GitChanges(Changes): def __init__(self, path1=None, revision1=None, path2=None, revision2=None): Changes.__init__(self, path1, revision1, path2, revision2) self.git = self.vcs.git(path1) self.first_urls_browse.hide() self.second_urls_browse.hide() if path1 is not None: self.first_urls.set_child_text(path1) if path2 is not None: self.second_urls.set_child_text(path2) elif path1 is not None: self.second_urls.set_child_text(path1) self.first_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("first_revision_container"), self.git, revision=revision1, url_combobox=self.first_urls, expand=True ) self.second_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("second_revision_container"), self.git, revision=revision2, url_combobox=self.second_urls, expand=True ) self.changes_table = rabbitvcs.ui.widget.Table( self.get_widget("changes_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Path"), _("Change")] ) self.check_ui() if path1 and revision1 and path2 and revision2: self.load() def load(self): first_url = self.first_urls.get_active_text() first_rev = self.get_first_revision() second_rev = self.get_second_revision() second_url = self.second_urls.get_active_text() self.action = rabbitvcs.ui.action.GitAction( self.git, notification=False ) self.action.append(self.disable_more_actions) self.action.append( self.git.diff_summarize, first_url, first_rev, second_url, second_rev ) self.action.append(helper.save_repository_path, first_url) self.action.append(helper.save_repository_path, second_url) self.action.append(self.populate_table) self.action.append(self.enable_more_actions) self.action.schedule() def populate_table(self): # returns a list of dicts(path, summarize_kind, node_kind, prop_changed) summary = self.action.get_result(1) self.changes_table.clear() for item in summary: self.changes_table.append([ item.path, item.action ]) class MenuOpenFirst(MenuItem): identifier = "RabbitVCS::Open_First" label = _("Open from first revision") icon = "document-open" class MenuOpenSecond(MenuItem): identifier = "RabbitVCS::Open_Second" label = _("Open from second revision") icon = "document-open" class MenuViewDiff(MenuItem): identifier = "RabbitVCS::View_Diff" label = _("View unified diff(s)") icon = "rabbitvcs-diff" class MenuCompare(MenuItem): identifier = "RabbitVCS::Compare" label = _("Compare side by side") icon = "rabbitvcs-compare" class ChangesContextMenuConditions(object): def __init__(self, caller, vcs): self.caller = caller self.vcs = vcs def open_first(self): return ( len(self.caller.selected_rows) == 1 ) def open_second(self): return ( len(self.caller.selected_rows) == 1 and ( str(self.caller.get_first_revision()) != str(self.caller.get_second_revision()) or self.caller.first_urls.get_active_text() != self.caller.second_urls.get_active_text() ) ) def view_diff(self): return ( len(self.caller.selected_rows) > 0 ) def compare(self): return ( len(self.caller.selected_rows) > 0 ) class ChangesContextMenuCallbacks(object): def __init__(self, caller, vcs): self.caller = caller self.vcs = vcs def open_first(self, widget, data=None): path = self.caller.changes_table.get_row(self.caller.selected_rows[0])[0] if path == ".": path = "" url = helper.url_join(self.caller.first_urls.get_active_text(), path) rev = self.caller.get_first_revision() helper.launch_ui_window("open", [ "--vcs=%s" % self.caller.get_vcs_name(), url, "-r%s" % S(rev) ]) def open_second(self, widget, data=None): path = self.caller.changes_table.get_row(self.caller.selected_rows[0])[0] if path == ".": path = "" url = helper.url_join(self.caller.second_urls.get_active_text(), path) rev = self.caller.get_second_revision() helper.launch_ui_window("open", [ "--vcs=%s" % self.caller.get_vcs_name(), url, "-r%s" % S(rev) ]) def view_diff(self, widget, data=None): self.caller.view_selected_diff() def compare(self, widget, data=None): for row in self.caller.selected_rows: url1 = self.caller.changes_table.get_row(row)[0] url2 = url1 if url1 == ".": url1 = "" url2 = "" url1 = helper.url_join(self.caller.first_urls.get_active_text(), url1) url2 = helper.url_join(self.caller.second_urls.get_active_text(), url2) rev1 = self.caller.get_first_revision() rev2 = self.caller.get_second_revision() helper.launch_ui_window("diff", [ "%s@%s" % (url1, S(rev1)), "%s@%s" % (url2, S(rev2)), "-s", "--vcs=%s" % self.caller.get_vcs_name() ]) class ChangesContextMenu(object): """ Defines context menu items for a table with files """ def __init__(self, caller, event): """ @param caller: The calling object @type caller: object """ self.caller = caller self.event = event self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.conditions = ChangesContextMenuConditions( self.caller, self.vcs ) self.callbacks = ChangesContextMenuCallbacks( self.caller, self.vcs ) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuOpenFirst, None), (MenuOpenSecond, None), (MenuViewDiff, None), (MenuCompare, None) ] def show(self): if len(self.caller.selected_rows) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNChanges, rabbitvcs.vcs.VCS_GIT: GitChanges } def changes_factory(vcs, path1=None, revision1=None, path2=None, revision2=None): if not vcs: guess = rabbitvcs.vcs.guess(path1) vcs = guess["vcs"] return classes_map[vcs](path1, revision1, path2, revision2) if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main( [VCS_OPT], usage="Usage: rabbitvcs changes [url1@rev1] [url2@rev2]" ) pathrev1 = helper.parse_path_revision_string(args.pop(0)) pathrev2 = (None, None) if len(args) > 0: pathrev2 = helper.parse_path_revision_string(args.pop(0)) window = changes_factory(options.vcs, pathrev1[0], pathrev1[1], pathrev2[0], pathrev2[1]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/checkmods.py000066400000000000000000000266261362112712700203450ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread import threading from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkFilesContextMenu, \ GtkContextMenuCaller, GtkFilesContextMenuConditions, GtkContextMenu from rabbitvcs.util.contextmenuitems import MenuItem, MenuUpdate, \ MenuSeparator import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import gtk_unsafe log = Log("rabbitvcs.ui.checkmods") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class SVNCheckForModifications(InterfaceView): """ Provides a way for the user to see what files have been changed on the repository. """ def __init__(self, paths, base_dir=None): InterfaceView.__init__(self, "checkmods", "CheckMods") self.paths = paths self.base_dir = base_dir self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.notebook = self.get_widget("notebook") self.local_mods = SVNCheckLocalModifications(self, \ self.vcs, \ self.paths, \ self.base_dir) self.remote_mods = SVNCheckRemoteModifications(self, \ self.vcs, \ self.paths, \ self.base_dir) self.remote_refreshed = False self.load() def on_refresh_clicked(self, widget): if self.notebook.get_current_page() == 0: self.local_mods.refresh() else: self.remote_mods.refresh() def on_notebook_switch_page(self, page, data, page_num): if page_num == 1 and self.remote_refreshed == False: self.remote_mods.refresh() self.remote_refreshed = True # # Helper methods # def load(self): self.local_mods.refresh() class SVNCheckLocalModifications(GtkContextMenuCaller): def __init__(self, caller, vcs, paths, base_dir): self.caller = caller self.vcs = vcs self.svn = vcs.svn() self.items = None self.paths = paths self.base_dir = base_dir self.files_table = rabbitvcs.ui.widget.Table( self.caller.get_widget("local_files_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Path"), _("Status"), _("Extension")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 0 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event } ) def on_files_table_row_activated(self, treeview, event, col): paths = self.files_table.get_selected_row_items(0) self.diff_local(paths[0]) def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: paths = self.files_table.get_selected_row_items(0) GtkFilesContextMenu(self, event, self.base_dir, paths).show() def refresh(self): self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append(self.svn.get_items, self.paths, self.svn.STATUSES_FOR_CHECK) self.action.append(self.populate_files_table) self.action.schedule() @gtk_unsafe def populate_files_table(self): self.files_table.clear() self.items = self.action.get_result(0) for item in self.items: self.files_table.append([ item.path, item.simple_content_status(), helper.get_file_extension(item.path) ]) def diff_local(self, path): helper.launch_diff_tool(path) def on_context_menu_command_finished(self): self.refresh() class SVNCheckRemoteModifications(GtkContextMenuCaller): def __init__(self, caller, vcs, paths, base_dir): self.caller = caller self.vcs = vcs self.svn = vcs.svn() self.items = None self.paths = paths self.base_dir = base_dir self.files_table = rabbitvcs.ui.widget.Table( self.caller.get_widget("remote_files_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Path"), _("Extension"), _("Text Status"), _("Property Status"), _("Revision"), _("Author")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 0 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event } ) def on_files_table_row_activated(self, treeview, event, col): paths = self.files_table.get_selected_row_items(0) self.diff_remote(paths[0]) def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: paths = self.files_table.get_selected_row_items(0) CheckRemoteModsContextMenu(self, event, self.base_dir, self.vcs, paths).show() def refresh(self): self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append(self.svn.get_remote_updates, self.paths) self.action.append(self.populate_files_table) self.action.schedule() @gtk_unsafe def populate_files_table(self): self.files_table.clear() self.items = self.action.get_result(0) for item in self.items: revision = -1 author = "" if item.revision is not None: revision = item.revision if item.author is not None: author = item.author self.files_table.append([ item.path, helper.get_file_extension(item.path), item.remote_content, item.remote_metadata, str(revision), author ]) def diff_remote(self, path): from rabbitvcs.ui.diff import SVNDiff path_local = path path_remote = self.svn.get_repo_url(path_local) self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append( SVNDiff, path_local, None, path_remote, "HEAD" ) self.action.schedule() def on_context_menu_command_finished(self): self.refresh() class MenuViewDiff(MenuItem): identifier = "RabbitVCS::View_Diff" label = _("View unified diff") icon = "rabbitvcs-diff" class MenuCompare(MenuItem): identifier = "RabbitVCS::Compare" label = _("Compare side by side") icon = "rabbitvcs-compare" class CheckRemoteModsContextMenuConditions(GtkFilesContextMenuConditions): def __init__(self, vcs, paths=[]): GtkFilesContextMenuConditions.__init__(self, vcs, paths) def update(self, data=None): return True def view_diff(self, data=None): return (self.path_dict["exists"] and self.path_dict["length"] == 1) def compare(self, data=None): return (self.path_dict["exists"] and self.path_dict["length"] == 1) class CheckRemoteModsContextMenuCallbacks(object): def __init__(self, caller, base_dir, vcs, paths=[]): self.caller = caller self.base_dir = base_dir self.vcs = vcs self.svn = self.vcs.svn() self.paths = paths def update(self, data1=None, data2=None): proc = helper.launch_ui_window( "update", self.paths ) self.caller.rescan_after_process_exit(proc, self.paths) def view_diff(self, data1=None, data2=None): self.caller.diff_remote(self.paths[0]) def compare(self, data1=None, data2=None): from rabbitvcs.ui.diff import SVNDiff path_local = self.paths[0] path_remote = self.svn.get_repo_url(path_local) self.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.action.append( SVNDiff, path_local, None, path_remote, "HEAD", sidebyside=True ) self.action.schedule() class CheckRemoteModsContextMenu(object): def __init__(self, caller, event, base_dir, vcs, paths=[]): self.caller = caller self.event = event self.paths = paths self.base_dir = base_dir self.vcs = vcs self.conditions = CheckRemoteModsContextMenuConditions(self.vcs, paths) self.callbacks = CheckRemoteModsContextMenuCallbacks( self.caller, self.base_dir, self.vcs, paths ) self.structure = [ (MenuViewDiff, None), (MenuCompare, None), (MenuSeparator, None), (MenuUpdate, None) ] def show(self): if len(self.paths) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNCheckForModifications } def checkmods_factory(paths, base_dir): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs checkmods [url_or_path]" ) window = checkmods_factory(paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/checkout.py000066400000000000000000000214121362112712700201760ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs.ui.updateto import GitUpdateToRevision from rabbitvcs import gettext _ = gettext.gettext class Checkout(InterfaceView): """ Provides an interface to check out a working copy. Pass it the destination path. """ def __init__(self, path=None, url=None, revision=None): InterfaceView.__init__(self, "checkout", "Checkout") self.path = path self.vcs = rabbitvcs.vcs.VCS() self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("repositories"), helper.get_repository_paths() ) # We must set a signal handler for the Gtk.Entry inside the combobox # Because glade will not retain that information self.repositories.set_child_signal( "key-release-event", self.on_repositories_key_released ) self.destination = helper.get_user_path() if path is not None: self.destination = path self.get_widget("destination").set_text(S(path).display()) if url is not None: self.repositories.set_child_text(url) self.complete = False # # UI Signal Callback Methods # def _parse_path(self, path): if path.startswith("file://"): path = helper.unquote(path) path = path[7:] return path def _get_path(self): path = self._parse_path(self.get_widget("destination").get_text()) return os.path.normpath(path) def on_file_chooser_clicked(self, widget, data=None): chooser = rabbitvcs.ui.dialog.FolderChooser() path = chooser.run() if path is not None: self.get_widget("destination").set_text(S(path).display()) def on_repositories_key_released(self, widget, event, *args): if Gdk.keyval_name(event.keyval) == "Return": if self.complete: self.on_ok_clicked(widget) def on_destination_changed(self, widget, data=None): self.check_form() def on_destination_key_released(self, widget, event, *args): if Gdk.keyval_name(event.keyval) == "Return": if self.complete: self.on_ok_clicked(widget) def on_repo_chooser_clicked(self, widget, data=None): from rabbitvcs.ui.browser import SVNBrowserDialog SVNBrowserDialog(self.repositories.get_active_text(), callback=self.on_repo_chooser_closed) def on_repo_chooser_closed(self, new_url): self.repositories.set_child_text(new_url) self.check_form() def check_form(self): self.complete = True if self.repositories.get_active_text() == "": self.complete = False if self.get_widget("destination").get_text() == "": self.complete = False self.get_widget("ok").set_sensitive(self.complete) class SVNCheckout(Checkout): def __init__(self, path=None, url=None, revision=None): Checkout.__init__(self, path, url, revision) self.get_widget("Checkout").set_title(_("Checkout - %s") % path) self.svn = self.vcs.svn() self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, revision=revision, url_combobox=self.repositories, expand=True ) self.get_widget("options_box").show() self.get_widget("revision_selector_box").show() self.check_form() def on_ok_clicked(self, widget): url = self.repositories.get_active_text() path = self._get_path() omit_externals = self.get_widget("omit_externals").get_active() recursive = self.get_widget("recursive").get_active() if not url or not path: rabbitvcs.ui.dialog.MessageBox(_("The repository URL and destination path are both required fields.")) return revision = self.revision_selector.get_revision_object() self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Checkout")) self.action.append(self.action.set_status, _("Running Checkout Command...")) self.action.append(helper.save_repository_path, url) self.action.append( self.svn.checkout, helper.quote_url(url), path, recurse=recursive, revision=revision, ignore_externals=omit_externals ) self.action.append(self.action.set_status, _("Completed Checkout")) self.action.append(self.action.finish) self.action.schedule() def on_repositories_changed(self, widget, data=None): # Do not use quoting for this bit url = self.repositories.get_active_text() tmp = url.replace("//", "/").split("/")[1:] append = "" prev = "" while len(tmp): prev = append append = tmp.pop() if append not in ("trunk", "branches", "tags"): break if append in ("http:", "https:", "file:", "svn:", "svn+ssh:"): append = "" break self.get_widget("destination").set_text( S(os.path.join(self.destination, append)).display() ) self.check_form() class GitCheckout(GitUpdateToRevision): def __init__(self, path, url, revision): GitUpdateToRevision.__init__(self, path, revision) self.get_widget("Update").set_title(_("Checkout - %s") % path) self.get_widget("options_box").hide() class GitCheckoutQuiet(object): def __init__(self, path): self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.action = rabbitvcs.ui.action.GitAction( self.git, run_in_thread=False ) self.action.append(self.git.checkout, [path]) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNCheckout, rabbitvcs.vcs.VCS_GIT: GitCheckout } def checkout_factory(vcs, path=None, url=None, revision=None, quiet=False): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] if vcs == rabbitvcs.vcs.VCS_DUMMY: return SVNCheckout(path, url, revision) elif vcs == rabbitvcs.vcs.VCS_GIT: if quiet: return GitCheckoutQuiet(path) else: return GitCheckout(path, url, revision) return classes_map[vcs](path, url, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT, QUIET_OPT (options, args) = main( [REVISION_OPT, VCS_OPT, QUIET_OPT], usage="Usage: rabbitvcs checkout --vcs=[git|svn] [url] [path]" ) # If two arguments are passed: # The first argument is expected to be a url # The second argument is expected to be a path # If one argument is passed: # If the argument exists, it is a path # Otherwise, it is a url path = url = None if len(args) == 2: path = args[0] url = args[1] elif len(args) == 1: if os.path.exists(args[0]): path = args[0] else: url = args[0] if options.quiet: window = checkout_factory(options.vcs, path=path, url=url, revision=options.revision, quiet=options.quiet) else: window = checkout_factory(options.vcs, path=path, url=url, revision=options.revision, quiet=options.quiet) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/clean.py000066400000000000000000000067161362112712700174650ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class GitClean(InterfaceView): """ Provides a UI to clean your repository of untracked files """ def __init__(self, path): InterfaceView.__init__(self, "clean", "Clean") self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.path = path def on_ok_clicked(self, widget): remove_dir = self.get_widget("remove_directories").get_active() remove_ignored_too = self.get_widget("remove_ignored_too").get_active() remove_only_ignored = self.get_widget("remove_only_ignored").get_active() dry_run = self.get_widget("dryrun").get_active() force = self.get_widget("force").get_active() self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Clean")) self.action.append(self.action.set_status, _("Running Clean Command...")) self.action.append( self.git.clean, self.path, remove_dir, remove_ignored_too, remove_only_ignored, dry_run, force ) self.action.append(self.action.set_status, _("Completed Clean")) self.action.append(self.action.finish) self.action.schedule() def on_remove_ignored_too_toggled(self, widget): remove_ignored_too = self.get_widget("remove_ignored_too") remove_only_ignored = self.get_widget("remove_only_ignored") if remove_ignored_too.get_active(): remove_only_ignored.set_active(False) def on_remove_only_ignored_toggled(self, widget): remove_ignored_too = self.get_widget("remove_ignored_too") remove_only_ignored = self.get_widget("remove_only_ignored") if remove_only_ignored.get_active(): remove_ignored_too.set_active(False) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs clean path") window = GitClean(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/cleanup.py000066400000000000000000000047261362112712700200310ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class SVNCleanup(InterfaceNonView): """ This class provides a handler to the Cleanup window view. The idea is that it displays a large folder icon with a label like "Please Wait...". Then when it finishes cleaning up, the label will change to "Finished cleaning up /path/to/folder" """ def __init__(self, path): InterfaceNonView.__init__(self) self.path = path self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() def start(self): self.action = SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Cleanup")) self.action.append(self.action.set_status, _("Cleaning Up...")) self.action.append(self.svn.cleanup, self.path) self.action.append(self.action.set_status, _("Completed Cleanup")) self.action.append(self.action.finish) self.action.schedule() if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs cleanup [path]") window = SVNCleanup(paths[0]) window.register_gtk_quit() window.start() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/clone.py000066400000000000000000000115621362112712700174760ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.checkout import Checkout import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class GitClone(Checkout): def __init__(self, path=None, url=None): Checkout.__init__(self, path, url) self.git = self.vcs.git() self.get_widget("Checkout").set_title(_("Clone")) self.get_widget("repo_chooser").hide() self.get_widget("options_box").hide() self.get_widget("revision_selector_box").hide() self.default_text() self.check_form() def on_ok_clicked(self, widget): url = self.repositories.get_active_text().strip() path = self._get_path().strip() if not url or not path: rabbitvcs.ui.dialog.MessageBox(_("The repository URL and destination path are both required fields.")) return self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Clone")) self.action.append(self.action.set_status, _("Running Clone Command...")) self.action.append(helper.save_repository_path, url) self.action.append( self.git.clone, url, path ) self.action.append(self.action.set_status, _("Completed Clone")) self.action.append(self.action.finish) self.action.schedule() def on_repositories_changed(self, widget, data=None): url = self.repositories.get_active_text() tmp = [x.strip() for x in url.split("/") if x.strip()] if tmp and tmp[0].lower() in ("http:", "https:", "file:", "git:"): del tmp[0] append = tmp[-1] if tmp else "" if append.endswith(".git"): append = append[:-4] helper.run_in_main_thread(self.get_widget("destination").set_text, S(os.path.join(self.destination, append)).display()) self.check_form() def default_text(self): # Use a repo url from the clipboard by default. clipboard = Gtk.Clipboard.get(Gdk.Atom.intern("CLIPBOARD", False)) text = clipboard.wait_for_text() if text and text.endswith(('.git', '.git/')): self.repositories.set_child_text(text) def check_form(self): self.complete = True if self.repositories.get_active_text() == "": self.complete = False if self.get_widget("destination").get_text() == "": self.complete = False self.get_widget("ok").set_sensitive(self.complete) classes_map = { rabbitvcs.vcs.VCS_GIT: GitClone } def clone_factory(classes_map, vcs, path=None, url=None): return classes_map[vcs](path, url) if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main( [VCS_OPT], usage="Usage: rabbitvcs clone --vcs=git [url] [path]" ) # Default to using git vcs = rabbitvcs.vcs.VCS_GIT if options.vcs: vcs = options.vcs # If two arguments are passed: # The first argument is expected to be a url # The second argument is expected to be a path # If one argument is passed: # If the argument exists, it is a path # Otherwise, it is a url path = url = None if len(args) == 2: path = args[0] url = args[1] elif len(args) == 1: if os.path.exists(args[0]): path = args[0] else: url = args[0] window = clone_factory(classes_map, vcs, path=path, url=url) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/commit.py000066400000000000000000000336771362112712700177010ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import six.moves._thread from time import sleep from rabbitvcs.util import helper from gi import require_version require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, GLib sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkFilesContextMenu, GtkContextMenuCaller import rabbitvcs.ui.action import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import gtk_unsafe import rabbitvcs.vcs.status log = Log("rabbitvcs.ui.commit") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class Commit(InterfaceView, GtkContextMenuCaller): """ Provides a user interface for the user to commit working copy changes to a repository. Pass it a list of local paths to commit. """ SETTINGS = rabbitvcs.util.settings.SettingsManager() TOGGLE_ALL = False SHOW_UNVERSIONED = SETTINGS.get("general", "show_unversioned_files") # This keeps track of any changes that the user has made to the row # selections changes = {} def __init__(self, paths, base_dir=None, message=None): """ @type paths: list of strings @param paths: A list of local paths. """ InterfaceView.__init__(self, "commit", "Commit") self.base_dir = base_dir self.vcs = rabbitvcs.vcs.VCS() self.items = [] self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_STATUS, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, "", _("Path"), _("Extension"), _("Text Status"), _("Property Status")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 2 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event, "key-event": self.on_files_table_key_event, "row-toggled": self.on_files_table_toggle_event }, flags={ "sortable": True, "sort_on": 2 } ) self.files_table.allow_multiple() self.get_widget("toggle_show_unversioned").set_active(self.SHOW_UNVERSIONED) if not message: message = self.SETTINGS.get_multiline("general", "default_commit_message") self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message"), message ) self.paths = [] for path in paths: if self.vcs.is_in_a_or_a_working_copy(path): self.paths.append(S(path)) # # Helper functions # def load(self): """ - Gets a listing of file items that are valid for the commit window. - Determines which items should be "activated" by default - Populates the files table with the retrieved items - Updates the status area """ self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths, self.vcs.statuses_for_commit(self.paths)) self.populate_files_table() # Overrides the GtkContextMenuCaller method def on_context_menu_command_finished(self): self.initialize_items() def should_item_be_activated(self, item): """ Determines if a file should be activated or not """ if (S(item.path) in self.paths or item.is_versioned() and item.simple_content_status() != rabbitvcs.vcs.status.status_missing): return True return False def should_item_be_visible(self, item): show_unversioned = self.SHOW_UNVERSIONED if not show_unversioned: if not item.is_versioned(): return False return True def initialize_items(self): """ Initializes the activated cache and loads the file items in a new thread """ GLib.idle_add(self.load) def show_files_table_popup_menu(self, treeview, data): paths = self.files_table.get_selected_row_items(1) GtkFilesContextMenu(self, data, self.base_dir, paths).show() def delete_items(self, widget, event): paths = self.files_table.get_selected_row_items(1) if len(paths) > 0: proc = helper.launch_ui_window("delete", paths) self.rescan_after_process_exit(proc, paths) # # Event handlers # def on_refresh_clicked(self, widget): self.initialize_items() def on_key_pressed(self, widget, event, *args): if InterfaceView.on_key_pressed(self, widget, event, *args): return True if (event.state & Gdk.ModifierType.CONTROL_MASK and Gdk.keyval_name(event.keyval) == "Return"): self.on_ok_clicked(widget) return True def on_toggle_show_all_toggled(self, widget, data=None): self.TOGGLE_ALL = not self.TOGGLE_ALL self.changes.clear() for row in self.files_table.get_items(): row[0] = self.TOGGLE_ALL self.changes[row[1]] = self.TOGGLE_ALL def on_toggle_show_unversioned_toggled(self, widget, *args): self.SHOW_UNVERSIONED = widget.get_active() self.populate_files_table() # Save this preference for future commits. if self.SETTINGS.get("general", "show_unversioned_files") != self.SHOW_UNVERSIONED: self.SETTINGS.set( "general", "show_unversioned_files", self.SHOW_UNVERSIONED ) self.SETTINGS.write() def on_files_table_row_activated(self, treeview, event, col): paths = self.files_table.get_selected_row_items(1) pathrev1 = helper.create_path_revision_string(paths[0], "base") pathrev2 = helper.create_path_revision_string(paths[0], "working") proc = helper.launch_ui_window("diff", ["-s", pathrev1, pathrev2]) self.rescan_after_process_exit(proc, paths) def on_files_table_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) == "Delete": self.delete_items(treeview, event) def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_files_table_popup_menu(treeview, event) def on_previous_messages_clicked(self, widget, data=None): dialog = rabbitvcs.ui.dialog.PreviousMessages() message = dialog.run() if message is not None: self.message.set_text(S(message).display()) def populate_files_table(self): """ First clears and then populates the files table based on the items retrieved in self.load() """ self.files_table.clear() n = 0 m = 0 for item in self.items: if item.path in self.changes: checked = self.changes[item.path] else: checked = self.should_item_be_activated(item) if item.is_versioned(): n += 1 else: m += 1 if not self.should_item_be_visible(item): continue self.files_table.append([ checked, S(item.path), item.path, helper.get_file_extension(item.path), item.simple_content_status(), item.simple_metadata_status() ]) self.get_widget("status").set_text(_("Found %(changed)d changed and %(unversioned)d unversioned item(s)") % { "changed": n, "unversioned": m } ) class SVNCommit(Commit): def __init__(self, paths, base_dir=None, message=None): Commit.__init__(self, paths, base_dir, message) self.get_widget("commit_to_box").show() self.get_widget("to").set_text( S(self.vcs.svn().get_repo_url(self.base_dir)).display() ) self.items = None if len(self.paths): self.initialize_items() def on_ok_clicked(self, widget, data=None): items = self.files_table.get_activated_rows(1) self.hide() if len(items) == 0: self.close() return added = 0 recurse = False for item in items: status = self.vcs.status(item, summarize=False).simple_content_status() try: if status == rabbitvcs.vcs.status.status_unversioned: self.vcs.svn().add(item) added += 1 elif status == rabbitvcs.vcs.status.status_deleted: recurse = True elif status == rabbitvcs.vcs.status.status_missing: self.vcs.svn().update(item) self.vcs.svn().remove(item) except Exception as e: log.exception(e) ticks = added + len(items)*2 self.action = rabbitvcs.ui.action.SVNAction( self.vcs.svn(), register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Commit")) self.action.append(self.action.set_status, _("Running Commit Command...")) self.action.append( helper.save_log_message, self.message.get_text() ), self.action.append(self.do_commit, items, recurse) self.action.append(self.action.finish) self.action.schedule() def do_commit(self, items, recurse): # pysvn.Revision revision = self.vcs.svn().commit(items, self.message.get_text(), recurse=recurse) self.action.set_status(_("Completed Commit") + " at Revision: " + str(revision.number)) def on_files_table_toggle_event(self, row, col): # Adds path: True/False to the dict self.changes[row[1]] = row[col] class GitCommit(Commit): def __init__(self, paths, base_dir=None, message=None): Commit.__init__(self, paths, base_dir, message) self.git = self.vcs.git(paths[0]) self.get_widget("commit_to_box").show() active_branch = self.git.get_active_branch() if active_branch: self.get_widget("to").set_text( S(active_branch.name).display() ) else: self.get_widget("to").set_text("No active branch") self.items = None if len(self.paths): self.initialize_items() def on_ok_clicked(self, widget, data=None): items = self.files_table.get_activated_rows(1) self.hide() if len(items) == 0: self.close() return staged = 0 for item in items: try: status = self.vcs.status(item, summarize=False).simple_content_status() if status == rabbitvcs.vcs.status.status_missing: self.git.checkout([item]) self.git.remove(item) else: self.git.stage(item) staged += 1 except Exception as e: log.exception(e) ticks = staged + len(items)*2 self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Commit")) self.action.append(self.action.set_status, _("Running Commit Command...")) self.action.append( helper.save_log_message, self.message.get_text() ) self.action.append( self.git.commit, self.message.get_text() ) self.action.append(self.action.set_status, _("Completed Commit")) self.action.append(self.action.finish) self.action.schedule() def on_files_table_toggle_event(self, row, col): # Adds path: True/False to the dict self.changes[row[1]] = row[col] classes_map = { rabbitvcs.vcs.VCS_SVN: SVNCommit, rabbitvcs.vcs.VCS_GIT: GitCommit } def commit_factory(paths, base_dir=None, message=None): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir, message) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT, (["-m", "--message"], {"help":"add a commit log message"})], usage="Usage: rabbitvcs commit [path1] [path2] ..." ) window = commit_factory(paths, options.base_dir, message=options.message) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/create.py000066400000000000000000000061411362112712700176360ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import subprocess from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() import rabbitvcs.ui.dialog from rabbitvcs.ui.action import GitAction from rabbitvcs import gettext _ = gettext.gettext class SVNCreate(object): """ Provides an interface to create a svn repository """ # Also, might want to just launch a terminal window instead of this def __init__(self, path): if not os.path.isdir(path): os.makedirs(path) # Let svnadmin return a bad value if a repo already exists there ret = subprocess.call(["/usr/bin/svnadmin", "create", path]) if ret == 0: rabbitvcs.ui.dialog.MessageBox(_("Repository successfully created")) else: rabbitvcs.ui.dialog.MessageBox(_("There was an error creating the repository. Make sure the given folder is empty.")) class GitCreate(object): # Also, might want to just launch a terminal window instead of this def __init__(self, path): self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git() self.path = path self.action = GitAction( self.git, register_gtk_quit=True ) self.action.append(self.action.set_header, _("Initialize Repository")) self.action.append(self.action.set_status, _("Setting up repository...")) self.action.append(self.git.initialize_repository, self.path) self.action.append(self.action.set_status, _("Completed repository setup")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNCreate, rabbitvcs.vcs.VCS_GIT: GitCreate } if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT, VCS_OPT_ERROR (options, paths) = main([VCS_OPT], usage="Usage: rabbitvcs create --vcs [svn|git] path") if options.vcs: window = classes_map[options.vcs](paths[0]) if options.vcs == rabbitvcs.vcs.VCS_GIT: Gtk.main() else: rabbitvcs.ui.dialog.MessageBox(VCS_OPT_ERROR) rabbitvcs-0.18/rabbitvcs/ui/createpatch.py000066400000000000000000000220461362112712700206600ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import tempfile import shutil import six.moves._thread from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log from rabbitvcs.ui.commit import SVNCommit, GitCommit log = Log("rabbitvcs.ui.createpatch") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class CreatePatch(InterfaceView): """ Provides a user interface for the user to create a Patch file """ def __init__(self, paths, base_dir): """ @type paths: list of strings @param paths: A list of local paths. """ InterfaceView.__init__(self, "commit", "Commit") # Modify the Commit window to what we need for Create Patch window = self.get_widget("Commit") window.set_title(_("Create Patch")) window.resize(640, 400) self.get_widget("commit_to_box").hide() self.get_widget("add_message_box").hide() self.paths = paths self.base_dir = base_dir self.vcs = rabbitvcs.vcs.VCS() self.activated_cache = {} self.common = helper.get_common_directory(paths) if not self.vcs.is_versioned(self.common): rabbitvcs.ui.dialog.MessageBox(_("The given path is not a working copy")) raise SystemExit() self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, "", _("Path"), _("Extension"), _("Text Status"), _("Property Status")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 2 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event, "key-event": self.on_files_table_key_event }, flags={ "sortable": True, "sort_on": 2 } ) self.files_table.allow_multiple() self.items = None self.initialize_items() # # Helper functions # def choose_patch_path(self): path = "" dialog = Gtk.FileChooserDialog( title = _("Create Patch"), parent = None, action = Gtk.FileChooserAction.SAVE) dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) dialog.add_button(_("_Create"), Gtk.ResponseType.OK) dialog.set_do_overwrite_confirmation(True) dialog.set_default_response(Gtk.ResponseType.OK) dialog.set_current_folder_uri( helper.get_common_directory(self.paths).replace("file://", "") ) response = dialog.run() if response == Gtk.ResponseType.OK: path = dialog.get_filename() dialog.destroy() return path class SVNCreatePatch(CreatePatch, SVNCommit): def __init__(self, paths, base_dir=None): CreatePatch.__init__(self, paths, base_dir) self.svn = self.vcs.svn() # # Event handlers # def on_ok_clicked(self, widget, data=None): items = self.files_table.get_activated_rows(1) self.hide() if len(items) == 0: self.close() return path = self.choose_patch_path() if not path: self.close() return ticks = len(items)*2 self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Create Patch")) self.action.append(self.action.set_status, _("Creating Patch File...")) def create_patch_action(patch_path, patch_items, base_dir): fileObj = open(patch_path,"w") # PySVN takes a path to create its own temp files... temp_dir = tempfile.mkdtemp(prefix=rabbitvcs.TEMP_DIR_PREFIX) os.chdir(base_dir) # Add to the Patch file only the selected items for item in patch_items: rel_path = helper.get_relative_path(base_dir, item) diff_text = self.svn.diff( temp_dir, rel_path, self.svn.revision("base"), rel_path, self.svn.revision("working") ) fileObj.write(diff_text) fileObj.close() # Note: if we don't want to ignore errors here, we could define a # function that logs failures. shutil.rmtree(temp_dir, ignore_errors = True) self.action.append(create_patch_action, path, items, self.common) self.action.append(self.action.set_status, _("Patch File Created")) self.action.append(self.action.finish) self.action.schedule() # TODO: Open the diff file (meld is going to add support in a future version :() # helper.launch_diff_tool(path) class GitCreatePatch(CreatePatch, GitCommit): def __init__(self, paths, base_dir=None): CreatePatch.__init__(self, paths, base_dir) self.git = self.vcs.git(paths[0]) # # Event handlers # def on_ok_clicked(self, widget, data=None): items = self.files_table.get_activated_rows(1) self.hide() if len(items) == 0: self.close() return path = self.choose_patch_path() if not path: self.close() return ticks = len(items)*2 self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.set_pbar_ticks(ticks) self.action.append(self.action.set_header, _("Create Patch")) self.action.append(self.action.set_status, _("Creating Patch File...")) def create_patch_action(patch_path, patch_items, base_dir): fileObj = open(patch_path,"w") # PySVN takes a path to create its own temp files... temp_dir = tempfile.mkdtemp(prefix=rabbitvcs.TEMP_DIR_PREFIX) os.chdir(base_dir) # Add to the Patch file only the selected items for item in patch_items: rel_path = helper.get_relative_path(base_dir, item) diff_text = self.git.diff( rel_path, self.git.revision("HEAD"), rel_path, self.git.revision("WORKING") ) fileObj.write(diff_text) fileObj.close() # Note: if we don't want to ignore errors here, we could define a # function that logs failures. shutil.rmtree(temp_dir, ignore_errors = True) self.action.append(create_patch_action, path, items, self.common) self.action.append(self.action.set_status, _("Patch File Created")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNCreatePatch, rabbitvcs.vcs.VCS_GIT: GitCreatePatch } def createpatch_factory(paths, base_dir): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs createpatch [path1] [path2] ..." ) window = createpatch_factory(paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/delete.py000066400000000000000000000073751362112712700176470ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper from gi import require_version require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction import rabbitvcs.vcs from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.delete") from rabbitvcs import gettext _ = gettext.gettext class Delete(InterfaceNonView): """ This class provides a handler to Delete functionality. """ def __init__(self, paths): InterfaceNonView.__init__(self) self.paths = paths self.vcs = rabbitvcs.vcs.VCS() def start(self): # From the given paths, determine which are versioned and which are not versioned = [] unversioned = [] for path in self.paths: if self.vcs.is_versioned(path): versioned.append(path) elif os.path.exists(path): unversioned.append(path) # If there are unversioned files, confirm that the user wants to # delete those. Default to true. result = True if unversioned: item = None if len(unversioned) == 1: item = unversioned[0] confirm = rabbitvcs.ui.dialog.DeleteConfirmation(item) result = confirm.run() # If the user wants to continue (or there are no unversioned files) # remove or delete the given files if result == Gtk.ResponseType.OK or result == True: if versioned: try: self.vcs_remove(versioned, force=True) except Exception as e: log.exception() return if unversioned: for path in unversioned: helper.delete_item(path) class SVNDelete(Delete): def __init__(self, paths): Delete.__init__(self, paths) def vcs_remove(self, paths, **kwargs): if rabbitvcs.vcs.guess(paths[0])["vcs"] == rabbitvcs.vcs.VCS_SVN: self.vcs.svn().remove(paths, **kwargs) class GitDelete(Delete): def __init__(self, paths): Delete.__init__(self, paths) def vcs_remove(self, paths, **kwargs): if rabbitvcs.vcs.guess(paths[0])["vcs"] == rabbitvcs.vcs.VCS_GIT: self.vcs.git(paths[0]).remove(paths) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNDelete, rabbitvcs.vcs.VCS_GIT: GitDelete } def delete_factory(paths): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs delete [path1] [path2] ...") window = delete_factory(paths) window.register_gtk_quit() window.start() rabbitvcs-0.18/rabbitvcs/ui/dialog.py000066400000000000000000000431751362112712700176420ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from gettext import gettext as _ import os.path import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GObject, Gdk, Pango from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.wraplabel import rabbitvcs.util.helper from rabbitvcs.util.strings import S ERROR_NOTICE = _("""\ An error has occurred in the RabbitVCS Nautilus extension. Please contact the \ RabbitVCS team with the error details listed below:""" % (rabbitvcs.WEBSITE)) class PreviousMessages(InterfaceView): def __init__(self): InterfaceView.__init__(self, "dialogs/previous_messages", "PreviousMessages") self.message = rabbitvcs.ui.widget.TextView( self.get_widget("prevmes_message") ) self.message_table = rabbitvcs.ui.widget.Table( self.get_widget("prevmes_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Date"), _("Message")], filters=[{ "callback": rabbitvcs.ui.widget.long_text_filter, "user_data": { "column": 1, "cols": 80 } }], callbacks={ "cursor-changed": self.on_prevmes_table_cursor_changed, "row-activated": self.on_prevmes_table_row_activated } ) self.entries = rabbitvcs.util.helper.get_previous_messages() if self.entries is None: return None for entry in self.entries: self.message_table.append([entry[0],entry[1]]) if len(self.entries) > 0: self.message.set_text(S(self.entries[0][1]).display()) def run(self): if self.entries is None: return None returner = None self.dialog = self.get_widget("PreviousMessages") result = self.dialog.run() if result == Gtk.ResponseType.OK: returner = self.message.get_text() self.dialog.destroy() return returner def on_prevmes_table_row_activated(self, treeview, data, col): self.update_message_table() self.dialog.response(Gtk.ResponseType.OK) def on_prevmes_table_cursor_changed(self, treeview): self.update_message_table() def update_message_table(self): selection = self.message_table.get_selected_row_items(1) if selection: selected_message = selection[-1] self.message.set_text(S(selected_message).display()) class FolderChooser(object): def __init__(self): self.dialog = Gtk.FileChooserDialog( title = _("Select a Folder"), parent = None, action = Gtk.FileChooserAction.SELECT_FOLDER) self.dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.dialog.add_button(_("_Select"), Gtk.ResponseType.OK) self.dialog.set_default_response(Gtk.ResponseType.OK) def run(self): returner = None result = self.dialog.run() if result == Gtk.ResponseType.OK: # returner = self.dialog.get_uri() returner = self.dialog.get_file().get_path() self.dialog.destroy() return returner class Certificate(InterfaceView): """ Provides a dialog to accept/accept_once/deny an ssl certificate """ def __init__(self, realm="", host="", issuer="", valid_from="", valid_until="", fingerprint=""): InterfaceView.__init__(self, "dialogs/certificate", "Certificate") self.get_widget("cert_realm").set_label(realm) self.get_widget("cert_host").set_label(host) self.get_widget("cert_issuer").set_label(issuer) to_str = _("to") self.get_widget("cert_valid").set_label( "%s %s %s" % (valid_from, to_str, valid_until) ) self.get_widget("cert_fingerprint").set_label(fingerprint) def run(self): """ Returns three possible values: - 0 Deny - 1 Accept Once - 2 Accept Forever """ self.dialog = self.get_widget("Certificate") result = self.dialog.run() self.dialog.destroy() return result class Authentication(InterfaceView): def __init__(self, realm="", may_save=True): InterfaceView.__init__(self, "dialogs/authentication", "Authentication") self.get_widget("auth_realm").set_label(realm) self.get_widget("auth_save").set_sensitive(may_save) def run(self): returner = None self.dialog = self.get_widget("Authentication") result = self.dialog.run() login = self.get_widget("auth_login").get_text() password = self.get_widget("auth_password").get_text() save = self.get_widget("auth_save").get_active() self.dialog.destroy() if result == Gtk.ResponseType.OK: return (True, login, password, save) else: return (False, "", "", False) class CertAuthentication(InterfaceView): def __init__(self, realm="", may_save=True): InterfaceView.__init__(self, "dialogs/cert_authentication", "CertAuthentication") self.get_widget("certauth_realm").set_label(realm) self.get_widget("certauth_save").set_sensitive(may_save) def run(self): self.dialog = self.get_widget("CertAuthentication") result = self.dialog.run() password = self.get_widget("certauth_password").get_text() save = self.get_widget("certauth_save").get_active() self.dialog.destroy() if result == Gtk.ResponseType.OK: return (True, password, save) else: return (False, "", False) class SSLClientCertPrompt(InterfaceView): def __init__(self, realm="", may_save=True): InterfaceView.__init__(self, "dialogs/ssl_client_cert_prompt", "SSLClientCertPrompt") self.get_widget("sslclientcert_realm").set_label(realm) self.get_widget("sslclientcert_save").set_sensitive(may_save) def on_sslclientcert_browse_clicked(self, widget, data=None): filechooser = FileChooser() cert = filechooser.run() if cert is not None: self.get_widget("sslclientcert_path").set_text(S(cert).display()) def run(self): self.dialog = self.get_widget("SSLClientCertPrompt") result = self.dialog.run() cert = self.get_widget("sslclientcert_path").get_text() save = self.get_widget("sslclientcert_save").get_active() self.dialog.destroy() if result == Gtk.ResponseType.OK: return (True, cert, save) else: return (False, "", False) class Property(InterfaceView): def __init__(self, name="", value="", recurse=True): InterfaceView.__init__(self, "dialogs/property", "Property") self.save_name = name self.save_value = value self.name = rabbitvcs.ui.widget.ComboBox( self.get_widget("property_name"), [ # default svn properties 'svn:author', 'svn:autoversioned', 'svn:date', 'svn:eol-style', 'svn:executable', 'svn:externals', 'svn:ignore', 'svn:keywords', 'svn:log', 'svn:mergeinfo', 'svn:mime-type', 'svn:needs-lock', 'svn:special', ] ) self.name.set_child_text(name) self.value = rabbitvcs.ui.widget.TextView( self.get_widget("property_value"), value ) self.recurse = self.get_widget("property_recurse") self.recurse.set_active(recurse) def run(self): self.dialog = self.get_widget("Property") result = self.dialog.run() if result == Gtk.ResponseType.OK: self.save() self.dialog.destroy() return (self.save_name, self.save_value, self.recurse.get_active()) def save(self): self.save_name = self.name.get_active_text() self.save_value = self.value.get_text() self.save_recurse = self.recurse.get_active() class FileChooser(object): def __init__(self, title=_("Select a File"), folder=None): self.dialog = Gtk.FileChooserDialog( title = title, parent = None, action = Gtk.FileChooserAction.OPEN) self.dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.dialog.add_button(_("_Open"), Gtk.ResponseType.OK) if folder is not None: self.dialog.set_current_folder(folder) self.dialog.set_default_response(Gtk.ResponseType.OK) def run(self): returner = None result = self.dialog.run() if result == Gtk.ResponseType.OK: returner = self.dialog.get_file().get_path() self.dialog.destroy() return returner class FileSaveAs(object): def __init__(self, title=_("Save As..."), folder=None): self.dialog = Gtk.FileChooserDialog( title = title, parent = None, action = Gtk.FileChooserAction.SAVE) self.dialog.add_button(_("_Cancel"), Gtk.ResponseType.CANCEL) self.dialog.add_button(_("_Save"), Gtk.ResponseType.OK) if folder is not None: self.dialog.set_current_folder(folder) self.dialog.set_default_response(Gtk.ResponseType.OK) def run(self): returner = None result = self.dialog.run() if result == Gtk.ResponseType.OK: returner = self.dialog.get_filename() self.dialog.destroy() return returner class Confirmation(InterfaceView): def __init__(self, message=_("Are you sure you want to continue?")): InterfaceView.__init__(self, "dialogs/confirmation", "Confirmation") self.get_widget("confirm_message").set_text(S(message).display()) def run(self): dialog = self.get_widget("Confirmation") result = dialog.run() dialog.destroy() return result class MessageBox(InterfaceView): def __init__(self, message): InterfaceView.__init__(self, "dialogs/message_box", "MessageBox") self.get_widget("messagebox_message").set_text(S(message).display()) dialog = self.get_widget("MessageBox") dialog.run() dialog.destroy() class DeleteConfirmation(InterfaceView): def __init__(self, path=None): InterfaceView.__init__(self, "dialogs/delete_confirmation", "DeleteConfirmation") if path: path = "\"%s\"" % os.path.basename(path) else: path = _("the selected item(s)") msg = self.get_widget("message").get_label().replace("%item%", path) self.get_widget("message").set_label(msg) def run(self): dialog = self.get_widget("DeleteConfirmation") result = dialog.run() dialog.destroy() return result class TextChange(InterfaceView): def __init__(self, title=None, message=""): InterfaceView.__init__(self, "dialogs/text_change", "TextChange") if title: self.get_widget("TextChange").set_title(title) self.textview = rabbitvcs.ui.widget.TextView( self.get_widget("textchange_message"), message ) def run(self): dialog = self.get_widget("TextChange") result = dialog.run() dialog.destroy() return (result, self.textview.get_text()) class OneLineTextChange(InterfaceView): def __init__(self, title=None, label=None, current_text=None): InterfaceView.__init__(self, "dialogs/one_line_text_change", "OneLineTextChange") if title: self.get_widget("OneLineTextChange").set_title(title) self.new_text = self.get_widget("new_text") self.label = self.get_widget("label") if label: self.label.set_text(S(label).display()) if current_text: self.new_text.set_text(S(current_text).display()) self.dialog = self.get_widget("OneLineTextChange") def on_key_release_event(self, widget, event, *args): # The Gtk.Dialog.response() method emits the "response" signal, # which tells Gtk.Dialog.run() asyncronously to stop. This allows the # user to press the "Return" button when done writing in the new text if Gdk.keyval_name(event.keyval) == "Return": self.dialog.response(Gtk.ResponseType.OK) def run(self): result = self.dialog.run() new_text = self.new_text.get_text() self.dialog.destroy() return (result, new_text) class NewFolder(InterfaceView): def __init__(self): InterfaceView.__init__(self, "dialogs/create_folder", "CreateFolder") self.folder_name = self.get_widget("folder_name") self.textview = rabbitvcs.ui.widget.TextView( self.get_widget("log_message"), _("Added a folder to the repository") ) self.on_folder_name_changed(self.folder_name) def on_folder_name_changed(self, widget): complete = (widget.get_text() != "") self.get_widget("ok").set_sensitive(complete) def run(self): dialog = self.get_widget("CreateFolder") dialog.set_default_response(Gtk.ResponseType.OK) result = dialog.run() fields_text = (self.folder_name.get_text(), self.textview.get_text()) dialog.destroy() if result == Gtk.ResponseType.OK: return fields_text else: return None class ErrorNotification(InterfaceView): def __init__(self, text): InterfaceView.__init__(self, "dialogs/error_notification", "ErrorNotification") notice = rabbitvcs.ui.wraplabel.WrapLabel(ERROR_NOTICE) notice.set_use_markup(True) notice_box = rabbitvcs.ui.widget.Box(self.get_widget("notice_box")) notice_box.pack_start(notice, True, True, 0) notice_box.show_all() self.textview = rabbitvcs.ui.widget.TextView( self.get_widget("error_text"), text, spellcheck=False ) self.textview.view.modify_font(Pango.FontDescription("monospace")) dialog = self.get_widget("ErrorNotification") dialog.run() dialog.destroy() class NameEmailPrompt(InterfaceView): def __init__(self): InterfaceView.__init__(self, "dialogs/name_email_prompt", "NameEmailPrompt") self.dialog = self.get_widget("NameEmailPrompt") def on_key_release_event(self, widget, event, *args): # The Gtk.Dialog.response() method emits the "response" signal, # which tells Gtk.Dialog.run() asyncronously to stop. This allows the # user to press the "Return" button when done writing in the new text if Gdk.keyval_name(event.keyval) == "Return": self.dialog.response(Gtk.ResponseType.OK) def run(self): result = self.dialog.run() name = self.get_widget("name").get_text() email = self.get_widget("email").get_text() self.dialog.destroy() if result == Gtk.ResponseType.OK: return (name, email) else: return (None, None) class MarkResolvedPrompt(InterfaceView): def __init__(self): InterfaceView.__init__(self, "dialogs/mark_resolved_prompt", "MarkResolvedPrompt") def run(self): self.dialog = self.get_widget("MarkResolvedPrompt") result = self.dialog.run() self.dialog.destroy() return result class ConflictDecision(InterfaceView): """ Provides a dialog to make conflict decisions with. User can accept mine, accept theirs, or edit conflicts. """ def __init__(self, filename=""): InterfaceView.__init__(self, "dialogs/conflict_decision", "ConflictDecision") self.get_widget("filename").set_text(S(filename).display()) def run(self): """ The first has three possible values about how to resolve the conflict. - -1 Cancel - 0 Accept Mine - 1 Accept Theirs - 2 Merge Manually """ self.dialog = self.get_widget("ConflictDecision") result = self.dialog.run() self.dialog.destroy() return result class Loading(InterfaceView): def __init__(self): InterfaceView.__init__(self, "dialogs/loading", "Loading") self.get_widget("loading_cancel").set_sensitive(False) self.pbar = rabbitvcs.ui.widget.ProgressBar( self.get_widget("pbar") ) self.pbar.start_pulsate() def on_destroy(self, widget): self.close() def on_loading_cancel_clicked(self, widget): self.close() def run(self): self.dialog = self.get_widget("Loading") self.dialog.run() def destroy(self): self.dialog.destroy() rabbitvcs-0.18/rabbitvcs/ui/diff.py000066400000000000000000000231311362112712700173010ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from shutil import rmtree import tempfile from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, Gdk, GLib sa.restore() from rabbitvcs import TEMP_DIR_PREFIX from rabbitvcs.ui import InterfaceNonView import rabbitvcs.vcs from rabbitvcs.ui.action import SVNAction, GitAction from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.diff") from rabbitvcs import gettext _ = gettext.gettext class Diff(InterfaceNonView): def __init__(self, path1, revision1=None, path2=None, revision2=None, sidebyside=False): InterfaceNonView.__init__(self) self.vcs = rabbitvcs.vcs.VCS() self.path1 = path1 self.path2 = path2 self.sidebyside = sidebyside self.temp_dir = tempfile.mkdtemp(prefix=TEMP_DIR_PREFIX) if path2 is None: self.path2 = path1 self.dialog = None def launch(self): try: if self.sidebyside: self.launch_sidebyside_diff() else: self.launch_unified_diff() finally: self.stop_loading() def _build_export_path(self, index, revision, path): dest = helper.get_tmp_path("rabbitvcs-%s-%s-%s" % (str(index), str(revision)[:5], os.path.basename(path))) if os.path.exists(dest): if os.path.isdir(dest): rmtree(dest, ignore_errors=True) else: os.remove(dest) return dest def start_loading(self): self.dialog = rabbitvcs.ui.dialog.Loading() self.dialog.run() def stop_loading(self): # Sometimes the launching will be too fast, and the dialog we're trusted with # cleaning up, may not even have been created! while self.dialog == None: # Wait for dialog's creation. pass self.dialog.close() self.dialog = None class SVNDiff(Diff): def __init__(self, path1, revision1=None, path2=None, revision2=None, sidebyside=False): Diff.__init__(self, path1, revision1, path2, revision2, sidebyside) self.svn = self.vcs.svn() self.revision1 = self.get_revision_object(revision1, "base") self.revision2 = self.get_revision_object(revision2, "working") GLib.idle_add(self.launch) self.start_loading() def get_revision_object(self, value, default): # If value is a rabbitvcs Revision object, return it if hasattr(value, "is_revision_object"): return value # If value is None, use the default if value is None: return self.svn.revision(default) # If the value is an integer number, return a numerical revision object # otherwise, a string revision value has been passed, use that as "kind" try: value = int(value) return self.svn.revision("number", value) except ValueError: # triggered when passed a string return self.svn.revision(value) def launch_unified_diff(self): """ Launch diff as a unified diff in a text editor or .diff viewer """ action = SVNAction( self.svn, notification=False, run_in_thread=False ) diff_text = action.run_single( self.svn.diff, self.temp_dir, self.path1, self.revision1, self.path2, self.revision2 ) if diff_text is None: diff_text = "" fh = tempfile.mkstemp("-rabbitvcs-" + str(self.revision1) + "-" + str(self.revision2) + ".diff") os.write(fh[0], S(diff_text).bytes()) os.close(fh[0]) helper.open_item(fh[1]) def launch_sidebyside_diff(self): """ Launch diff as a side-by-side comparison using our comparison tool """ action = SVNAction( self.svn, notification=False, run_in_thread=False ) if self.revision1.kind == "working": dest1 = self.path1 else: dest1 = self._build_export_path(1, self.revision1, self.path1) action.run_single( self.svn.export, self.path1, dest1, self.revision1 ) action.stop_loader() if self.revision2.kind == "working": dest2 = self.path2 else: dest2 = self._build_export_path(2, self.revision2, self.path2) action.run_single( self.svn.export, self.path2, dest2, self.revision2 ) action.stop_loader() helper.launch_diff_tool(dest1, dest2) class GitDiff(Diff): def __init__(self, path1, revision1=None, path2=None, revision2=None, sidebyside=False): Diff.__init__(self, path1, revision1, path2, revision2, sidebyside) self.git = self.vcs.git(path1) self.revision1 = self.get_revision_object(revision1, "HEAD") self.revision2 = self.get_revision_object(revision2, "WORKING") GLib.idle_add(self.launch) self.start_loading() def get_revision_object(self, value, default): # If value is a rabbitvcs Revision object, return it if hasattr(value, "is_revision_object"): return value value_to_pass = value if not value_to_pass: value_to_pass = default # triggered when passed a string return self.git.revision(value_to_pass) def save_diff_to_file(self, path, data): dirname = os.path.dirname(path) if not os.path.isdir(dirname): os.makedirs(dirname) if not data: data = "" file = open(path, "wb") try: try: file.write(S(data).bytes()) except Exception as e: log.exception(e) finally: file.close() def launch_unified_diff(self): """ Launch diff as a unified diff in a text editor or .diff viewer """ action = GitAction( self.git, notification=False, run_in_thread=False ) diff_text = action.run_single( self.git.diff, self.path1, self.revision1, self.path2, self.revision2 ) if diff_text is None: diff_text = "" fh = tempfile.mkstemp("-rabbitvcs-" + str(self.revision1)[:5] + "-" + str(self.revision2)[:5] + ".diff") os.write(fh[0], S(diff_text).bytes()) os.close(fh[0]) helper.open_item(fh[1]) def launch_sidebyside_diff(self): """ Launch diff as a side-by-side comparison using our comparison tool """ action = GitAction( self.git, notification=False, run_in_thread=False ) if self.revision1.kind != "WORKING": dest1 = self._build_export_path(1, self.revision1, self.path1) self.save_diff_to_file(dest1, action.run_single( self.git.show, self.path1, self.revision1 )) else: dest1 = self.path1 if self.revision2.kind != "WORKING": dest2 = self._build_export_path(2, self.revision2, self.path2) self.save_diff_to_file(dest2, action.run_single( self.git.show, self.path2, self.revision2 )) else: dest2 = self.path2 helper.launch_diff_tool(dest1, dest2) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNDiff, rabbitvcs.vcs.VCS_GIT: GitDiff } def diff_factory(vcs, path1, revision_obj1, path2=None, revision_obj2=None, sidebyside=False): if not vcs: guess = rabbitvcs.vcs.guess(path1) vcs = guess["vcs"] return classes_map[vcs](path1, revision_obj1, path2, revision_obj2, sidebyside) if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main([ (["-s", "--sidebyside"], { "help": _("View diff as side-by-side comparison"), "action": "store_true", "default": False }), VCS_OPT], usage="Usage: rabbitvcs diff [url1@rev1] [url2@rev2]" ) pathrev1 = helper.parse_path_revision_string(args.pop(0)) pathrev2 = (None, None) if len(args) > 0: pathrev2 = helper.parse_path_revision_string(args.pop(0)) diff_factory(options.vcs, pathrev1[0], pathrev1[1], pathrev2[0], pathrev2[1], sidebyside=options.sidebyside) rabbitvcs-0.18/rabbitvcs/ui/editconflicts.py000066400000000000000000000130611362112712700212240ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import os.path import six.moves._thread import shutil from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.editconflicts") from rabbitvcs import gettext _ = gettext.gettext class SVNEditConflicts(InterfaceNonView): def __init__(self, path): InterfaceNonView.__init__(self) log.debug("incoming path: %s"%path) self.path = path self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() status = self.svn.status(self.path) if status.simple_content_status() != rabbitvcs.vcs.status.status_complicated: log.debug("The specified file is not conflicted. There is nothing to do.") self.close() return filename = os.path.basename(path) dialog = rabbitvcs.ui.dialog.ConflictDecision(filename) action = dialog.run() dialog.destroy() if action == -1: #Cancel pass elif action == 0: #Accept Mine working = self.get_working_path(path) shutil.copyfile(working, path) self.svn.resolve(path) elif action == 1: #Accept Theirs ancestor, theirs = self.get_revisioned_paths(path) shutil.copyfile(theirs, path) self.svn.resolve(path) elif action == 2: #Merge Manually working = self.get_working_path(path) ancestor, theirs = self.get_revisioned_paths(path) log.debug("launching merge tool with base: %s, mine: %s, theirs: %s, merged: %s"%(ancestor, working, theirs, path)) helper.launch_merge_tool(base=ancestor, mine=working, theirs=theirs, merged=path) dialog = rabbitvcs.ui.dialog.MarkResolvedPrompt() mark_resolved = dialog.run() dialog.destroy() if mark_resolved == 1: self.svn.resolve(path) self.close() def get_working_path(self, path): paths = [ "%s.mine" % path, "%s.working" % path ] for working in paths: if os.path.exists(working): return working return path def get_revisioned_paths(self, path): """ Will return a tuple where the first element is the common ancestor's path and the second is the path of the the file being merged in.""" ancestorPath = "" theirsPath = "" revisionPaths = [] baseDir, baseName = os.path.split(path) log.debug("baseDir: %s, baseName: %s"%(baseDir, baseName)) for name in os.listdir(baseDir): if baseName in name: extension = name.split(".")[-1] log.debug("extension: %s"%extension) if extension.startswith("r"): revision = extension[1:] log.debug("revision: %s"%revision) revisionPaths.append((revision,name)) if len(revisionPaths) == 2: if revisionPaths[0][0] < revisionPaths[1][0]: ancestorPath = os.path.join(baseDir, revisionPaths[0][1]) theirsPath = os.path.join(baseDir, revisionPaths[1][1]) else: ancestorPath = os.path.join(baseDir, revisionPaths[1][1]) theirsPath = os.path.join(baseDir, revisionPaths[0][1]) return (ancestorPath, theirsPath) else: log.error("Unexpected number (%d) of revision paths found"%len(revisionPaths)) return ("", "") class GitEditConflicts(InterfaceNonView): def __init__(self, path): InterfaceNonView.__init__(self) self.path = path self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) helper.launch_merge_tool(self.path) self.close() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNEditConflicts, rabbitvcs.vcs.VCS_GIT: GitEditConflicts } def editconflicts_factory(path): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs edit-conflicts [path1] [path2] ..." ) window = editconflicts_factory(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/export.py000066400000000000000000000166431362112712700177240ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.checkout import SVNCheckout from rabbitvcs.ui.clone import GitClone from rabbitvcs.ui.dialog import MessageBox from rabbitvcs.ui.action import SVNAction, GitAction from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class SVNExport(SVNCheckout): def __init__(self, path=None, revision=None): SVNCheckout.__init__(self, path, url=None, revision=revision) self.svn = self.vcs.svn() self.get_widget("Checkout").set_title(_("Export - %s") % path) # Determine behavior based on the given path if self.svn.is_in_a_or_a_working_copy(path): # If path is from a working copy, export FROM path and set revision # to working copy self.repositories.set_child_text(path) self.get_widget("destination").set_text("") if revision is None: self.revision_selector.set_kind_working() elif self.svn.is_path_repository_url(path): # If path is a repository, export FROM path self.repositories.set_child_text(path) self.get_widget("destination").set_text("") else: # Path is not a working copy so the user probably wants to export # TO this path self.repositories.set_child_text("") self.get_widget("destination").set_text(S(path).display()) def on_ok_clicked(self, widget): url = self.repositories.get_active_text() path = self._get_path() omit_externals = self.get_widget("omit_externals").get_active() recursive = self.get_widget("recursive").get_active() if not url or not path: MessageBox(_("The repository URL and destination path are both required fields.")) return if url.startswith("file://"): url = self._parse_path(url) # Cannot do: # url = os.path.normpath(url) # ...in general, since it might be eg. an http URL. Doesn't seem to # affect pySvn though. path = os.path.normpath(path) revision = self.revision_selector.get_revision_object() self.hide() self.action = SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Export")) self.action.append(self.action.set_status, _("Running Export Command...")) self.action.append(helper.save_repository_path, url) self.action.append( self.svn.export, url, path, force=True, recurse=recursive, revision=revision, ignore_externals=omit_externals ) self.action.append(self.action.set_status, _("Completed Export")) self.action.append(self.action.finish) self.action.schedule() class GitExport(GitClone): def __init__(self, path=None, revision=None): self.vcs = rabbitvcs.vcs.VCS() self.git = None guess = rabbitvcs.vcs.guess(path) if guess["vcs"] == rabbitvcs.vcs.VCS_GIT: self.git = self.vcs.git(path) export_to = "" export_from = path else: export_to = path export_from = "" GitClone.__init__(self, export_to, export_from) self.get_widget("Checkout").set_title(_("Export - %s") % path) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.git, revision=revision, url_combobox=self.repositories, expand=True ) self.get_widget("revision_selector_box").show() def on_ok_clicked(self, widget): url = self.repositories.get_active_text() path = self._get_path() if not url or not path: MessageBox(_("The repository URL and destination path are both required fields.")) return if url.startswith("file://"): url = self._parse_path(url) # Cannot do: # url = os.path.normpath(url) # ...in general, since it might be eg. an http URL. Doesn't seem to # affect pySvn though. path = os.path.normpath(path) revision = self.revision_selector.get_revision_object() self.hide() self.action = GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Export")) self.action.append(self.action.set_status, _("Running Export Command...")) self.action.append(helper.save_repository_path, url) self.action.append( self.git.export, url, path, revision=revision ) self.action.append(self.action.set_status, _("Completed Export")) self.action.append(self.action.finish) self.action.schedule() def on_repositories_changed(self, widget, data=None): # Do not use quoting for this bit url = self.repositories.get_active_text() tmp = url.replace("//", "/").split("/")[1:] append = "" prev = "" while len(tmp): prev = append append = tmp.pop() if append not in ("trunk", "branches", "tags"): break if append in ("http:", "https:", "file:", "svn:", "svn+ssh:"): append = "" break self.get_widget("destination").set_text( S(os.path.join(self.destination, append)).display() ) self.check_form() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNExport, rabbitvcs.vcs.VCS_GIT: GitExport } def export_factory(vcs, path, revision=None): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] if vcs == rabbitvcs.vcs.VCS_DUMMY: vcs = rabbitvcs.vcs.VCS_SVN return classes_map[vcs](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs export --vcs=[git|svn] [url_or_path]" ) window = export_factory(options.vcs, paths[0], revision=options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/ignore.py000066400000000000000000000077001362112712700176600ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from os import getcwd import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView, InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class SVNIgnore(InterfaceNonView): """ This class provides a handler to Ignore functionality. """ def __init__(self, path, pattern, glob=False): """ @type path: string @param path: The path to apply the ignore keyword to @type pattern: string @param pattern: Ignore items with the given pattern @type glob: boolean @param glob: True if the path to ignore is a wildcard "glob" """ InterfaceNonView.__init__(self) self.path = path self.pattern = pattern self.glob = glob self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() prop = self.svn.PROPERTIES["ignore"] self.svn.propset(self.path, prop, self.pattern, recurse=self.glob) raise SystemExit() class GitIgnore(InterfaceView): def __init__(self, path, pattern=""): InterfaceView.__init__(self, "ignore", "Ignore") self.path = path self.pattern = pattern self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) ignore_files = self.git.get_ignore_files(path) ignore_file_labels = [] path_dir = os.path.abspath(self.path) if os.path.isfile(path_dir): path_dir = os.path.dirname(path_dir) for ignore_file in ignore_files: label = path if ignore_file.startswith(path_dir): label = ignore_file[len(path_dir)+1:] ignore_file_labels.append(label) text = "" if pattern != path: text = pattern self.file_editor = rabbitvcs.ui.widget.MultiFileTextEditor( self.get_widget("fileeditor_container"), _("Ignore file:"), ignore_file_labels, ignore_files, show_add_line=True, line_content=text ) def on_ok_clicked(self, widget, data=None): self.file_editor.save() self.close() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNIgnore, rabbitvcs.vcs.VCS_GIT: GitIgnore } def ignore_factory(path, pattern): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path, pattern) if __name__ == "__main__": from rabbitvcs.ui import main (options, args) = main(usage="Usage: rabbitvcs ignore ") path = getcwd() pattern = "" if args: if len(args) == 1: pattern = args[0] else: if args[0] != ".": path = args[0] pattern = args[1] window = ignore_factory(path, pattern) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/import.py000077500000000000000000000070261362112712700177130ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog from rabbitvcs.util.strings import S from rabbitvcs import gettext _ = gettext.gettext class SVNImport(InterfaceView): def __init__(self, path): InterfaceView.__init__(self, "import", "Import") self.get_widget("Import").set_title(_("Import - %s") % path) self.path = path self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() if self.svn.is_in_a_or_a_working_copy(path): self.get_widget("repository").set_text(S(self.svn.get_repo_url(path)).display()) self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("repositories"), helper.get_repository_paths() ) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message") ) def on_ok_clicked(self, widget): url = self.get_widget("repository").get_text() if not url: rabbitvcs.ui.dialog.MessageBox(_("The repository URL field is required.")) return ignore = not self.get_widget("include_ignored").get_active() self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Import")) self.action.append(self.action.set_status, _("Running Import Command...")) self.action.append( self.svn.import_, self.path, url, self.message.get_text(), ignore=ignore ) self.action.append(self.action.set_status, _("Completed Import")) self.action.append(self.action.finish) self.action.schedule() def on_previous_messages_clicked(self, widget, data=None): dialog = rabbitvcs.ui.dialog.PreviousMessages() message = dialog.run() if message is not None: self.message.set_text(S(message).display()) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNImport } def import_factory(path): vcs = rabbitvcs.vcs.VCS_SVN return classes_map[vcs](path) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs import [path]") window = import_factory(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/lock.py000077500000000000000000000144671362112712700173400ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread import os from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction from rabbitvcs.util.contextmenu import GtkFilesContextMenu, GtkContextMenuCaller import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.lock") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() class SVNLock(InterfaceView, GtkContextMenuCaller): """ Provides an interface to lock any number of files in a working copy. """ def __init__(self, paths, base_dir): """ @type: paths: list @param: paths: A list of paths to search for versioned files """ InterfaceView.__init__(self, "lock", "Lock") self.paths = paths self.base_dir = base_dir self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, _("Path"), _("Extension"), _("Locked")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 2 } }], callbacks={ "mouse-event": self.on_files_table_mouse_event } ) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message") ) self.items = None self.initialize_items() # # Helper functions # # Overrides the GtkContextMenuCaller method def on_context_menu_command_finished(self): self.initialize_items() def initialize_items(self): """ Initializes the activated cache and loads the file items in a new thread """ try: six.moves._thread.start_new_thread(self.load, ()) except Exception as e: log.exception(e) def load(self): self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths) self.populate_files_table() self.get_widget("status").set_text(_("Found %d item(s)") % len(self.items)) def populate_files_table(self): for item in self.items: locked = "" if self.svn.is_locked(item.path): locked = _("Yes") if not self.svn.is_versioned(item.path): continue self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path), locked ]) def show_files_table_popup_menu(self, treeview, data): paths = self.files_table.get_selected_row_items(1) GtkFilesContextMenu(self, data, self.base_dir, paths).show() # # UI Signal Callbacks # def on_ok_clicked(self, widget, data=None): steal_locks = self.get_widget("steal_locks").get_active() items = self.files_table.get_activated_rows(1) if not items: self.close() return message = self.message.get_text() self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Get Lock")) self.action.append(self.action.set_status, _("Running Lock Command...")) self.action.append(helper.save_log_message, message) for path in items: self.action.append( self.svn.lock, path, message, force=steal_locks ) self.action.append(self.action.set_status, _("Completed Lock")) self.action.append(self.action.finish) self.action.schedule() def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_files_table_popup_menu(treeview, event) def on_select_all_toggled(self, widget, data=None): for row in self.files_table.get_items(): row[0] = self.get_widget("select_all").get_active() def on_previous_messages_clicked(self, widget, data=None): dialog = rabbitvcs.ui.dialog.PreviousMessages() message = dialog.run() if message is not None: self.message.set_text(S(message).display()) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNLock } def lock_factory(paths, base_dir): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs lock [path1] [path2] ..." ) window = lock_factory(paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/log.py000077500000000000000000001552441362112712700171700ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from __future__ import division from __future__ import absolute_import import six import threading from locale import strxfrm import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction, vcs_action_factory from rabbitvcs.ui.dialog import MessageBox import rabbitvcs.ui.widget from rabbitvcs.util.contextmenu import GtkContextMenu from rabbitvcs.util.contextmenuitems import * from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs.util.strings import S import rabbitvcs.util.settings import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext from six.moves import range REVISION_LABEL = _("Revision") DATE_LABEL = _("Date") AUTHOR_LABEL = _("Author") def revision_grapher(history): """ Expects a list of revision items like so: [ item.commit = "..." item.parents = ["...", "..."] ] Output can be put directly into the CellRendererGraph """ items = [] revisions = [] last_lines = [] color = "#d3b9d3" for item in history: commit = S(item.revision) parents = [] for parent in item.parents: parents.append(S(parent)) if commit not in revisions: revisions.append(commit) index = revisions.index(commit) next_revisions = revisions[:] parents_to_add = [] for parent in parents: if parent not in next_revisions: parents_to_add.append(parent) next_revisions[index:index+1] = parents_to_add lines = [] for i, revision in enumerate(revisions): if revision in next_revisions: lines.append((i, next_revisions.index(revision), color)) elif revision == commit: for parent in parents: lines.append((i, next_revisions.index(parent), color)) node = (index, "#a9f9d2") items.append((item, node, last_lines, lines)) revisions = next_revisions last_lines = lines return items class Log(InterfaceView): """ Provides an interface to the Log UI """ selected_rows = [] selected_row = [] paths_selected_rows = [] display_items = [] limit = 100 def __init__(self, path): """ @type path: string @param path: A path for which to get log items """ InterfaceView.__init__(self, "log", "Log") self.get_widget("Log").set_title(_("Log - %s") % path) self.vcs = rabbitvcs.vcs.VCS() sm = rabbitvcs.util.settings.SettingsManager() self.datetime_format = sm.get("general", "datetime_format") self.filter_text = None self.path = path self.cache = LogCache() self.rev_first = None self.rev_start = None self.rev_end = None self.rev_max = 1 self.previous_starts = [] self.initialize_revision_labels() self.revision_number_column = 0 self.head_row = 0 self.get_widget("limit").set_text(S(self.limit).display()) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message") ) self.stop_on_copy = False self.revision_clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) # # UI Signal Callback Methods # def on_destroy(self, widget, data=None): self.destroy() def on_close_clicked(self, widget, data=None): if self.is_loading: self.action.set_cancel(True) self.action.stop() self.set_loading(False) self.close() def on_key_pressed(self, widget, event, *args): InterfaceView.on_key_pressed(self, widget, event) if (event.state & Gdk.ModifierType.CONTROL_MASK and Gdk.keyval_name(event.keyval).lower() == "c"): if len(self.revisions_table.get_selected_rows()) > 0: self.copy_revision_text() def on_stop_on_copy_toggled(self, widget): self.stop_on_copy = self.get_widget("stop_on_copy").get_active() if not self.is_loading: self.refresh() def on_refresh_clicked(self, widget): self.limit = int(self.get_widget("limit").get_text()) self.cache.empty() self.load() def on_search(self, widget): tb = self.get_widget("search_buffer") self.filter_text = tb.get_text(tb.get_start_iter(), tb.get_end_iter()).lower() self.refresh() # # Revisions table callbacks # # In this UI, we have an ability to filter and display only certain items. def get_displayed_row_items(self, col): items = [] for row in self.selected_rows: items.append(self.display_items[row][col]) return items def on_revisions_table_row_activated(self, treeview, event, col): paths = self.revisions_table.get_displayed_row_items(1) helper.launch_diff_tool(*paths) def on_revisions_table_mouse_event(self, treeview, event, *args): if len(self.revisions_table.get_selected_rows()) == 0: self.message.set_text("") self.paths_table.clear() return if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_revisions_table_popup_menu(treeview, event) self.paths_table.clear() self.message.set_text("") self.update_revision_message() # # Paths table callbacks # def on_paths_table_row_activated(self, treeview, data=None, col=None): try: revision1 = S(self.display_items[self.revisions_table.get_selected_rows()[0]].revision) revision2 = S(self.display_items[self.revisions_table.get_selected_rows()[0]+1].revision) path_item = self.paths_table.get_row(self.paths_table.get_selected_rows()[0])[1] url = self.root_url + path_item self.view_diff_for_path(url, S(revision1), S(revision2), sidebyside=True) except IndexError: pass def on_paths_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_paths_table_popup_menu(treeview, event) def show_paths_table_popup_menu(self, treeview, event): revisions = [] for row in self.revisions_table.get_selected_rows(): line = { "revision": self.display_items[row].revision, "author": self.display_items[row].author, "message": self.display_items[row].message } if self.display_items[row].parents: line["parents"] = self.display_items[row].parents try: line["next_revision"] = self.display_items[row+1].revision except IndexError as e: pass try: line["previous_revision"] = self.display_items[row-1].revision except IndexError as e: pass revisions.append(line) revisions.reverse() paths = [] for row in self.paths_table.get_selected_rows(): paths.append(self.paths_table.get_row(row)[1]) LogBottomContextMenu(self, event, paths, revisions).show() # # Helper methods # def load_or_refresh(self): if self.cache.has(self.rev_start): self.refresh() else: self.load() def get_selected_revision_numbers(self): if len(self.revisions_table.get_selected_rows()) == 0: return "" revisions = [] for row in self.revisions_table.get_selected_rows(): revisions.append(int(self.revisions_table.get_row(row)[self.revision_number_column])) revisions.sort() helper.encode_revisions(revisions) def get_selected_revision_number(self): if len(self.revisions_table.get_selected_rows()): return self.revisions_table.get_row(self.revisions_table.get_selected_rows()[0])[self.revision_number_column] else: return "" @gtk_unsafe def set_start_revision(self, rev): self.get_widget("start").set_text(S(rev).display()) @gtk_unsafe def set_end_revision(self, rev): self.get_widget("end").set_text(S(rev).display()) def initialize_revision_labels(self): self.set_start_revision(_("N/A")) self.set_end_revision(_("N/A")) def set_loading(self, loading): self.is_loading = loading def show_revisions_table_popup_menu(self, treeview, data): revisions = [] for row in self.revisions_table.get_selected_rows(): line = { "revision": self.display_items[row].revision, "author": self.display_items[row].author, "message": self.display_items[row].message } try: line["next_revision"] = self.display_items[row+1].revision except IndexError as e: pass try: line["previous_revision"] = self.display_items[row-1].revision except IndexError as e: pass revisions.append(line) LogTopContextMenu(self, data, self.path, revisions).show() # # Other helper methods # def view_diff_for_path(self, url, revision1, revision2=None, sidebyside=False): if revision2 == None: revision2 = revision1 options = [ "%s@%s" % (url, revision2), "%s@%s" % (url, revision1), "--vcs=%s" % self.get_vcs_name() ] if sidebyside: options += ["-s"] helper.launch_ui_window("diff", options) def get_vcs_name(self): vcs = rabbitvcs.vcs.VCS_DUMMY if hasattr(self, "svn"): vcs = rabbitvcs.vcs.VCS_SVN elif hasattr(self, "git"): vcs = rabbitvcs.vcs.VCS_GIT return vcs class SVNLog(Log): def __init__(self, path, merge_candidate_revisions=None): Log.__init__(self, path) self.svn = self.vcs.svn() self.merge_candidate_revisions = merge_candidate_revisions self.revisions_table = rabbitvcs.ui.widget.Table( self.get_widget("revisions_table"), [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_HIDDEN], [_("Revision"), _("Author"), _("Date"), _("Message"), _("Color")], callbacks={ "mouse-event": self.on_revisions_table_mouse_event } ) for i in range(4): column = self.revisions_table.get_column(i) cell = column.get_cells()[0] column.add_attribute(cell, 'foreground', 4) self.paths_table = rabbitvcs.ui.widget.Table( self.get_widget("paths_table"), [GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Action"), "", _("Path"), _("Copy From Path"), _("Copy From Revision")], callbacks={ "mouse-event": self.on_paths_table_mouse_event, "row-activated": self.on_paths_table_row_activated }, flags={ "sortable": True, "sort_on": 2 } ) self.initialize_root_url() self.load_or_refresh() def initialize_root_url(self): action = SVNAction( self.svn, notification=False, run_in_thread=False ) self.root_url = action.run_single( self.svn.get_repo_root_url, self.path ) # # Log-loading callback methods # def refresh(self): """ Refresh the items in the main log table that shows Revision/Author/etc. """ self.revision_items = [] self.revisions_table.clear() self.message.set_text("") self.paths_table.clear() if self.rev_start and self.cache.has(self.rev_start): self.revision_items = self.cache.get(self.rev_start) else: # Make sure the int passed is the order the log call was made self.revision_items = self.action.get_result(0) if not self.revision_items or len(self.revision_items) == 0: return # Get the starting/ending point from the actual returned revisions self.rev_start = int(S(self.revision_items[0].revision)) self.rev_end = int(S(self.revision_items[-1].revision)) if not self.rev_first: self.rev_first = self.rev_start self.cache.set(self.rev_start, self.revision_items) # The first time the log items return, the rev_start will be as large # as it will ever be. So set this to our maximum revision. if self.rev_start > self.rev_max: self.rev_max = self.rev_start self.display_items = [] for item in self.revision_items: msg = helper.html_escape(item.message).lower() should_add = not self.filter_text should_add = should_add or msg.find(self.filter_text) > -1 should_add = should_add or item.author.lower().find(self.filter_text) > -1 should_add = should_add or str(item.revision).lower().find(self.filter_text) > -1 should_add = should_add or str(item.date).lower().find(self.filter_text) > -1 if should_add: self.display_items.append(item) self.set_start_revision(self.rev_start) self.set_end_revision(self.rev_end) self.check_previous_sensitive() self.check_next_sensitive() for item in self.display_items: msg = helper.format_long_text(item.message, cols = 80, line1only = True) rev = item.revision color = "#000000" if (self.merge_candidate_revisions != None and int(rev.short()) not in self.merge_candidate_revisions): color = "#c9c9c9" self.populate_table(rev, item.author, item.date, msg, color) # Stop on copy after adding the item to the table # so the user can look at the item that was copied if self.stop_on_copy: for path in item.changed_paths: if path.copy_from_path or path.copy_from_revision: self.set_loading(False) return self.set_loading(False) def populate_table(self, revision, author, date, msg, color): self.revisions_table.append([ S(revision), author, helper.format_datetime(date, self.datetime_format), msg, color ]) def load(self): self.set_loading(True) self.action = SVNAction( self.svn, notification=False ) start = self.svn.revision("head") if self.rev_start: start = self.svn.revision("number", number=self.rev_start) self.action.append( self.svn.log, self.path, revision_start=start, limit=self.limit, discover_changed_paths=True ) self.action.append(self.refresh) self.action.schedule() def edit_revprop(self, prop_name, prop_value, callback=None): failure = False url = S(self.svn.get_repo_url(self.path)) self.action = SVNAction( self.svn, notification=False ) for row in self.revisions_table.get_selected_rows(): item = self.display_items[row] self.action.append( self.svn.revpropset, prop_name, prop_value, url, item.revision ) self.action.append(callback, row, prop_value) self.action.schedule() @gtk_unsafe def on_log_message_edited(self, index, val): self.display_items[index].message = val self.revisions_table.set_row_item(index, 3, val) self.message.set_text(S(val).display()) @gtk_unsafe def on_author_edited(self, index, val): self.display_items[index].author = val self.revisions_table.set_row_item(index, 1, val) def copy_revision_text(self): text = "" for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] text += "%s: %s\n" % (REVISION_LABEL, S(item.revision).display()) text += "%s: %s\n" % (AUTHOR_LABEL, S(item.author).display()) text += "%s: %s\n" % (DATE_LABEL, S(item.date).display()) text += "%s\n\n" % S(item.message).display() if item.changed_paths is not None: for subitem in item.changed_paths: text += "%s\t%s" % (S(subitem.action).display(), S(subitem.path).display()) if subitem.copy_from_path or subitem.copy_from_revision: text += " (Copied from %s %s)" % (S(subitem.copy_from_path).display(), S(subitem.copy_from_revision).display()) text += "\n" text += "\n\n\n" self.revision_clipboard.set_text(text, -1) def update_revision_message(self): combined_paths = [] subitems = [] for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] msg = S(item.message).display() if len(self.revisions_table.get_selected_rows()) == 1: self.message.set_text(msg) else: indented_message = msg.replace("\n","\n\t") self.message.append_text( "%s %s:\n\t%s\n" % (REVISION_LABEL, S(item.revision).display(), indented_message)) if item.changed_paths is not None: for subitem in item.changed_paths: if subitem.path not in combined_paths: combined_paths.append(subitem.path) subitems.append([ subitem.action, subitem.path, subitem.copy_from_path, S(subitem.copy_from_revision) ]) subitems.sort(key = lambda x: strxfrm(x[1])) for subitem in subitems: self.paths_table.append([ subitem[0], S(subitem[1]), subitem[1], subitem[2], S(subitem[3]) ]) def on_previous_clicked(self, widget): self.rev_start = self.previous_starts.pop() self.load_or_refresh() def on_next_clicked(self, widget): self.previous_starts.append(self.rev_start) self.rev_start = int(self.rev_end) - 1 if self.rev_start < 1: self.rev_start = 1 self.load_or_refresh() def check_previous_sensitive(self): sensitive = (self.rev_start < self.rev_max) self.get_widget("previous").set_sensitive(sensitive) def check_next_sensitive(self): sensitive = True if self.rev_end == 1: sensitive = False if len(self.revision_items) < self.limit: sensitive = False self.get_widget("next").set_sensitive(sensitive) class GitLog(Log): def __init__(self, path): Log.__init__(self, path) self.git = self.vcs.git(path) self.limit = 500 self.get_widget("stop_on_copy").hide() self.revision_number_column = 1 self.revisions_table = rabbitvcs.ui.widget.Table( self.get_widget("revisions_table"), [rabbitvcs.ui.widget.TYPE_GRAPH, GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_MARKUP, rabbitvcs.ui.widget.TYPE_MARKUP, rabbitvcs.ui.widget.TYPE_MARKUP], [_("Graph"), _("Revision"), _("Author"), _("Date"), _("Message")], filters=[{ "callback": rabbitvcs.ui.widget.git_revision_filter, "user_data": { "column": 1 } }], callbacks={ "mouse-event": self.on_revisions_table_mouse_event } ) self.paths_table = rabbitvcs.ui.widget.Table( self.get_widget("paths_table"), [GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, GObject.TYPE_STRING], [_("Action"), "", _("Path")], callbacks={ "mouse-event": self.on_paths_table_mouse_event, "row-activated": self.on_paths_table_row_activated }, flags={ "sortable": False } ) self.start_point = 0 self.initialize_root_url() self.load_or_refresh() # # Log-loading callback methods # def refresh(self): """ Refresh the items in the main log table that shows Revision/Author/etc. """ self.revisions_table.clear() helper.run_in_main_thread(self.message.set_text, "") self.paths_table.clear() # Make sure the int passed is the order the log call was made self.revision_items = self.action.get_result(0) if not self.revision_items or len(self.revision_items) == 0: return # Load tags. self.tagItems = [] for tag in self.tagAction.get_result(0): name = tag.name # Determine the type of tag, so we know which id to use. if "Tag" in str([tag.obj]): # Tag object, use the dereferenced id. id = tag.obj.object[1] else: # Commit object, use the sha id. id = tag.sha # Add tags to list so we can match on id and display in the message. self.tagItems.append({'id': id, 'name': name}) # Load branches. self.branchItems = [] for branch in self.branchAction.get_result(0): if branch.name.startswith("remotes/"): branch.name = branch.name[len("remotes/"):] self.branchItems.append({'id': branch.revision, 'name': branch.name}) self.set_start_revision(self.revision_items[0].revision.short()) self.set_end_revision(self.revision_items[-1].revision.short()) self.display_items = [] for item in self.revision_items: msg = item.message.lower() should_add = not self.filter_text should_add = should_add or msg.find(self.filter_text) > -1 should_add = should_add or item.author.lower().find(self.filter_text) > -1 should_add = should_add or S(item.revision).lower().find(self.filter_text) > -1 should_add = should_add or str(item.date).lower().find(self.filter_text) > -1 if should_add: self.display_items.append(item) grapher = revision_grapher(self.display_items) max_columns = 1 for (item, node, in_lines, out_lines) in grapher: if max_columns < len(out_lines): max_columns = len(out_lines) # Set the graph column width if not self.filter_text: graph_width = 21 * max_columns if graph_width < 55: graph_width = 55 graph_column = self.revisions_table.get_column(0) graph_column.set_fixed_width(graph_width) index = 0 for (item, node, in_lines, out_lines) in grapher: revision = S(item.revision) msg = helper.html_escape(helper.format_long_text(item.message, cols = 80, line1only = True)) author = item.author date = helper.format_datetime(item.date, self.datetime_format) if item.head: self.head_row = index msg = "%s" % msg author = "%s" % author date = "%s" % date graph_render = {} if not self.filter_text: graph_render = { "node": node, "in_lines": in_lines, "out_lines": out_lines } # Check if a branch is available for this revision, and if so, insert it in the message description. for branch in self.branchItems: if branch['id'] == revision: msg = "[" + branch['name'] + "] " + msg # Check if a tag is available for this revision, and if so, insert it in the message description. for tag in self.tagItems: if tag['id'] == revision: msg = "[" + tag['name'] + "] " + msg self.revisions_table.append([ graph_render, revision, author, date, msg ]) index += 1 self.check_previous_sensitive() self.check_next_sensitive() self.set_loading(False) def load(self): self.set_loading(True) # Load branches. self.branchAction = GitAction( self.git, notification=False, run_in_thread=True ) self.branchAction.append(self.git.branch_list) self.branchAction.schedule(); # Load tags. self.tagAction = GitAction( self.git, notification=False, run_in_thread=True ) self.tagAction.append(self.git.tag_list) self.tagAction.schedule() # Load log. self.action = GitAction( self.git, notification=False, run_in_thread=True ) self.action.append( self.git.log, path=self.path, skip=self.start_point, limit=self.limit+1 ) self.action.append(self.refresh) self.action.schedule() def copy_revision_text(self): text = "" for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] text += "%s: %s\n" % (REVISION_LABEL, S(item.revision.short()).display()) text += "%s: %s\n" % (AUTHOR_LABEL, S(item.author).display()) text += "%s: %s\n" % (DATE_LABEL, S(item.date).display()) text += "%s\n\n" % S(item.message).display() self.revision_clipboard.set_text(text, -1) def update_revision_message(self): combined_paths = [] subitems = [] for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] msg = S(item.message).display() if len(self.revisions_table.get_selected_rows()) == 1: self.message.set_text(msg) else: indented_message = msg.replace("\n","\n\t") self.message.append_text( "%s %s:\n\t%s\n" % (REVISION_LABEL, item.revision.short(), msg)) for subitem in item.changed_paths: if subitem.path not in combined_paths: combined_paths.append(subitem.path) subitems.append([ subitem.action, subitem.path ]) # subitems.sort(key = lambda x: strxfrm(x[1])) for subitem in subitems: self.paths_table.append([ subitem[0], S(subitem[1]), subitem[1] ]) def on_previous_clicked(self, widget): self.start_point -= self.limit if self.start_point < 0: self.start_point = 0 self.load_or_refresh() def on_next_clicked(self, widget): self.start_point += self.limit self.load() def check_previous_sensitive(self): sensitive = (self.start_point > 0) self.get_widget("previous").set_sensitive(sensitive) def check_next_sensitive(self): sensitive = True if len(self.revision_items) < self.limit: sensitive = False self.get_widget("next").set_sensitive(sensitive) def initialize_root_url(self): self.root_url = self.git.get_repository() + "/" class SVNLogDialog(SVNLog): def __init__(self, path, ok_callback=None, multiple=False, merge_candidate_revisions=None): """ Override the normal SVNLog class so that we can hide the window as we need. Also, provide a callback for when the OK button is clicked so that we can get some desired data. """ SVNLog.__init__(self, path, merge_candidate_revisions) self.ok_callback = ok_callback self.multiple = multiple self.change_button("close", _("_Select"), "rabbitvcs-ok") def on_destroy(self, widget): pass def on_close_clicked(self, widget, data=None): self.hide() if self.ok_callback is not None: if self.multiple == True: self.ok_callback(self.get_selected_revision_numbers()) else: self.ok_callback(self.get_selected_revision_number()) class GitLogDialog(GitLog): def __init__(self, path, ok_callback=None, multiple=False): """ Override the normal GitLog class so that we can hide the window as we need. Also, provide a callback for when the OK button is clicked so that we can get some desired data. """ GitLog.__init__(self, path) self.ok_callback = ok_callback self.multiple = multiple def on_destroy(self, widget): pass def on_close_clicked(self, widget, data=None): self.hide() if self.ok_callback is not None: if self.multiple == True: self.ok_callback(self.get_selected_revision_numbers()) else: self.ok_callback(self.get_selected_revision_number()) class LogCache(object): def __init__(self, cache={}): self.cache = cache def set(self, key, val): self.cache[key] = val def get(self, key): return self.cache[key] def has(self, key): return (key in self.cache) def empty(self): self.cache = {} class MenuViewDiffWorkingCopy(MenuItem): identifier = "RabbitVCS::View_Diff_Working_Copy" label = _("View diff against working copy") icon = "rabbitvcs-diff" class MenuViewDiffPreviousRevision(MenuItem): identifier = "RabbitVCS::View_Diff_Previous_Revision" label = _("View diff against previous revision") icon = "rabbitvcs-diff" class MenuViewDiffRevisions(MenuItem): identifier = "RabbitVCS::View_Diff_Revisions" label = _("View diff between revisions") icon = "rabbitvcs-diff" class MenuCompareWorkingCopy(MenuItem): identifier = "RabbitVCS::Compare_Working_Copy" label = _("Compare with working copy") icon = "rabbitvcs-compare" class MenuComparePreviousRevision(MenuItem): identifier = "RabbitVCS::Compare_Previous_Revision" label = _("Compare with previous revision") icon = "rabbitvcs-compare" class MenuCompareRevisions(MenuItem): identifier = "RabbitVCS::Compare_Revisions" label = _("Compare revisions") icon = "rabbitvcs-compare" class MenuShowChangesPreviousRevision(MenuItem): # This is for the revs list identifier = "RabbitVCS::Show_Changes_Previous_Revision" label = _("Show changes against previous revision") icon = "rabbitvcs-changes" class MenuShowChangesRevisions(MenuItem): # This is for the revs list identifier = "RabbitVCS::Show_Changes_Revisions" label = _("Show changes between revisions") icon = "rabbitvcs-changes" class MenuUpdateToThisRevision(MenuItem): identifier = "RabbitVCS::Update_To_This_Revision" label = _("Update to this revision") tooltip = _("Update the selected path to this revision") icon = "rabbitvcs-update" class MenuRevertChangesFromThisRevision(MenuItem): identifier = "RabbitVCS::Revert_Changes_From_This_Revision" label = _("Revert changes from this revision") tooltip = _("Update the selected path by reverse merging the changes") icon = "rabbitvcs-revert" class MenuCopyClipboard(MenuItem): identifier = "RabbitVCS::Copy_Clipboard" label = _("Copy to clipboard") tooltip = _("Copy to clipboard the full data of these revisions") icon = "rabbitvcs-asynchronous" class MenuEditAuthor(MenuItem): identifier = "RabbitVCS::Edit_Author" label = _("Edit author...") icon = "rabbitvcs-monkey" class MenuEditLogMessage(MenuItem): identifier = "RabbitVCS::Edit_Log_Message" label = _("Edit log message...") icon = "rabbitvcs-editconflicts" class MenuEditRevisionProperties(MenuItem): identifier = "RabbitVCS::Edit_Revision_Properties" label = _("Edit revision properties...") icon = "rabbitvcs-editprops" class MenuSeparatorLast(MenuSeparator): identifier = "RabbitVCS::Separator_Last" class LogTopContextMenuConditions(object): def __init__(self, caller, vcs, path, revisions): self.caller = caller self.vcs = vcs self.path = path self.revisions = revisions self.vcs_name = caller.get_vcs_name() def view_diff_working_copy(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1) def copy_clipboard(self, data=None): return (len(self.revisions) > 0) def view_diff_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def view_diff_revisions(self, data=None): return (len(self.revisions) > 1) def compare_working_copy(self, data=None): return (self.vcs.is_in_a_or_a_working_copy(self.path) and len(self.revisions) == 1) def compare_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def compare_revisions(self, data=None): return (len(self.revisions) > 1) def show_changes_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def show_changes_revisions(self, data=None): return (len(self.revisions) > 1) def update_to_this_revision(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_SVN and len(self.revisions) == 1) # TODO Evaluate multiple revisions later # TODO Git? def revert_changes_from_this_revision(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_SVN and len(self.revisions) == 1) def checkout(self, data=None): return (len(self.revisions) == 1) def branches(self, data=None): return (len(self.revisions) == 1 and self.vcs_name == rabbitvcs.vcs.VCS_GIT) def tags(self, data=None): return (len(self.revisions) == 1 and self.vcs_name == rabbitvcs.vcs.VCS_GIT) def branch_tag(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_SVN and len(self.revisions) == 1) def export(self, data=None): return (len(self.revisions) == 1) def edit_author(self, data=None): return self.vcs_name == rabbitvcs.vcs.VCS_SVN def edit_log_message(self, data=None): return self.vcs_name == rabbitvcs.vcs.VCS_SVN def edit_revision_properties(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_SVN and len(self.revisions) == 1) def separator(self, data=None): return True def separator_last(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_SVN) def merge(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_GIT) def reset(self, data=None): return (self.vcs_name == rabbitvcs.vcs.VCS_GIT) class LogTopContextMenuCallbacks(object): def __init__(self, caller, vcs, path, revisions): self.caller = caller self.vcs = vcs self.path = path self.revisions = revisions self.vcs_name = self.caller.get_vcs_name() def find_parent(self, revision): if ("parents" in revision) and len(revision["parents"]) > 0: parent = S(revision["parents"][0]) elif ("next_revision" in revision): parent = S(revision["next_revision"]) else: parent = S(int(S(revision["revision"])) - 1) return parent def view_diff_working_copy(self, widget, data=None): helper.launch_ui_window("diff", [ "%s@%s" % (self.path, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def copy_clipboard(self, widget, data=None): self.caller.copy_revision_text() def view_diff_previous_revision(self, widget, data=None): parent = self.find_parent(self.revisions[0]) helper.launch_ui_window("diff", [ "%s@%s" % (self.path, parent), "%s@%s" % (self.path, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def view_diff_revisions(self, widget, data=None): path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "%s@%s" % (path_older, self.revisions[1]["revision"].value), "%s@%s" % (self.path, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_working_copy(self, widget, data=None): path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, S(self.revisions[0]["revision"])), "%s" % (self.path), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_previous_revision(self, widget, data=None): parent = self.find_parent(self.revisions[0]) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (self.path, parent), "%s@%s" % (self.path, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def compare_revisions(self, widget, data=None): path_older = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path_older = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, self.revisions[1]["revision"].value), "%s@%s" % (self.path, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_previous_revision(self, widget, data=None): rev_first = S(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) path = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("changes", [ "%s@%s" % (path, parent), "%s@%s" % (path, S(rev_first)), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_revisions(self, widget, data=None): rev_first = S(self.revisions[0]["revision"]) rev_last = S(self.revisions[-1]["revision"]) path = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("changes", [ "%s@%s" % (path, S(rev_first)), "%s@%s" % (path, S(rev_last)), "--vcs=%s" % self.caller.get_vcs_name() ]) def update_to_this_revision(self, widget, data=None): helper.launch_ui_window("updateto", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def revert_changes_from_this_revision(self, widget, data=None): helper.launch_ui_window("merge", [ self.path, S(self.revisions[0]["revision"]) + "-" + str(int(S(self.revisions[0]["revision"])) - 1), "--vcs=%s" % self.caller.get_vcs_name() ]) def checkout(self, widget, data=None): url = "" if self.vcs_name == rabbitvcs.vcs.VCS_SVN: url = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("checkout", [ self.path, url, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def branch_tag(self, widget, data=None): helper.launch_ui_window("branch", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def branches(self, widget, data=None): helper.launch_ui_window("branches", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def tags(self, widget, data=None): helper.launch_ui_window("tags", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def export(self, widget, data=None): helper.launch_ui_window("export", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def merge(self, widget, data=None): extra = [] if self.vcs_name == rabbitvcs.vcs.VCS_GIT: extra.append(S(self.revisions[0]["revision"])) try: fromrev = S(self.revisions[1]["revision"]) extra.append(fromrev) except IndexError as e: pass extra += ["--vcs=%s" % self.caller.get_vcs_name()] helper.launch_ui_window("merge", [self.path] + extra) def reset(self, widget, data=None): helper.launch_ui_window("reset", [ self.path, "-r", S(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def edit_author(self, widget, data=None): author = "" if len(self.revisions) == 1: author = self.revisions[0]["author"] if author == _("(no author)"): author = "" from rabbitvcs.ui.dialog import TextChange dialog = TextChange(_("Edit author"), author) (result, new_author) = dialog.run() if result == Gtk.ResponseType.OK: self.caller.edit_revprop("svn:author", new_author, self.caller.on_author_edited) def edit_log_message(self, widget, data=None): message = "" if len(self.revisions) == 1: message = self.revisions[0]["message"] from rabbitvcs.ui.dialog import TextChange dialog = TextChange(_("Edit log message"), message) (result, new_message) = dialog.run() if result == Gtk.ResponseType.OK: self.caller.edit_revprop("svn:log", new_message, self.caller.on_log_message_edited) def edit_revision_properties(self, widget, data=None): url = self.vcs.svn().get_repo_url(self.path) helper.launch_ui_window("revprops", [ "%s@%s" % (url, S(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) class LogTopContextMenu(object): """ Defines context menu items for a table with files """ def __init__(self, caller, event, path, revisions=[]): """ @param caller: The calling object @type caller: object @param base_dir: The curent working directory @type base_dir: string @param path: The loaded path @type path: string @param revisions: The selected revisions @type revisions: list of rabbitvcs.vcs.Revision object """ self.caller = caller self.event = event self.path = path self.revisions = revisions self.vcs = rabbitvcs.vcs.VCS() self.conditions = LogTopContextMenuConditions( self.caller, self.vcs, self.path, self.revisions ) self.callbacks = LogTopContextMenuCallbacks( self.caller, self.vcs, self.path, self.revisions ) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuViewDiffWorkingCopy, None), (MenuViewDiffPreviousRevision, None), (MenuViewDiffRevisions, None), (MenuCompareWorkingCopy, None), (MenuComparePreviousRevision, None), (MenuCompareRevisions, None), (MenuShowChangesPreviousRevision, None), (MenuShowChangesRevisions, None), (MenuSeparator, None), (MenuCopyClipboard, None), (MenuSeparator, None), (MenuUpdateToThisRevision, None), (MenuRevertChangesFromThisRevision, None), (MenuCheckout, None), (MenuBranches, None), (MenuTags, None), (MenuBranchTag, None), (MenuExport, None), (MenuMerge, None), (MenuReset, None), (MenuSeparatorLast, None), (MenuEditAuthor, None), (MenuEditLogMessage, None), (MenuEditRevisionProperties, None) ] def show(self): if len(self.revisions) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) class LogBottomContextMenuConditions(object): def __init__(self, caller, vcs, paths, revisions): self.caller = caller self.vcs = vcs self.paths = paths self.revisions = revisions def view_diff_working_copy(self, data=None): return False def view_diff_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def view_diff_revisions(self, data=None): return (len(self.paths) == 1 and len(self.revisions) > 1) def compare_working_copy(self, data=None): return False def compare_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def compare_revisions(self, data=None): return (len(self.paths) == 1 and len(self.revisions) > 1) def show_changes_previous_revision(self, data=None): item = self.revisions[0]["revision"] return ("previous_revision" in self.revisions[0] and len(self.revisions) == 1) def show_changes_revisions(self, data=None): return (len(self.paths) == 1 and len(self.revisions) > 1) def _open(self, data=None): return True def annotate(self, data=None): return (len(self.paths) == 1) def separator(self, data=None): return True class LogBottomContextMenuCallbacks(object): def __init__(self, caller, vcs, paths, revisions): self.caller = caller self.vcs = vcs self.svn = self.vcs.svn() self.vcs_name = self.caller.get_vcs_name() self.paths = paths self.revisions = revisions def find_parent(self, revision): if ("parents" in revision) and len(revision["parents"]) > 0: parent = S(revision["parents"][0]) elif ("next_revision" in revision): parent = S(revision["next_revision"]) else: parent = S(int(S(revision["revision"])) - 1) return parent def view_diff_previous_revision(self, widget, data=None): rev = S(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) path_item = S(self.paths[0]).unicode() url = self.caller.root_url + path_item self.caller.view_diff_for_path(url, rev, parent) def view_diff_revisions(self, widget, data=None): rev_first = S(self.revisions[0]["revision"]) rev_last = S(self.revisions[-1]["revision"]) path_item = S(self.paths[0]).unicode() url = self.caller.root_url + path_item self.caller.view_diff_for_path(url, latest_revision_number=rev_last, earliest_revision_number=rev_first) def compare_previous_revision(self, widget, data=None): rev = S(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) path_item = S(self.paths[0]).unicode() url = self.caller.root_url + path_item self.caller.view_diff_for_path(url, rev, parent, sidebyside=True) def compare_revisions(self, widget, data=None): earliest_rev = S(self.revisions[0]["revision"]) latest_rev = S(self.revisions[-1]["revision"]) path_item = S(self.paths[0]).unicode() url = self.caller.root_url + path_item self.caller.view_diff_for_path(url, latest_rev, sidebyside=True, earliest_revision_number=earliest_rev) def show_changes_previous_revision(self, widget, data=None): rev_first = S(self.revisions[0]["revision"]) rev_last = S(self.revisions[-1]["revision"]) parent = self.find_parent(self.revisions[0]) url = self.caller.root_url + S(self.paths[0]).unicode() helper.launch_ui_window("changes", [ six.u("%s@%s") % (url, parent), six.u("%s@%s") % (url, rev_last), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_revisions(self, widget, data=None): rev_first = S(self.revisions[0]["revision"]) rev_last = S(self.revisions[-1]["revision"]) url = self.caller.root_url + S(self.paths[0]).unicode() helper.launch_ui_window("changes", [ six.u("%s@%s") % (url, rev_first), six.u("%s@%s") % (url, rev_last), "--vcs=%s" % self.caller.get_vcs_name() ]) def _open(self, widget, data=None): for path in self.paths: path = self.caller.root_url + S(path).unicode() helper.launch_ui_window("open", [ path, "--vcs=%s" % self.vcs_name, "-r", S(self.revisions[0]["revision"]) ]) def annotate(self, widget, data=None): url = self.caller.root_url + S(self.paths[0]).unicode() helper.launch_ui_window("annotate", [ url, "--vcs=%s" % self.vcs_name, "-r", S(self.revisions[0]["revision"]) ]) class LogBottomContextMenu(object): """ Defines context menu items for a table with files """ def __init__(self, caller, event, paths, revisions): """ @param caller: The calling object @type caller: object @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param revision: The selected revision @type revision: rabbitvcs.vcs.Revision object """ self.caller = caller self.event = event self.paths = paths self.revisions = revisions self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.conditions = LogBottomContextMenuConditions( self.caller, self.vcs, self.paths, self.revisions ) self.callbacks = LogBottomContextMenuCallbacks( self.caller, self.vcs, self.paths, self.revisions ) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuViewDiffRevisions, None), (MenuViewDiffPreviousRevision, None), (MenuComparePreviousRevision, None), (MenuCompareRevisions, None), (MenuShowChangesPreviousRevision, None), (MenuShowChangesRevisions, None), (MenuSeparator, None), (MenuOpen, None), (MenuAnnotate, None) ] def show(self): if len(self.paths) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNLog, rabbitvcs.vcs.VCS_GIT: GitLog } dialogs_map = { rabbitvcs.vcs.VCS_SVN: SVNLogDialog, rabbitvcs.vcs.VCS_GIT: GitLogDialog } def log_factory(path, vcs): # vcs option is allowed for URL only if os.path.exists(path): vcs = None if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] if not vcs in classes_map: from rabbitvcs.ui import VCS_OPT_ERROR raise SystemExit(VCS_OPT_ERROR) return classes_map[vcs](path) def log_dialog_factory(path, ok_callback=None, multiple=False, vcs=None): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] return dialogs_map[vcs](path, ok_callback, multiple) if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, paths) = main( [VCS_OPT], usage="Usage: rabbitvcs log [--vcs=svn|git] [url_or_path]" ) window = log_factory(paths[0], vcs=options.vcs) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/markresolved.py000077500000000000000000000072431362112712700211000ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.add import Add from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.markresolved") from rabbitvcs import gettext _ = gettext.gettext class SVNMarkResolved(Add): def setup(self, window, columns): window.set_title(_("Mark as Resolved")) self.svn = self.vcs.svn() self.statuses = self.svn.STATUSES_FOR_RESOLVE columns[0] = [GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING], columns[1] = [rabbitvcs.ui.widget.TOGGLE_BUTTON, "", _("Path"), _("Extension"), _("Text Status"), _("Property Status")] def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path), item.simple_content_status(), item.simple_metadata_status() ]) def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Mark as Resolved")) self.action.append(self.action.set_status, _("Running Resolved Command...")) for item in items: self.action.append(self.svn.resolve, item, recurse=True) self.action.append(self.action.set_status, _("Completed Mark as Resolved")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNMarkResolved } def markresolved_factory(paths, base_dir=None): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs markresolved [path1] [path2] ..." ) window = markresolved_factory(paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/merge.py000066400000000000000000000526071362112712700175020ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.log import SVNLogDialog from rabbitvcs.ui.action import SVNAction import rabbitvcs.vcs import rabbitvcs.ui.widget import rabbitvcs.util.settings from rabbitvcs.util.strings import S from rabbitvcs import gettext _ = gettext.gettext class SVNMerge(InterfaceView): def __init__(self, path, revision_range = None): InterfaceView.__init__(self, "merge", "Merge") self.revision_range = revision_range self.assistant = self.get_widget("Merge") self.path = path self.page = self.assistant.get_nth_page(0) self.last_page = None self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() if not self.svn.has_merge2(): self.get_widget("mergetype_range_opt").set_sensitive(False) self.get_widget("mergetype_tree_opt").set_active(True) self.get_widget("mergetype_reintegrate_opt").set_active(False) self.get_widget("mergeoptions_only_record").set_active(False) if not self.svn.has_merge_reintegrate(): self.get_widget("mergetype_reintegrate_opt").set_sensitive(False) self.assistant.set_page_complete(self.page, True) self.assistant.set_forward_page_func(self.on_forward_clicked) self.repo_paths = helper.get_repository_paths() # Keeps track of which stages should be marked as complete self.type = None self.initialize_root_url() def initialize_root_url(self): action = SVNAction( self.svn, notification=False, run_in_thread=False ) self.root_url = action.run_single( self.svn.get_repo_url, self.path ) # # Assistant UI Signal Callbacks # def on_apply_clicked(self, widget): self.merge() def on_test_clicked(self, widget): self.merge(test=True) def merge(self, test=False): if self.type is None: return if test: startcmd = _("Running Merge Test") endcmd = _("Completed Merge Test") else: startcmd = _("Running Merge Command") endcmd = _("Completed Merge") self.hide() recursive = self.get_widget("mergeoptions_recursive").get_active() ignore_ancestry = self.get_widget("mergeoptions_ignore_ancestry").get_active() record_only = False if self.svn.has_merge2(): record_only = self.get_widget("mergeoptions_only_record").get_active() action = SVNAction(self.svn, register_gtk_quit=(not test)) action.append(action.set_header, _("Merge")) action.append(action.set_status, startcmd) args = () kwargs = {} if self.type == "range": url = self.mergerange_repos.get_active_text() head_revision = self.svn.get_head(self.path) revisions = self.get_widget("mergerange_revisions").get_text() if revisions == "": revisions = "head" revisions = revisions.lower().replace("head", str(head_revision)) ranges = [] for r in revisions.split(","): if r.find("-") != -1: (low, high) = [ int(i) for i in r.split("-") ] if low < high: low -= 1 elif r.find(":") != -1: (low, high) = [ int(i) for i in r.split(":") ] if low < high: low -= 1 else: high = int(r) low = high - 1 # Before pysvn v1.6.3, there was a bug that required the ranges # tuple to have three elements, even though only two were used # Fixed in Pysvn Revision 1114 if (self.svn.interface == "pysvn" and self.svn.is_version_less_than((1,6,3,0))): ranges.append(( self.svn.revision("number", number=low).primitive(), self.svn.revision("number", number=high).primitive(), None )) else: ranges.append(( self.svn.revision("number", number=low).primitive(), self.svn.revision("number", number=high).primitive(), )) action.append(helper.save_repository_path, url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_ranges, url, ranges, self.svn.revision("head"), self.path ) kwargs = { "notice_ancestry": (not ignore_ancestry), "dry_run": test } if record_only: kwargs["record_only"] = record_only elif self.type == "reintegrate": url = self.merge_reintegrate_repos.get_active_text() revision = self.merge_reintegrate_revision.get_revision_object() action.append(helper.save_repository_path, url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_reintegrate, url, revision, self.path ) kwargs = { "dry_run": test } elif self.type == "tree": from_url = self.mergetree_from_repos.get_active_text() from_revision = self.svn.revision("head") if self.get_widget("mergetree_from_revision_number_opt").get_active(): from_revision = self.svn.revision( "number", number=int(self.get_widget("mergetree_from_revision_number").get_text()) ) to_url = self.mergetree_to_repos.get_active_text() to_revision = self.svn.revision("head") if self.get_widget("mergetree_to_revision_number_opt").get_active(): to_revision = self.svn.revision( "number", number=int(self.get_widget("mergetree_to_revision_number").get_text()) ) action.append(helper.save_repository_path, from_url) action.append(helper.save_repository_path, to_url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_trees, from_url, from_revision, to_url, to_revision, self.path ) kwargs = { "recurse": recursive, "dry_run": test } if len(args) > 0: action.append(*args, **kwargs) action.append(action.set_status, endcmd) action.append(action.finish) action.schedule() def on_prepare(self, widget, page): self.page = page current = self.assistant.get_current_page() if current == 1: self.on_mergerange_prepare() elif current == 2: self.on_mergetree_prepare() elif current == 3: self.on_merge_reintegrate_prepare() elif current == 4: self.on_mergeoptions_prepare() self.last_page = current def on_forward_clicked(self, widget): current = self.assistant.get_current_page() if current == 0: if self.get_widget("mergetype_range_opt").get_active(): next = 1 self.type = "range" if self.revision_range: self.get_widget("mergerange_revisions").set_text(S(self.revision_range).display()) elif self.get_widget("mergetype_tree_opt").get_active(): next = 2 self.type = "tree" elif self.get_widget("mergetype_reintegrate_opt").get_active(): next = 3 self.type = "reintegrate" else: next = 4 return next # # Step 2a: Merge a Range of Revisions # def on_mergerange_prepare(self): if not hasattr(self, "mergerange_repos"): self.mergerange_repos = rabbitvcs.ui.widget.ComboBox( self.get_widget("mergerange_from_urls"), self.repo_paths ) self.mergerange_repos.set_child_text(self.root_url) self.get_widget("mergerange_working_copy").set_text(S(self.path).display()) self.mergerange_check_ready() def on_mergerange_show_log1_clicked(self, widget): merge_candidate_revisions = self.svn.find_merge_candidate_revisions( self.mergerange_repos.get_active_text(), self.path ) SVNLogDialog( self.mergerange_repos.get_active_text(), ok_callback=self.on_mergerange_log1_closed, multiple=True, merge_candidate_revisions=merge_candidate_revisions ) def on_mergerange_log1_closed(self, data): if not data is None: self.get_widget("mergerange_revisions").set_text(S(data).display()) def on_mergerange_from_urls_changed(self, widget): self.mergerange_check_ready() def on_mergerange_revisions_changed(self, widget): self.mergerange_check_ready() def mergerange_check_ready(self): ready = True if self.mergerange_repos.get_active_text() == "": ready = False self.assistant.set_page_complete(self.page, ready) allow_log = False if self.mergerange_repos.get_active_text(): allow_log = True self.get_widget("mergerange_show_log1").set_sensitive(allow_log) # # Step 2b: Reintegrate a Branch # def on_merge_reintegrate_prepare(self): if not hasattr(self, "merge_reintegrate_repos"): self.merge_reintegrate_repos = rabbitvcs.ui.widget.ComboBox( self.get_widget("merge_reintegrate_repos"), self.repo_paths ) self.merge_reintegrate_repos.cb.connect("changed", self.on_merge_reintegrate_from_urls_changed) self.get_widget("merge_reintegrate_working_copy").set_text(S(self.path).display()) if not hasattr(self, "merge_reintegrate_revision"): self.merge_reintegrate_revision = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, url_combobox=self.merge_reintegrate_repos, expand=True ) def on_merge_reintegrate_browse_clicked(self, widget): from rabbitvcs.ui.browser import SVNBrowserDialog SVNBrowserDialog(self.path, callback=self.on_repo_chooser_closed) def on_repo_chooser_closed(self, new_url): self.merge_reintegrate_repos.set_child_text(new_url) self.merge_reintegrate_check_ready() def on_merge_reintegrate_from_urls_changed(self, widget): self.merge_reintegrate_check_ready() def merge_reintegrate_check_ready(self): ready = True if self.merge_reintegrate_repos.get_active_text() == "": ready = False self.assistant.set_page_complete(self.page, ready) # # Step 2c: Merge two different trees # def on_mergetree_prepare(self): if not hasattr(self, "mergetree_from_repos"): self.mergetree_from_repos = rabbitvcs.ui.widget.ComboBox( self.get_widget("mergetree_from_urls"), self.repo_paths ) self.mergetree_to_repos = rabbitvcs.ui.widget.ComboBox( self.get_widget("mergetree_to_urls"), self.repo_paths ) self.get_widget("mergetree_working_copy").set_text(S(self.path).display()) def on_mergetree_from_show_log_clicked(self, widget): SVNLogDialog( self.path, ok_callback=self.on_mergetree_from_show_log_closed, multiple=False ) def on_mergetree_from_show_log_closed(self, data): self.get_widget("mergetree_from_revision_number").set_text(S(data).display()) self.get_widget("mergetree_from_revision_number_opt").set_active(True) def on_mergetree_to_show_log_clicked(self, widget): SVNLogDialog( self.path, ok_callback=self.on_mergetree_to_show_log_closed, multiple=False ) def on_mergetree_to_show_log_closed(self, data): self.get_widget("mergetree_to_revision_number").set_text(S(data).display()) self.get_widget("mergetree_to_revision_number_opt").set_active(True) def on_mergetree_working_copy_show_log_clicked(self, widget): SVNLogDialog(self.path) def on_mergetree_from_revision_number_focused(self, widget, data): self.get_widget("mergetree_from_revision_number_opt").set_active(True) def on_mergetree_to_revision_number_focused(self, widget, data): self.get_widget("mergetree_to_revision_number_opt").set_active(True) def on_mergetree_from_urls_changed(self, widget): self.mergetree_check_ready() def on_mergetree_to_urls_changed(self, widget): self.mergetree_check_ready() def mergetree_check_ready(self): ready = True if self.mergetree_from_repos.get_active_text() == "": ready = False if self.mergetree_to_repos.get_active_text() == "": ready = False self.assistant.set_page_complete(self.page, ready) # # Step 3: Merge Options # def on_mergeoptions_prepare(self): if self.last_page == 3: self.get_widget("mergeoptions_recursive").hide() self.get_widget("mergeoptions_ignore_ancestry").hide() self.get_widget("mergeoptions_only_record").hide() else: self.get_widget("mergeoptions_recursive").show() self.get_widget("mergeoptions_ignore_ancestry").show() self.get_widget("mergeoptions_only_record").show() self.assistant.set_page_complete(self.page, True) class BranchMerge(InterfaceView): def __init__(self, path, branch=None): InterfaceView.__init__(self, "branch-merge", "Merge") self.path = path self.branch = branch self.vcs = rabbitvcs.vcs.VCS() sm = rabbitvcs.util.settings.SettingsManager() self.datetime_format = sm.get("general", "datetime_format") def on_cancel_clicked(self, widget, data=None): self.close() class GitMerge(BranchMerge): def __init__(self, path, branch=None): BranchMerge.__init__(self, path, branch) self.git = self.vcs.git(path) self.init_branch_widgets() self.from_branches = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("from_branch_container"), self.git, revision=self.branch, url=path, expand=True, revision_changed_callback=self.__revision_changed ) self.update_branch_info() self.active_branch = self.git.get_active_branch() if self.active_branch: self.get_widget("to_branch").set_text(S(self.active_branch.name + " (" + self.active_branch.revision[0:7] + ")").display()) else: self.get_widget("to_branch").set_text(_("No active branch")) def init_branch_widgets(self): self.info = {"from":{}, "to":{}} # FROM BRANCH INFO # from_container = rabbitvcs.ui.widget.Box(self.get_widget("from_branch_info"), vertical = True) # Set up the Author line author = Gtk.Label(label = _("Author:")) author.set_size_request(90, -1) author.set_properties(xalign=0,yalign=0) self.info['from']['author'] = Gtk.Label(label = "") self.info['from']['author'].set_properties(xalign=0,yalign=0,selectable=True) self.info['from']['author'].set_line_wrap(True) author_container = rabbitvcs.ui.widget.Box() author_container.pack_start(author, False, False, 0) author_container.pack_start(self.info['from']['author'], False, False, 0) from_container.pack_start(author_container, False, False, 0) # Set up the Date line date = Gtk.Label(label = _("Date:")) date.set_size_request(90, -1) date.set_properties(xalign=0,yalign=0) self.info['from']['date'] = Gtk.Label(label = "") self.info['from']['date'].set_properties(xalign=0,yalign=0,selectable=True) date_container = rabbitvcs.ui.widget.Box() date_container.pack_start(date, False, False, 0) date_container.pack_start(self.info['from']['date'], False, False, 0) from_container.pack_start(date_container, False, False, 0) # Set up the Revision line revision = Gtk.Label(label = _("Revision:")) revision.set_size_request(90, -1) revision.set_properties(xalign=0,yalign=0) self.info['from']['revision'] = Gtk.Label(label = "") self.info['from']['revision'].set_properties(xalign=0,selectable=True) self.info['from']['revision'].set_line_wrap(True) revision_container = rabbitvcs.ui.widget.Box() revision_container.pack_start(revision, False, False, 0) revision_container.pack_start(self.info['from']['revision'], False, False, 0) from_container.pack_start(revision_container, False, False, 0) # Set up the Log Message line message = Gtk.Label(label = _("Message:")) message.set_size_request(90, -1) message.set_properties(xalign=0,yalign=0) self.info['from']['message'] = Gtk.Label(label = "") self.info['from']['message'].set_properties(xalign=0,yalign=0,selectable=True) self.info['from']['message'].set_line_wrap(True) self.info['from']['message'].set_size_request(250, -1) message_container = rabbitvcs.ui.widget.Box() message_container.pack_start(message, False, False, 0) message_container.pack_start(self.info['from']['message'], False, False, 0) from_container.pack_start(message_container, False, False, 0) from_container.show_all() def update_branch_info(self): from_branch = self.from_branches.get_revision_object() if from_branch.value: log = self.git.log(self.path, limit=1, revision=from_branch, showtype="branch") if log: from_info = log[0] self.info['from']['author'].set_text(S(from_info.author).display()) self.info['from']['date'].set_text(helper.format_datetime(from_info.date, self.datetime_format)) self.info['from']['revision'].set_text(S(from_info.revision).display()[0:7]) self.info['from']['message'].set_text(S(helper.html_escape(helper.format_long_text(from_info.message, 500))).display()) def on_from_branches_changed(self, widget): self.update_branch_info() def on_ok_clicked(self, widget, data=None): self.hide() from_branch = self.from_branches.get_revision_object() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Merge")) self.action.append(self.action.set_status, _("Running Merge Command...")) self.action.append( self.git.merge, from_branch ) self.action.append(self.action.set_status, _("Completed Merge")) self.action.append(self.action.finish) self.action.schedule() def __revision_changed(self, widget): self.update_branch_info() if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main( [VCS_OPT], usage="Usage: rabbitvcs merge path [revision/revision_range]" ) path = args[0] vcs_name = options.vcs if not vcs_name: vcs_name = rabbitvcs.vcs.guess(path)["vcs"] window = None revision_text = None if len(args) >= 2: revision_text = args[1] if vcs_name == rabbitvcs.vcs.VCS_SVN: window = SVNMerge(path, revision_text) window.register_gtk_quit() Gtk.main() elif vcs_name == rabbitvcs.vcs.VCS_GIT: window = GitMerge(path, revision_text) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/open.py000066400000000000000000000100701362112712700173300ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from os import getcwd import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs import gettext _ = gettext.gettext import six class SVNOpen(InterfaceNonView): """ This class provides a handler to open tracked files. """ def __init__(self, path, revision): """ @type path: string @param path: The path to open @type revision: string @param revision: The revision of the file to open """ InterfaceNonView.__init__(self) self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() if revision and isinstance(revision, (str, six.text_type)): revision_obj = self.svn.revision("number", number=revision) else: revision_obj = self.svn.revision("HEAD") url = path if not self.svn.is_path_repository_url(path): url = self.svn.get_repo_root_url(path) + '/' + path dest = helper.get_tmp_path("rabbitvcs-" + revision + "-" + os.path.basename(path)) self.svn.export( url, dest, revision=revision_obj, force=True ) helper.open_item(dest) raise SystemExit() class GitOpen(InterfaceNonView): """ This class provides a handler to open tracked files. """ def __init__(self, path, revision): """ @type path: string @param path: The path to open @type revision: string @param revision: The revision of the file to open """ InterfaceNonView.__init__(self) self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) if revision: revision_obj = self.git.revision(revision) else: revision_obj = self.git.revision("HEAD") dest_dir = helper.get_tmp_path("rabbitvcs-" + S(revision)) self.git.export( path, dest_dir, revision=revision_obj ) repo_path = self.git.find_repository_path(path) relative_path = path if path.startswith(repo_path): relative_path = path[len(repo_path)+1:] dest_path = "%s/%s" % (dest_dir, relative_path) helper.open_item(dest_path) raise SystemExit() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNOpen, rabbitvcs.vcs.VCS_GIT: GitOpen } def open_factory(vcs, path, revision): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] return classes_map[vcs](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs open path [-r REVISION]" ) window = open_factory(options.vcs, paths[0], options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/properties.py000077500000000000000000000134421362112712700205740ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.properties") from rabbitvcs import gettext _ = gettext.gettext class PropertiesBase(InterfaceView): """ Provides an interface to add/edit/delete properties on versioned items in the working copy. """ selected_row = None selected_rows = [] def __init__(self, path): InterfaceView.__init__(self, "properties", "Properties") self.path = path self.delete_stack = [] self.get_widget("Properties").set_title( _("Properties - %s") % path ) self.get_widget("path").set_text(S(path).display()) self.table = rabbitvcs.ui.widget.Table( self.get_widget("table"), [GObject.TYPE_BOOLEAN, GObject.TYPE_STRING, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, _("Name"), _("Value")] ) self.table.allow_multiple() self.vcs = rabbitvcs.vcs.VCS() # # UI Signal Callbacks # def on_ok_clicked(self, widget): self.save() def on_new_clicked(self, widget): dialog = rabbitvcs.ui.dialog.Property() name,value,recurse = dialog.run() if name: self.table.append([recurse,name,value]) def on_edit_clicked(self, widget): (recurse,name,value) = self.get_selected_name_value() dialog = rabbitvcs.ui.dialog.Property(name, value) name,value,recurse = dialog.run() if name: self.set_selected_name_value(name, value, recurse) def on_delete_clicked(self, widget, data=None): if not self.selected_rows: return for i in self.selected_rows: row = self.table.get_row(i) self.delete_stack.append([row[0],row[1]]) self.table.remove_multiple(self.selected_rows) def on_table_cursor_changed(self, treeview, data=None): self.on_table_event(treeview) def on_table_button_released(self, treeview, data=None): self.on_table_event(treeview) def on_table_event(self, treeview): selection = treeview.get_selection() (liststore, indexes) = selection.get_selected_rows() self.selected_rows = [] for tup in indexes: self.selected_rows.append(tup[0]) length = len(self.selected_rows) if length == 0: self.get_widget("edit").set_sensitive(False) self.get_widget("delete").set_sensitive(False) elif length == 1: self.get_widget("edit").set_sensitive(True) self.get_widget("delete").set_sensitive(True) else: self.get_widget("edit").set_sensitive(False) self.get_widget("delete").set_sensitive(True) def on_refresh_activate(self, widget): self.load() # # Helper methods # def set_selected_name_value(self, name, value, recurse): self.table.set_row(self.selected_rows[0], [recurse,name,value]) def get_selected_name_value(self): returner = None if self.selected_rows is not None: returner = self.table.get_row(self.selected_rows[0]) return returner class SVNProperties(PropertiesBase): def __init__(self, path): PropertiesBase.__init__(self, path) self.svn = self.vcs.svn() self.load() def load(self): self.table.clear() try: self.proplist = self.svn.proplist(self.get_widget("path").get_text()) except Exception as e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) self.proplist = [] if self.proplist: for key,val in list(self.proplist.items()): self.table.append([False, key,val.rstrip()]) def save(self): delete_recurse = self.get_widget("delete_recurse").get_active() for row in self.delete_stack: self.svn.propdel(self.path, row[1], recurse=delete_recurse) failure = False for row in self.table.get_items(): if (not self.svn.propset(self.path, row[1], row[2], overwrite=True, recurse=row[0])): failure = True break if failure: rabbitvcs.ui.dialog.MessageBox(_("There was a problem saving your properties.")) self.close() if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs properties [url_or_path]") window = SVNProperties(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/property_editor.py000066400000000000000000000227131362112712700216300ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2009 by Jason Heeris # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ A note to anyone intending to work on this in the future... This dialog is designed to be as stateless as possible. That is, all the information about properties being changed, deleted, added, etc. should be kept in the SVN admin system, not in this dialog. SVN should be keeping track of this info, not us! To this effect, changes are applied immediately... no saving lists of changes to apply later, no trying to keep track of what was done recursively and what wasn't; just do the work and make sure the UI is sensible. """ from __future__ import absolute_import from __future__ import print_function import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkContextMenu, GtkContextMenuCaller import rabbitvcs.ui.wraplabel import rabbitvcs.util.contextmenuitems import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs.vcs.svn import Revision from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.property_editor") from rabbitvcs import gettext _ = gettext.gettext PROP_EDITOR_NOTE = _("""\ Note: changes to properties are applied instantly. You may review and \ undo changes using the context menu for each item. """) RECURSIVE_DELETE_MSG = _("""\ Do you want to delete the selected properties from all files and subdirectories beneath this directory?""") PROP_MENU_STRUCTURE = [ (rabbitvcs.util.contextmenuitems.PropMenuEdit, None), (rabbitvcs.util.contextmenuitems.PropMenuRevert, None), (rabbitvcs.util.contextmenuitems.PropMenuRevertRecursive, None), (rabbitvcs.util.contextmenuitems.PropMenuDelete, None), (rabbitvcs.util.contextmenuitems.PropMenuDeleteRecursive, None)] class PropEditor(InterfaceView, GtkContextMenuCaller): ''' User interface for the property editor. The UI is basically an "instant update" editor, that is as soon as you add a property in the dialog, it is actually added in the WC. Each row has a context menu available to perform other actions. ''' def __init__(self, path): ''' Initialises the UI. ''' InterfaceView.__init__(self, "property_editor", "PropertyEditor") note = rabbitvcs.ui.wraplabel.WrapLabel(PROP_EDITOR_NOTE) note.set_hexpand(True) note.set_use_markup(True) self.get_widget("note_box").add(note) self.get_widget("note_box").show_all() self.path = path self.get_widget("wc_text").set_text(S(self.get_local_path(os.path.realpath(path))).display()) self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() if not self.svn.is_versioned(self.path): rabbitvcs.ui.dialog.MessageBox(_("File is not under version control.")) self.close() return self.get_widget("remote_uri_text").set_text(S(self.svn.get_repo_url(path)).display()) self.table = rabbitvcs.ui.widget.Table( self.get_widget("table"), [GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_ELLIPSIZED, GObject.TYPE_STRING, rabbitvcs.ui.widget.TYPE_STATUS], [_("Name"), _("Value"), _("Reserved"), _("Status")], filters=[ { "callback": rabbitvcs.ui.widget.long_text_filter, "user_data": { "cols": 0, "column": 1 } }, { "callback": rabbitvcs.ui.widget.translate_filter, "user_data": { "column": 3 } }], callbacks={ "row-activated": self.on_table_row_activated, "mouse-event": self.on_table_mouse_event, "key-event": self.on_table_key_event } ) self.table.allow_multiple() self.refresh() def get_local_path(self, path): return path.replace("file://", "") def on_note_box_add(self, *args, **kwargs): print("Added!") def refresh(self): self.table.clear() propdets = {} try: propdets = self.svn.propdetails(self.path) except Exception as e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) for propname, details in list(propdets.items()): self.table.append( [propname, details["value"], "N/A", details["status"]] ) def on_refresh_clicked(self, widget): self.refresh() def on_new_clicked(self, widget): self.edit_property() def edit_property(self, name=""): value = self.svn.propget(self.path, name) dialog = rabbitvcs.ui.dialog.Property(name, value) name,value,recurse = dialog.run() if name: success = self.svn.propset(self.path, name, value, overwrite=True, recurse=False) if not success: rabbitvcs.ui.dialog.MessageBox(_("Unable to set new value for property.")) self.refresh() def delete_properties(self, names): recursive = False if(os.path.isdir(self.path)): dialog = rabbitvcs.ui.dialog.Confirmation(RECURSIVE_DELETE_MSG) recursive = dialog.run() for name in names: self.svn.propdel(self.path, name, recurse=recursive) self.refresh() def on_table_row_activated(self, treeview, event, col): for name in self.table.get_selected_row_items(0): self.edit_property(name) def on_table_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) == "Delete": names = self.table.get_selected_row_items(0) self.delete_properties(names) def on_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_menu(event) def show_menu(self, event): # self.show_files_table_popup_menu(treeview, event) selected_propnames = self.table.get_selected_row_items(0) propdetails = self.svn.propdetails(self.path) filtered_details = {} for propname, detail in list(propdetails.items()): if propname in selected_propnames: filtered_details[propname] = detail conditions = PropMenuConditions(self.path, filtered_details) callbacks = PropMenuCallbacks(self, self.path, filtered_details, self.vcs) GtkContextMenu(PROP_MENU_STRUCTURE, conditions, callbacks).show(event) class PropMenuCallbacks(object): def __init__(self, caller, path, propdetails, vcs): self.path = path self.caller = caller self.propdetails = propdetails self.vcs = vcs self.svn = self.vcs.svn() def property_edit(self, widget, *args): if list(self.propdetails.keys()): propname = list(self.propdetails.keys())[0] self.caller.edit_property(propname) def property_delete(self, widget, *args): for propname in list(self.propdetails.keys()): self.svn.propdel(self.path, propname, recurse=False) self.caller.refresh() def property_delete_recursive(self, widget, *args): for propname in list(self.propdetails.keys()): self.svn.propdel(self.path, propname, recurse=True) self.caller.refresh() def property_revert(self, widget, *args): pass def property_revert_recursive(self, widget, *args): pass class PropMenuConditions(object): def __init__(self, path, propdetails): self.path = path self.propdetails = propdetails def all_modified(self): return all([detail["status"] != "unchanged" for (propname, detail) in list(self.propdetails.items())]) def all_not_deleted(self): return all([detail["status"] != "deleted" for (propname, detail) in list(self.propdetails.items())]) def property_revert(self): return False # return self.all_modified() def property_delete(self): return self.all_not_deleted() def property_edit(self): return len(list(self.propdetails.keys())) == 1 if __name__ == "__main__": # These are some dumb tests before I add any functionality. from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs propedit [url_or_path]") window = PropEditor(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/property_page.py000066400000000000000000000160351362112712700212560ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2010 by Jason Heeris # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import os.path import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from collections import defaultdict import rabbitvcs.ui import rabbitvcs.ui.widget import rabbitvcs.vcs from rabbitvcs.services.checkerservice import StatusCheckerStub as StatusChecker from rabbitvcs.ui import STATUS_EMBLEMS from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.property_page") from rabbitvcs import gettext _ = gettext.gettext class PropertyPage(rabbitvcs.ui.GtkBuilderWidgetWrapper): gtkbuilder_filename = "property_page" gtkbuilder_id = "prop_page_scroller" def __init__(self, paths, vcs=None, claim_domain=True): rabbitvcs.ui.GtkBuilderWidgetWrapper.__init__(self, claim_domain=claim_domain) self.paths = paths self.vcs = vcs or rabbitvcs.vcs.VCS() self.info_pane = rabbitvcs.ui.widget.Box(self.get_widget("property_page"), vertical = True) if len(paths) == 1: file_info = FileInfoPane(paths[0], self.vcs, claim_domain=self.claim_domain) self.info_pane.pack_start(file_info.get_widget(), expand=False, fill=False, padding=0) elif len(paths) > 1: try: for path in paths: expander = FileInfoExpander(path, self.vcs, claim_domain=self.claim_domain, indent=12) self.info_pane.pack_start(expander.get_widget(), expand=False, fill=False, padding=0) except Exception as ex: log.exception(ex) raise class FileInfoPane(rabbitvcs.ui.GtkBuilderWidgetWrapper): gtkbuilder_filename = "property_page" gtkbuilder_id = "file_info_table" def __init__(self, path, vcs=None, claim_domain=True): rabbitvcs.ui.GtkBuilderWidgetWrapper.__init__(self, claim_domain=claim_domain) self.path = path self.vcs = vcs or rabbitvcs.vcs.VCS() self.checker = StatusChecker() self.get_widget("file_name").set_text(S(os.path.basename(path)).display()) self.status = self.checker.check_status(path, recurse = False, invalidate = False, summary = False) self.get_widget("vcs_type").set_text(S(self.status.vcs_type).display()) self.get_widget("content_status").set_text(S(self.status.simple_content_status()).display()) self.get_widget("prop_status").set_text(S(self.status.simple_metadata_status()).display()) self.set_icon_from_status(self.get_widget("content_status_icon"), self.status.simple_content_status()) self.set_icon_from_status(self.get_widget("prop_status_icon"), self.status.simple_metadata_status()) self.set_icon_from_status(self.get_widget("vcs_icon"), self.status.single, Gtk.IconSize.DIALOG) additional_info = self.get_additional_info() if additional_info: additional_props_table = rabbitvcs.ui.widget.KeyValueTable( additional_info) additional_props_table.show() file_info_table = rabbitvcs.ui.widget.Box(self.get_widget("file_info_table"), vertical = True) file_info_table.pack_start(additional_props_table, expand=False, fill=False, padding=0) def set_icon_from_status(self, icon, status, size=Gtk.IconSize.BUTTON): if status in rabbitvcs.ui.STATUS_EMBLEMS: icon.set_from_icon_name("emblem-" + STATUS_EMBLEMS[status], size) def get_additional_info(self): vcs_type = rabbitvcs.vcs.guess_vcs(self.path)['vcs'] if(vcs_type == rabbitvcs.vcs.VCS_SVN): return self.get_additional_info_svn() elif(vcs_type == rabbitvcs.vcs.VCS_GIT): return self.get_additional_info_git() else: return [] def get_additional_info_svn(self): repo_url = S(self.vcs.svn().get_repo_url(self.path)) return [ (_("Repository URL"), repo_url)] def get_additional_info_git(self): repo_url = S(self.vcs.git().config_get(("remote", "origin"), "url")) return [ (_("Repository URL"), repo_url)] class FileInfoExpander(rabbitvcs.ui.GtkBuilderWidgetWrapper): gtkbuilder_filename = "property_page" gtkbuilder_id = "file_info_expander" def __init__(self, path, vcs=None, claim_domain=True, indent=0): # Might be None, but that's okay, only subclasses use it self.vcs = vcs rabbitvcs.ui.GtkBuilderWidgetWrapper.__init__(self, claim_domain=claim_domain) self.path = path self.get_widget("file_expander_path").set_label(path) # Do a lazy evaluate for this self.file_info = None self.expander = self.get_widget() self.indent = indent # There seems to be no easy way to connect to this in Gtkbuilder self.expander.connect("notify::expanded", self.on_expand) def on_expand(self, param_spec, user_data): if self.expander.get_expanded() and not self.file_info: self.file_info = FileInfoPane(self.path, self.vcs, claim_domain=self.claim_domain ).get_widget() self.file_info.set_margin_start(self.indent) self.expander.add(self.file_info) class PropertyPageLabel(rabbitvcs.ui.GtkBuilderWidgetWrapper): gtkbuilder_filename = "property_page" gtkbuilder_id = "property_page_label" rabbitvcs-0.18/rabbitvcs/ui/push.py000066400000000000000000000130721362112712700173530ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path import six.moves._thread from datetime import datetime from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.settings import rabbitvcs.vcs from rabbitvcs import gettext import six _ = gettext.gettext helper.gobject_threads_init() class Push(InterfaceView): def __init__(self, path): InterfaceView.__init__(self, "push", "Push") self.path = path self.vcs = rabbitvcs.vcs.VCS() sm = rabbitvcs.util.settings.SettingsManager() self.datetime_format = sm.get("general", "datetime_format") # # Event handlers # def on_ok_clicked(self, widget, data=None): pass class GitPush(Push): def __init__(self, path): Push.__init__(self, path) self.git = self.vcs.git(path) self.repository_selector = rabbitvcs.ui.widget.GitRepositorySelector( self.get_widget("repository_container"), self.git, self.on_branch_changed ) self.log_table = rabbitvcs.ui.widget.Table( self.get_widget("log"), [GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Date"), _("Message")], flags={ "sortable": True, "sort_on": 0 } ) # Set default for checkboxes. self.get_widget("tags").set_active(True) self.get_widget("force_with_lease").set_active(False) self.initialize_logs() def on_ok_clicked(self, widget, data=None): self.hide() repository = self.repository_selector.repository_opt.get_active_text() branch = self.repository_selector.branch_opt.get_active_text() tags = self.get_widget("tags").get_active() force_with_lease = self.get_widget("force_with_lease").get_active() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Push")) self.action.append(self.action.set_status, _("Running Push Command...")) self.action.append(self.git.push, repository, branch, tags, force_with_lease) self.action.append(self.action.set_status, _("Completed Push")) self.action.append(self.action.finish) self.action.schedule() def initialize_logs(self): """ Initializes the git logs """ try: six.moves._thread.start_new_thread(self.load_logs, ()) except Exception as e: log.exception(e) def load_logs_exit(self): self.get_widget("status").set_text("") self.update_widgets() def load_logs(self): helper.run_in_main_thread(self.get_widget("status").set_text, _("Loading...")) self.load_push_log() helper.run_in_main_thread(self.load_logs_exit) def load_push_log(self): repository = self.repository_selector.repository_opt.get_active_text() branch = self.repository_selector.branch_opt.get_active_text() refspec = "refs/remotes/%s/%s" % (repository, branch) self.push_log = self.git.log(revision=self.git.revision(refspec), showtype="push") def on_branch_changed(self, repository, branch): self.load_push_log() self.update_widgets() def update_widgets(self): self.log_table.clear() repository = self.repository_selector.repository_opt.get_active_text() branch = self.repository_selector.branch_opt.get_active_text() if not repository or not branch: self.get_widget("ok").set_sensitive(False) return has_commits = False for item in self.push_log: self.log_table.append([ helper.format_datetime(item.date, self.datetime_format), helper.format_long_text(item.message.rstrip("\n")) ]) has_commits = True self.get_widget("ok").set_sensitive(True) if not has_commits: self.get_widget("status").set_text(_("No commits found")) classes_map = { rabbitvcs.vcs.VCS_GIT: GitPush } def push_factory(path): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main( usage="Usage: rabbitvcs push [path]" ) window = push_factory(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/relocate.py000077500000000000000000000061771362112712700202050ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction from rabbitvcs.ui.dialog import MessageBox import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs import gettext _ = gettext.gettext class Relocate(InterfaceView): """ Interface to relocate your working copy's repository location. """ def __init__(self, path): """ @type path: string @param path: A path to a local working copy """ InterfaceView.__init__(self, "relocate", "Relocate") self.path = path self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() repo = S(self.svn.get_repo_url(self.path)).display() self.get_widget("from_url").set_text(repo) self.get_widget("to_url").set_text(repo) self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("to_urls"), helper.get_repository_paths() ) def on_ok_clicked(self, widget): from_url = self.get_widget("from_url").get_text() to_url = self.get_widget("to_url").get_text() if not from_url or not to_url: MessageBox(_("The from and to url fields are both required.")) return self.hide() self.action = SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Relocate")) self.action.append(self.action.set_status, _("Running Relocate Command...")) self.action.append( self.svn.relocate, from_url, to_url, self.path ) self.action.append(self.action.set_status, _("Completed Relocate")) self.action.append(self.action.finish) self.action.schedule() if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs relocate [path]") window = Relocate(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/remotes.py000066400000000000000000000123111362112712700200450ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget from rabbitvcs.ui.dialog import DeleteConfirmation import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext STATE_ADD = 0 STATE_EDIT = 1 class GitRemotes(InterfaceView): """ Provides a UI interface to manage items """ state = STATE_ADD def __init__(self, path): InterfaceView.__init__(self, "manager", "Manager") self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.get_widget("right_side").hide() self.get_widget("Manager").set_title(_("Remote Repository Manager")) self.get_widget("items_label").set_markup(_("Remote Repositories")) self.selected_branch = None self.items_treeview = rabbitvcs.ui.widget.Table( self.get_widget("items_treeview"), [GObject.TYPE_STRING, GObject.TYPE_STRING], [_("Name"), _("Host")], callbacks={ "mouse-event": self.on_treeview_mouse_event, "key-event": self.on_treeview_key_event, "cell-edited": self.on_treeview_cell_edited_event }, flags={ "sortable": False, "sort_on": 0, "editable": [0,1] } ) self.load() def load(self): self.items_treeview.clear() self.remote_list = self.git.remote_list() for remote in self.remote_list: self.items_treeview.append([remote["name"], remote["host"]]) def save(self, row, column, data): row = int(row) if row in self.remote_list: remote = self.remote_list[row] name = remote["name"] if column == 0: name = data host = remote["host"] if column == 1: host = data if name != remote["name"]: self.git.remote_rename(remote["name"], name) if host != remote["host"]: self.git.remote_set_url(remote["name"], host) self.load() else: (name, host) = self.items_treeview.get_row(row) if name and host: self.git.remote_add(name, host) self.load() def on_add_clicked(self, widget): self.show_add() def on_delete_clicked(self, widget): selected = self.items_treeview.get_selected_row_items(0) confirm = rabbitvcs.ui.dialog.Confirmation(_("Are you sure you want to delete %s?" % ", ".join(selected))) result = confirm.run() if result == Gtk.ResponseType.OK or result == True: for remote in selected: self.git.remote_delete(remote) self.load() def on_treeview_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, event) def on_treeview_mouse_event(self, treeview, event, *args): self.on_treeview_event(treeview, event) def on_treeview_cell_edited_event(self, cell, row, data, column): self.items_treeview.set_row_item(row, column, data) self.save(row, column, data) def on_treeview_event(self, treeview, event): selected = self.items_treeview.get_selected_row_items(0) if len(selected) > 0: if len(selected) == 1: self.show_edit(selected[0]) self.get_widget("delete").set_sensitive(True) def show_add(self): self.state = STATE_ADD self.items_treeview.unselect_all() self.items_treeview.append(["", ""]) self.items_treeview.focus(len(self.remote_list), 0) def show_edit(self, remote_name): self.state = STATE_EDIT if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs branch-manager path") window = GitRemotes(paths[0]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/rename.py000077500000000000000000000104271362112712700176470ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction from rabbitvcs.ui.dialog import MessageBox, OneLineTextChange import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class Rename(InterfaceNonView): DO_RENAME = False def __init__(self, path): InterfaceNonView.__init__(self) self.register_gtk_quit() self.vcs = rabbitvcs.vcs.VCS() self.path = path if not os.path.exists(self.path): MessageBox(_("The requested file or folder does not exist.")) self.close() return dialog = OneLineTextChange(_("Rename"), _("New Name:"), self.path) (result, new_path) = dialog.run() if result != Gtk.ResponseType.OK: self.close() return if not new_path: MessageBox(_("The new name field is required")) self.new_path = new_path self.DO_RENAME = True class SVNRename(Rename): def __init__(self, path): Rename.__init__(self, path) if not self.DO_RENAME: return self.svn = self.vcs.svn() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) dirname = os.path.dirname(self.new_path) if not os.path.exists(dirname): os.mkdir(dirname) self.svn.add(dirname) self.action.append(self.action.set_header, _("Rename")) self.action.append(self.action.set_status, _("Running Rename Command...")) self.action.append( self.svn.move, self.path, self.new_path ) self.action.append(self.action.set_status, _("Completed Rename")) self.action.append(self.action.finish) self.action.append(self.close) self.action.schedule() class GitRename(Rename): def __init__(self, path): Rename.__init__(self, path) if not self.DO_RENAME: return self.git = self.vcs.git(path) self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) dirname = os.path.dirname(os.path.realpath(self.new_path)) if not os.path.exists(dirname): os.mkdir(dirname) self.action.append(self.action.set_header, _("Rename")) self.action.append(self.action.set_status, _("Running Rename Command...")) self.action.append( self.git.move, self.path, self.new_path ) self.action.append(self.action.set_status, _("Completed Rename")) self.action.append(self.action.finish) self.action.append(self.close) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNRename, rabbitvcs.vcs.VCS_GIT: GitRename } def rename_factory(path): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs rename [path]") window = rename_factory(os.path.abspath(paths[0])) Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/renderers/000077500000000000000000000000001362112712700200105ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/ui/renderers/__init__.py000066400000000000000000000000001362112712700221070ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/ui/renderers/graphcell.py000066400000000000000000000157571362112712700223420ustar00rootroot00000000000000"""Cell renderer for directed graph. This module contains the implementation of a custom GtkCellRenderer that draws part of the directed graph based on the lines suggested by the code in graph.py. Because we're shiny, we use Cairo to do this, and because we're naughty we cheat and draw over the bits of the TreeViewColumn that are supposed to just be for the background. """ from __future__ import absolute_import __copyright__ = "Copyright 2005 Canonical Ltd." __author__ = "Scott James Remnant " import math import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GObject, Pango import cairo # Styles used when rendering revision graph edges style_SOLID = 0 style_DASHED = 1 class CellRendererGraph(Gtk.CellRenderer): """Cell renderer for directed graph. Properties: node (column, colour) tuple to draw revision node, in_lines (start, end, colour, style) tuple list to draw inward lines, out_lines (start, end, colour, style) tuple list to draw outward lines. """ columns_len = 1 _box_size = None node = None in_lines = [] out_lines = [] __gproperties__ = { "graph": ( GObject.TYPE_PYOBJECT, "graph", "revision node instruction", GObject.PARAM_WRITABLE ) } def do_set_property(self, property, value): """Set properties from GObject properties.""" if not value: return if property.name == "graph": self.node = value["node"] self.in_lines = value["in_lines"] self.out_lines = value["out_lines"] else: raise AttributeError("no such property: '%s'" % property.name) def box_size(self, widget): """Calculate box size based on widget's font. Cache this as it's probably expensive to get. It ensures that we draw the graph at least as large as the text. """ return 20 def set_colour(self, ctx, colour, bg, fg): """Set the context source colour. Picks a distinct colour based on an internal wheel; the bg parameter provides the value that should be assigned to the 'zero' colours and the fg parameter provides the multiplier that should be applied to the foreground colours. """ if isinstance(colour, str): r, g, b = colour[1:3], colour[3:5], colour[5:7] colour_rgb = int(r, 16) / 255., int(g, 16) / 255., int(b, 16) / 255. else: if colour == 0: colour_rgb = Gtklib.MAINLINE_COLOR else: colour_rgb = Gtklib.LINE_COLORS[colour % len(Gtklib.LINE_COLORS)] red = (colour_rgb[0] * fg) or bg green = (colour_rgb[1] * fg) or bg blue = (colour_rgb[2] * fg) or bg ctx.set_source_rgb(red, green, blue) def do_get_size(self, widget, cell_area): """Return the size we need for this cell. Each cell is drawn individually and is only as wide as it needs to be, we let the TreeViewColumn take care of making them all line up. """ box_size = self.box_size(widget) + 1 width = box_size * (self.columns_len + 1) height = box_size # FIXME I have no idea how to use cell_area properly return (0, 0, width, height) def do_render(self, ctx, widget, bg_area, cell_area, flags): """Render an individual cell. Draws the cell contents using cairo, taking care to clip what we do to within the background area so we don't draw over other cells. Note that we're a bit naughty there and should really be drawing in the cell_area (or even the exposed area), but we explicitly don't want any gutter. We try and be a little clever, if the line we need to draw is going to cross other columns we actually draw it as in the .---' style instead of a pure diagonal ... this reduces confusion by an incredible amount. """ ctx.rectangle(bg_area.x, bg_area.y, bg_area.width, bg_area.height) ctx.clip() box_size = self.box_size(widget) # Maybe draw branch head highlight under revision node if self.node: (column, colour) = self.node arc_start_position_x = cell_area.x + box_size * column + box_size / 2; arc_start_position_y = cell_area.y + cell_area.height / 2; ctx.set_line_width(box_size / 8) ctx.set_line_cap(cairo.LINE_CAP_ROUND) # Draw lines into the cell if self.in_lines: for start, end, lcolour in self.in_lines: style = style_SOLID self.render_line (ctx, cell_area, box_size, bg_area.y, bg_area.height, start, end, lcolour, style) # Draw lines out of the cell if self.out_lines: for start, end, lcolour in self.out_lines: style = style_SOLID self.render_line (ctx, cell_area, box_size, bg_area.y + bg_area.height, bg_area.height, start, end, lcolour, style) # Draw the revision node in the right column if not self.node: return ctx.arc(arc_start_position_x, arc_start_position_y, box_size / 5, 0, 2 * math.pi) self.set_colour(ctx, colour, 0.0, 0.5) ctx.stroke_preserve() self.set_colour(ctx, colour, 0.5, 1.0) ctx.fill() ctx.save() def render_line (self, ctx, cell_area, box_size, mid, height, start, end, colour, style): if start is None: x = cell_area.x + box_size * end + box_size / 2 ctx.move_to(x, mid + height / 3) ctx.line_to(x, mid + height / 3) ctx.move_to(x, mid + height / 6) ctx.line_to(x, mid + height / 6) elif end is None: x = cell_area.x + box_size * start + box_size / 2 ctx.move_to(x, mid - height / 3) ctx.line_to(x, mid - height / 3) ctx.move_to(x, mid - height / 6) ctx.line_to(x, mid - height / 6) else: startx = cell_area.x + box_size * start + box_size / 2 endx = cell_area.x + box_size * end + box_size / 2 ctx.move_to(startx, mid - height / 2) if start - end == 0 : ctx.line_to(endx, mid + height / 2) else: ctx.curve_to(startx, mid - height / 5, startx, mid - height / 5, startx + (endx - startx) / 2, mid) ctx.curve_to(endx, mid + height / 5, endx, mid + height / 5 , endx, mid + height / 2) self.set_colour(ctx, colour, 0.0, 0.65) if style == style_DASHED: dashes = [1, 2] ctx.set_dash(dashes) ctx.stroke() ctx.set_dash([]) rabbitvcs-0.18/rabbitvcs/ui/reset.py000066400000000000000000000103111362112712700175070ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext class GitReset(InterfaceView): """ Provides a UI to reset your repository to some specified state """ def __init__(self, path, revision=None): InterfaceView.__init__(self, "reset", "Reset") self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.path = path self.revision_obj = None if revision: self.revision_obj = self.git.revision(revision) self.get_widget("path").set_text(S(path).display()) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.git, revision=self.revision_obj, url=self.path, expand=True ) self.get_widget("none_opt").set_active(True) self.check_path() def on_ok_clicked(self, widget): path = self.get_widget("path").get_text() mixed = self.get_widget("mixed_opt").get_active() soft = self.get_widget("soft_opt").get_active() hard = self.get_widget("hard_opt").get_active() merge = self.get_widget("merge_opt").get_active() none = self.get_widget("none_opt").get_active() type = None if mixed: type = "mixed" if soft: type = "soft" if hard: type = "hard" if merge: type = "merge" revision = self.revision_selector.get_revision_object() self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Reset")) self.action.append(self.action.set_status, _("Running Reset Command...")) self.action.append( self.git.reset, path, revision, type ) self.action.append(self.action.set_status, _("Completed Reset")) self.action.append(self.action.finish) self.action.schedule() def on_browse_clicked(self, widget, data=None): chooser = rabbitvcs.ui.dialog.FolderChooser() path = chooser.run() if path is not None: self.get_widget("path").set_text(S(path).display()) def on_path_changed(self, widget, data=None): self.check_path() def check_path(self): path = self.get_widget("path").get_text() root = self.git.find_repository_path(path) if root != path: self.get_widget("none_opt").set_active(True) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs reset [-r REVISION] path" ) window = GitReset(paths[0], options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/revert.py000077500000000000000000000176201362112712700177110ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import six.moves._thread from time import sleep from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.util.contextmenu import GtkFilesContextMenu, GtkContextMenuCaller import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log from rabbitvcs.vcs.status import Status log = Log("rabbitvcs.ui.revert") from rabbitvcs import gettext _ = gettext.gettext helper.gobject_threads_init() import rabbitvcs.vcs log = Log("rabbitvcs.ui.revert") from rabbitvcs import gettext _ = gettext.gettext class Revert(InterfaceView, GtkContextMenuCaller): TOGGLE_ALL = True def __init__(self, paths, base_dir=None): InterfaceView.__init__(self, "revert", "Revert") self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.items = [] self.statuses = self.vcs.statuses_for_revert(paths) self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [GObject.TYPE_BOOLEAN, rabbitvcs.ui.widget.TYPE_HIDDEN_OBJECT, rabbitvcs.ui.widget.TYPE_PATH, GObject.TYPE_STRING], [rabbitvcs.ui.widget.TOGGLE_BUTTON, "", _("Path"), _("Extension")], filters=[{ "callback": rabbitvcs.ui.widget.path_filter, "user_data": { "base_dir": base_dir, "column": 2 } }], callbacks={ "row-activated": self.on_files_table_row_activated, "mouse-event": self.on_files_table_mouse_event, "key-event": self.on_files_table_key_event } ) self.initialize_items() def on_ok_clicked(self, widget): return True def load(self): self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths, self.statuses) self.populate_files_table() self.get_widget("status").set_text(_("Found %d item(s)") % len(self.items)) def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path) ]) # Overrides the GtkContextMenuCaller method def on_context_menu_command_finished(self): self.initialize_items() def initialize_items(self): """ Initializes the activated cache and loads the file items in a new thread """ try: six.moves._thread.start_new_thread(self.load, ()) except Exception as e: log.exception(e) def on_select_all_toggled(self, widget): self.TOGGLE_ALL = not self.TOGGLE_ALL for row in self.files_table.get_items(): row[0] = self.TOGGLE_ALL def on_files_table_row_activated(self, treeview, event, col): paths = self.files_table.get_selected_row_items(1) helper.launch_diff_tool(*paths) def on_files_table_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) == "Delete": self.delete_items(treeview, event) def on_files_table_mouse_event(self, treeview, event, *args): if event.button == 3 and event.type == Gdk.EventType.BUTTON_RELEASE: self.show_files_table_popup_menu(treeview, event) def show_files_table_popup_menu(self, treeview, event): paths = self.files_table.get_selected_row_items(1) GtkFilesContextMenu(self, event, self.base_dir, paths).show() class SVNRevert(Revert): def __init__(self, paths, base_dir=None): Revert.__init__(self, paths, base_dir) self.svn = self.vcs.svn() def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.vcs.svn(), register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Revert")) self.action.append(self.action.set_status, _("Running Revert Command...")) self.action.append(self.vcs.svn().revert, items, recurse=True) self.action.append(self.action.set_status, _("Completed Revert")) self.action.append(self.action.finish) self.action.schedule() class GitRevert(Revert): def __init__(self, paths, base_dir=None): Revert.__init__(self, paths, base_dir) self.git = self.vcs.git(self.paths[0]) def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Revert")) self.action.append(self.action.set_status, _("Running Revert Command...")) self.action.append(self.git.checkout, items) self.action.append(self.action.set_status, _("Completed Revert")) self.action.append(self.action.finish) self.action.schedule() class SVNRevertQuiet(object): def __init__(self, paths, base_dir=None): self.vcs = rabbitvcs.vcs.VCS() self.action = rabbitvcs.ui.action.SVNAction( self.vcs.svn(), run_in_thread=False ) self.action.append(self.vcs.svn().revert, paths) self.action.schedule() class GitRevertQuiet(object): def __init__(self, paths, base_dir=None): self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(paths[0]) self.action = rabbitvcs.ui.action.GitAction( self.git, run_in_thread=False ) self.action.append(self.git.checkout, paths) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNRevert, rabbitvcs.vcs.VCS_GIT: GitRevert } quiet_classes_map = { rabbitvcs.vcs.VCS_SVN: SVNRevertQuiet, rabbitvcs.vcs.VCS_GIT: GitRevertQuiet } def revert_factory(classes_map, paths, base_dir=None): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT, QUIET_OPT (options, paths) = main( [BASEDIR_OPT, QUIET_OPT], usage="Usage: rabbitvcs revert [path1] [path2] ..." ) if options.quiet: revert_factory(quiet_classes_map, paths) else: window = revert_factory(classes_map, paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/revprops.py000066400000000000000000000071351362112712700202570ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui.properties import PropertiesBase import rabbitvcs.ui.widget import rabbitvcs.ui.dialog from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs.util.log import Log from rabbitvcs.ui.action import SVNAction log = Log("rabbitvcs.ui.revprops") from rabbitvcs import gettext _ = gettext.gettext class SVNRevisionProperties(PropertiesBase): def __init__(self, path, revision=None): PropertiesBase.__init__(self, path) self.svn = self.vcs.svn() if not self.svn.is_path_repository_url(path): self.path = self.svn.get_repo_url(path) self.get_widget("path").set_text(S(self.path).display()) self.revision = revision self.revision_obj = None if revision is not None: self.revision_obj = self.svn.revision("number", revision) self.load() def load(self): self.table.clear() try: self.proplist = self.svn.revproplist( self.get_widget("path").get_text(), self.revision_obj ) except Exception as e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) self.proplist = {} if self.proplist: for key,val in list(self.proplist.items()): self.table.append([False, key,val.rstrip()]) def save(self): delete_recurse = self.get_widget("delete_recurse").get_active() self.action = SVNAction( self.svn, notification=False, run_in_thread=False ) for row in self.delete_stack: self.action.append( self.svn.revpropdel, self.path, row[1], self.revision_obj, force=True ) for row in self.table.get_items(): self.action.append( self.svn.revpropset, row[1], row[2], self.path, self.revision_obj, force=True ) self.action.schedule() self.close() if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main( [VCS_OPT], usage="Usage: rabbitvcs revprops [url1@rev1]" ) pathrev = helper.parse_path_revision_string(args.pop(0)) window = SVNRevisionProperties(pathrev[0], pathrev[1]) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/settings.py000066400000000000000000000360301362112712700202330ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import dbus import datetime from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util.settings from rabbitvcs.util.strings import S import rabbitvcs.services.checkerservice from rabbitvcs.services.checkerservice import StatusCheckerStub from rabbitvcs import gettext, _gettext, APP_NAME, LOCALE_DIR _ = gettext.gettext CHECKER_UNKNOWN_INFO = _("Unknown") CHECKER_SERVICE_ERROR = _( "There was an error communicating with the status checker service.") from locale import getdefaultlocale, getlocale, LC_MESSAGES class Settings(InterfaceView): dtformats = [ ["", _("default")], ["%c", _("locale")], ["%Y-%m-%d %H:%M:%S", _("ISO")], ["%b %d, %Y %I:%M:%S %p", None], ["%B %d, %Y %I:%M:%S %p", None], ["%m/%d/%Y %I:%M:%S %p", None], ["%b %d, %Y %H:%M:%S", None], ["%B %d, %Y %H:%M:%S", None], ["%m/%d/%Y %H:%M:%S", None], ["%d %b %Y %H:%M:%S", None], ["%d %B %Y %H:%M:%S", None], ["%d/%m/%Y %H:%M:%S", None] ] def __init__(self, base_dir=None): """ Provides an interface to the settings library. """ InterfaceView.__init__(self, "settings", "Settings") self.checker_service = None self.settings = rabbitvcs.util.settings.SettingsManager() self.get_widget("enable_attributes").set_active( int(self.settings.get("general", "enable_attributes")) ) self.get_widget("enable_emblems").set_active( int(self.settings.get("general", "enable_emblems")) ) self.get_widget("enable_recursive").set_active( int(self.settings.get("general", "enable_recursive")) ) self.get_widget("enable_highlighting").set_active( int(self.settings.get("general","enable_highlighting")) ) self.get_widget("enable_colorize").set_active( int(self.settings.get("general","enable_colorize")) ) self.get_widget("show_debug").set_active( int(self.settings.get("general","show_debug")) ) self.get_widget("enable_subversion").set_active( int(self.settings.get("HideItem", "svn")) == 0 ) self.get_widget("enable_git").set_active( int(self.settings.get("HideItem", "git")) == 0 ) dtfs = [] dt = datetime.datetime.today() # Disambiguate day. if dt.day <= 12: dt = datetime.datetime(dt.year, dt.month, dt.day + 12, dt.hour, dt.minute, dt.second) for format, label in self.dtformats: if label is None: label = helper.format_datetime(dt, format) dtfs.append([format, label]) self.datetime_format = rabbitvcs.ui.widget.ComboBox(self.get_widget("datetime_format"), dtfs, 2, 1) self.datetime_format.set_active_from_value( self.settings.get("general", "datetime_format") ) self.default_commit_message = rabbitvcs.ui.widget.TextView(self.get_widget("default_commit_message")) self.default_commit_message.set_text( S(self.settings.get_multiline("general", "default_commit_message")).display() ) self.get_widget("diff_tool").set_text( S(self.settings.get("external", "diff_tool")).display() ) self.get_widget("diff_tool_swap").set_active( int(self.settings.get("external", "diff_tool_swap")) ) self.get_widget("merge_tool").set_text( S(self.settings.get("external", "merge_tool")).display() ) self.get_widget("cache_number_repositories").set_text( S(self.settings.get("cache", "number_repositories")).display() ) self.get_widget("cache_number_messages").set_text( S(self.settings.get("cache", "number_messages")).display() ) self.logging_type = rabbitvcs.ui.widget.ComboBox( self.get_widget("logging_type"), ["None", "Console", "File", "Both"] ) val = self.settings.get("logging", "type") if not val: val = "Console" self.logging_type.set_active_from_value(val) self.logging_level = rabbitvcs.ui.widget.ComboBox( self.get_widget("logging_level"), ["Debug", "Info", "Warning", "Error", "Critical"] ) val = self.settings.get("logging", "level") if not val: val = "Debug" self.logging_level.set_active_from_value(val) # Git Configuration Editor show_git = False self.file_editor = None if base_dir: vcs = rabbitvcs.vcs.VCS() git_config_files = [] if vcs.is_in_a_or_a_working_copy(base_dir) and vcs.guess(base_dir)["vcs"] == rabbitvcs.vcs.VCS_GIT: git = vcs.git(base_dir) git_config_files = git.get_config_files(base_dir) self.file_editor = rabbitvcs.ui.widget.MultiFileTextEditor( self.get_widget("git_config_container"), _("Config file:"), git_config_files, git_config_files, show_add_line=False ) show_git = True if show_git: self.get_widget("pages").get_nth_page(5).show() else: self.get_widget("pages").get_nth_page(5).hide() self._populate_checker_tab() def _get_checker_service(self, report_failure=True): if not self.checker_service: try: session_bus = dbus.SessionBus() self.checker_service = session_bus.get_object( rabbitvcs.services.checkerservice.SERVICE, rabbitvcs.services.checkerservice.OBJECT_PATH) # Initialize service locale in case it just started. self.checker_service.SetLocale(*getlocale(LC_MESSAGES)) except dbus.DBusException as ex: if report_failure: rabbitvcs.ui.dialog.MessageBox(CHECKER_SERVICE_ERROR) return self.checker_service def _populate_checker_tab(self, report_failure = True, connect = True): # This is a limitation of GLADE, and can be removed when we migrate to # GTK2 Builder checker_service = self.checker_service if not checker_service and connect: checker_service = self._get_checker_service(report_failure) self.get_widget("stop_checker").set_sensitive(bool(checker_service)) if(checker_service): self.get_widget("checker_type").set_text(S(checker_service.CheckerType()).display()) self.get_widget("pid").set_text(S(checker_service.PID()).display()) memory = checker_service.MemoryUsage() if memory: self.get_widget("memory_usage").set_text("%s KB" % memory) else: self.get_widget("memory_usage").set_text(CHECKER_UNKNOWN_INFO) self.get_widget("locale").set_text(S(".".join(checker_service.SetLocale())).display()) self._populate_info_table(checker_service.ExtraInformation()) else: self.get_widget("checker_type").set_text(CHECKER_UNKNOWN_INFO) self.get_widget("pid").set_text(CHECKER_UNKNOWN_INFO) self.get_widget("memory_usage").set_text(CHECKER_UNKNOWN_INFO) self.get_widget("locale").set_text(CHECKER_UNKNOWN_INFO) self._clear_info_table() def _clear_info_table(self): for info_table in self.get_widget("info_table_area").get_children(): info_table.destroy() def _populate_info_table(self, info): self._clear_info_table() table_place = self.get_widget("info_table_area") table = rabbitvcs.ui.widget.KeyValueTable(info) table_place.add(table) table.show() def on_refresh_info_clicked(self, widget): self._populate_checker_tab() def _stop_checker(self): pid = None if self.checker_service: try: pid = self.checker_service.Quit() except dbus.exceptions.DBusException: # Ignore it, it will necessarily happen when we kill the service pass self.checker_service = None if pid: try: os.waitpid(pid, 0) except OSError: # This occurs if the process is already gone. pass def on_restart_checker_clicked(self, widget): self._stop_checker() rabbitvcs.services.checkerservice.start() self._populate_checker_tab() def on_stop_checker_clicked(self, widget): self._stop_checker() self._populate_checker_tab(report_failure = False, connect = False) def on_destroy(self, widget): Gtk.main_quit() def on_cancel_clicked(self, widget): Gtk.main_quit() def on_ok_clicked(self, widget): self.save() Gtk.main_quit() def on_apply_clicked(self, widget): self.save() def save(self): self.settings.set( "general", "enable_attributes", self.get_widget("enable_attributes").get_active() ) self.settings.set( "general", "enable_emblems", self.get_widget("enable_emblems").get_active() ) self.settings.set( "general", "enable_recursive", self.get_widget("enable_recursive").get_active() ) self.settings.set( "general", "enable_highlighting", self.get_widget("enable_highlighting").get_active() ) self.settings.set( "general", "enable_colorize", self.get_widget("enable_colorize").get_active() ) self.settings.set( "general", "show_debug", self.get_widget("show_debug").get_active() ) self.settings.set( "HideItem", "svn", not self.get_widget("enable_subversion").get_active() ) self.settings.set( "HideItem", "git", not self.get_widget("enable_git").get_active() ) self.settings.set_multiline( "general", "default_commit_message", self.default_commit_message.get_text() ) self.settings.set( "general", "datetime_format", self.datetime_format.get_active_text() ) self.settings.set( "external", "diff_tool", self.get_widget("diff_tool").get_text() ) self.settings.set( "external", "diff_tool_swap", self.get_widget("diff_tool_swap").get_active() ) self.settings.set( "external", "merge_tool", self.get_widget("merge_tool").get_text() ) self.settings.set( "cache", "number_repositories", self.get_widget("cache_number_repositories").get_text() ) self.settings.set( "cache", "number_messages", self.get_widget("cache_number_messages").get_text() ) self.settings.set( "logging", "type", self.logging_type.get_active_text() ) self.settings.set( "logging", "level", self.logging_level.get_active_text() ) self.settings.write() if self.file_editor: self.file_editor.save() def on_external_diff_tool_browse_clicked(self, widget): chooser = rabbitvcs.ui.dialog.FileChooser( _("Select a program"), "/usr/bin" ) path = chooser.run() if not path is None: path = path.replace("file://", "") self.get_widget("diff_tool").set_text(S(path).display()) def on_cache_clear_repositories_clicked(self, widget): confirmation = rabbitvcs.ui.dialog.Confirmation( _("Are you sure you want to clear your repository paths?") ) if confirmation.run() == Gtk.ResponseType.OK: path = helper.get_repository_paths_path() fh = open(path, "w") fh.write("") fh.close() rabbitvcs.ui.dialog.MessageBox(_("Repository paths cleared")) def on_cache_clear_messages_clicked(self, widget): confirmation = rabbitvcs.ui.dialog.Confirmation( _("Are you sure you want to clear your previous messages?") ) if confirmation.run() == Gtk.ResponseType.OK: path = helper.get_previous_messages_path() fh = open(path, "w") fh.write("") fh.close() rabbitvcs.ui.dialog.MessageBox(_("Previous messages cleared")) def on_cache_clear_authentication_clicked(self, widget): confirmation = rabbitvcs.ui.dialog.Confirmation( _("Are you sure you want to clear your authentication information?") ) if confirmation.run() == Gtk.ResponseType.OK: home_dir = helper.get_user_path() subpaths = [ '/.subversion/auth/svn.simple', '/.subversion/auth/svn.ssl.server', '/.subversion/auth/svn.username' ] for subpath in subpaths: path = "%s%s" % (home_dir, subpath) if os.path.exists(path): files = os.listdir(path) for filename in files: filepath = "%s/%s" % (path, filename) os.remove(filepath) rabbitvcs.ui.dialog.MessageBox(_("Authentication information cleared")) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT (options, paths) = main( [BASEDIR_OPT], usage="Usage: rabbitvcs settings" ) window = Settings(options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/stage.py000066400000000000000000000073471362112712700175070ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.add import Add from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log import rabbitvcs.vcs log = Log("rabbitvcs.ui.stage") from rabbitvcs import gettext _ = gettext.gettext class GitStage(Add): def setup(self, window, columns): window.set_title(_("Stage")) self.git = self.vcs.git(self.paths[0]) self.statuses = self.git.STATUSES_FOR_STAGE def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path) ]) def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Stage")) self.action.append(self.action.set_status, _("Running Stage Command...")) for item in items: self.action.append(self.git.stage, item) self.action.append(self.action.set_status, _("Completed Stage")) self.action.append(self.action.finish) self.action.schedule() class GitStageQuiet(object): def __init__(self, paths, base_dir=None): self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(paths[0]) self.action = rabbitvcs.ui.action.GitAction( self.git, run_in_thread=False ) for path in paths: self.action.append(self.git.stage, path) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_GIT: GitStage } quiet_classes_map = { rabbitvcs.vcs.VCS_GIT: GitStageQuiet } def stage_factory(classes_map, paths, base_dir=None): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT, QUIET_OPT (options, paths) = main( [BASEDIR_OPT, QUIET_OPT], usage="Usage: rabbitvcs stage [path1] [path2] ..." ) if options.quiet: stage_factory(quiet_classes_map, paths) else: window = stage_factory(classes_map, paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/switch.py000077500000000000000000000071001362112712700176730ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog from rabbitvcs.util.strings import * from rabbitvcs import gettext _ = gettext.gettext class SVNSwitch(InterfaceView): def __init__(self, path, revision=None): InterfaceView.__init__(self, "switch", "Switch") self.path = path self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.get_widget("path").set_text(S(self.path).display()) self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("repositories"), helper.get_repository_paths() ) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, revision=revision, url_combobox=self.repositories, expand=True ) self.repositories.set_child_text(helper.unquote_url(self.svn.get_repo_url(self.path))) def on_ok_clicked(self, widget): url = self.repositories.get_active_text() if not url or not self.path: rabbitvcs.ui.dialog.MessageBox(_("The repository location is a required field.")) return revision = self.revision_selector.get_revision_object() self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Switch")) self.action.append(self.action.set_status, _("Running Switch Command...")) self.action.append(helper.save_repository_path, url) self.action.append( self.svn.switch, self.path, helper.quote_url(url), revision=revision ) self.action.append(self.action.set_status, _("Completed Switch")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNSwitch } def switch_factory(path, revision=None): guess = rabbitvcs.vcs.guess(path) return classes_map[guess["vcs"]](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT (options, args) = main( [REVISION_OPT], usage="Usage: rabbitvcs switch [url]" ) window = switch_factory(args[0], revision=options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/tags.py000066400000000000000000000275531362112712700173430ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os from datetime import datetime import time from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk, Pango sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget from rabbitvcs.ui.dialog import DeleteConfirmation from rabbitvcs.ui.log import log_dialog_factory from rabbitvcs.util.strings import S import rabbitvcs.util.settings import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext STATE_ADD = 0 STATE_EDIT = 1 class GitTagManager(InterfaceView): """ Provides a UI interface to manage items """ state = STATE_ADD def __init__(self, path, revision=None): InterfaceView.__init__(self, "manager", "Manager") self.path = path sm = rabbitvcs.util.settings.SettingsManager() self.datetime_format = sm.get("general", "datetime_format") self.get_widget("right_side").show() self.get_widget("Manager").set_size_request(695, -1) self.get_widget("Manager").set_title(_("Tag Manager")) self.get_widget("items_label").set_markup(_("Tags")) self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) self.revision_obj = self.git.revision(revision) self.selected_tag = None self.items_treeview = rabbitvcs.ui.widget.Table( self.get_widget("items_treeview"), [GObject.TYPE_STRING], [_("Tag")], callbacks={ "mouse-event": self.on_treeview_mouse_event, "key-event": self.on_treeview_key_event }, flags={ "sortable": True, "sort_on": 0 } ) self.initialize_detail() self.load(self.show_add) def initialize_detail(self): self.detail_container = self.get_widget("detail_container") self.detail_grid = Gtk.Grid() self.detail_grid.set_row_spacing(4) self.detail_grid.set_column_spacing(6) self.detail_grid.set_hexpand(True) row = 0 # Set up the Tag line label = Gtk.Label(label = _("Name:")) label.set_properties(xalign=0, yalign=.5) self.tag_entry = Gtk.Entry() self.tag_entry.set_hexpand(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.tag_entry, 1, row, 2, 1) tag_name_row = row row = row + 1 # Set up the Commit-sha line label = Gtk.Label(label = _("Revision:")) label.set_properties(xalign=0, yalign=.5) self.start_point_entry = Gtk.Entry() self.start_point_entry.set_size_request(300, -1) self.start_point_entry.set_hexpand(True) if self.revision_obj.value: self.start_point_entry.set_text(S(self.revision_obj).display()) self.log_dialog_button = Gtk.Button() self.log_dialog_button.connect("clicked", self.on_log_dialog_button_clicked) image = Gtk.Image() image.set_from_icon_name("rabbitvcs-show_log", Gtk.IconSize.SMALL_TOOLBAR) self.log_dialog_button.set_image(image) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.start_point_entry, 1, row, 1, 1) self.detail_grid.attach(self.log_dialog_button, 2, row, 1, 1) start_point_row = row row = row + 1 # Set up the Log Message Entry line label = Gtk.Label(label = _("Message:")) label.set_properties(xalign=0, yalign=0) self.message_entry = rabbitvcs.ui.widget.TextView() self.message_entry.view.set_size_request(300, 75) self.message_entry.view.set_hexpand(True) self.message_entry.view.set_vexpand(True) swin = Gtk.ScrolledWindow() swin.set_shadow_type(Gtk.ShadowType.ETCHED_IN) swin.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) swin.set_hexpand(True) swin.set_vexpand(True) swin.add(self.message_entry.view) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(swin, 1, row, 2, 1) message_entry_row = row row = row + 1 # Set up Save button self.save_button = Gtk.Button(label=_("Save")) self.save_button.set_halign(Gtk.Align.START) self.save_button.connect("clicked", self.on_save_clicked) self.detail_grid.attach(self.save_button, 1, row, 1, 1) save_row = row row = row + 1 # Set up the tagger line label = Gtk.Label(label = _("Tagger:")) label.set_properties(xalign=0, yalign=0) self.tagger_label = Gtk.Label(label = "") self.tagger_label.set_properties(xalign=0, yalign=0, selectable=True) self.tagger_label.set_hexpand(True) self.tagger_label.set_line_wrap(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.tagger_label, 1, row, 2, 1) tagger_row = row row = row + 1 # Set up the Date line label = Gtk.Label(label = _("Date:")) label.set_properties(xalign=0, yalign=0) self.date_label = Gtk.Label(label = "") self.date_label.set_properties(xalign=0, yalign=0, selectable=True) self.date_label.set_hexpand(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.date_label, 1, row, 2, 1) date_row = row row = row + 1 # Set up the Revision line label = Gtk.Label(label = _("Revision:")) label.set_properties(xalign=0, yalign=0) self.revision_label = Gtk.Label(label = "") self.revision_label.set_properties(xalign=0, selectable=True) self.revision_label.set_hexpand(True) self.revision_label.set_line_wrap(True) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(self.revision_label, 1, row, 2, 1) revision_row = row row = row + 1 # Set up the Log Message line label = Gtk.Label(label = _("Message:")) label.set_properties(xalign=0, yalign=0) self.message_label = Gtk.Label(label = "") self.message_label.set_properties(xalign=0, yalign=0, selectable=True) self.message_label.set_hexpand(True) self.message_label.set_vexpand(True) self.message_label.set_line_wrap(True) vport = Gtk.Viewport() vport.set_shadow_type(Gtk.ShadowType.NONE) vport.set_hexpand(True) vport.set_vexpand(True) vport.add(self.message_label) swin = Gtk.ScrolledWindow() swin.set_shadow_type(Gtk.ShadowType.NONE) swin.set_size_request(250, -1) swin.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) swin.set_hexpand(True) swin.set_vexpand(True) swin.add(vport) self.detail_grid.attach(label, 0, row, 1, 1) self.detail_grid.attach(swin, 1, row, 2, 1) message_row = row row = row + 1 self.add_rows = [tag_name_row, message_entry_row, start_point_row, save_row] self.view_rows = [tag_name_row, tagger_row, date_row, revision_row, message_row] self.detail_grid.show() self.detail_container.add(self.detail_grid) def load(self, callback, *args, **kwargs): self.items_treeview.clear() self.tag_list = self.git.tag_list() for item in self.tag_list: self.items_treeview.append([item.name]) if callback: callback(*args, **kwargs) def on_add_clicked(self, widget): self.show_add() def on_delete_clicked(self, widget): selected = self.items_treeview.get_selected_row_items(0) confirm = rabbitvcs.ui.dialog.Confirmation(_("Are you sure you want to delete %s?" % ", ".join(selected))) result = confirm.run() if result == Gtk.ResponseType.OK or result == True: for tag in selected: self.git.tag_delete(tag) self.load(self.show_add) def on_save_clicked(self, widget): tag_name = self.tag_entry.get_text() tag_message = self.message_entry.get_text() tag_revision = self.git.revision(self.start_point_entry.get_text()) self.git.tag(tag_name, tag_message, tag_revision) self.load(self.show_detail, tag_name) def on_treeview_key_event(self, treeview, event, *args): if Gdk.keyval_name(event.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, event) def on_treeview_mouse_event(self, treeview, event, *args): self.on_treeview_event(treeview, event) def on_treeview_event(self, treeview, event): selected = self.items_treeview.get_selected_row_items(0) if len(selected) > 0: if len(selected) == 1: self.show_detail(selected[0]) self.get_widget("delete").set_sensitive(True) else: self.show_add() def show_rows(self, rows): self.detail_grid.hide() for w in self.detail_grid.get_children(): if self.detail_grid.child_get_property(w, "top-attach") in rows: w.show_all() else: w.hide() self.detail_grid.show() def show_add(self): self.items_treeview.unselect_all() self.tag_entry.set_text("") self.message_entry.set_text("") self.save_button.set_label(_("Add")) self.show_rows(self.add_rows) self.get_widget("detail_label").set_markup(_("Add Tag")) def show_detail(self, tag_name): self.selected_tag = None for item in self.tag_list: if S(item.name) == tag_name: self.selected_tag = item break self.save_button.set_label(_("Save")) if self.selected_tag: self.tag_entry.set_text(S(self.selected_tag.name).display()) self.revision_label.set_text(S(self.selected_tag.sha).display()) self.message_label.set_text(S(self.selected_tag.message).display().rstrip("\n")) self.tagger_label.set_text(S(self.selected_tag.tagger).display()) self.date_label.set_text(helper.format_datetime(datetime.fromtimestamp(self.selected_tag.tag_time), self.datetime_format)) self.show_rows(self.view_rows) self.get_widget("detail_label").set_markup(_("Tag Detail")) def on_log_dialog_button_clicked(self, widget): log_dialog_factory( self.path, ok_callback=self.on_log_dialog_closed ) def on_log_dialog_closed(self, data): if data: self.start_point_entry.set_text(S(data).display()) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, paths) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs tag-manager path" ) window = GitTagManager(paths[0], options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/unlock.py000077500000000000000000000111441362112712700176700ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView, InterfaceNonView from rabbitvcs.ui.add import Add from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.unlock") from rabbitvcs import gettext _ = gettext.gettext class SVNUnlock(Add): def setup(self, window, columns): window.set_title(_("Unlock")) self.svn = self.vcs.svn() self.statuses = None # # Helpers # def on_context_menu_command_finished(self): self.initialize_items() def initialize_items(self): """ Initializes the activated cache and loads the file items in a new thread """ try: six.moves._thread.start_new_thread(self.load, ()) except Exception as e: log.exception(e) def load(self): self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths, self.statuses) self.populate_files_table() def populate_files_table(self): self.files_table.clear() found = 0 for item in self.items: # FIXME: ... if item.simple_content_status() in (rabbitvcs.vcs.status.status_unversioned, rabbitvcs.vcs.status.status_ignored): continue if not self.svn.is_locked(item.path): continue self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path) ]) found += 1 self.get_widget("status").set_text(_("Found %d item(s)") % found) # # UI Signal Callbacks # def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Unlock")) self.action.append(self.action.set_status, _("Running Unlock Command...")) for item in items: self.action.append(self.svn.unlock, item, force=True) self.action.append(self.action.set_status, _("Completed Unlock")) self.action.append(self.action.finish) self.action.schedule() class SVNUnlockQuiet(object): """ This class provides a handler to unlock functionality. """ def __init__(self, paths, base_dir=None): self.paths = paths self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() for path in self.paths: self.svn.unlock(path, force=True) classes_map = { rabbitvcs.vcs.VCS_SVN: SVNUnlock } quiet_classes_map = { rabbitvcs.vcs.VCS_SVN: SVNUnlockQuiet } def unlock_factory(cmap, paths, base_dir=None): guess = rabbitvcs.vcs.guess(paths[0]) return cmap[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT, QUIET_OPT (options, paths) = main( [BASEDIR_OPT, QUIET_OPT], usage="Usage: rabbitvcs unlock [path1] [path2] ..." ) if options.quiet: unlock_factory(quiet_classes_map, paths) else: window = unlock_factory(classes_map, paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/unstage.py000066400000000000000000000074071362112712700200470ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import six.moves._thread from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.add import Add from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log import rabbitvcs.vcs log = Log("rabbitvcs.ui.unstage") from rabbitvcs import gettext _ = gettext.gettext class GitUnstage(Add): def setup(self, window, columns): window.set_title(_("Unstage")) self.git = self.vcs.git(self.paths[0]) self.statuses = self.git.STATUSES_FOR_UNSTAGE def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, S(item.path), item.path, helper.get_file_extension(item.path) ]) def on_ok_clicked(self, widget): items = self.files_table.get_activated_rows(1) if not items: self.close() return self.hide() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Unstage")) self.action.append(self.action.set_status, _("Running Unstage Command...")) for item in items: self.action.append(self.git.unstage, item) self.action.append(self.action.set_status, _("Completed Unstage")) self.action.append(self.action.finish) self.action.schedule() class GitUnstageQuiet(object): def __init__(self, paths, base_dir=None): self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(paths[0]) self.action = rabbitvcs.ui.action.GitAction( self.git, run_in_thread=False ) for path in paths: self.action.append(self.git.unstage, path) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_GIT: GitUnstage } quiet_classes_map = { rabbitvcs.vcs.VCS_GIT: GitUnstageQuiet } def unstage_factory(classes_map, paths, base_dir=None): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths, base_dir) if __name__ == "__main__": from rabbitvcs.ui import main, BASEDIR_OPT, QUIET_OPT (options, paths) = main( [BASEDIR_OPT, QUIET_OPT], usage="Usage: rabbitvcs unstage [path1] [path2] ..." ) if options.quiet: unstage_factory(quiet_classes_map, paths) else: window = unstage_factory(classes_map, paths, options.base_dir) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/update.py000077500000000000000000000115351362112712700176630ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceNonView, InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog from rabbitvcs import gettext _ = gettext.gettext class SVNUpdate(InterfaceNonView): """ This class provides an interface to generate an "update". Pass it a path and it will start an update, running the notification dialog. There is no glade . """ def __init__(self, paths): self.paths = paths self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() def start(self): self.action = SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set(), run_in_thread=False ) self.action.append(self.action.set_header, _("Update")) self.action.append(self.action.set_status, _("Updating...")) self.action.append(self.svn.update, self.paths) self.action.append(self.action.set_status, _("Completed Update")) self.action.append(self.action.finish) self.action.schedule() class GitUpdate(InterfaceView): """ This class provides an interface to generate an "update". Pass it a path and it will start an update, running the notification dialog. There is no glade . """ def __init__(self, paths): InterfaceView.__init__(self, "git-update", "Update") self.paths = paths self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(paths[0]) self.repository_selector = rabbitvcs.ui.widget.GitRepositorySelector( self.get_widget("repository_container"), self.git ) def on_apply_changes_toggled(self, widget, data=None): self.get_widget("merge").set_sensitive(self.get_widget("apply_changes").get_active()) self.get_widget("rebase").set_sensitive(self.get_widget("apply_changes").get_active()) def on_ok_clicked(self, widget, data=None): self.hide() rebase = self.get_widget("rebase").get_active() git_function_params = [] apply_changes = self.get_widget("apply_changes").get_active() repository = self.repository_selector.repository_opt.get_active_text() branch = self.repository_selector.branch_opt.get_active_text() fetch_all = self.get_widget("all").get_active() self.action = GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set(), run_in_thread=False ) self.action.append(self.action.set_header, _("Update")) self.action.append(self.action.set_status, _("Updating...")) if apply_changes: if rebase: git_function_params.append("rebase") if fetch_all: git_function_params.append("all") repository = "" branch = "" self.action.append(self.git.pull, repository, branch, git_function_params) else: if fetch_all: self.action.append(self.git.fetch_all) else: self.action.append(self.git.fetch, repository, branch) self.action.append(self.action.set_status, _("Completed Update")) self.action.append(self.action.finish) self.action.schedule() classes_map = { rabbitvcs.vcs.VCS_SVN: SVNUpdate, rabbitvcs.vcs.VCS_GIT: GitUpdate } def update_factory(paths): guess = rabbitvcs.vcs.guess(paths[0]) return classes_map[guess["vcs"]](paths) if __name__ == "__main__": from rabbitvcs.ui import main (options, paths) = main(usage="Usage: rabbitvcs update [path1] [path2] ...") window = update_factory(paths) window.register_gtk_quit() if isinstance(window, SVNUpdate): window.start() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/updateto.py000066400000000000000000000137071362112712700202260ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GObject, Gdk sa.restore() from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.action import rabbitvcs.ui.widget import rabbitvcs.ui.dialog from rabbitvcs import gettext _ = gettext.gettext class UpdateToRevision(InterfaceView): """ This class provides an interface to update a working copy to a specific revision. It has a glade . """ def __init__(self, path, revision=None): InterfaceView.__init__(self, "update", "Update") self.path = path self.revision = revision self.vcs = rabbitvcs.vcs.VCS() class SVNUpdateToRevision(UpdateToRevision): def __init__(self, path, revision): UpdateToRevision.__init__(self, path, revision) self.svn = self.vcs.svn() self.get_widget("options_box").show() self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.svn, revision=revision, url=self.path, expand=True, revision_changed_callback=self.on_revision_changed ) def on_ok_clicked(self, widget): revision = self.revision_selector.get_revision_object() recursive = self.get_widget("recursive").get_active() omit_externals = self.get_widget("omit_externals").get_active() rollback = self.get_widget("rollback").get_active() self.action = rabbitvcs.ui.action.SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) if rollback: self.action.append(self.action.set_header, _("Rollback To Revision")) self.action.append(self.action.set_status, _("Rolling Back...")) self.action.append( self.svn.merge_ranges, self.svn.get_repo_url(self.path), [(self.svn.revision("HEAD").primitive(), revision.primitive())], self.svn.revision("head"), self.path ) self.action.append(self.action.set_status, _("Completed Rollback")) else: self.action.append(self.action.set_header, _("Update To Revision")) self.action.append(self.action.set_status, _("Updating...")) self.action.append( self.svn.update, self.path, revision=revision, recurse=recursive, ignore_externals=omit_externals ) self.action.append(self.action.set_status, _("Completed Update")) self.action.append(self.action.finish) self.action.schedule() def on_revision_changed(self, revision_selector): # Only allow rollback when a revision number is specified if (revision_selector.revision_kind_opt.get_active() == 1 and revision_selector.revision_entry.get_text() != ""): self.get_widget("rollback").set_sensitive(True) else: self.get_widget("rollback").set_sensitive(False) class GitUpdateToRevision(UpdateToRevision): def __init__(self, path, revision): UpdateToRevision.__init__(self, path, revision) self.get_widget("revision_label").set_text(_("What revision/branch do you want to checkout?")) self.git = self.vcs.git(path) self.revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("revision_container"), self.git, revision=revision, url=self.path, expand=True, revision_changed_callback=self.on_revision_changed ) def on_ok_clicked(self, widget): revision = self.revision_selector.get_revision_object() self.action = rabbitvcs.ui.action.GitAction( self.git, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Checkout")) self.action.append(self.action.set_status, _("Checking out %s..." % revision)) self.action.append( self.git.checkout, [self.path], revision ) self.action.append(self.action.set_status, _("Completed Checkout")) self.action.append(self.action.finish) self.action.schedule() def on_revision_changed(self, revision_selector): pass classes_map = { rabbitvcs.vcs.VCS_SVN: SVNUpdateToRevision, rabbitvcs.vcs.VCS_GIT: GitUpdateToRevision, } def updateto_factory(vcs, path, revision=None): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] return classes_map[vcs](path, revision) if __name__ == "__main__": from rabbitvcs.ui import main, REVISION_OPT, VCS_OPT (options, args) = main( [REVISION_OPT, VCS_OPT], usage="Usage: rabbitvcs updateto [path]" ) window = updateto_factory(options.vcs, args[0], revision=options.revision) window.register_gtk_quit() Gtk.main() rabbitvcs-0.18/rabbitvcs/ui/widget.py000066400000000000000000001500461362112712700176620ustar00rootroot00000000000000from __future__ import absolute_import from six.moves import range # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import os.path from locale import getlocale, LC_MESSAGES, strxfrm import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, Gdk, GObject, Pango HAS_GTKSPELL = False try: gi.require_version("GtkSpell", "3.0") from gi.repository import GtkSpell HAS_GTKSPELL = True except (ImportError, ValueError): pass from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs.util import helper from rabbitvcs.util.strings import S import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.widget") from rabbitvcs.ui import STATUS_EMBLEMS TOGGLE_BUTTON = 'TOGGLE_BUTTON' TYPE_PATH = 'TYPE_PATH' TYPE_STATUS = 'TYPE_STATUS' TYPE_ELLIPSIZED = 'TYPE_ELLIPSIZED' TYPE_GRAPH = 'TYPE_GRAPH' TYPE_MARKUP = 'TYPE_MARKUP' TYPE_HIDDEN = 'TYPE_HIDDEN' TYPE_HIDDEN_OBJECT = 'TYPE_HIDDEN_OBJECT' ELLIPSIZE_COLUMN_CHARS = 20 PATH_ENTRY = 'PATH_ENTRY' SEPARATOR = u'\u2015' * 10 from pprint import pformat def filter_router(model, iter, column, filters): """ Route filter requests for a table's columns. This function is called for each cell of the table that gets displayed. @type model: Gtk.TreeModelFilter or Gtk.TreeModelSort @param model: The TreeModelFilter or Gtk.TreeModelSort instance for our table @type iter: Gtk.TreeIter @param iter: The TreeIter instance for the table row being filtered @type column: int @param column: The column index of the current item being filtered @type filters: list @param filters: A list of dicts used to define how a column should be filtered Note for filters: Each dict consists of a callback function and user data like so: { "callback": self.file_filter, "user_data": { "column": 0, //tells the callback what column to filter "base_dir": "/home/workingcopy" } } @return The filtered output defined for the given column """ real_model = model.get_model() real_iter = model.convert_iter_to_child_iter(iter) row = real_model[real_model.get_path(real_iter)] if not filters: return row[column] for filter in filters: filter_column = filter["user_data"]["column"] if column == filter_column: return filter["callback"](row, column, filter["user_data"]) return row[column] def path_filter(row, column, user_data=None): """ A common filter function that is used in many tables. Changes the displayed path to a path relative to the given base_dir (current working directory) @type row: Gtk.TreeModelRow @param row: The row that is being filtered @type column: int @param column: The column that is being filtered @type user_data: dict @param user_data: A dictionary of user_data useful to this function @rtype str @return A relative path """ base_dir = user_data["base_dir"] if row[column]: relpath = helper.get_relative_path(base_dir, row[column]) if relpath == "": relpath = os.path.basename(row[column]) return relpath else: return row[column] def long_text_filter(row, column, user_data=None): """ Uses the format_long_text helper function to trim and prettify some text. """ text = row[column] cols = user_data["cols"] if text: text = helper.format_long_text(text, cols) return text def git_revision_filter(row, column, user_data=None): """ Only show the first seven characters of a git revision hash """ text = row[column] if text: if text.startswith(""): text = text[3:10] else: text = text[0:7] return text def translate_filter(row, column, user_data=None): """ Translates text as needed. """ text = row[column] if text: return _(text) def compare_items(model, iter1, iter2, user_data=None): if not user_data: # No column data given => Give up return 0 colnum, coltype = user_data real_model = model.get_model() real_iter1 = model.convert_iter_to_child_iter(iter1) real_iter2 = model.convert_iter_to_child_iter(iter2) value1 = real_model.get_value(real_iter1, colnum) value2 = real_model.get_value(real_iter2, colnum) if coltype in [GObject.TYPE_STRING, str]: value1 = strxfrm(value1) value2 = strxfrm(value2) if value1 == value2: return 0 elif value1 < value2: return -1 else: return 1 class TableBase(object): def __init__(self, treeview, coltypes, colnames, values=[], filters=None, filter_types=None, callbacks={}, flags={}): """ @type treeview: Gtk.Treeview @param treeview: The treeview widget to use @type coltypes: list @param coltypes: Contains the "type" of each column (i.e. str or int) @type colnames: list @param colnames: Contains the name string for each column @type values: list @param values: Contains the data to be inserted into the table @type filters: list @param filters: A list of dicts used to define how a column should be filtered Note for filters: Each dict consists of a callback function and user data like so: { "callback": self.file_filter, "user_data": { "column": 0, //tells the callback what column to filter "base_dir": "/home/workingcopy" } } @type filter_types: list @param filter_types: Contains the filtered "type" of each column. @type callbacks: dict @param callbacks: A dict of callbacks to be used. Some are for signal handling while others are useful for other things. @type flags: dict @param flags: A dict of flags FLAGS: @type sortable: boolean @param sortable: whether the columns can be sorted @type sort_on: int @param sort_on: the column number to initially sort by @type editable: list @param editable: A list of which columns are editable """ from .renderers.graphcell import CellRendererGraph if "sortable" not in flags: flags["sortable"] = False if "sort_on" not in flags: flags["sort_on"] = -1 if "editable" not in flags: flags["editable"] = () self.treeview = treeview self.selected_rows = [] # When True, will cause update_selection to reapply the existing content of selected_rows, # rather than the other way around, then set it to False again. self._reassert_selection = False i = 0 for name in colnames: if coltypes[i] == GObject.TYPE_BOOLEAN: cell = Gtk.CellRendererToggle() cell.set_property('activatable', True) cell.set_property('xalign', 0) cell.connect("toggled", self.toggled_cb, i) colname = "" if name != TOGGLE_BUTTON: colname = name col = Gtk.TreeViewColumn(colname, cell) col.set_attributes(cell, active=i) elif coltypes[i] == TYPE_PATH: # The type should be str but we have to use TYPE_PATH to # distinguish from a regular str column coltypes[i] = str # First we create the column, then we create a CellRenderer # instance for the path icon and a CellRenderer instance for # the path. Each is packed into the treeview column col = Gtk.TreeViewColumn(name) cellpb = Gtk.CellRendererPixbuf() cellpb.set_property('xalign', 0) cellpb.set_property('yalign', 0) col.pack_start(cellpb, False) data = None if "file-column-callback" in callbacks: data = { "callback": callbacks["file-column-callback"], "column": i } else: data = { "callback": helper.get_node_kind, "column": i } col.set_cell_data_func(cellpb, self.file_pixbuf, data) cell = Gtk.CellRendererText() cell.set_property('xalign', 0) cell.set_property('yalign', 0) col.pack_start(cell, False) col.set_attributes(cell, text=i) elif coltypes[i] == TYPE_STATUS: # Same as for TYPE_PATH coltypes[i] = str col = Gtk.TreeViewColumn(name) cellpb = Gtk.CellRendererPixbuf() cellpb.set_property('xalign', 0) cellpb.set_property('yalign', 0) col.pack_start(cellpb, False) data = None col.set_cell_data_func(cellpb, self.status_pixbuf, i) cell = Gtk.CellRendererText() cell.set_property('xalign', 0) cell.set_property('yalign', 0) col.pack_start(cell, False) col.set_attributes(cell, text=i) elif coltypes[i] == TYPE_HIDDEN: coltypes[i] = str col = Gtk.TreeViewColumn(name) col.set_visible(False) elif coltypes[i] == TYPE_HIDDEN_OBJECT: coltypes[i] = GObject.TYPE_PYOBJECT col = Gtk.TreeViewColumn(name) col.set_visible(False) elif coltypes[i] == TYPE_ELLIPSIZED: coltypes[i] = str cell = Gtk.CellRendererText() cell.set_property('yalign', 0) cell.set_property('xalign', 0) cell.set_property('ellipsize', Pango.EllipsizeMode.END) cell.set_property('width-chars', ELLIPSIZE_COLUMN_CHARS) col = Gtk.TreeViewColumn(name, cell) col.set_attributes(cell, text=i) elif coltypes[i] == TYPE_GRAPH: coltypes[i] = GObject.TYPE_PYOBJECT cell = CellRendererGraph() col = Gtk.TreeViewColumn(name, cell) col.add_attribute(cell, "graph", i) else: cell = Gtk.CellRendererText() cell.set_property('yalign', 0) cell.set_property('xalign', 0) if i in flags["editable"]: cell.set_property('editable', True) cell.connect("edited", self.__cell_edited, i) if coltypes[i] == TYPE_MARKUP: col = Gtk.TreeViewColumn(name, cell, markup=i) else: col = Gtk.TreeViewColumn(name, cell, text=i) coltypes[i] = GObject.TYPE_STRING if flags["sortable"]: col.set_sort_column_id(i) self.treeview.append_column(col) i += 1 self.coltypes = coltypes self.data = self.get_store(coltypes) self.sorted = None # self.sorted == sorted view of data # self.filter == filtered data (abs paths -> rel paths) # self.data == actual data # The filter is there to change the way data is displayed. The data # should always be accessed via self.data, NOT self.filter. self.filter = self.data.filter_new() types = (filter_types and filter_types or coltypes) self.filter.set_modify_func( types, filter_router, filters) # This runs through the columns, and sets the "compare_items" comparator # as needed. Note that the user data tells which column to sort on. if flags["sortable"]: self.sorted = Gtk.TreeModelSort(self.filter) self.sorted.set_default_sort_func(compare_items, None) for idx in range(0, i): self.sorted.set_sort_func(idx, compare_items, (idx, coltypes[idx])) self.sorted.set_sort_column_id(flags["sort_on"], Gtk.SortType.ASCENDING) self.treeview.set_model(self.sorted) elif filters: self.treeview.set_model(self.filter) else: self.treeview.set_model(self.data) if len(values) > 0: self.populate(values) self.set_resizable() # Set up some callbacks for all tables to deal with row clicking and # selctions self.treeview.connect("cursor-changed", self.__cursor_changed_event) self.treeview.connect("row-activated", self.__row_activated_event) self.treeview.connect("button-press-event", self.__button_press_event) self.treeview.connect("button-release-event", self.__button_release_event) self.treeview.connect("key-press-event", self.__key_press_event) self.treeview.connect("select-cursor-row", self.__row_selected) # Necessary for self.selected_rows to remain sane self.treeview.connect("select-all", self.__all_selected) self.treeview.connect("unselect-all", self.__all_unselected) self.callbacks = callbacks if self.callbacks: self.allow_multiple() def _sortedpath(self, real_path): """ Converts a model index (as stored in selected_rows) into a user selection path """ if self.sorted: path = self.sorted.convert_child_path_to_path(real_path) else: path = self.filter.convert_child_path_to_path(real_path) return path def _realpath(self, visible_path): """ Converts a path (ie. row number) that we get from what the user selects into a path for the underlying data structure. If the data is not sorted, this is trivial; if it is sorted, the sorting model can figure it out for us. """ if self.sorted: path = self.sorted.convert_path_to_child_path(visible_path) else: path = self.filter.convert_path_to_child_path(visible_path) return path def toggled_cb(self, cell, path, column): model = self.data realpath = self._realpath(Gtk.TreePath.new_from_string(path)) # User has clicked a checkbox on a selected item. toggleMulti = realpath in self.selected_rows and len(self.selected_rows) > 1 model[realpath][column] = not model[realpath][column] if "row-toggled" in self.callbacks: self.callbacks["row-toggled"](model[realpath], column) # Set the state of _all_ selected items to match the new state of the checkbox if toggleMulti: sel = self.treeview.get_selection() for selPath in self.selected_rows: model[selPath][column] = model[realpath][column] if "row-toggled" in self.callbacks: self.callbacks["row-toggled"](model[selPath], column) self._reassert_selection = True @gtk_unsafe def real_append(self, **kwargs): return self.data.append(**kwargs) def append(self, row, **kwargs): # Python 3 needs type conversions. newrow = [] for i, item in enumerate(row): if self.coltypes[i] in [GObject.TYPE_STRING, str]: item = S(item).display() newrow.append(item) return self.real_append(row=newrow, **kwargs) @gtk_unsafe def remove(self, index): model = self.data del model[index] def remove_multiple(self, rows): i = 0 for row in rows: rm_index = row if i > 0: rm_index -= 1 self.remove(rm_index) i += 1 def get_items(self): return self.data @gtk_unsafe def clear(self): self.data.clear() self.reset_selection() def get_row(self, index): model = self.data return model[index] @gtk_unsafe def set_row(self, index, row): model = self.data model[index] = row @gtk_unsafe def set_row_item(self, row, column, val): model = self.data model[row][column] = val def allow_multiple(self): self.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) def get_activated_rows(self, column=None): returner = [] for row in self.data: if row[0]: item = row if column is not None: item = row[column] returner.append(item) return returner def scroll_to_bottom(self): bottom = len(self.get_items()) - 1 self.treeview.scroll_to_cell(bottom) def set_resizable(self, resizable=True): for col in self.treeview.get_columns(): col.set_resizable(resizable) def get_column(self, column): return self.treeview.get_column(column) def set_column_width(self, column, width=None): col = self.treeview.get_column(column) if width is not None: col.set_sizing(Gtk.TreeViewColumnSizing.FIXED) col.set_fixed_width(width) else: col.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) def update_selection(self): selection = self.treeview.get_selection() # Will be set if a checkmark is changed while multiple rows # selected; user retains their selection after using # the new multicheck feature. if not self._reassert_selection: (model, indexes) = selection.get_selected_rows() self.reset_selection() for path in indexes: self.selected_rows.append(self._realpath(path)) else: self._reassert_selection = False for path in self.selected_rows: selection.select_path(self._sortedpath(path)) def reset_selection(self): self.selected_rows = [] def get_selected_row_items(self, col): items = [] for row in self.selected_rows: items.append(self.data[row][col]) return items def get_selected_rows(self): return self.selected_rows def generate_string_from_data(self): lines = [] for row in self.data: line = [] for cell in row: line.append(S(cell)) lines.append("\t".join(line)) return "\n".join(lines) @gtk_unsafe def unselect_all(self): self.treeview.get_selection().unselect_all() def focus(self, row, column): treecol = self.treeview.get_column(column) self.treeview.set_cursor((row,), treecol) self.treeview.grab_focus() def __button_press_event(self, treeview, event, *args): info = treeview.get_path_at_pos(int(event.x), int(event.y)) selection = treeview.get_selection() result = False # If info is none, that means the user is clicking the empty space # In that case, unselect everything and update the selected_rows if info is None: selection.unselect_all() self.update_selection() elif event.button == 3: # this allows us to retain multiple selections with a right-click (model, indexes) = selection.get_selected_rows() # If the mouse click is one of the currently selected rows # keep the selection, otherwise, use the new selection result = any(index == info[0] for index in indexes) if "mouse-event" in self.callbacks: result = self.callbacks["mouse-event"](treeview, event, *args) or result return result def __row_activated_event(self, treeview, data, col): treeview.grab_focus() self.update_selection() if "row-activated" in self.callbacks: self.callbacks["row-activated"](treeview, data, col) def __row_selected(self, treeview, started_editing): self.update_selection() if "row-selected" in self.callbacks: self.callbacks["row-selected"](treeview, started_editing) # Without these in place, Ctrl+A / Shift+Ctrl+A were not updating # self.selected_rows def __all_selected(self, treeview): treeview.get_selection().select_all() self.update_selection() if "all-selected" in self.callbacks: self.callbacks["all-selected"](treeview) def __all_unselected(self, treeview): treeview.get_selection().unselect_all() self.update_selection() if "all-unselected" in self.callbacks: self.callbacks["all-unselected"](treeview) def __key_press_event(self, treeview, event, *args): self.update_selection() if "key-event" in self.callbacks: self.callbacks["key-event"](treeview, event, *args) def __cursor_changed_event(self, treeview): self.update_selection() if "cursor-changed" in self.callbacks: self.callbacks["cursor-changed"](treeview) def __button_release_event(self, treeview, event, *args): self.update_selection() if "mouse-event" in self.callbacks: return self.callbacks["mouse-event"](treeview, event, *args) def __cell_edited(self, cell, row, data, column): self.update_selection() if "cell-edited" in self.callbacks: self.callbacks["cell-edited"](cell, row, data, column) # def __column_header_clicked(self, column, column_idx): # self.data.set_sort_column_id(column_idx, ) def status_pixbuf(self, column, cell, model, iter, colnum): path = model.get_path(iter) real_path = model.convert_path_to_child_path(path) status = self.data[real_path][colnum] if status not in list(STATUS_EMBLEMS.keys()): status = "error" icon = "emblem-" + STATUS_EMBLEMS[status] cell.set_property("icon-name", icon) def file_pixbuf(self, column, cell, model, iter, data=None): icon_name = None path = model.get_path(iter) real_path = model.convert_path_to_child_path(path) if data: real_item = self.data[real_path][data["column"]] kind = data["callback"](real_item) icon_name = "text-x-generic" if kind == "dir": icon_name = "folder" if not icon_name is None: cell.set_property("icon-name", icon_name) class Table(TableBase): """ Generate a flat tree view. See the TableBase documentation for parameter information """ def __init__(self, treeview, coltypes, colnames, values=[], filters=None, filter_types=None, callbacks={}, flags={}): TableBase.__init__(self, treeview, coltypes, colnames, values, filters, filter_types, callbacks, flags) def get_store(self, coltypes): return Gtk.ListStore(*coltypes) def populate(self, values): for row in values: self.append(row) def get_selected_rows(self): # Return as a list of integer row indexes. return [path[0] for path in self.selected_rows] class Tree(TableBase): """ Generate a hierarchal tree view. The structure of "values" should be like: values = [ (["A"], [ (["C"], None) ]), (["B"], [ (["D"], [ (["E"], None) ]) ]) ] Note that with multiple columns, you add to the list in the first element of each tuple. (i.e. ["A"] becomes ["A", "Z", ... ] See the TableBase documentation for parameter information """ def __init__(self, treeview, coltypes, colnames, values=[], filters=None, filter_types=None, callbacks={}, flags={}): TableBase.__init__(self, treeview, coltypes, colnames, values, filters, filter_types, callbacks, flags) def get_store(self, coltypes): return Gtk.TreeStore(*coltypes) def populate(self, values, parent=None): for node in values: root = self.append(node[0], parent=parent) if len(node) > 1 and node[1] is not None: self.populate(node[1], root) class Box(object): def __init__(self, box=None, vertical=False, spacing=-1): if not box: box = Gtk.Grid() self.box = box if spacing >= 0: box.set_row_spacing(spacing) box.set_column_spacing(spacing) self.middle = 0 # Determine pack start/end indexes. ch = [(box.child_get_property(c, "left-attach"), box.child_get_property(c, "width")) for c in box.get_children()] cv = [(box.child_get_property(c, "top-attach"), box.child_get_property(c, "height")) for c in box.get_children()] if ch: ch.sort(key = lambda x: x[0]) cv.sort(key = lambda x: x[0]) if ch[-1][0] - ch[0][0] > 0: vertical = False elif cv[-1][0] - cv[0][0] > 0: vertical = True c = cv if vertical else ch last = c.pop() self.middle = last[0] + last[1] while c: prev = c.pop() next = prev[0] + prev[1] if next < last[0]: self.middle = next break last = prev self.insert = self.box.insert_column self.attach = lambda child, pos: self.box.attach(child, pos, 0, 1, 1) self.set_expand = lambda child, expand: child.set_hexpand(expand) self.set_align = lambda child, align: child.set_halign(align) self.set_padding = lambda child, padding: (child.set_margin_start(padding), child.set_margin_end(padding)) if vertical: self.insert = self.box.insert_row self.attach = lambda child, pos: self.box.attach(child, 0, pos, 1, 1) self.set_expand = lambda child, expand: child.set_vexpand(expand) self.set_align = lambda child, align: child.set_valign(align) self.set_padding = lambda child, padding: (child.set_margin_top(padding), child.set_margin_bottom(padding)) def add(self, child): if isinstance(child, Box): child = child.box self.insert(self.middle) self.attach(child, self.middle) self.middle = self.middle + 1 def pack_start(self, child, expand, fill, padding): if isinstance(child, Box): child = child.box self.set_expand(child, expand) self.set_align(child, Gtk.Align.FILL if fill else Gtk.Align.START) self.set_padding(child, padding) self.add(child) def pack_end(self, child, expand, fill, padding): if isinstance(child, Box): child = child.box self.set_expand(child, expand) self.set_align(child, Gtk.Align.FILL if fill else Gtk.Align.END) self.set_padding(child, padding) self.insert(self.middle) self.attach(child, self.middle + 1) def __getattr__(self, name): return getattr(self.box, name) class ComboBox(object): def __init__(self, cb, items=None, columns=1, textcolumn=0): self.cb = cb coltypes = [str] * columns self.model = Gtk.ListStore(*coltypes) if not items is None: for i in items: self.append(i) self.cb.clear() self.cb.set_model(self.model) self.cb.set_entry_text_column(textcolumn) self.cell = Gtk.CellRendererText() self.cb.pack_start(self.cell, True) self.cb.add_attribute(self.cell, 'text', textcolumn) def append(self, item): if not isinstance(item, list): item = [item] self.model.append(item) def set_active_from_value(self, value): index = 0 for entry in self.model: if entry[0] == value: self.cb.set_active(index) return index += 1 def get_active_text(self): child = self.cb.get_child() if isinstance(child, Gtk.Entry): return child.get_text() index = self.cb.get_active() if index < 0: return "" return self.model[index][0] def get_active(self): return self.cb.get_active() def set_active(self, index): self.cb.set_active(index) def set_child_text(self, text): self.cb.get_child().set_text(S(text).display()) def set_sensitive(self, val): self.cb.set_sensitive(val) def set_child_signal(self, signal, callback, userdata=None): self.cb.get_child().connect(signal, callback, userdata) class TextView(object): def __init__(self, widget=None, value="", spellcheck=True): if widget is None: self.view = Gtk.TextView() else: self.view = widget self.buffer = Gtk.TextBuffer() self.view.set_buffer(self.buffer) self.buffer.set_text(S(value).display()) if HAS_GTKSPELL and spellcheck: try: checker = GtkSpell.Checker() try: checker.set_language(getlocale(LC_MESSAGES)[0]) except: checker = None # Language not available. if checker: checker.attach(self.view) except Exception as e: log.exception(e) def get_text(self): return self.buffer.get_text( self.buffer.get_start_iter(), self.buffer.get_end_iter(), True ) @gtk_unsafe def set_text(self, text): self.buffer.set_text(S(text).display()) @gtk_unsafe def append_text(self, text): self.buffer.set_text(S(self.get_text() + text).display()) class ProgressBar(object): def __init__(self, pbar): if pbar is None: self.view = Gtk.ProgressBar() else: self.view = pbar self.timer = None def start_pulsate(self): # Set up an interval to make the progress bar pulse # The timeout is removed after the log action finishes self.timer = GObject.timeout_add(100, self.update) def stop_pulsate(self): if self.timer: GObject.source_remove(self.timer) self.timer = None @gtk_unsafe def update(self, fraction=None): if fraction: if self.timer is not None: self.stop_pulsate() if fraction > 1: fraction = 1 self.view.set_fraction(fraction) return False else: self.view.pulse() return True @gtk_unsafe def set_text(self, text): self.view.set_text(S(text).display()) class Clickable(object): """ Handle mouse button events for any click on an event-sensitive widget. Supports the following additional signals: - single_click(clickable, widget, event, data) - double_click(clickable, widget, event, data) - triple_click(clickable, widget, event, data) - long_click(clickable, widget, event, data) """ _BUTTON_PRESS = Gdk.EventType.BUTTON_PRESS _2BUTTON_PRESS = Gdk.EventType._2BUTTON_PRESS _3BUTTON_PRESS = Gdk.EventType._3BUTTON_PRESS def __init__(self, widget): self.widget = widget self._timer = None self._signals = { self._BUTTON_PRESS: self._signal_data(), self._2BUTTON_PRESS: self._signal_data(), self._3BUTTON_PRESS: self._signal_data(), "long-click": self._signal_data(), "button-press-event": self._signal_data(), "button-release-event": self._signal_data(), None: self._signal_data(), } self._lastpress = None widget.connect("button-press-event", self._on_button_pressed, None) widget.connect("button-release-event", self._on_button_released, None) widget.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) def connect(self, signal, func, *args): if signal == "single-click": self._signals[self._BUTTON_PRESS] = self._signal_data(func, args) elif signal == "double-click": self._signals[self._2BUTTON_PRESS] = self._signal_data(func, args) elif signal == "triple-click": self._signals[self._3BUTTON_PRESS] = self._signal_data(func, args) elif signal in ("long-click", "button-press-event", "button-release-event"): self._signals[signal] = self._signal_data(func, args) else: self.widget.connect(signal, func, *args) def _on_button_pressed(self, widget, event, data): self._cancel_timer() if self._callback("button-press-event", widget, event): return True if event.button == 1: self._lastpress = event.type if event.type == self._BUTTON_PRESS: self._start_timer(1000, self._long_click, event.copy()) return False def _on_button_released(self, widget, event, data): self._cancel_timer() if self._callback("button-release-event", widget, event): return True if event.button == 1: self._callback(self._lastpress, widget, event) self._lastpress = None return False def _long_click(self, event, *args): self._timer = None self._lastpress = None self._callback("long-click", self.widget, event) return False def _callback(self, signal, *args): func, data = self._signals[signal] args = list(args) + data return func(self, *args) @gtk_unsafe def _cancel_timer(self): if self._timer: GObject.source_remove(self._timer) self._timer = None @gtk_unsafe def _start_timer(self, milliseconds, callback, *args): self._cancel_timer() self._timer = GObject.timeout_add(milliseconds, callback, *args) def _signal_data(self, func=None, args=[]): if func is None: func = self._passfalse return (func, list(args)) def _passfalse(self, *args): return False def __getattr__(self, name): return getattr(self.widget, name) class RevisionSelector(object): """ Provides a standard way to generate a revision object from the UI. """ def __init__(self, container, client, revision=None, url_combobox=None, url_entry=None, url=None, expand=False, revision_changed_callback=None): """ @type container: A Gtk container object (i.e. HBox, VBox, Box) @param container: The container that to add this widget @type client: VCS client object @param client: A vcs client instance (i.e. rabbitvcs.vcs.VCS()) @type revision: int @param revision: A revision number to start with @type url_combobox: rabbitvcs.ui.widget.ComboBox @param url_combobox: A repository url combobox @type url_entry: Gtk.Entry @param url_entry: A repository url entry @type url: str @param url: A repository url string Note: The url fields are required for use with the log browser. It can be excluded. """ self.client = client self.revision = revision self.url_combobox = url_combobox self.url_entry = url_entry self.url = url self.revision_changed_callback = revision_changed_callback self.revision_change_inprogress = False hbox = Box(spacing = 4) hbox.set_hexpand(expand) if self.url_combobox: self.url_combobox.cb.connect("changed", self.__on_url_combobox_changed) if client.vcs == rabbitvcs.vcs.VCS_GIT: self.OPTIONS = [ _("HEAD"), _("Revision"), _("Branch") ] elif client.vcs == rabbitvcs.vcs.VCS_SVN: self.OPTIONS = [ _("HEAD"), _("Number") ] if not client.is_path_repository_url(self.get_url()): self.OPTIONS.append(_("Working Copy")) self.revision_kind_opt = ComboBox(Gtk.ComboBox(), self.OPTIONS) self.revision_kind_opt.set_active(0) self.revision_kind_opt.cb.connect("changed", self.__revision_kind_changed) hbox.pack_start(self.revision_kind_opt.cb, False, False, 0) self.revision_entry = Gtk.Entry() self.revision_entry.connect("changed", self.__revision_entry_changed) hbox.pack_start(self.revision_entry, expand, expand, 0) self.branch_selector = None if client.vcs == rabbitvcs.vcs.VCS_GIT: self.branch_selector = GitBranchSelector(hbox, client, self.__branch_selector_changed) self.branch_selector.hide() self.revision_browse = Gtk.Button() revision_browse_image = Gtk.Image() revision_browse_image.set_from_icon_name("edit-find", Gtk.IconSize.MENU) revision_browse_image.show() self.revision_browse.add(revision_browse_image) self.revision_browse.connect("clicked", self.__revision_browse_clicked) hbox.pack_start(self.revision_browse, False, False, 0) if self.revision is not None: self.set_kind_number(revision) else: self.set_kind_head() self.revision_kind_opt.cb.show() self.revision_entry.show() self.revision_browse.show() hbox.show() container.add(hbox.box) def __revision_browse_clicked(self, widget): from rabbitvcs.ui.log import SVNLogDialog, GitLogDialog if self.client.vcs == rabbitvcs.vcs.VCS_GIT: GitLogDialog(self.get_url(), ok_callback=self.__log_closed) elif self.client.vcs == rabbitvcs.vcs.VCS_SVN: SVNLogDialog(self.get_url(), ok_callback=self.__log_closed) def __log_closed(self, data): if data is not None: self.revision_kind_opt.set_active(1) self.revision_entry.set_text(S(data).display()) def __revision_kind_changed(self, widget): self.determine_widget_sensitivity() if self.revision_changed_callback: self.revision_change_inprogress = True GObject.timeout_add(400, self.__revision_changed_callback, self) def __revision_entry_changed(self, widget): if self.revision_changed_callback and not self.revision_change_inprogress: self.revision_change_inprogress = True GObject.timeout_add(400, self.__revision_changed_callback, self) def __revision_changed_callback(self, *args, **kwargs): self.revision_change_inprogress = False self.revision_changed_callback(*args, **kwargs) def __on_url_combobox_changed(self, widget): self.determine_widget_sensitivity() def determine_widget_sensitivity(self): index = self.revision_kind_opt.get_active() allow_revision_browse = True # Default to showing the revision entry self.hide_branch_selector() # Only allow number entry if "Number" is selected if index == 1: self.revision_entry.set_sensitive(True) elif index == 2: if self.client.vcs == rabbitvcs.vcs.VCS_GIT: self.revision_entry.set_sensitive(True) allow_revision_browse = False # If showing the "Branch" option, show the branch selector self.show_branch_selector() else: self.revision_entry.set_text("") self.revision_entry.set_sensitive(False) # Only allow browsing if a URL is provided if self.get_url() and allow_revision_browse: self.revision_browse.set_sensitive(True) else: self.revision_browse.set_sensitive(False) def get_url(self): if self.url_combobox: url = self.url_combobox.get_active_text() if url is None: return "" else: return url elif self.url_entry: return self.url_entry.get_text() elif self.url: return self.url else: return "" def set_url(self, url): self.url = url def get_revision_object(self): """ @rtype rabbitvcs.vcs.###.Revision @return A rabbitvcs revision object index=0 HEAD index=1 Revision Number index=2 SVN Working Copy Git Branch Selector """ index = self.revision_kind_opt.get_active() if index == 0: return self.client.revision("head") elif index == 1: if self.client.vcs == rabbitvcs.vcs.VCS_SVN: return self.client.revision("number", self.revision_entry.get_text()) elif self.client.vcs == rabbitvcs.vcs.VCS_GIT: return self.client.revision(self.revision_entry.get_text()) elif index == 2: if self.client.vcs == rabbitvcs.vcs.VCS_SVN: return self.client.revision("working") elif self.client.vcs == rabbitvcs.vcs.VCS_GIT: return self.client.revision(self.branch_selector.get_branch()) def set_kind_head(self): self.revision_kind_opt.set_active(0) self.determine_widget_sensitivity() def set_kind_number(self, number=None): self.revision_kind_opt.set_active(1) if number is not None: self.revision_entry.set_text(S(number).display()) self.determine_widget_sensitivity() def set_kind_working(self): self.revision_kind_opt.set_active(2) self.determine_widget_sensitivity() def show_branch_selector(self): if self.branch_selector: self.revision_entry.hide() self.revision_browse.hide() self.branch_selector.show() def hide_branch_selector(self): if self.branch_selector: self.branch_selector.hide() self.revision_entry.show() self.revision_browse.show() def __branch_selector_changed(self, branch): self.__revision_entry_changed(self.revision_entry) class KeyValueTable(Gtk.Grid): """ Simple extension of a GTK grid to display a two-column table of information with labels. """ default_col_spacing = 12 default_row_spacing = 6 def __init__(self, stuff): """ @param stuff: a list of two-element tuples - the first element of the tuple is the key/label, and the second element is the information """ super(KeyValueTable, self).__init__() if stuff and len(stuff): row = 0 for key, value in stuff: label_key = Gtk.Label(label = "%s:" % key) label_key.set_properties(xalign=0, use_markup=True) label_value = Gtk.Label(label = "%s" % value) label_value.set_properties(xalign=0, \ ellipsize=Pango.EllipsizeMode.MIDDLE, \ selectable=True) label_value.set_hexpand(True) label_value.set_halign(Gtk.Align.START) self.attach(label_key, 0, row, 1, 1) self.attach(label_value, 1, row, 1, 1) label_key.show() label_value.show() row += 1 self.set_column_spacing(self.default_col_spacing) self.set_row_spacing(self.default_row_spacing) class GitRepositorySelector(object): def __init__(self, container, git, changed_callback=None): self.git = git self.changed_callback = changed_callback grid = Gtk.Grid() grid.set_row_spacing(4) grid.set_column_spacing(6) grid.set_hexpand(True) # Set up the Repository Line label = Gtk.Label(label = _("Repository:")) label.set_justify(Gtk.Justification.LEFT) label.set_halign(Gtk.Align.START) tmp_repos = [] for item in self.git.remote_list(): tmp_repos.append(item["name"]) self.repository_opt = ComboBox(Gtk.ComboBoxText.new_with_entry(), tmp_repos) self.repository_opt.set_active(0) self.repository_opt.cb.connect("changed", self.__repository_changed) self.repository_opt.cb.set_size_request(175, -1) self.repository_opt.cb.set_hexpand(True) grid.attach(label, 0, 0, 1, 1) grid.attach(self.repository_opt.cb, 1, 0, 1, 1) # Set up the Branch line label = Gtk.Label(label = _("Branch:")) label.set_justify(Gtk.Justification.LEFT) label.set_halign(Gtk.Align.START) tmp_branches = [] active_branch_index = 0 index = 0 for item in self.git.branch_list(): tmp_branches.append(item.name) if item.tracking: active_branch_index = index index += 1 self.branch_opt = ComboBox(Gtk.ComboBoxText.new_with_entry(), tmp_branches) self.branch_opt.set_active(active_branch_index) self.branch_opt.cb.connect("changed", self.__branch_changed) self.branch_opt.cb.set_size_request(175, -1) self.branch_opt.cb.set_hexpand(True) grid.attach(label, 0, 1, 1, 1) grid.attach(self.branch_opt.cb, 1, 1, 1, 1) # Set up the Host line label = Gtk.Label(label = _("Host:")) label.set_justify(Gtk.Justification.LEFT) label.set_halign(Gtk.Align.START) self.host = Gtk.Label() self.host.set_justify(Gtk.Justification.LEFT) self.host.set_hexpand(True) self.host.set_halign(Gtk.Align.START) grid.attach(label, 0, 2, 1, 1) grid.attach(self.host, 1, 2, 1, 1) grid.show_all() container.add(grid) self.__update_host() def __update_host(self): repo = self.repository_opt.get_active_text() try: self.host.set_text(S(self.git.config_get(("remote", repo), "url")).display()) except KeyError as e: log.error("Missing remote %s config key" % repo) def __repository_changed(self, repository_opt): if self.changed_callback: self.changed_callback(repository_opt.get_active_text(), self.branch_opt.get_active_text()) self.__update_host() def __branch_changed(self, branch_opt): if self.changed_callback: self.changed_callback(self.repository_opt.get_active_text(), self.branch_opt.get_active_text()) class GitBranchSelector(object): def __init__(self, container, git, changed_callback=None): self.git = git self.changed_callback = changed_callback self.vbox = Box(vertical = True, spacing = 4) tmp_branches = [] active = 0 index = 0 for item in self.git.branch_list(): tmp_branches.append(item.name) if self.git.is_tracking(item.name): active = index index += 1 self.branch_opt = ComboBox(Gtk.ComboBoxText.new_with_entry(), tmp_branches) self.branch_opt.set_active(active) self.branch_opt.cb.connect("changed", self.__branch_changed) self.branch_opt.cb.set_size_request(175, -1) hbox = Box() hbox.pack_start(self.branch_opt.cb, True, False, 0) self.vbox.pack_start(hbox, False, False, 0) self.vbox.show_all() container.add(self.vbox.box) def append(self, widget): self.vbox.pack_start(widget, False, False, 0) def get_branch(self): return self.branch_opt.get_active_text() def __branch_changed(self, branch_opt): pass def show(self): self.vbox.show_all() def hide(self): self.vbox.hide() class MultiFileTextEditor(object): """ Edit a set of text/config/ignore files """ def __init__(self, container, label, combobox_labels, combobox_paths, show_add_line=True, line_content=""): self.container = container self.label = label self.combobox_labels = combobox_labels self.combobox_paths = combobox_paths self.cache = {} self.last_path = None self.combobox = ComboBox(Gtk.ComboBox(), self.combobox_labels) self.combobox.cb.connect("changed", self.__combobox_changed) self.combobox.cb.set_size_request(175, -1) self.textview = TextView(Gtk.TextView()) grid = Gtk.Grid() grid.set_row_spacing(6) grid.set_column_spacing(3) grid.set_hexpand(True) grid.set_vexpand(True) combo_label = Gtk.Label(label = label) combo_label.set_alignment(0, 0.5) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_shadow_type(Gtk.ShadowType.ETCHED_IN) scrolled_window.add(self.textview.view) scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) scrolled_window.set_size_request(320, 150) scrolled_window.set_hexpand(True) scrolled_window.set_vexpand(True) grid.attach(combo_label, 0, 0, 1, 1) grid.attach(self.combobox.cb, 1, 0, 2, 1) if show_add_line: add_label = Gtk.Label(label = _("Add line:")) add_label.set_alignment(0, 0.5) self.add_entry = Gtk.Entry() self.add_entry.set_text(S(line_content).display()) self.add_entry.set_hexpand(True) add_button = Gtk.Button(_("Add")) add_button.connect("clicked", self.__add_button_clicked) grid.attach(add_label, 0, 1, 1, 1) grid.attach(self.add_entry, 1, 1, 1, 1) grid.attach(add_button, 2, 1, 1, 1) grid.attach(scrolled_window, 0, 2, 3, 1) grid.show_all() self.combobox.set_active(0) container.add(grid) def __combobox_changed(self, widget): index = self.combobox.get_active() path = self.combobox_paths[index] if not self.last_path: self.last_path = path self.cache[self.last_path] = self.textview.get_text() self.last_path = path self.load_file(path) def __add_button_clicked(self, widget): text = self.add_entry.get_text() self.add_line(text) self.add_entry.set_text("") def add_line(self, text): current_text = self.textview.get_text() if current_text: current_text += "\n" + text else: current_text = text self.textview.set_text(S(current_text).display()) def load_file(self, path): if os.path.exists(path): fh = open(path, "r") self.textview.set_text(S(fh.read()).display()) fh.close() else: self.textview.set_text("") def save(self, path=None): if path: paths = [path] else: paths = self.combobox_paths index = self.combobox.get_active() current_path = self.combobox_paths[index] self.cache[current_path] = self.textview.get_text() for tmppath in paths: if tmppath in self.cache: if not os.path.exists(os.path.dirname(tmppath)): os.mkdir(os.path.dirname(tmppath)) fh = open(tmppath, "w") fh.write(self.cache[tmppath]) fh.close() rabbitvcs-0.18/rabbitvcs/ui/wraplabel.py000066400000000000000000000051751362112712700203520ustar00rootroot00000000000000from __future__ import absolute_import # This file was originally obtained from: # http://git.gnome.org/cgit/meld/tree/meld/ui/wraplabel.py # ...and added here by Jason # # Copyright (c) 2005 VMware, Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # Python translation from wrapLabel.{cc|h} by Gian Mario Tagliaretti import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk, GObject, Pango from rabbitvcs.util.strings import S class WrapLabel(Gtk.Label): __gtype_name__ = 'WrapLabel' def __init__(self, str=None): Gtk.Label.__init__(self) self.__wrap_width = 0 self.layout = self.get_layout() self.layout.set_wrap(Pango.WrapMode.WORD_CHAR) if str != None: self.set_text(S(str).display()) self.set_alignment(0.0, 0.0) def do_size_request(self, requisition): layout = self.get_layout() width, height = layout.get_pixel_size() requisition.width = 0 requisition.height = height def do_size_allocate(self, allocation): Gtk.Label.do_size_allocate(self, allocation) self.__set_wrap_width(allocation.width) def set_text(self, str): Gtk.Label.set_text(self, S(str).display()) self.__set_wrap_width(self.__wrap_width) def set_markup(self, str): Gtk.Label.set_markup(self, str) self.__set_wrap_width(self.__wrap_width) def __set_wrap_width(self, width): if width == 0: return layout = self.get_layout() layout.set_width(width * Pango.SCALE) if self.__wrap_width != width: self.__wrap_width = width self.queue_resize() rabbitvcs-0.18/rabbitvcs/ui/xml/000077500000000000000000000000001362112712700166175ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/ui/xml/add.xml000066400000000000000000000166301362112712700200770ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 450 True False Add center 400 300 rabbitvcs-small center True False 12 13 12 13 vertical 6 True False end True True False end 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 1 0 True False True 0 0 0 0 3 Show ignored files True True False start True True 0 2 Select / Deselect all True True False start True True True 0 1 200 True True True etched-in True True True 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/annotate.xml000066400000000000000000000251271362112712700211610ustar00rootroot00000000000000 True False document-save-as True False window-close 750 550 True False Annotate center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False True 100 True True True 2 1 True True True True False rabbitvcs-show_log 3 1 True False end 6 end Save _As True False True True document-save-as True False False 0 _Close True True True window-close True False False 1 6 1 True False <b>Revision</b> True 0 2 0 2 True False 4 True False go-first 0 1 True False True False go-previous 1 1 True False 4 True False go-next 4 1 True False 24 True False go-last 5 1 0 1 True True True True True True True 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/branch-merge.xml000066400000000000000000000224721362112712700217020ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok True False Merge rabbitvcs True False 12 12 12 12 True True vertical 18 True False end True True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 2 True False start True True vertical 6 True False 12 True 0 0 1 True False True <b>Will be merged into</b> True 0 0 0 0 1 True False True vertical 6 True False True <b>From</b> True 0 0 0 True False 12 True vertical 0 2 True False 12 True vertical 0 1 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/branch.xml000066400000000000000000000331311362112712700205770ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 550 True False Branch/tag center rabbitvcs-small True False 6 6 6 6 vertical 18 True False 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 3 True False True True vertical 6 True True 6 True True etched-in 100 True True word 0 2 True False True start Previous Messages True True True 6 False False 0 0 1 True False <b>Add Message</b> True 0 0 0 0 2 True False vertical 6 True False <b>Create copy from</b> True 0 0 0 True False 6 True 0 1 0 1 True False 6 6 True False 6 From: 0 0 1 True False 6 To: 0 0 2 True False True True True True 1 1 True True True True False edit-find 1 2 1 True False True True True True 1 2 2 True False <b>Repository</b> True 0 0 0 3 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/browser.xml000066400000000000000000000246711362112712700210360ustar00rootroot00000000000000 True False folder-new True False window-close 640 480 True False Repository Browser center rabbitvcs True False 12 12 12 12 vertical 18 True False 6 True False end 6 end True True True True False 2 True False Load/Refresh 1 0 True False view-refresh 0 0 False False 0 _Close True True True window-close True False False 1 1 0 _Create folder here True True True start True folder-new True 0 0 0 1 True False True 6 6 True False Revision: 0 0 1 True False URL: 0 0 0 True False True True True True 1 0 True False True 1 1 330 True True True True etched-in True True 0 2 2 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/changes.xml000066400000000000000000000552011362112712700207540ustar00rootroot00000000000000 True False window-close 640 500 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Changes center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end True 6 end True True True True False 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Load/Refresh 1 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK view-refresh 0 0 False False 0 _Close True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK window-close True False False 1 1 0 True False False 0 0 0 3 True False True True vertical 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True True etched-in True 200 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 1 True False True <b>Differences</b> (double-click to compare with base) True 0 0 0 0 2 True False True vertical 6 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 Revision 0 0 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 URL 0 0 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True True 1 1 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK zoom-fit-best 1 2 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>Second:</b> True 0 0 0 3 True False True 1 2 2 0 1 True False True vertical 6 6 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 Revision 0 0 2 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 URL 0 0 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True True 1 1 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK zoom-fit-best 1 2 1 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <b>First:</b> True 0 0 0 3 True False True 1 2 2 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/checkmods.xml000066400000000000000000000163501362112712700213060ustar00rootroot00000000000000 True False view-refresh True False window-close 550 300 True False Check for Modifications center 400 300 rabbitvcs-small center True False 12 12 12 12 True True vertical 18 True False end True 6 end _Refresh True True True view-refresh True False False 0 _Close True True True window-close True False False 1 0 1 True True True True True True True True etched-in True True True False Local False True True True True True True 1 True False Remote 1 False 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/checkout.xml000066400000000000000000000374141362112712700211570ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 550 True False Checkout center 450 rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True False True True rabbitvcs-ok True False False 1 0 3 True False True True 6 True False True <b>Revision</b> True 0 0 0 True False 12 True vertical 0 1 0 2 True False True 6 Omit Externals True True False start 12 True True 0 2 Recursive True True False start 12 True True True 0 1 True False <b>Options</b> True 0 0 0 0 1 True False True 6 6 True False 12 Destination: 0 0 2 True True True 1 2 True False 12 URL: 0 0 1 True True True Browse... True False drive-harddisk 2 2 2 True False <b>Repository</b> True 0 0 0 3 True False True 6 True False True True True True 0 0 True True True True Browse... True False edit-find 1 1 0 1 1 2 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/clean.xml000066400000000000000000000244431362112712700204320ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 400 True False Clean center-always True False 12 12 12 12 True True vertical 18 True False end True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 1 True False True True vertical 6 True False 12 True vertical 2 Force True True False start True True True 0 4 Dry run True True False start True True 0 3 Remove only ignored files True True False start True True 0 2 Remove ignored files, too True True False start True True 0 1 Remove directories True True False start True True True 0 0 0 2 True False True Remove untracked files from the working tree 0.10000000149011612 0 1 True False True <b>Clean your Repository</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/commit.xml000066400000000000000000000463501362112712700206410ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok True False Commit center 640 640 rabbitvcs-small True False 12 12 12 12 vertical 18 True False True 6 True False end 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 2 0 True True True Refresh 6 6 True False view-refresh 1 0 True False True True 0 0 0 0 2 True True True True 6 vertical True False True True vertical 6 True False 12 True True vertical 6 True True True True etched-in True True True True True word False 0 1 0 True False True start Previous Messages True True True False False 0 0 0 0 1 True False <b>Add Message</b> True 0 0 0 False True True False 10 True True vertical 6 True False 12 True True vertical 6 True False True vertical Show unversioned files True True False start True True True 0 1 Select / Deselect all True True False start True True 0 0 0 1 True True True True etched-in True True 0 0 0 1 True False <b>Changed Files</b> (double-click to compare with base) True 0 0 0 False True 0 1 True False True 12 500 True False True True char True 0 1 0 True False <b>Commit to:</b> True char 0 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/000077500000000000000000000000001362112712700202415ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/authentication.xml000066400000000000000000000244611362112712700240110ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 450 False 5 Authentication center rabbitvcs-small dialog True False True True vertical 18 True False end True True end _Cancel True True False rabbitvcs-cancel True False False 0 _OK True True True True True rabbitvcs-ok True False False 1 False False end 0 True False True vertical 6 True False 12 True vertical 6 6 Save Authentication True True False start True True 1 3 True True True False True 1 2 True True True True 1 1 300 True False True True char True 0 0 1 0 True False Password: 0 0 2 True False Login: 0 0 1 True False Realm: 0 0 0 0 0 1 True False <b>Please add your authentication details</b> True 0 0 0 False False 1 auth_cancel auth_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/cert_authentication.xml000066400000000000000000000217431362112712700250260ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 400 False 5 center rabbitvcs-small dialog True False vertical 18 True False end True True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True True True rabbitvcs-ok True False False 1 False False end 0 True False True vertical 6 True False 12 True vertical 6 6 Save Authentication True True False start True True 1 2 True True True False True 1 1 True False Password: 0 0 1 True False True True True 0 0 1 0 True False Realm: 0 0 0 0 0 1 True False True <b>Please add your authentication details</b> True 0 0 0 False True 1 certauth_cancel certauth_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/certificate.xml000066400000000000000000000303221362112712700232450ustar00rootroot00000000000000 550 False 5 Check Certificate center rabbitvcs-small dialog 400 True False vertical 12 True False end end True True spread Accept Once True True True False False 0 Accept Forever True True True False False 1 Deny True True True False False 2 False False end 0 True False True vertical 6 True False 12 True vertical 6 6 True False True True 0 0 1 4 True False Fingerprint: start 0 0 0 4 True False True True 0 0 1 3 True False Valid: start 0 0 0 3 True False True True 0 0 1 2 True False Issuer: start 0 0 0 2 True False True True 0 0 1 1 True False Host: start 0 0 0 1 True False True True 0 0 1 0 True False Realm: start 0 0 0 0 0 1 True False <b>Certificate Details</b> True 0 0 0 False False 1 cert_accept_once cert_accept_forever rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/confirmation.xml000066400000000000000000000127041362112712700234570ustar00rootroot00000000000000 True False rabbitvcs-no True False rabbitvcs-yes False 5 Confirmation center rabbitvcs-small dialog True False vertical 18 True False end end True True end _No True True True rabbitvcs-no True False False 0 _Yes True True True True True rabbitvcs-yes True False False 1 False False end 0 True False True 6 True False start True Are you sure you want to continue? 0 1 0 True False 48 dialog-warning 6 0 0 False False 1 confirm_cancel confirm_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/conflict_decision.xml000066400000000000000000000154431362112712700244500ustar00rootroot00000000000000 False 5 Edit Conflicts normal True False True True vertical 18 True False end True True center Cancel True True True False False 0 Accept Mine True True True False False 1 Accept Theirs True True True False False 2 Edit Conflicts True True True False False 3 False True end 0 True False 18 6 True False 7 True <b>A conflict was found in the following file:</b> True 0 0.10000000149011612 1 0 True False 12 True 0 0 1 1 True False start 64 dialog-warning 6 0 0 2 True True 1 cancel accept_mine accept_theirs edit_conflicts rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/create_folder.xml000066400000000000000000000172341362112712700235700ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 320 240 False 5 Create Folder... normal True False vertical 18 True False end True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True True True True rabbitvcs-ok True False False 1 False False end 0 True False True vertical 6 True True 12 True 0 1 True False True <b>Folder Name</b> True 0 0 0 False False 0 True False True True vertical 6 True True 12 True True etched-in True True 0 1 True False True <b>Add Message</b> True 0 0 0 False True 2 cancel ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/delete_confirmation.xml000066400000000000000000000144761362112712700250110ustar00rootroot00000000000000 True False edit-delete True False rabbitvcs-cancel False 5 Delete Confirmation center rabbitvcs-small dialog True False True True vertical 18 True False end end True True end _Cancel True True True rabbitvcs-cancel True False False 0 _Delete True True True True True edit-delete True False False 1 False False end 0 True False True 6 6 True False True The item(s) will be sent to the trash can. 0 1 1 True False True <span size="large"><b>Are you sure you want to delete %item%?</b></span> True 0 1 0 True False 64 dialog-warning 6 0 0 2 False True 1 cancel delete rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/error_notification.xml000066400000000000000000000135541362112712700246720ustar00rootroot00000000000000 True False window-close 500 300 False 5 RabbitVCS Error rabbitvcs-small normal True False True True vertical 18 True False end True end _Close True True True window-close True False False 0 False False end 0 True False 6 True False True <span weight="bold" size="xx-large">RabbitVCS Error</span> True 0 1 0 True False 6 64 dialog-warning 6 0 0 False True 1 True False True False True 2 True True True True etched-in True True False False False True 3 rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/loading.xml000066400000000000000000000100731362112712700224010ustar00rootroot00000000000000 True False rabbitvcs-cancel 300 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Loading False center rabbitvcs-small dialog center True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 18 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end end True True end _Cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK rabbitvcs-cancel True False False 0 False False end 0 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/mark_resolved_prompt.xml000077500000000000000000000071121362112712700252250ustar00rootroot00000000000000 False 5 Mark Resolved False True dialog True False True True vertical True False end end True end Unresolved True True True False False 0 Resolved True True True False False 1 True True end 0 True False True True <b>Mark Conflict As</b> True True True 1 button2 button1 rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/message_box.xml000066400000000000000000000066251362112712700232700ustar00rootroot00000000000000 True False rabbitvcs-ok True False 5 Message center rabbitvcs-small dialog True False vertical 18 True False end end True end _OK True True True rabbitvcs-ok True False False 0 False False end 0 175 True False 6 6 6 6 True 0 False True 1 messagebox_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/name_email_prompt.xml000066400000000000000000000176761362112712700244740ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 400 False 12 Name and Email center-on-parent normal True False True True vertical 18 True False end end True True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 False False end 0 True False True vertical 6 True False True <b>Enter Name and Email Details</b> True 0 0 0 True False 12 12 True vertical 6 6 True True True 1 1 True False Email: 0 0 1 True True True 1 0 True False Name: 0 0 0 0 1 False False 1 cancel ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/one_line_text_change.xml000066400000000000000000000130101362112712700251170ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 500 False 5 Text Change rabbitvcs-small normal True False True True vertical 18 True False end end True True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True True True True True rabbitvcs-ok True False False 1 False False end 0 True False True 6 True True True 1 0 True False New Name: 0 0 0 False False 1 cancel ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/previous_messages.xml000066400000000000000000000210311362112712700245230ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 500 False 5 Previous Messages center 450 rabbitvcs-small dialog True False True True vertical 18 True False end True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 False False end 0 True False True True vertical 6 200 True True 12 12 True True etched-in True True 0 1 True False True <b>Previous Messages</b> True 0 0 0 True True 1 True False True True vertical 6 175 True True 12 12 True True etched-in 100 True True word 0 1 True False True <b>Message</b> True 0 0 0 True True 2 prevmes_cancel prevmes_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/property.xml000066400000000000000000000233661362112712700226610ustar00rootroot00000000000000 True False True False rabbitvcs-ok False 5 Property center 600 400 rabbitvcs-small dialog True False vertical 18 True False end end True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True True True rabbitvcs-ok True False False 1 False False end 0 True False True True vertical 6 True False 12 12 True True vertical 6 6 Apply property recursively True True False start True True True 1 2 True True True True etched-in 100 True True word 1 1 True False Value: 0 0.05000000074505806 0 1 True True True True True True 1 0 True False Property: 0 0 0 0 1 True False <b>Edit Property Details</b> True 0 0 0 False True 1 property_cancel property_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/ssl_client_cert_prompt.xml000066400000000000000000000240731362112712700255460ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 400 False 5 SSL Client Certification center rabbitvcs-small dialog True False True True vertical 18 True False end end True True end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 False False end 0 True False True vertical 6 True False 12 12 True vertical 6 6 Save Authentication True True False start True True 1 2 2 True True True True False drive-harddisk 2 1 True True True 1 1 True False Path: 0 0 1 True False True 0 1 0 2 True False Realm: 0 0 0 0 1 True False <b>Please provide your ssl certification file</b> True 0 0 0 False True 1 sslclientcert_cancel sslclientcert_ok rabbitvcs-0.18/rabbitvcs/ui/xml/dialogs/text_change.xml000066400000000000000000000140331362112712700232550ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 350 200 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent rabbitvcs-small dialog True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True vertical 18 True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end True end _Cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK rabbitvcs-cancel True False False 0 _OK True True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK rabbitvcs-ok True False False 1 False False end 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 12 6 True True etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True word True True 1 textchange_cancel textchange_ok rabbitvcs-0.18/rabbitvcs/ui/xml/git-update.xml000066400000000000000000000225121362112712700214060ustar00rootroot00000000000000 True False rabbitvxs-cancel True False rabbitvcs-ok True False center-always True False 12 12 12 12 True True vertical 18 True False end end False 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 3 Fetch from all remotes True True False start start True True True 0 2 True False True vertical 5 Apply remote changes prior to local changes (rebase) True True False start True none True True merge 0 2 Merge into local branch True True False start True none True True 0 1 Apply remote changes True True False start True True True 0 0 0 1 True False True vertical 6 True False True <b>Options</b> True 0 0 0 True False True vertical 0 1 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/ignore.xml000066400000000000000000000132041362112712700206240ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok True False Ignore center-always rabbitvcs True False 12 12 12 12 True True vertical 18 True False end True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 1 True False True True vertical 6 True False True <b>Ignore and exclude files from being tracked</b> True 0 0 0 0 True False 12 True True 0 1 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/import.xml000066400000000000000000000255361362112712700206660ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 550 True False Import center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True 6 end _Cancel True True True rabbitvcs-cancel True True True 0 _OK True True True rabbitvcs-ok True True True 1 0 2 True False True True vertical 6 True False 12 True True vertical 6 Include ignored files True True False start True True 0 2 150 True True True True etched-in True True word 0 1 True False start True start Previous Messages True True True True True 0 0 0 0 1 True False <b>Import Message</b> True 0 0 0 0 1 True False vertical 6 True False 12 True True True True 0 1 True False True <b>Repository</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/lock.xml000066400000000000000000000336431362112712700203020ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 600 True False Lock Files center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False True True False end 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 1 0 True False start 6 True 0 0 0 0 0 2 True False True True vertical 6 True False 12 True True Steal the locks True True False start True True 0 2 Select / Deselect all True True False start 6 True True True 0 1 250 True True True True etched-in True True 0 0 0 1 True False True <b>Files to lock</b> True 0 0 0 0 1 True False True True vertical 6 True False 12 True True vertical 6 100 True True True True etched-in True True word 0 1 True False True start Previous Messages True True True False False 0 0 0 0 1 True False <b>Please describe why you are locking these files</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/log.xml000066400000000000000000000604171362112712700201320ustar00rootroot00000000000000 True False go-next True False go-previous True False window-close 775 560 True False center rabbitvcs-small True False 12 12 12 12 vertical 18 True False _Close True True True end True window-close True 1 0 True False True False True True True Refresh True False view-refresh 2 0 75 True True 100 1 0 True False Limit: 0 0 1 0 True False 6 start _Back True False True True go-previous True False False 0 _Forward True False True True go-next True False False 1 0 0 0 0 0 1 True True True True vertical 274 True True False True vertical 6 True False True True vertical 6 True True True True etched-in True True True 0 0 0 1 True False True 12 True False 3 True False N/A 3 0 True False to 2 0 True False N/A 1 0 True False Showing Revisions: 0 0 3 0 Stop on copy True True False True 2 0 True False True 3 True False True 1 3 4 3 4 search_buffer 0 0 1 0 True False <b>Revisions Table</b> True 0 0 0 0 0 True True True True 6 True True 390 True True False vertical 6 80 True True True True etched-in True True True True 0 1 True False True <b>Affected File(s)</b> (double-click to compare with base) True 0 0 0 True True True False vertical 6 80 True True True True etched-in True True True True False word 0 1 True False True <b>Message</b> True 0 0 0 True True True True 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/manager.xml000066400000000000000000000263111362112712700207560ustar00rootroot00000000000000 True False window-close 450 True False center-always rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True 6 end _Close True True True window-close True False False 0 0 1 True False True True 6 True True False True True vertical 6 True False True True vertical 0 1 True False True 0 0 0 1 0 True False True True vertical 6 6 200 150 True True 12 True True etched-in True True 0 1 3 True False True True start True False edit-delete 1 2 True True True start True False list-add 1 1 True False True 0 0 0 2 True False True 1 3 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/merge.xml000066400000000000000000001401261362112712700204440ustar00rootroot00000000000000 600 True False 12 Merge Assistant center rabbitvcs-small center True False 12 12 12 12 vertical 18 True False True vertical 475 True False 30 True Choose this method if you wish to reintegrate a branch into the trunk. True 0 0 1 Reintegrate a branch True True False start True True mergetype_range_opt 0 0 0 2 True False True vertical 475 True False 30 Choose this method if you wish to merge two different branches into your working copy. True 0 0 1 Merge two different trees True True False start True True True mergetype_range_opt 0 0 0 1 True False True vertical 475 True False 30 True Choose this method if you have made some changes to a branch and wish to merge your changes with another branch. True 0 0 1 Merge a range of revisions True True False start True True True 0 0 0 0 intro Step 1: Merge Type False True False 12 12 12 12 True 18 True False True vertical 6 True False 12 True 0 0 1 True False start True <b>Working Copy</b> True 0 0 0 0 2 True False vertical 6 True False 12 True vertical 6 6 500 True False 8 True Use the log dialog to select the revisions that you wish to merge. Or write out the revisions manually, each separated by a comma. You can specify a revision range by a dash. Example: 4-7,9,11,15-HEAD To merge all revisions, leave the box empty. True 0 0 1 2 True True True Show log True False 24 rabbitvcs-show_log 1 0 True True True 0 0 0 1 True False start True <b>Revision Range</b> True 0 0 0 0 1 True False True vertical 6 True False 12 True True True True 0 1 True False start True <b>URL to merge from</b> True 0 0 0 0 0 Step 2: Merge a Range of Revisions False True False 12 12 12 12 True vertical 18 True False True 6 True False 12 True 0 0 1 True False <b>Working Copy</b> True 0 0 0 0 2 True False True 6 True False 12 True vertical 6 6 Revision True True False start True mergetree_to_revision_head_opt 0 2 75 True True True 1 2 True True True Show log True False 24 rabbitvcs-show_log 2 2 HEAD True True False start True True True 0 1 3 True False True True True 0 0 3 0 1 True False True <b>To: (URL and revision to merge)</b> True 0 0 0 0 1 True False True 6 True False 12 True 6 6 True True True Show log True False 24 rabbitvcs-show_log 2 2 75 True True True 1 2 Revision True True False start True mergetree_from_revision_head_opt 0 2 HEAD True True False start True True True 0 1 3 True False True True True True 0 0 3 0 1 True False <b>From: (URL and revision to merge)</b> True 0 0 0 0 0 Step 2: Merge two different trees False True False 12 12 12 12 True True vertical 18 True False True vertical True False 12 True True 0 0 1 True False True <b>Working Copy</b> True 0 0 0 0 1 True False True vertical 6 True False 12 True 6 6 True True True True Show log True False 24 drive-harddisk 1 0 True False True True True True 0 0 True False True True vertical 0 1 2 0 1 True False <b>From URL</b> True 0 0 0 0 0 Step 2: Reintegrate a Branch False True False 12 12 12 12 True 18 True False True end True True True True False True False Test Merge 1 0 True False system-run 0 0 False False 0 0 1 True False True vertical 6 True False 12 True vertical Only record the merge True True False start True 0 2 Ignore ancestry True True False start True True 0 1 Recursive True True False start True True True 0 0 0 1 True False <b>Options</b> True 0 0 0 0 0 confirm Step 3: Final Options False rabbitvcs-0.18/rabbitvcs/ui/xml/notification.xml000066400000000000000000000217751362112712700220430ustar00rootroot00000000000000 True False document-save-as True False rabbitvcs-cancel True False rabbitvcs-ok 740 True Notification Messages center rabbitvcs-small center True False 12 12 12 12 True True vertical 18 True False True 6 True False True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True False True True True True rabbitvcs-ok True False False 1 1 0 True False start Save _As True False True True document-save-as True False False 0 0 0 0 3 True False True 0 2 225 True True True True etched-in True True 0 1 True False vertical 6 True False True True 0 0 1 True False True True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/properties.xml000066400000000000000000000357031362112712700215450ustar00rootroot00000000000000 True False document-new True False document-save True False edit-delete True False rabbitvcs-cancel True False rabbitvcs-editprops 600 True False Properties center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _Save True True True document-save True False False 1 0 1 True False True True vertical 6 True False 12 True True vertical 6 True False 8 True 3 start _New... True True True document-new True False False 0 _Edit... True False True True rabbitvcs-editprops True False False 1 _Delete True False True True edit-delete True False False 2 0 4 Delete properties recursively True True False start True True 0 3 True False start True <i>Selected properties will be applied recursively.</i> True 0 2 150 True True True True etched-in True True True 0 1 True False True 6 True True True True False view-refresh 1 0 True True URL/Path True 0 0 0 0 0 1 True False <b>Properties for:</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/property_editor.xml000066400000000000000000000240041362112712700225730ustar00rootroot00000000000000 True False document-new True False view-refresh True False window-close True False Property Editor 600 400 rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True 6 True end _Close True True True Close this dialog. window-close True False False 0 0 4 True False True 0 3 True False True 6 True center _Refresh True True True Refresh the list of properties. view-refresh True False False 0 _New True True True Add a new property. document-new True False False 1 0 2 True True True True etched-in True True 0 1 True False vertical 6 20 True False start <b>Remote URI:</b> True True 0 1 True False start True middle 0 1 0 True False start True middle 0 1 1 True False start <b>Working Copy:</b> True True 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/property_page.xml000066400000000000000000000273751362112712700222370ustar00rootroot00000000000000 True True True False 0 True False 12 True vertical 12 12 True False True 0 2 True False True False 8 16 True False Property status: 0 0 3 True False Content status: 0 0 2 True False VCS: 0 0 1 True False True True 0 1 1 True False True True 0 1 0 True False Name: 0 0 0 True False True False start True True 0 1 0 True False 0 0 1 2 True False True False start True True 0 1 0 True False 0 0 1 3 1 0 True False start 8 8 True text-x-generic 6 0 0 0 1 12 True False True 0 0 True True never True False queue True False True False True False center RabbitVCS 0 1 True False center rabbitvcs 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/push.xml000066400000000000000000000250171362112712700203250ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok True False Push center-always rabbitvcs True False 12 12 12 12 True True vertical 18 True False True True False 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 1 0 True False True 0 0 0 0 3 True False True True vertical 6 True True 12 True True etched-in 450 200 True True 0 1 True False <b>Commits to Push</b> True 0 0 0 0 1 True False vertical 6 True False 12 True True 0 1 True False <b>Push Information</b> True 0 0 0 0 0 True False vertical Include tags True False False start True True 0 0 Force with lease True True False start True True 0 1 0 2 rabbitvcs-0.18/rabbitvcs/ui/xml/relocate.xml000066400000000000000000000177671362112712700211610ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 640 True False Relocate center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True True 6 end _Cancel True True True rabbitvcs-cancel True True True 0 _OK True True True rabbitvcs-ok True True True 1 0 1 True False True vertical 6 True False 12 True 6 6 True False To: 0 0 1 True False True True True True 1 1 True True True 1 0 True False From: 0 0 0 0 1 True False <b>Change the repository of your working copy</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/reset.xml000066400000000000000000000443421362112712700204720ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok True False Reset center-always True False 12 12 12 12 True True vertical 18 True False True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 4 True False True vertical 6 True False 12 True vertical 6 True True False start True True True mixed_opt True False None 0 0 4 True True False start True True mixed_opt True False <i>Merge</i> - Resets the index to match the tree recorded by the named commit, and updates the files that are different between the named commit and the current commit in the working tree True 0 0 3 True True False start True True mixed_opt True False <i>Hard</i> - Matches the working tree and index to that of the tree being switched to True 0 0 2 True True False start True True mixed_opt True False <i>Soft</i> - Does not touch the index file or working tree at all, but requires them to be in good working order True 0 0 1 True True False start True True True False <i>Mixed</i> - Reset the index but not the working tree True 0 0 0 0 1 True False <b>Options</b> True 0 0 0 0 3 True False True True vertical 6 True False 12 True True vertical 0 1 True False <b>Revision</b> True 0 0 0 0 2 True False True vertical 6 6 True True True True False drive-harddisk 1 1 True True 12 True 0 1 True False True <b>Path</b> True 0 0 0 2 0 1 True False True vertical 6 True False True Reset current HEAD to specified state. 0 0 1 True False True <b>Reset your Repository</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/revert.xml000066400000000000000000000151261362112712700206550ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 450 True False Revert center 400 300 rabbitvcs-small center True False 12 12 12 12 True True vertical 6 True False True True False 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 1 0 True False True 0 0 0 0 2 Select / Deselect all True True False start True True True 0 1 200 True True True True etched-in True True 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/settings.xml000066400000000000000000002120171362112712700212040ustar00rootroot00000000000000 True False edit-clear True False edit-clear True False edit-clear True False process-stop True False rabbitvcs-cancel True False rabbitvcs-ok True False system-run True False view-refresh 550 425 True False Settings center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 1 True True True True True False 12 12 12 12 vertical 18 True False True vertical 6 True False True <b>Version Control Systems</b> True 0 0 0 True False 12 True vertical Enable Subversion True True False start True True True 0 0 Enable Git True True False start True True True 0 1 0 1 0 1 True False vertical 6 True False 12 True vertical 5 Enable emblems True True False start True True True 0 2 2 Enable recursive status checks True False start True True True 0 1 2 Enable file attributes True True False start True True True 0 0 2 True False start False Date/time format 0 6 True False start True 1 6 Highlight source syntax True True False Highlight source lines according to language syntax start True True True 0 3 2 Colorize commits and authors True True False Set a unique background color of lines belonging to the same commit. Apply to line author's too start True True True 0 4 2 Show RabbitVCS debugging tools True True False The debug menu is used to diagnose problems with RabbitVCS itself start True True 0 5 2 0 1 True False <b>RabbitVCS</b> True 0 0 0 0 0 True False True True 6 True False start True <b>Default Commit Message</b> True 0 0 True True True True never in True True True True word False 0 1 0 2 False General False True False 12 12 12 12 True vertical 18 True False vertical 6 True False <b>Configure the program to resolve conflicted files.</b> True 0 0 0 True False 12 True vertical True False Use the following macros to configure the merge tool: %base - The common ancestor of the two files to be merged. %mine - The file you modified in your working copy. %theirs - The file being merged into your working copy. %merged - The file to store the merged result. False 0 0 1 True True True False False 0 0 0 1 0 1 True False True vertical 6 True False 12 True vertical 6 6 True True True Browse... True False drive-harddisk 1 0 Show new version on the left side True True False start True True 0 1 2 True True True False False 0 0 0 1 True False True <b>Program used to compare files</b> True 0 0 0 0 0 1 True False External Programs 1 False True False 12 12 12 12 True vertical 18 True False True vertical 6 True False 12 True 6 Clear True True True edit-clear-3 1 0 True False True Clear your authentication information 0.0099999997764825821 0 0 0 1 True False <b>Authentication</b> True 0 0 0 0 2 True False True vertical 6 True False 12 True 6 Clear True True True edit-clear-2 2 0 60 True True False False 1 0 True False True Number of messages to remember word-char 0 0 0 0 1 True False True <b>Log Messages</b> True 0 0 0 0 1 True False True vertical 6 True False 12 True 6 Clear True True True edit-clear-1 2 0 60 True True False False 1 0 True False True Number of URLs to remember 0 0 0 0 1 True False True <b>URL History</b> True 0 0 0 0 0 2 True False Saved Data 2 False True False 12 12 12 12 True vertical 18 True False True 6 True False <b>Logging Options</b> True 0 0 0 0 True False 12 True vertical 6 True False 1 1 True False 1 0 True False True Minimum level to log: 0 0 1 True False True Type: 0 0 0 0 1 0 0 3 True False Logging 3 False True False 12 12 12 12 True vertical 18 True False True center Refresh Information True True True view-refresh False False 0 Restart Checker True True True system-run False False 1 Stop Checker True True True process-stop 0.54000002145767212 False False 2 0 3 True False True 0 none True False 12 12 12 12 True vertical True False True <b>Other Information</b> True 0 2 True False 0 1 True False 6 True 6 12 True False <b>Checker type:</b> True 0 0 0 True False True Unknown 0 1 0 True False True Unknown 0 1 1 True False True Unknown 0 1 2 True False <b>Process ID:</b> True 0 0 1 True False <b>Memory usage:</b> True 0 0 2 True False <b>Locale:</b> True 0 0 3 True False True Unknown 0 1 3 0 0 4 True False Status Checker 4 False True False 12 12 12 12 True True vertical 18 True False True True vertical 6 True False True <b>Configuration Editor</b> True 0 0 0 True False 12 True True vertical 0 1 0 0 5 True False Git 5 False 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/switch.xml000066400000000000000000000236041362112712700206470ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 550 True False Switch center rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 2 True False True vertical 6 True False 12 True vertical 0 1 True False True <b>Revision</b> True 0 0 0 0 1 True False True vertical 6 True False 12 True vertical 6 6 True False True True True True 1 1 True False To: 0 0 1 True True True 1 0 True False From: 0 0 0 0 1 True False True <b>Switch Details</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/ui/xml/update.xml000066400000000000000000000235121362112712700206260ustar00rootroot00000000000000 True False rabbitvcs-cancel True False rabbitvcs-ok 400 True False Update center-always rabbitvcs-small True False 12 12 12 12 True True vertical 18 True False end True True 6 end _Cancel True True True rabbitvcs-cancel True False False 0 _OK True True True rabbitvcs-ok True False False 1 0 2 True False True 6 Rollback to specified revision number True False True False start True True 1 2 Omit Externals True True False start True True 1 1 Recursive True True False start True True True 1 0 True False start start <b>Options</b> True 0 0 0 0 3 0 1 True False True 6 True False True 1 0 True False start 6 True <b>Revision</b> True 0 0 0 0 0 rabbitvcs-0.18/rabbitvcs/util/000077500000000000000000000000001362112712700163575ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/util/__init__.py000066400000000000000000000072731362112712700205010ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # from rabbitvcs.util.log import Log logger = Log("rabbitvcs.util.__init__") class Function(object): """ Provides an interface to define and call a function. Usage: f = Function(self.do_this, path) f.run() """ def __init__(self, func, *args, **kwargs): self.func = func self.args = args self.kwargs = kwargs self.result = None def start(self): self.result = self.func(*self.args, **self.kwargs) def call(self): return self.func(*self.args, **self.kwargs) def set_args(self, *args, **kwargs): self.args = args self.kwargs = kwargs def get_result(self): return self.result class FunctionQueue(object): """ Provides an interface to generate a queue of function calls. """ def __init__(self): self.queue = [] self.cancel = False self._exception = None self.position = 0 def cancel_queue(self): self.cancel = True def append(self, func, *args, **kwargs): """ Append a Function object to the FunctionQueue @type func: def @param func: A method call @type *args: list @param *args: A list of arguments @type **kwargs: list @param **kwargs: A list of keyword arguments """ self.queue.append(Function(func, *args, **kwargs)) def insert(self, position, func, *args, **kwargs): """ Insert a Function object into the FunctionQueue @type func: def @param func: A method call @type *args: list @param *args: A list of arguments @type **kwargs: list @param **kwargs: A list of keyword arguments """ self.queue.insert(position, Function(func, *args, **kwargs)) def set_exception_callback(self, func): self._exception = Function(func) def start(self): """ Runs through the queue and calls each function """ for func in self.queue: if self.cancel == True: return try: func.start() except Exception as e: logger.exception() if self._exception: self._exception.set_args(e) self._exception.call() break self.position += 1 def get_position(self): return self.position def get_result(self, index): """ Retrieve the result of a single function call by specifying the order in which the function was in the queue. @type index: int @param index: The queue index """ return self.queue[index].get_result() rabbitvcs-0.18/rabbitvcs/util/_locale.py000066400000000000000000000031161362112712700203300ustar00rootroot00000000000000from __future__ import absolute_import import locale import os from rabbitvcs.util.log import Log import rabbitvcs.util.settings import rabbitvcs.util.helper from rabbitvcs import gettext log = Log("rabbitvcs.util.locale") def set_locale(language, encoding): sane_default = locale.getlocale(locale.LC_MESSAGES) loc = language if not encoding: if not language: return sane_default encoding = sane_default[1] if not loc: loc = sane_default[0] try: locale.setlocale(locale.LC_ALL, (loc, encoding)) except locale.Error: # If the user's environment does not specify an encoding, Python will # pick a default which might not be available. It seems to pick # ISO8859-1 (latin1), but UTF8 is a better idea on GNU/Linux. log.warning("Could not set locale (%s, %s)" % (loc, encoding)) # We should only try this if we have a region to set as well. if language and encoding != "UTF-8": try: locale.setlocale(locale.LC_ALL, (language, "UTF-8")) log.warning("Manually set encoding to UTF-8") except locale.Error: # Nope, no UTF-8 either. log.warning("Could not set user's locale to UTF-8") loc = locale.getlocale(locale.LC_MESSAGES) langs = [] if loc[0]: langs.append(loc[0]) gettext.set_language(langs) return loc def initialize_locale(): sane_default = locale.getdefaultlocale(['LANG', 'LANGUAGE']) # Just try to set the default locale for the user set_locale(*sane_default) rabbitvcs-0.18/rabbitvcs/util/configspec/000077500000000000000000000000001362112712700204775ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/util/configspec/configspec.ini000066400000000000000000000015241362112712700233220ustar00rootroot00000000000000[general] enable_attributes = boolean(default=True) enable_emblems = boolean(default=True) enable_recursive = boolean(default=True) enable_highlighting = boolean(default=True) enable_colorize = boolean(default=True) show_debug = boolean(default=False) show_unversioned_files = boolean(default=True) datetime_format = string(default="") default_commit_message = string(default="") [external] diff_tool = string(default="/usr/bin/meld") diff_tool_swap = boolean(default=False) merge_tool = string(default="") [cache] number_repositories = integer(default=30) number_messages = integer(default=30) [logging] type = option("None", "File", "Console", "Both", default="Both") level = option("Debug", "Warning", "Info", "Error", "Critical", default="Error") [HideItem] svn = boolean(default=False) hg = boolean(default=False) git = boolean(default=False) rabbitvcs-0.18/rabbitvcs/util/contextmenu.py000066400000000000000000001540461362112712700213140ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2010 by Jason Heeris # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os import os.path from time import sleep from collections import deque from six.moves import range # Yes, * imports are bad. You write it out then. from .contextmenuitems import * from rabbitvcs.util import helper import gi gi.require_version("Gtk", "3.0") sa = helper.SanitizeArgv() from gi.repository import Gtk, GLib sa.restore() from rabbitvcs.vcs import create_vcs_instance, VCS_SVN, VCS_GIT, VCS_DUMMY, VCS_MERCURIAL from rabbitvcs.util.log import Log from rabbitvcs import gettext from rabbitvcs.util.settings import SettingsManager import rabbitvcs.vcs log = Log("rabbitvcs.util.contextmenu") _ = gettext.gettext settings = SettingsManager() class MenuBuilder(object): """ Generalised menu builder class. Subclasses must provide: connect_to_signal(self, menuitem, callback, callback_args) - connect the menu item to a signal (or do whatever needs to be done) so that the callback is called upon activation. In actual fact, a standard GTK compatible method for this is provided by this class. All a subclass has to do is define the class parameter "signal", and it will be automatically done. make_menu_item(self, item, id_magic) - create the menu item for whatever toolkit (usually this should be just call a convenience method on the MenuItem instance). attach_submenu(self, menu_node, submenu_list) - given a list of whatever make_menu_item(...) returns, create a submenu and attach it to the given node. top_level_menu(self, items) - in some circumstances we need to treat the top level menu differently (eg. Nautilus, because Xenu said so). This processes a list of menu items returned by make_menu_item(...) to create the overall menu. """ def __init__(self, structure, conditions, callbacks): """ @param structure: Menu structure @type structure: list Note on "structure". The menu structure is defined in a list of tuples of two elements each. The first element is a class - the MenuItem subclass that defines the menu interface (see below). The second element is either None (if there is no submenu) or a list of tuples if there is a submenu. The submenus are generated recursively. FYI, this is a list of tuples so that we retain the desired menu item order (dicts do not retain order) Example: [ (MenuClassOne, [ (MenuClassOneSubA, None), (MenuClassOneSubB, None) ]), (MenuClassTwo, None), (MenuClassThree, None) ] """ # The index is mostly for identifier magic index = 0 last_level = -1 last_item = last_menuitem = None stack = [] # ([items], last_item, last_menuitem) flat_structure = helper.walk_tree_depth_first( structure, show_levels=True, preprocess=lambda x: x(conditions, callbacks), filter=lambda x: x.show()) # Here's how this works: we walk the tree, which is a series of (level, # MenuItem instance) tuples. We accumulate items in the list in # stack[level][0], and when we go back up a level we put them in a # submenu (as defined by the subclasses). We need to keep track of the # last item on each level, in case they are separators, so that's on the # stack too. for (level, item) in flat_structure: index += 1 # Have we dropped back a level? Restore previous context if level < last_level: # We may have ended up descending several levels (it works, but # please no-one write triply nested menus, it's just dumb). for num in range(last_level - level): # Remove separators at the end of menus if type(last_item) == MenuSeparator: stack[-1][0].remove(last_menuitem) (items, last_item, last_menuitem) = stack.pop() # Every time we back out of a level, we attach the list of # items as a submenu, however the subclass wants to do it. self.attach_submenu(last_menuitem, items) # Have we gone up a level? Save the context and create a submenu if level > last_level: # Skip separators at the start of a menu if type(item) == MenuSeparator: continue stack.append(([], last_item, last_menuitem)) last_item = last_menuitem = None # Skip duplicate separators if (type(last_item) == type(item) == MenuSeparator and level == last_level): continue menuitem = self.make_menu_item(item, index) self.connect_signal(menuitem, item.callback, item.callback_args) stack[-1][0].append(menuitem) last_item = item last_menuitem = menuitem last_level = level # Hey, we're out of the loop. Go back up any remaining levels (in case # there were submenus at the end) and finish the job. for (items, last_item2, last_menuitem2) in stack[:0:-1]: if type(last_item) == MenuSeparator: stack[-1][0].remove(last_menuitem) self.attach_submenu(last_menuitem2, items) last_item = last_item2 last_menuitem = last_menuitem2 if stack: self.menu = self.top_level_menu(stack[0][0]) else: log.debug("Empty top level menu!") self.menu = self.top_level_menu([]) def connect_signal(self, menuitem, callback, callback_args): if callback: if callback_args: menuitem.connect(self.signal, callback, callback_args) else: menuitem.connect(self.signal, callback) class GtkContextMenu(MenuBuilder): """ Provides a standard Gtk Context Menu class used for all context menus in Gtk dialogs/windows. """ signal = "button-press-event" def make_menu_item(self, item, id_magic): return item.make_gtk3_menu_item(id_magic) def attach_submenu(self, menu_node, submenu_list): submenu = Gtk.Menu() menu_node.set_submenu(submenu) [submenu.add(item) for item in submenu_list] def top_level_menu(self, items): menu = Gtk.Menu() [menu.add(item) for item in items] return menu def show(self, event): if self.menu.get_children(): self.menu.show_all() self.menu.popup(None, None, None, None, event.button, event.time) def get_widget(self): return self.menu class GtkContextMenuCaller(object): """ Provides an abstract interface to be inherited by dialogs/windows that call a GtkContextMenu. Allows us to have a standard common set of methods we can call from the callback object. """ def __init__(self): pass def on_context_menu_command_finished(self): pass def rescan_after_process_exit(self, proc, paths=None): self.execute_after_process_exit(proc, self.on_context_menu_command_finished) def execute_after_process_exit(self, proc, callback=None): if callback is None: callback = self.on_context_menu_command_finished def is_process_still_alive(): log.debug("is_process_still_alive() for pid: %i" % proc.pid) # First we need to see if the process is still running retval = proc.poll() log.debug("%s" % retval) still_going = (retval is None) if not still_going and callable(callback): callback() return still_going # Add our callback function on a 1 second timeout GLib.timeout_add_seconds(1, is_process_still_alive) class ContextMenuCallbacks(object): """ The base class for context menu callbacks. This is inherited by sub-classes. """ def __init__(self, caller, base_dir, vcs_client, paths=[]): """ @param caller: The calling object @type caller: RabbitVCS extension @param base_dir: The curent working directory @type base_dir: string @param vcs_client: The vcs client to be used @type vcs_client: rabbitvcs.vcs.create_vcs_instance() @param paths: The selected paths @type paths: list """ self.caller = caller self.base_dir = base_dir self.vcs_client = vcs_client self.paths = paths def python_console(self, widget, data1=None, data2=None): """ Open up an interactive Python console sharing our current context. """ from rabbitvcs.debug.pythonconsole import PythonConsole def exit(): window.destroy() window = Gtk.Window() window.set_size_request(750, 550) window.set_resizable(True) window.set_position(Gtk.WindowPosition.CENTER) console = PythonConsole(exit, namespace={"extension": self.caller}) console.eval("print(\"You can access the extension through " "'extension'\")", False) window.add(console) window.show_all() def refresh_status(self, widget, data1=None, data2=None): """ Refreshes an item status, which is actually just invalidate. """ self.debug_invalidate(widget) def debug_revert(self, widget, data1=None, data2=None): client = pysvn.Client() for path in self.paths: client.revert(path, recurse=True) def debug_invalidate(self, widget, data1=None, data2=None): rabbitvcs_extension = self.caller VFSFile_table = rabbitvcs_extension.VFSFile_table for path in self.paths: log.debug("callback_debug_invalidate() called for %s" % path) if path in VFSFile_table: VFSFile_table[path].invalidate_extension_info() def debug_add_emblem(self, widget, data1=None, data2=None): def add_emblem_dialog(): from subprocess import Popen, PIPE command = ["zenity", "--entry", "--title=RabbitVCS", "--text=Emblem to add:"] emblem = S(Popen(command, stdout=PIPE).communicate()[0]).replace("\n", "") rabbitvcs_extension = self.caller VFSFile_table = rabbitvcs_extension.VFSFile_table for path in self.paths: if path in VFSFile_table: VFSFile_table[path].add_emblem(emblem) return False GLib.idle_add(add_emblem_dialog) # End debugging callbacks def checkout(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("checkout", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def update(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("update", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def commit(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("commit", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def add(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("add", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def check_for_modifications(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("checkmods", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def delete(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("delete", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def revert(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("revert", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def diff(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("diff", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def diff_multiple(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("diff", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def diff_previous_revision(self, widget, data1=None, data2=None): guess = self.vcs_client.guess(self.paths[0]) if guess["vcs"] == rabbitvcs.vcs.VCS_SVN: previous_revision_number = self.vcs_client.svn().get_revision(self.paths[0]) - 1 pathrev1 = helper.create_path_revision_string(self.vcs_client.svn().get_repo_url(self.paths[0]), previous_revision_number) pathrev2 = helper.create_path_revision_string(self.paths[0], "working") proc = helper.launch_ui_window("diff", [ "-s", pathrev1, pathrev2, "--vcs=%s" % rabbitvcs.vcs.VCS_SVN ]) self.caller.rescan_after_process_exit(proc, self.paths) def compare_tool(self, widget, data1=None, data2=None): pathrev1 = helper.create_path_revision_string(self.paths[0], "base") pathrev2 = helper.create_path_revision_string(self.paths[0], "working") proc = helper.launch_ui_window("diff", [ "-s", pathrev1, pathrev2 ]) self.caller.rescan_after_process_exit(proc, self.paths) def compare_tool_multiple(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("diff", ["-s"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def compare_tool_previous_revision(self, widget, data1=None, data2=None): guess = self.vcs_client.guess(self.paths[0]) if guess["vcs"] == rabbitvcs.vcs.VCS_SVN: previous_revision_number = self.vcs_client.svn().get_revision(self.paths[0]) - 1 pathrev1 = helper.create_path_revision_string(self.vcs_client.svn().get_repo_url(self.paths[0]), previous_revision_number) pathrev2 = helper.create_path_revision_string(self.paths[0], "working") proc = helper.launch_ui_window("diff", [ "-s", pathrev1, pathrev2, "--vcs=%s" % rabbitvcs.vcs.VCS_SVN ]) self.caller.rescan_after_process_exit(proc, self.paths) def show_changes(self, widget, data1=None, data2=None): pathrev1 = helper.create_path_revision_string(self.paths[0]) pathrev2 = pathrev1 if len(self.paths) == 2: pathrev2 = helper.create_path_revision_string(self.paths[1]) proc = helper.launch_ui_window("changes", [pathrev1, pathrev2]) self.caller.rescan_after_process_exit(proc, self.paths) def show_log(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("log", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def rename(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("rename", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def create_patch(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("createpatch", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def apply_patch(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("applypatch", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def properties(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("property_editor", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def about(self, widget, data1=None, data2=None): helper.launch_ui_window("about") def settings(self, widget, data1=None, data2=None): base_dir = self.base_dir if len(self.paths) == 1 and os.path.isdir(self.paths[0]): base_dir = self.paths[0] proc = helper.launch_ui_window("settings", [base_dir]) self.caller.reload_settings(proc) def ignore_by_filename(self, widget, data1=None, data2=None): path = self.paths[0] base_dir = os.path.join(self.base_dir, os.path.dirname(path)) proc = helper.launch_ui_window("ignore", [base_dir, os.path.basename(path)]) self.caller.rescan_after_process_exit(proc, self.paths) def ignore_by_file_extension(self, widget, data1=None, data2=None): path = self.paths[0] pattern = "*%s" % helper.get_file_extension(path) base_dir = os.path.join(self.base_dir, os.path.dirname(path)) proc = helper.launch_ui_window("ignore", [base_dir, pattern]) self.caller.rescan_after_process_exit(proc, self.paths) def get_lock(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("lock", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def branch_tag(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("branch", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def switch(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("switch", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def merge(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("merge", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def _import(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("import", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def export(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("export", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def svn_export(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("export", ["--vcs=svn", self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def git_export(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("export", ["--vcs=git", self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def update_to_revision(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("updateto", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def mark_resolved(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("markresolved", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def annotate(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("annotate", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def unlock(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("unlock", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def create_repository(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("create", ["--vcs", "svn", self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def relocate(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("relocate", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def cleanup(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("cleanup", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def restore(self, widget, data1=None, data2=None): guess = self.vcs_client.guess(self.paths[0]) if guess["vcs"] == rabbitvcs.vcs.VCS_SVN: proc = helper.launch_ui_window("update", self.paths) elif guess["vcs"] == rabbitvcs.vcs.VCS_GIT: proc = helper.launch_ui_window("checkout", ["-q", "--vcs", "git"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def _open(self, widget, data1=None, data2=None): pass def browse_to(self, widget, data1=None, data2=None): pass def repo_browser(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("browser", [self.paths[0]]) def initialize_repository(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("create", ["--vcs", "git", self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def clone(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("clone", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def push(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("push", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def branches(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("branches", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def tags(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("tags", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def remotes(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("remotes", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def clean(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("clean", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def reset(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("reset", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def stage(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("stage", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def unstage(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("unstage", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, self.paths) def edit_conflicts(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("editconflicts", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, [self.paths[0]]) class ContextMenuConditions(object): """ Provides a standard interface to checking conditions for menu items. This class should never be instantied directly, rather the narrowly defined FileManagerContextMenuConditions and GtkFilesContextMenuConditions classes should be called. """ def __init__(self): pass def generate_path_dict(self, paths): self.path_dict = { "length": len(paths) } checks = { "is_svn" : lambda path: (self.vcs_client.guess(path)["vcs"] == VCS_SVN), "is_git" : lambda path: (self.vcs_client.guess(path)["vcs"] == VCS_GIT), "is_mercurial" : lambda path: (self.vcs_client.guess(path)["vcs"] == VCS_MERCURIAL), "is_dir" : os.path.isdir, "is_file" : os.path.isfile, "exists" : os.path.exists, "is_working_copy" : self.vcs_client.is_working_copy, "is_in_a_or_a_working_copy" : self.vcs_client.is_in_a_or_a_working_copy, "is_versioned" : self.vcs_client.is_versioned, "is_normal" : lambda path: self.statuses[path].simple_content_status() == "unchanged" and self.statuses[path].simple_metadata_status() == "normal", "is_added" : lambda path: self.statuses[path].simple_content_status() == "added", "is_modified" : lambda path: self.statuses[path].simple_content_status() == "modified" or self.statuses[path].simple_metadata_status() == "modified", "is_deleted" : lambda path: self.statuses[path].simple_content_status() == "deleted", "is_ignored" : lambda path: self.statuses[path].simple_content_status() == "ignored", "is_locked" : self.vcs_client.is_locked, "is_missing" : lambda path: self.statuses[path].simple_content_status() == "missing", "is_conflicted" : lambda path: self.statuses[path].simple_content_status() == "complicated", "is_obstructed" : lambda path: self.statuses[path].simple_content_status() == "obstructed", "has_unversioned" : lambda path: "unversioned" in self.text_statuses, "has_added" : lambda path: "added" in self.text_statuses, "has_modified" : lambda path: "modified" in self.text_statuses or "modified" in self.prop_statuses, "has_deleted" : lambda path: "deleted" in self.text_statuses, "has_ignored" : lambda path: "ignored" in self.text_statuses, "has_missing" : lambda path: "missing" in self.text_statuses, "has_conflicted" : lambda path: "complicated" in self.text_statuses, "has_obstructed" : lambda path: "obstructed" in self.text_statuses } for key,func in list(checks.items()): self.path_dict[key] = False # Each path gets tested for each check # If a check has returned True for any path, skip it for remaining paths for path in paths: for key, func in list(checks.items()): try: self.path_dict[key] = func(path) except KeyError as e: self.path_dict[key] = False def checkout(self, data=None): if self.path_dict["length"] == 1: if self.path_dict["is_git"]: return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"]) else: return (self.path_dict["is_dir"] and not self.path_dict["is_working_copy"]) return False def update(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and not self.path_dict["is_added"]) def commit(self, data=None): if self.path_dict["is_svn"] or self.path_dict["is_git"] or self.path_dict["is_mercurial"]: if self.path_dict["is_in_a_or_a_working_copy"]: if (self.path_dict["is_added"] or self.path_dict["is_modified"] or self.path_dict["is_deleted"] or not self.path_dict["is_versioned"]): return True elif (self.path_dict["is_dir"]): return True return False def diff_menu(self, data=None): return self.path_dict["is_in_a_or_a_working_copy"] def diff_multiple(self, data=None): if (self.path_dict["length"] == 2 and self.path_dict["is_versioned"] and self.path_dict["is_in_a_or_a_working_copy"]): return True return False def compare_tool_multiple(self, data=None): if (self.path_dict["length"] == 2 and self.path_dict["is_versioned"] and self.path_dict["is_in_a_or_a_working_copy"]): return True return False def diff(self, data=None): if (self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"] and (self.path_dict["is_modified"] or self.path_dict["has_modified"] or self.path_dict["is_conflicted"] or self.path_dict["has_conflicted"])): return True return False def diff_previous_revision(self, data=None): if (self.path_dict["is_svn"] and self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"]): return True return False def compare_tool(self, data=None): if (self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"] and (self.path_dict["is_modified"] or self.path_dict["has_modified"] or self.path_dict["is_conflicted"] or self.path_dict["has_conflicted"])): return True return False def compare_tool_previous_revision(self, data=None): if (self.path_dict["is_svn"] and self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"]): return True return False def show_changes(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and self.path_dict["length"] in (1,2)) def show_log(self, data=None): return (self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and not self.path_dict["is_added"]) def add(self, data=None): if not self.path_dict["is_svn"]: return False if (self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"]): return True elif (not self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_versioned"]): return True return False def check_for_modifications(self, data=None): return (self.path_dict["is_working_copy"] or self.path_dict["is_versioned"]) def rename(self, data=None): return (self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_working_copy"] and self.path_dict["is_versioned"]) def delete(self, data=None): return (self.path_dict["exists"] or self.path_dict["is_versioned"]) and \ not self.path_dict["is_deleted"] def revert(self, data=None): if self.path_dict["is_in_a_or_a_working_copy"]: if (self.path_dict["is_added"] or self.path_dict["is_modified"] or self.path_dict["is_deleted"]): return True else: if (self.path_dict["is_dir"] and (self.path_dict["has_added"] or self.path_dict["has_modified"] or self.path_dict["has_deleted"] or self.path_dict["has_missing"])): return True return False def annotate(self, data=None): return (self.path_dict["length"] == 1 and not self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and not self.path_dict["is_added"]) def properties(self, data=None): return (self.path_dict["length"] == 1 and self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"]) def create_patch(self, data=None): if self.path_dict["is_in_a_or_a_working_copy"]: if (self.path_dict["is_added"] or self.path_dict["is_modified"] or self.path_dict["is_deleted"] or not self.path_dict["is_versioned"]): return True elif (self.path_dict["is_dir"] and (self.path_dict["has_added"] or self.path_dict["has_modified"] or self.path_dict["has_deleted"] or self.path_dict["has_unversioned"] or self.path_dict["has_missing"])): return True return False def apply_patch(self, data=None): if self.path_dict["is_in_a_or_a_working_copy"]: return True return False def add_to_ignore_list(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_versioned"]) def ignore_by_filename(self, *args): return (self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_versioned"]) def ignore_by_file_extension(self, *args): return (self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_versioned"]) def refresh_status(self, data=None): return True def get_lock(self, data=None): return self.path_dict["is_versioned"] def branch_tag(self, data=None): return self.path_dict["is_versioned"] def relocate(self, data=None): return self.path_dict["is_versioned"] def switch(self, data=None): return self.path_dict["is_versioned"] def merge(self, data=None): return self.path_dict["is_versioned"] def _import(self, data=None): return (self.path_dict["length"] == 1 and not self.path_dict["is_in_a_or_a_working_copy"]) def export(self, data=None): return (self.path_dict["length"] == 1) def svn_export(self, data=None): return self.export(data) def git_export(self, data=None): return self.export(data) def update_to_revision(self, data=None): return (self.path_dict["length"] == 1 and self.path_dict["is_versioned"] and self.path_dict["is_in_a_or_a_working_copy"]) def mark_resolved(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and self.path_dict["is_conflicted"]) def create_repository(self, data=None): return (self.path_dict["length"] == 1 and not self.path_dict["is_in_a_or_a_working_copy"]) def unlock(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and (self.path_dict["is_dir"] or self.path_dict["is_locked"])) def cleanup(self, data=None): return self.path_dict["is_versioned"] def browse_to(self, data=None): return self.path_dict["exists"] def _open(self, data=None): return self.path_dict["is_file"] def restore(self, data=None): return self.path_dict["has_missing"] def update(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and not self.path_dict["is_added"]) def repo_browser(self, data=None): return True def rabbitvcs(self, data=None): return False def rabbitvcs_svn(self, data=None): return (self.path_dict["is_svn"] or not self.path_dict["is_in_a_or_a_working_copy"]) def rabbitvcs_git(self, data=None): return (self.path_dict["is_git"] or not self.path_dict["is_in_a_or_a_working_copy"]) def rabbitvcs_mercurial(self, data=None): return (self.path_dict["is_mercurial"] or not self.path_dict["is_in_a_or_a_working_copy"]) def debug(self, data=None): return settings.get("general", "show_debug") def separator(self, data=None): return True def help(self, data=None): return False def settings(self, data=None): return True def about(self, data=None): return True def bugs(self, data=None): return True def initialize_repository(self, data=None): return (self.path_dict["is_dir"] and not self.path_dict["is_in_a_or_a_working_copy"]) def clone(self, data=None): return (self.path_dict["is_dir"] and not self.path_dict["is_in_a_or_a_working_copy"]) def push(self, data=None): return (self.path_dict["is_git"] or self.path_dict["is_mercurial"]) def branches(self, data=None): return (self.path_dict["is_git"]) def tags(self, data=None): return (self.path_dict["is_git"]) def remotes(self, data=None): return (self.path_dict["is_git"]) def clean(self, data=None): return (self.path_dict["is_git"]) def reset(self, data=None): return (self.path_dict["is_git"]) def stage(self, data=None): if self.path_dict["is_git"]: if (self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"]): return True elif (not self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"] and not self.path_dict["is_versioned"]): return True return False def unstage(self, data=None): if self.path_dict["is_git"]: if (self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"]): return True elif (not self.path_dict["is_dir"] and self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_added"]): return True return False def edit_conflicts(self, data=None): return (self.path_dict["is_in_a_or_a_working_copy"] and self.path_dict["is_versioned"] and self.path_dict["is_conflicted"]) class GtkFilesContextMenuCallbacks(ContextMenuCallbacks): """ A callback class created for GtkFilesContextMenus. This class inherits from the standard ContextMenuCallbacks class and overrides some methods. """ def __init__(self, caller, base_dir, vcs_client, paths=[]): """ @param caller: The calling object @type caller: RabbitVCS extension @param base_dir: The curent working directory @type base_dir: string @param vcs_client: The vcs client to be used @type vcs_client: rabbitvcs.vcs.create_vcs_instance() @param paths: The selected paths @type paths: list """ ContextMenuCallbacks.__init__(self, caller, base_dir, vcs_client, paths) def _open(self, widget, data1=None, data2=None): for path in self.paths: helper.open_item(path) def add(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("add", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def revert(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("revert", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def mark_resolved(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("markresolved", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def browse_to(self, widget, data1=None, data2=None): helper.browse_to_item(self.paths[0]) def delete(self, widget, data1=None, data2=None): if len(self.paths) > 0: proc = helper.launch_ui_window("delete", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def update(self, data1=None, data2=None): proc = helper.launch_ui_window("update", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def unlock(self, data1=None, data2=None): proc = helper.launch_ui_window("unlock", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def show_log(self, data1=None, data2=None): proc = helper.launch_ui_window("log", self.paths) self.caller.rescan_after_process_exit(proc, [self.paths[0]]) def stage(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("stage", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def unstage(self, widget, data1=None, data2=None): proc = helper.launch_ui_window("unstage", ["-q"] + self.paths) self.caller.rescan_after_process_exit(proc, self.paths) class GtkFilesContextMenuConditions(ContextMenuConditions): """ Sub-class for ContextMenuConditions for our dialogs. Allows us to override some generic condition methods with condition logic more suitable to the dialogs. """ def __init__(self, vcs_client, paths=[]): """ @param vcs_client: The vcs client to be used @type vcs_client: rabbitvcs.vcs.create_vcs_instance() @param paths: The selected paths @type paths: list """ self.vcs_client = vcs_client self.paths = paths self.statuses = {} self.generate_statuses(self.paths) self.generate_path_dict(self.paths) def generate_statuses(self, paths): self.statuses = {} for path in paths: if not path: continue statuses_tmp = self.vcs_client.statuses(path, invalidate=True) for status in statuses_tmp: self.statuses[status.path] = status self.text_statuses = [self.statuses[key].simple_content_status() for key in list(self.statuses.keys())] self.prop_statuses = [self.statuses[key].simple_metadata_status() for key in list(self.statuses.keys())] class GtkFilesContextMenu(object): """ Defines context menu items for a table with files """ def __init__(self, caller, event, base_dir, paths=[], conditions=None, callbacks=None): """ @param caller: The calling object @type caller: RabbitVCS extension @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.event = event self.paths = paths self.base_dir = base_dir self.vcs_client = create_vcs_instance() self.conditions = conditions if self.conditions is None: self.conditions = GtkFilesContextMenuConditions(self.vcs_client, paths) self.callbacks = callbacks if self.callbacks is None: self.callbacks = GtkFilesContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, paths ) ignore_items = get_ignore_list_items(paths) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuDiff, None), (MenuCompareTool, None), (MenuUnlock, None), (MenuShowLog, None), (MenuOpen, None), (MenuBrowseTo, None), (MenuDelete, None), (MenuRevert, None), (MenuRestore, None), (MenuEditConflicts, None), (MenuMarkResolved, None), (MenuCreatePatch, None), (MenuAdd, None), (MenuStage, None), (MenuUnstage, None), (MenuAddToIgnoreList, ignore_items) ] def show(self): if len(self.paths) == 0: return context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) context_menu.show(self.event) def get_menu(self): context_menu = GtkContextMenu(self.structure, self.conditions, self.callbacks) return context_menu.menu class MainContextMenuCallbacks(ContextMenuCallbacks): """ The callback class used for the main context menu. This inherits from and overrides the ContextMenuCallbacks class. """ def __init__(self, caller, base_dir, vcs_client, paths=[]): """ @param caller: The calling object @type caller: RabbitVCS extension @param base_dir: The curent working directory @type base_dir: string @param vcs_client: The vcs client to be used @type vcs_client: rabbitvcs.vcs.create_vcs_instance() @param paths: The selected paths @type paths: list """ ContextMenuCallbacks.__init__(self, caller, base_dir, vcs_client, paths) class MainContextMenuConditions(ContextMenuConditions): """ Sub-class for ContextMenuConditions used for file manager extensions. Allows us to override some generic condition methods with condition logic more suitable to the dialogs. """ def __init__(self, vcs_client, paths=[]): """ @param vcs_client: The vcs client to be used @type vcs_client: rabbitvcs.vcs.create_vcs_instance() @param paths: The selected paths @type paths: list """ self.vcs_client = vcs_client self.paths = paths self.statuses = {} self.generate_statuses(paths) self.generate_path_dict(paths) # FIXME: major bottleneck def generate_statuses(self, paths): self.statuses = {} for path in paths: if not path: continue statuses_tmp = self.vcs_client.statuses(path) for status in statuses_tmp: self.statuses[status.path] = status self.text_statuses = [self.statuses[key].simple_content_status() for key in list(self.statuses.keys())] self.prop_statuses = [self.statuses[key].simple_metadata_status() for key in list(self.statuses.keys())] class MainContextMenu(object): """ Defines and composes the main context menu. """ def __init__(self, caller, base_dir, paths=[], conditions=None, callbacks=None): """ @param caller: The calling object @type caller: RabbitVCS extension @param base_dir: The curent working directory @type base_dir: string @param paths: The selected paths @type paths: list @param conditions: The conditions class that determines menu item visibility @kind conditions: ContextMenuConditions @param callbacks: The callbacks class that determines what actions are taken @kind callbacks: ContextMenuCallbacks """ self.caller = caller self.paths = paths self.base_dir = base_dir self.vcs_client = create_vcs_instance() self.conditions = conditions if self.conditions is None: self.conditions = MainContextMenuConditions(self.vcs_client, paths) self.callbacks = callbacks if self.callbacks is None: self.callbacks = MainContextMenuCallbacks( self.caller, self.base_dir, self.vcs_client, paths ) ignore_items = get_ignore_list_items(paths) # The first element of each tuple is a key that matches a # ContextMenuItems item. The second element is either None when there # is no submenu, or a recursive list of tuples for desired submenus. self.structure = [ (MenuDebug, [ (MenuBugs, None), (MenuPythonConsole, None), (MenuRefreshStatus, None), (MenuDebugRevert, None), (MenuDebugInvalidate, None), (MenuDebugAddEmblem, None) ]), (MenuUpdate, None), (MenuCommit, None), (MenuPush, None), None if settings.get("HideItem", "svn") else (MenuRabbitVCSSvn, [ (MenuCheckout, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuRepoBrowser, None), (MenuCheckForModifications, None), (MenuSeparator, None), (MenuAdd, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuUpdateToRevision, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuEditConflicts, None), (MenuMarkResolved, None), (MenuRelocate, None), (MenuGetLock, None), (MenuUnlock, None), (MenuCleanup, None), (MenuSeparator, None), (MenuSVNExport, None), (MenuCreateRepository, None), (MenuImport, None), (MenuSeparator, None), (MenuBranchTag, None), (MenuSwitch, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuProperties, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]), None if settings.get("HideItem", "git") else (MenuRabbitVCSGit, [ (MenuClone, None), (MenuInitializeRepository, None), (MenuSeparator, None), (MenuDiffMenu, [ (MenuDiff, None), (MenuDiffPrevRev, None), (MenuDiffMultiple, None), (MenuCompareTool, None), (MenuCompareToolPrevRev, None), (MenuCompareToolMultiple, None), (MenuShowChanges, None), ]), (MenuShowLog, None), (MenuStage, None), (MenuUnstage, None), (MenuAddToIgnoreList, ignore_items), (MenuSeparator, None), (MenuRename, None), (MenuDelete, None), (MenuRevert, None), (MenuClean, None), (MenuReset, None), (MenuCheckout, None), (MenuSeparator, None), (MenuBranches, None), (MenuTags, None), (MenuRemotes, None), (MenuSeparator, None), (MenuGitExport, None), (MenuMerge, None), (MenuSeparator, None), (MenuAnnotate, None), (MenuSeparator, None), (MenuCreatePatch, None), (MenuApplyPatch, None), (MenuSeparator, None), (MenuSettings, None), (MenuAbout, None) ]), None if settings.get("HideItem", "hg") else (MenuRabbitVCSMercurial, [ (MenuSettings, None), (MenuAbout, None) ]) ] self.structure = [_f for _f in self.structure if _f] def get_menu(self): pass def TestMenuItemFunctions(): """ This is a test for developers to ensure that they've written all the necessary conditions and callbacks (and haven't made any typos). What it does: - build a list of all the subclasses of MenuItem - build lists of the methods in ContextMenuConditions/ContextMenuCallbacks - checks to see whether all the MenuItems conditions and callbacks have been assigned - if not, a message is printed """ # These are some simple tests: import inspect import types from . import contextmenuitems menu_item_subclasses = [] # Let's create a list of all MenuItem subclasses for name in dir(contextmenuitems): entity = getattr(contextmenuitems, name) if type(entity) == type: mro = inspect.getmro(entity) if (entity is not contextmenuitems.MenuItem and contextmenuitems.MenuItem in mro): menu_item_subclasses.append(entity) condition_functions = [] # Now let's create a list of all of the functions in our conditions class for name in dir(ContextMenuConditions): entity = getattr(ContextMenuConditions, name) if type(entity) == types.UnboundMethodType and not name.startswith("__"): condition_functions.append(entity) callback_functions = [] # ...and in our callbacks class for name in dir(ContextMenuCallbacks): entity = getattr(ContextMenuCallbacks, name) if type(entity) == types.UnboundMethodType and not name.startswith("__"): condition_functions.append(entity) for cls in menu_item_subclasses: item = cls(ContextMenuConditions(), ContextMenuCallbacks(None, None, None, None)) if not item.found_condition: print("Did not find condition function in ContextMenuConditions " \ "for %s (type: %s)" % (item.identifier, cls)) if not item.callback: print("Did not find callback function in ContextMenuCallbacks " \ "for %s (type: %s)" % (item.identifier, cls)) if __name__ == "__main__": TestMenuItemFunctions() rabbitvcs-0.18/rabbitvcs/util/contextmenuitems.py000066400000000000000000000636661362112712700223650ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2010 by Jason Heeris # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path import os import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from rabbitvcs.util import helper from rabbitvcs.util.strings import S from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.contextmenuitems") _ = gettext.gettext SEPARATOR = u'\u2015' * 10 class MenuItem(object): """ This is the base class for a definition of a menu item. Consider this "abstract" (in the language of Java) - it makes no sense to instantiate it directly. If you want to define a new kind of menu item, you need to subclass it like so: class MenuPerformMagic(MenuItem): identifier = "RabbitVCS::Perform_Magic" label = _("Perform Magic") tooltip = _("Put on your robe and wizard hat") icon = "rabbitvcs-wand" There is some introspection magic that goes on to associate the items themselves with certain methods of a ContextMenuCondition object or a ContextMenuCallback object. This is done by looking at the identifier - the part of the identifier after "::" is converted to lowercase and the item looks for a method of that name (eg. in the example above, "perform_magic"). It is easy to override this, just define condition_name and callback_name to be what you need. If the item cannot find anything, it defaults to not assigning the callback and having the condition return False. There a few ways to organise this (and maybe it would be better to have the GtkContextMenu class do it), but this is it for the moment. """ @staticmethod def default_condition(*args, **kwargs): return False @staticmethod def make_default_name(identifier): return identifier.split(MenuItem.IDENTIFIER_SEPARATOR)[-1].lower() IDENTIFIER_SEPARATOR = "::" # These are all explicitly defined here to make it obvious what a subclass # needs to set up. # This is relevant for GTK and Nautilus - they require unique identifiers # for all the elements of their menus. Make sure it starts with # "RabbitVCS::" identifier = None # The label that appears on the menu item. It is up to the subclass to # designate it as translatable. label = None # The tooltip for the menu item. It is up to the subclass to designate it as # translatable. tooltip = "" # The icon that will appear on the menu item. This can be, say, # "rabbitvcs-something" icon = None # This is a string that holds the name of the function that is called when # the menu item is activated (it is assigned to # self.signals["activate"]["callback"]) # # The menu item will look for a callable attribute of this name in the # callback object passed in to the constructor. If it is None, it will try # to assign a default callback based on the identifier. If nothing is found # then no callback will be assigned to the "activate" signal. callback_name = None callback_args = () # This is a string that holds the name of the function that is called to # determine whether to show the item. # # The menu item will look for a callable attribute of this name in the # callback object passed in to the constructor. If it is None, or False, or # it cannot find anything, it will set up a function that returns False. condition_name = None condition_args = () def __init__(self, conditions, callbacks): """ Creates a new menu item for constructing the GTK context menu. """ self.signals = {} default_name = MenuItem.make_default_name(self.identifier) # These flags are used for sanity checks that developers can run to # ensure completeness of conditions and callbacks. # See contextmenu.TestMenuItemFunctions() self.found_callback = False self.found_condition = False # If no callback name is set, assign the default if self.callback_name is None: # log.debug("Using default callback name: %s" % default_name) self.callback_name = default_name # Try to get the callback function for this item self.callback = self._get_function(callbacks, self.callback_name) # else: # log.debug("Could not find callback for %s" % self.identifier) self.condition = { "callback": MenuItem.default_condition, "args": self.condition_args } if self.condition_name is None: self.condition_name = default_name condition = self._get_function(conditions, self.condition_name) if condition: self.condition["callback"] = condition self.found_condition = True # else: # log.debug("Could not find condition for %s" % self.identifier) def show(self): return self.condition["callback"](*self.condition["args"]) def _get_function(self, object, name): function = None if hasattr(object, name): attr = getattr(object, name) if callable(attr): function = attr return function def make_magic_id(self, id_magic = None): identifier = self.identifier if id_magic: identifier = identifier + "-" + str(id_magic) return identifier def make_action(self, id_magic = None): """ Creates the Action for the menu item. To avoid GTK "helpfully" preventing us from adding duplicates (eg. separators), you can pass in a string that will be appended and separated from the actual identifier. """ identifier = self.make_magic_id(id_magic) return Action(identifier, self.make_label(), self.tooltip, self.icon) def make_thunar_action(self, id_magic = None): identifier = self.make_magic_id(id_magic) action = RabbitVCSAction( identifier, self.make_label(), self.tooltip, self.icon ) return action def make_gtk_menu_item(self, id_magic = None): action = self.make_action(id_magic) if self.icon: # We use this instead of Gtk.Action.set_icon_name because # that method is not available until pyGtk 2.16 action.set_menu_item_type(Gtk.ImageMenuItem) menuitem = action.create_menu_item() menuitem.set_image(Gtk.image_new_from_icon_name(self.icon, Gtk.IconSize.MENU)) else: menuitem = action.create_menu_item() return menuitem def make_gtk3_menu_item(self, id_magic = None): action = self.make_action(id_magic) menuitem = action.create_menu_item() if self.icon: menuitem.set_image(Gtk.Image.new_from_icon_name(self.icon, Gtk.IconSize.MENU)) return menuitem def make_thunarx_menu_item(self, id_magic = None): # WARNING: this import is here because it will fail if it is not done # inside a thunar process and therefore can't be in the module proper. # This should only be used for Thunarx-3 identifier = self.make_magic_id(id_magic) from gi.repository import Thunarx menuitem = Thunarx.MenuItem( name=identifier, label=self.make_label(), tooltip=self.tooltip, icon=self.icon ) return menuitem def make_nautilus_menu_item(self, id_magic = None): # WARNING: this import is here because it will fail if it is not done # inside a nautilus process and therefore can't be in the module proper. # I'm happy to let the exception propagate the rest of the time, since # this method shouldn't be called outside of nautilus. identifier = self.make_magic_id(id_magic) try: from gi.repository import Nautilus menuitem = Nautilus.MenuItem( name=identifier, label=self.make_label(), tip=self.tooltip, icon=self.icon ) except ImportError: import nautilus menuitem = nautilus.MenuItem( identifier, self.make_label(), self.tooltip, self.icon ) return menuitem def make_label(self): label = S(self.label).display().replace('_', '__') return label class MenuSeparator(MenuItem): identifier = "RabbitVCS::Separator" label = SEPARATOR def make_insensitive(self, menuitem): menuitem.set_property("sensitive", False) def make_thunar_action(self, id_magic = None): menuitem = super(MenuSeparator, self).make_thunar_action(id_magic) self.make_insensitive(menuitem) return menuitem # FIXME: I thought that this would work to create separators, # but all I get are black "-"s... # I thought #~ identifier = self.make_magic_id(id_magic) #~ # This information is not actually used, but is necessary for #~ # the required subclassing of Action. #~ action = ThunarSeparator( #~ identifier, #~ self.label, #~ self.tooltip, #~ self.icon, #~ ) #~ return action # Make separators insensitive def make_gtk_menu_item(self, id_magic = None): menuitem = Gtk.SeparatorMenuItem() menuitem.show() return menuitem def make_gtk3_menu_item(self, id_magic = None): menuitem = Gtk.SeparatorMenuItem() menuitem.show() return menuitem def make_nautilus_menu_item(self, id_magic = None): menuitem = super(MenuSeparator, self).make_nautilus_menu_item(id_magic) self.make_insensitive(menuitem) return menuitem class MenuDebug(MenuItem): identifier = "RabbitVCS::Debug" label = _("Debug") icon = "rabbitvcs-monkey" class MenuBugs(MenuItem): identifier = "RabbitVCS::Bugs" label = _("Bugs") icon = "rabbitvcs-bug" class MenuPythonConsole(MenuItem): identifier = "RabbitVCS::Python_Console" label = _("Open Python Console") icon = "gnome-terminal" condition_name = "debug" class MenuRefreshStatus(MenuItem): identifier = "RabbitVCS::Refresh_Status" label = _("Refresh Status") icon = "rabbitvcs-refresh" class MenuDebugRevert(MenuItem): identifier = "RabbitVCS::Debug_Revert" label = _("Debug Revert") tooltip = _("Reverts everything it sees") icon = "rabbitvcs-revert" condition_name = "debug" class MenuDebugInvalidate(MenuItem): identifier = "RabbitVCS::Debug_Invalidate" label = _("Invalidate") tooltip = _("Force an invalidate_extension_info() call") icon = "rabbitvcs-clear" condition_name = "debug" class MenuDebugAddEmblem(MenuItem): identifier = "RabbitVCS::Debug_Add_Emblem" label = _("Add Emblem") tooltip = _("Add an emblem") icon = "rabbitvcs-emblems" condition_name = "debug" class MenuCheckout(MenuItem): identifier = "RabbitVCS::Checkout" label = _("Checkout...") tooltip = _("Check out a working copy") icon = "rabbitvcs-checkout" class MenuUpdate(MenuItem): identifier = "RabbitVCS::Update" label = _("Update") tooltip = _("Update a working copy") icon = "rabbitvcs-update" class MenuCommit(MenuItem): identifier = "RabbitVCS::Commit" label = _("Commit") tooltip = _("Commit modifications to the repository") icon = "rabbitvcs-commit" class MenuRabbitVCS(MenuItem): identifier = "RabbitVCS::RabbitVCS" label = _("RabbitVCS") icon = "rabbitvcs" class MenuRabbitVCSSvn(MenuItem): identifier = "RabbitVCS::RabbitVCS_Svn" label = _("RabbitVCS SVN") icon = "rabbitvcs" class MenuRabbitVCSGit(MenuItem): identifier = "RabbitVCS::RabbitVCS_Git" label = _("RabbitVCS Git") icon = "rabbitvcs" class MenuRabbitVCSMercurial(MenuItem): identifier = "RabbitVCS::RabbitVCS_Mercurial" label = _("RabbitVCS Hg") icon = "rabbitvcs" class MenuRepoBrowser(MenuItem): identifier = "RabbitVCS::Repo_Browser" label = _("Repository Browser") tooltip = _("Browse a repository tree") icon = "edit-find" class MenuCheckForModifications(MenuItem): identifier = "RabbitVCS::Check_For_Modifications" label = _("Check for Modifications...") tooltip = _("Check for modifications made to the repository") icon = "rabbitvcs-checkmods" class MenuDiffMenu(MenuItem): identifier = "RabbitVCS::Diff_Menu" label = _("Diff Menu...") tooltip = _("List of comparison options") icon = "rabbitvcs-diff" class MenuDiff(MenuItem): identifier = "RabbitVCS::Diff" label = _("View diff against base") tooltip = _("View the modifications made to a file") icon = "rabbitvcs-diff" class MenuDiffMultiple(MenuItem): identifier = "RabbitVCS::Diff_Multiple" label = _("View diff between files/folders") tooltip = _("View the differences between two files") icon = "rabbitvcs-diff" class MenuDiffPrevRev(MenuItem): identifier = "RabbitVCS::Diff_Previous_Revision" label = _("View diff against previous revision") tooltip = _("View the modifications made to a file since its last change") icon = "rabbitvcs-diff" class MenuCompareTool(MenuItem): identifier = "RabbitVCS::Compare_Tool" label = _("Compare with base") tooltip = _("Compare with base using side-by-side comparison tool") icon = "rabbitvcs-compare" class MenuCompareToolMultiple(MenuItem): identifier = "RabbitVCS::Compare_Tool_Multiple" label = _("Compare files/folders") tooltip = _("Compare the differences between two items") icon = "rabbitvcs-compare" class MenuCompareToolPrevRev(MenuItem): identifier = "RabbitVCS::Compare_Tool_Previous_Revision" label = _("Compare with previous revision") tooltip = _("Compare with previous revision using side-by-side comparison tool") icon = "rabbitvcs-compare" class MenuShowChanges(MenuItem): identifier = "RabbitVCS::Show_Changes" label = _("Show Changes...") tooltip = _("Show changes between paths and revisions") icon = "rabbitvcs-changes" class MenuShowLog(MenuItem): identifier = "RabbitVCS::Show_Log" label = _("Show Log") tooltip = _("Show a file's log information") icon = "rabbitvcs-show_log" class MenuAdd(MenuItem): identifier = "RabbitVCS::Add" label = _("Add") tooltip = _("Schedule items to be added to the repository") icon = "rabbitvcs-add" class MenuAddToIgnoreList(MenuItem): identifier = "RabbitVCS::Add_To_Ignore_List" label = _("Add to ignore list") icon = None class MenuUpdateToRevision(MenuItem): identifier = "RabbitVCS::Update_To_Revision" label = _("Update to revision...") tooltip = _("Update a file to a specific revision") icon = "rabbitvcs-update" class MenuRename(MenuItem): identifier = "RabbitVCS::Rename" label = _("Rename...") tooltip = _("Schedule an item to be renamed on the repository") icon = "rabbitvcs-rename" class MenuDelete(MenuItem): identifier = "RabbitVCS::Delete" label = _("Delete") tooltip = _("Schedule an item to be deleted from the repository") icon = "rabbitvcs-delete" class MenuRevert(MenuItem): identifier = "RabbitVCS::Revert" label = _("Revert") tooltip = _("Revert an item to its unmodified state") icon = "rabbitvcs-revert" class MenuMarkResolved(MenuItem): identifier = "RabbitVCS::Mark_Resolved" label = _("Mark as Resolved") tooltip = _("Mark a conflicted item as resolved") icon = "rabbitvcs-resolve" class MenuRestore(MenuItem): identifier = "RabbitVCS::Restore" label = _("Restore") tooltip = _("Restore a missing item") class MenuRelocate(MenuItem): identifier = "RabbitVCS::Relocate" label = _("Relocate...") tooltip = _("Relocate your working copy") icon = "rabbitvcs-relocate" class MenuGetLock(MenuItem): identifier = "RabbitVCS::Get_Lock" label = _("Get Lock...") tooltip = _("Locally lock items") icon = "rabbitvcs-lock" class MenuUnlock(MenuItem): identifier = "RabbitVCS::Unlock" label = _("Release Lock...") tooltip = _("Release lock on an item") icon = "rabbitvcs-unlock" class MenuCleanup(MenuItem): identifier = "RabbitVCS::Cleanup" label = _("Cleanup") tooltip = _("Clean up working copy") icon = "rabbitvcs-cleanup" class MenuExport(MenuItem): identifier = "RabbitVCS::Export" label = _("Export...") tooltip = _("Export a working copy or repository with no versioning information") icon = "rabbitvcs-export" class MenuSVNExport(MenuExport): identifier = "RabbitVCS::SVN_Export" pass class MenuGitExport(MenuExport): identifier = "RabbitVCS::Git_Export" pass class MenuCreateRepository(MenuItem): identifier = "RabbitVCS::Create_Repository" label = _("Create Repository here") tooltip = _("Create a repository in a folder") icon = "rabbitvcs-run" class MenuImport(MenuItem): identifier = "RabbitVCS::Import" label = _("Import") tooltip = _("Import an item into a repository") icon = "rabbitvcs-import" # "import" is reserved condition_name = "_import" callback_name = "_import" class MenuBranchTag(MenuItem): identifier = "RabbitVCS::Branch_Tag" label = _("Branch/tag...") tooltip = _("Copy an item to another location in the repository") icon = "rabbitvcs-branch" class MenuSwitch(MenuItem): identifier = "RabbitVCS::Switch" label = _("Switch...") tooltip = _("Change the repository location of a working copy") icon = "rabbitvcs-switch" class MenuMerge(MenuItem): identifier = "RabbitVCS::Merge" label = _("Merge...") tooltip = _("A wizard with steps for merging") icon = "rabbitvcs-merge" class MenuAnnotate(MenuItem): identifier = "RabbitVCS::Annotate" label = _("Annotate...") tooltip = _("Annotate a file") icon = "rabbitvcs-annotate" class MenuCreatePatch(MenuItem): identifier = "RabbitVCS::Create_Patch" label = _("Create Patch...") tooltip = _("Creates a unified diff file with all changes you made") icon = "rabbitvcs-createpatch" class MenuApplyPatch(MenuItem): identifier = "RabbitVCS::Apply_Patch" label = _("Apply Patch...") tooltip = _("Applies a unified diff file to the working copy") icon = "rabbitvcs-applypatch" class MenuProperties(MenuItem): identifier = "RabbitVCS::Properties" label = _("Properties") tooltip = _("View the properties of an item") icon = "rabbitvcs-properties" class MenuHelp(MenuItem): identifier = "RabbitVCS::Help" label = _("Help") tooltip = _("View help") icon = "rabbitvcs-help" class MenuSettings(MenuItem): identifier = "RabbitVCS::Settings" label = _("Settings") tooltip = _("View or change RabbitVCS settings") icon = "rabbitvcs-settings" class MenuAbout(MenuItem): identifier = "RabbitVCS::About" label = _("About") tooltip = _("About RabbitVCS") icon = "rabbitvcs-about" class MenuOpen(MenuItem): identifier = "RabbitVCS::Open" label = _("Open") tooltip = _("Open a file") icon = "document-open" # Not sure why, but it was like this before... condition_name = "_open" callback_name = "_open" class MenuBrowseTo(MenuItem): identifier = "RabbitVCS::Browse_To" label = _("Browse to") tooltip = _("Browse to a file or folder") icon = "drive-harddisk" class PropMenuRevert(MenuItem): identifier = "RabbitVCS::Property_Revert" label = _("Revert property") icon = "rabbitvcs-revert" tooltip = _("Revert this property to its original state") class PropMenuRevertRecursive(MenuItem): identifier = "RabbitVCS::Property_Revert_Recursive" label = _("Revert property (recursive)") icon = "rabbitvcs-revert" tooltip = _("Revert this property to its original state (recursive)") condition_name = "property_revert" class PropMenuDelete(MenuItem): identifier = "RabbitVCS::Property_Delete" label = _("Delete property") icon = "rabbitvcs-delete" tooltip = _("Delete this property") class PropMenuDeleteRecursive(MenuItem): identifier = "RabbitVCS::Property_Delete_Recursive" label = _("Delete property (recursive)") icon = "rabbitvcs-delete" tooltip = _("Delete this property (recursive)") condition_name = "property_delete" class PropMenuEdit(MenuItem): identifier = "RabbitVCS::Property_Edit" label = _("Edit details") icon = "rabbitvcs-editprops" tooltip = _("Show and edit property details") class MenuInitializeRepository(MenuItem): identifier = "RabbitVCS::Initialize_Repository" label = _("Initialize Repository") icon = "rabbitvcs-run" class MenuClone(MenuItem): identifier = "RabbitVCS::Clone" label = _("Clone") icon = "rabbitvcs-checkout" class MenuFetchPull(MenuItem): identifier = "RabbitVCS::Fetch_Pull" label = _("Fetch/Pull") icon = "rabbitvcs-update" class MenuPush(MenuItem): identifier = "RabbitVCS::Push" label = _("Push") icon = "rabbitvcs-push" class MenuBranches(MenuItem): identifier = "RabbitVCS::Branches" label = _("Branches") icon = "rabbitvcs-branch" class MenuTags(MenuItem): identifier = "RabbitVCS::Tags" label = _("Tags") icon = "rabbitvcs-branch" class MenuRemotes(MenuItem): identifier = "RabbitVCS::Remotes" label = _("Remotes") icon = "rabbitvcs-checkmods" class MenuClean(MenuCleanup): identifier = "RabbitVCS::Clean" label = _("Clean") class MenuReset(MenuItem): identifier = "RabbitVCS::Reset" label = _("Reset") icon = "rabbitvcs-reset" class MenuStage(MenuItem): identifier = "RabbitVCS::Stage" label = _("Stage") icon = "rabbitvcs-add" class MenuUnstage(MenuItem): identifier = "RabbitVCS::Unstage" label = _("Unstage") icon = "rabbitvcs-unstage" class MenuEditConflicts(MenuItem): identifier = "RabbitVCS::Edit_Conflicts" label = _("Edit conflicts") icon = "rabbitvcs-editconflicts" def get_ignore_list_items(paths): """ Build up a list of items to ignore based on the selected paths @param paths: The selected paths @type paths: list """ ignore_items = [] # Used to weed out duplicate menu items added_ignore_labels = [] # These are ignore-by-filename items ignorebyfilename_index = 0 for path in paths: basename = os.path.basename(path) if basename not in added_ignore_labels: key = "IgnoreByFileName%s" % str(ignorebyfilename_index) class MenuIgnoreFilenameClass(MenuItem): identifier = "RabbitVCS::%s" % key label = basename tooltip = _("Ignore item by filename") callback_name = "ignore_by_filename" callback_args = (path) condition_name = "ignore_by_filename" condition_args = (path) ignore_items.append((MenuIgnoreFilenameClass, None)) # These are ignore-by-extension items ignorebyfileext_index = 0 for path in paths: extension = helper.get_file_extension(path) ext_str = "*%s"%extension if ext_str not in added_ignore_labels: class MenuIgnoreFileExtClass(MenuItem): identifier = "RabbitVCS::%s" % key label = ext_str tooltip = _("Ignore item by file extension") callback_name = "ignore_by_file_extension" callback_args = (path, extension) condition_name = "ignore_by_file_extension" condition_args = (path, extension) ignore_items.append((MenuIgnoreFileExtClass, None)) return ignore_items class Action(object): def __init__(self, name, label, tooltip, icon_name): self.name = name self.label = label self.tooltip = tooltip self.icon_name = icon_name def __repr__(self): return self.get_name() def create_menu_item(self): item = Gtk.ImageMenuItem() if self.label: item.set_label(self.label) if self.tooltip: item.set_tooltip_text(self.tooltip) if self.icon_name: item.set_image(Gtk.Image.new_from_icon_name(self.icon_name, Gtk.IconSize.MENU)) return item class RabbitVCSAction(Action): """ Sub-classes Action so that we can have submenus. This is needed for context menus that use Gtk actions """ __gtype_name__ = "RabbitVCSAction" def __init__(self, name, label, tooltip, icon_name): Action.__init__(self, name, label, tooltip, icon_name) self.sub_actions = None def set_sub_actions(self, sub_actions): self.sub_actions = sub_actions def create_menu_item(self): menu_item = super(RabbitVCSAction, self).create_menu_item() if self.sub_actions is not None: menu = Gtk.Menu() menu_item.set_submenu(menu) for sub_action in self.sub_actions: subitem = sub_action.create_menu_item() menu.append(subitem) subitem.show() return menu_item # FIXME: apparently it's possible to get real GtkSeparators in a Thunar # menu, but this doesn't seem to work. class ThunarSeparator(RabbitVCSAction): def create_menu_item(self): return Gtk.SeparatorMenuItem() rabbitvcs-0.18/rabbitvcs/util/decorators.py000066400000000000000000000124611362112712700211020ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Simple decorators (usable in Python >= 2.4). Decorators should be named as verbs (present or paste tense). See: - https://linkchecker.svn.sourceforge.net/svnroot/linkchecker/trunk/linkchecker/linkcheck/decorators.py - http://wiki.python.org/moin/PythonDecoratorLibrary """ from __future__ import absolute_import import os from gi.repository import GLib import time import warnings import threading from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.decorators") def update_func_meta(fake_func, real_func): """ Set meta information (eg. __doc__) of fake function to that of the real function. @rtype: function @return Fake function with metadata of the real function. """ fake_func.__module__ = real_func.__module__ fake_func.__name__ = real_func.__name__ fake_func.__doc__ = real_func.__doc__ fake_func.__dict__.update(real_func.__dict__) return fake_func def deprecated(func): """ A decorator which can be used to mark functions as deprecated. It emits a warning when the function is called. @type func: function @param func: The function to be designated as deprecated. """ def newfunc(*args, **kwargs): """ Print deprecated warning and execute original function. """ warnings.warn("Call to deprecated function %s." % func.__name__, category=DeprecationWarning) return func(*args, **kwargs) return update_func_meta(newfunc, func) def timeit(func): """ This is a decorator which times a function and prints the time it took in milliseconds to stdout. Based on the timeit function from LinkChecker. @type func: function @param func: The function to be timed. """ def newfunc(*args, **kwargs): """Execute function and print execution time.""" start_time = time.time() result = func(*args, **kwargs) duration = (time.time() - start_time) * 1000.0 log.info("%s() took %0.4f milliseconds" % (func.__name__, duration)) return result return update_func_meta(newfunc, func) def disable(func): """ Disable a function. @type func: function @param func: The function to be disabled. """ def newfunc(*args, **kwargs): return return update_func_meta(newfunc, func) def gtk_unsafe(func): """ Used to wrap a function that makes calls to GTK from a thread in the main thread's idle loop. """ from rabbitvcs.util import helper def newfunc(*args, **kwargs): return helper.run_in_main_thread(func, *args, **kwargs) return update_func_meta(newfunc, func) def debug_calls(caller_log, show_caller=False): """ Given a log to write messages to, wrap a function and log its invocation and return. Use like: @debug_calls(my_modules_log) def actual_function(...): ... Warning: do not use with DBUS decorated methods, as this will play havoc with introspection. """ # We need a function within a function to be able to use the log argument. def real_debug(func): def newfunc(*args, **kwargs): caller_log.debug("Calling: %s (%s)" % (func.__name__, threading.currentThread().getName())) result = func(*args, **kwargs) caller_log.debug("Returned: %s (%s)" % (func.__name__, threading.currentThread().getName())) return result return update_func_meta(newfunc, func) return real_debug def structure_map(func): """ Descend recursively into object if it is a list, a tuple, a set or a dict and build the equivalent structure with func results. Do not apply function to None. """ def newfunc(obj, *args, **kwargs): if obj is None: return obj if isinstance(obj, list): return [newfunc(item, *args, **kwargs) for item in obj] if isinstance(obj, tuple): return tuple(newfunc(item, *args, **kwargs) for item in obj) if isinstance(obj, set): return {newfunc(item, *args, **kwargs) for item in obj} if isinstance(obj, dict): return {key: newfunc(obj[key], *args, **kwargs) for key in obj} return func(obj, *args, **kwargs) return update_func_meta(newfunc, func) rabbitvcs-0.18/rabbitvcs/util/helper.py000066400000000000000000001065711362112712700202220ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ All sorts of helper functions. """ from __future__ import absolute_import from collections import deque import locale import os import os.path import sys import subprocess import re import datetime import time import shutil import hashlib import threading import codecs from gi.repository import GLib import six from six.moves import filter from six.moves import range import six.moves.urllib.parse import rabbitvcs.util.settings from rabbitvcs.util.decorators import structure_map from rabbitvcs.util.strings import * from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.helper") from rabbitvcs import gettext ngettext = gettext.ngettext try: from html import escape as html_escape except ImportError: from cgi import escape as html_escape import gi from gi.repository import GObject from rabbitvcs import gettext _ = gettext.gettext LOG_DATETIME_FORMAT = "%Y-%m-%d %H:%M" # for log files DT_FORMAT_TIME = _("%I:%M%P") DT_FORMAT_THISWEEK = _("%a %I:%M%p") DT_FORMAT_THISYEAR = _("%b %d") DT_FORMAT_ALL = _("%b %d %Y") LINE_BREAK_CHAR = six.unichr(0x23CE) def compare_version(version1, version2, length = None): if not length: length = max(len(version1), len(version2)) for i in range(length): x = int(version1[i]) if i in version1 else 0 y = int(version2[i]) if i in version2 else 0 r = x - y if r: return r return 0 def gobject_threads_init(): """ Call GObject.threads_init() only if not deprecated. """ if compare_version(GObject.pygobject_version, [3, 10, 2]) < 0: GObject.threads_init() @structure_map def to_bytes(s, encoding=UTF8_ENCODING): """ Convert string (whatever type it is) to bytes in the given encoding. """ if isinstance(s, six.text_type): return S(s).bytes(encoding) if isinstance(s, bytearray): if encoding.lower() == UTF8_ENCODING: return s return bytearray(S(s).bytes(encoding)) if isinstance(s, bytes) and encoding.lower() != UTF8_ENCODING: return S(s).bytes(encoding) return s def run_in_main_thread(func, *args, **kwargs): """ Execute function in main thread's idle loop. """ def dofunc(event, func, args, kwargs): try: event.result = func(*args, **kwargs) except Exception as e: event.exception = e event.set() if isinstance(threading.current_thread(), threading._MainThread): return func(*args, **kwargs) event = threading.Event() event.result = None event.exception = None GLib.idle_add(dofunc, event, func, args, kwargs) event.wait() if event.exception: raise event.exception return event.result def get_tmp_path(filename): day = datetime.datetime.now().day day_string = S(str(day) + str(os.geteuid())).bytes() m = hashlib.md5(day_string).hexdigest()[0:10] tmpdir = "/tmp/rabbitvcs-%s" %m if not os.path.isdir(tmpdir): os.mkdir(tmpdir) return "%s/%s" % (tmpdir, filename) def process_memory(pid): # ps -p 5205 -w -w -o rss --no-headers psproc = subprocess.Popen( ["ps", "-p", str(pid), "-w", "-w", # Extra-wide format "-o", "size", # "Size" is probably the best all round # memory measure. "--no-headers"], stdout=subprocess.PIPE) (output, stdin) = psproc.communicate() mem_in_kb = 0 try: mem_in_kb = int(output) except ValueError: pass # log.debug("Memory for %i: %i" % (pid, mem_in_kb)) return mem_in_kb def format_long_text(text, cols = None, line1only = False): """ Nicely formats text containing linebreaks to display in a single line by replacing newlines with U+23CE, or keeping only the first non-empty line. If the param "cols" is given, the text beyond cols is replaced by "...". """ text = S(text.strip()).unicode().replace(six.u("\n"), LINE_BREAK_CHAR) if line1only: i = text.find(LINE_BREAK_CHAR) if i >= 0: text = text[:i] if cols and len(text) > cols: text = six.u("%s...") % text[0:cols] return text def format_datetime(dt, format=None): if format: return S(dt.strftime(format), None).unicode() now = datetime.datetime.now() delta = now - dt returner = "" if dt.year == 1900: returner = _("(no date)") else: if delta.days == 0: if delta.seconds < 60: returner = _("just now") elif delta.seconds >= 60 and delta.seconds < 600: returner = _("%d minute(s) ago") % (delta.seconds/60) elif delta.seconds >= 600 and delta.seconds < 43200: returner = dt.strftime(DT_FORMAT_TIME) else: returner = dt.strftime(DT_FORMAT_THISWEEK) elif delta.days > 0 and delta.days < 7: returner = dt.strftime(DT_FORMAT_THISWEEK) elif delta.days >= 7 and delta.days < 365: returner = dt.strftime(DT_FORMAT_THISYEAR) else: returner = dt.strftime(DT_FORMAT_ALL) return S(returner).unicode() def in_rich_compare(item, list): """ Tests whether the item is in the given list. This is mainly to work around the rich-compare bug in pysvn. This is not identical to the "in" operator when used for substring testing. """ in_list = False if list is not None: for thing in list: try: in_list = item == thing except AttributeError as e: pass return in_list # FIXME: this function is duplicated in settings.py def get_home_folder(): """ Returns the location of the hidden folder we use in the home dir. This is used for storing things like previous commit messages and peviously used repositories. @rtype: string @return: The location of our main user storage folder. """ # Make sure we adher to the freedesktop.org XDG Base Directory # Specifications. $XDG_CONFIG_HOME if set, by default ~/.config xdg_config_home = os.environ.get( "XDG_CONFIG_HOME", os.path.join(os.path.expanduser("~"), ".config") ) config_home = os.path.join(xdg_config_home, "rabbitvcs") # Make sure the directories are there if not os.path.isdir(config_home): # FIXME: what if somebody places a file in there? os.makedirs(config_home, 0o700) return config_home def get_user_path(): """ Returns the location of the user's home directory. /home/$USER @rtype: string @return: The location of the user's home directory. """ return os.path.abspath(os.path.expanduser("~")) def get_repository_paths_path(): """ Returns a valid URI for the repository paths file @rtype: string @return: The location of the repository paths file. """ return os.path.join(get_home_folder(), "repos_paths") def get_repository_paths(): """ Gets all previous repository paths stored in the user's home folder @rtype: list @return: A list of previously used repository paths. """ returner = [] paths_file = get_repository_paths_path() if os.path.exists(paths_file): returner = [x.strip() for x in open(paths_file, "r").readlines()] return returner def get_previous_messages_path(): """ Returns a valid URI for the previous messages file @rtype: string @return: The location of the previous messages file. """ return os.path.join(get_home_folder(), "previous_log_messages") def get_previous_messages(): """ Gets all previous messages stored in the user's home folder @rtype: list @return: A list of previous used messages. """ path = get_previous_messages_path() if not os.path.exists(path): return lines = open(path, "r").readlines() cur_entry = "" returner = [] date = None msg = "" regex = re.compile(r"-- ([\d\-]+ [\d\:]+) --") for line in lines: m = regex.match(line) if m: cur_entry = m.groups()[0] if date: returner.append((date, msg.rstrip())) msg = "" date = cur_entry else: msg += line if date and msg: returner.append((date, msg.rstrip())) returner.reverse() return returner def get_exclude_paths_path(): return os.path.join(get_home_folder(), "exclude_paths") def get_exclude_paths(): path = get_exclude_paths_path() if not os.path.exists(path): return [] f = open(path, "r") paths = [] for l in f: paths.append(l.strip()) f.close() return paths def encode_revisions(revision_array): """ Takes a list of integer revision numbers and converts to a TortoiseSVN-like format. This means we have to determine what numbers are consecutives and collapse them into a single element (see doctest below for an example). @type revision_array: list of integers @param revision_array: A list of revision numbers. @rtype: string @return A string of revision numbers in TortoiseSVN-like format. >>> encode_revisions([4,5,7,9,10,11,12]) '4-5,7,9-12' >>> encode_revisions([]) '' >>> encode_revisions([1]) '1' """ # Let's get a couple of cases out of the way if len(revision_array) == 0: return "" if len(revision_array) == 1: return str(revision_array[0]) # Instead of repeating a set of statements we'll just define them as an # inner function. def append(start, last, list): if start == last: result = "%s" % start else: result = "%s-%s" % (start, last) list.append(result) # We need a couple of variables outside of the loop start = revision_array[0] last = revision_array[0] current_position = 0 returner = [] while True: if current_position + 1 >= len(revision_array): append(start, last, returner) break; current = revision_array[current_position] next = revision_array[current_position + 1] if not current + 1 == next: append(start, last, returner) start = next last = next last = next current_position += 1 return ",".join(returner) def decode_revisions(string, head): """ Takes a TortoiseSVN-like revision string and returns a list of integers. EX. 4-5,7,9-12 -> [4,5,7,9,10,11,12] TODO: This function is a first draft. It may not be production-worthy. """ returner = [] arr = string.split(",") for el in arr: if el.find("-") != -1: subarr = el.split("-") if subarr[1] == 'HEAD': subarr[1] = head for subel in range(int(subarr[0]), int(subarr[1])+1): returner.append(subel) else: returner.append(int(el)) return returner def get_diff_tool(): """ Gets the path to the diff_tool, and whether or not to swap lhs/rhs. @rtype: dictionary @return: A dictionary with the diff tool path and swap boolean value. """ sm = rabbitvcs.util.settings.SettingsManager() diff_tool = sm.get("external", "diff_tool") diff_tool_swap = sm.get("external", "diff_tool_swap") return { "path": diff_tool, "swap": diff_tool_swap } def get_merge_tool(): """ Gets the path to the merge_tool. @rtype: string @return: A string with the path and arguments to launch the merge tool. """ sm = rabbitvcs.util.settings.SettingsManager() return sm.get("external", "merge_tool") def launch_diff_tool(path1, path2=None): """ Launches the diff tool of choice. 1. Generate a standard diff between the path and the latest revision. 2. Write the diff text to a tmp file 3. Copy the given file (path) to the tmp directory 4. Do a reverse patch to get a version of the file that is in the repo. 5. Now you have two files and you can send them to the diff tool. @type paths: list @param paths: Paths to the given files """ diff = get_diff_tool() if diff["path"] == "": return if not os.path.exists(diff["path"]): return # If path2 is set, that means we are comparing one file/folder to another if path2 is not None: (lhs, rhs) = (path1, path2) else: patch = os.popen("svn diff --diff-cmd 'diff' '%s'" % path1).read() tmp_file = get_tmp_path("tmp.patch") open(tmp_file, "w").write(patch) tmp_path = get_tmp_path(os.path.split(path1)[-1]) if os.path.isfile(path1): shutil.copy(path1, tmp_path) elif os.path.isdir(path1): shutil.copytree(path1, tmp_path) else: return os.popen( "patch --reverse '%s' < %s" % (tmp_path, tmp_file) ) (lhs, rhs) = (tmp_path, path1) if diff["swap"]: (lhs, rhs) = (rhs, lhs) os.spawnl( os.P_NOWAIT, diff["path"], diff["path"], lhs, rhs ) def launch_merge_tool(base="", mine="", theirs="", merged=""): merge_tool = get_merge_tool() if(mine == None or mine == "" or not os.path.exists(mine) or theirs == None or theirs == "" or not os.path.exists(theirs)): return if "%base" in merge_tool: merge_tool = merge_tool.replace("%base", base) if "%mine" in merge_tool: merge_tool = merge_tool.replace("%mine", mine) if "%theirs" in merge_tool: merge_tool = merge_tool.replace("%theirs", theirs) if "%merged" in merge_tool: merge_tool = merge_tool.replace("%merged", merged) log.debug("merge_tool: %s"%merge_tool) os.popen(merge_tool) def get_file_extension(path): """ Wrapper that retrieves a file path's extension. @type path: string @param path: A filename or path. @rtype: string @return: A file extension. """ return os.path.splitext(path)[1] def open_item(path): """ Use GNOME default opener to handle file opening. @type path: string @param path: A file path. """ if path == "" or path is None: return openers = [] import platform if platform.system() == 'Darwin': openers.append("open") subprocess.Popen(["open", os.path.abspath(path)]) else: openers.append("gio") openers.append("gvfs-open") openers.append("xdg-open") for o in openers: for p in set(os.environ['PATH'].split(':')): if os.path.exists("%s/%s" % (p, o)): command = [o] if o == "gio": command.append("open") command.append(os.path.abspath(path)) subprocess.Popen(command) return def browse_to_item(path): """ Browse to the specified path in the file manager @type path: string @param path: A file path. """ import platform if platform.system() == 'Darwin': subprocess.Popen([ "open", "--reveal", os.path.dirname(os.path.abspath(path)) ]) else: subprocess.Popen([ "nautilus", "--no-desktop", "--browser", os.path.dirname(os.path.abspath(path)) ]) def delete_item(path): """ Send an item to the trash. @type path: string @param path: A file path. """ abspath = os.path.abspath(path) permanent_delete = False try: import platform if platform.system() == 'Darwin': retcode = subprocess.call(["mv", abspath, os.getenv("HOME") + "/.Trash"]) if retcode: permanent_delete = True else: # If the gvfs-trash program is not found, an OSError exception will # be thrown, and rm will be used instead retcode = subprocess.call(["gio trash", abspath]) if retcode: permanent_delete = True except OSError: permanent_delete = True if permanent_delete: if os.path.isdir(abspath): shutil.rmtree(abspath, True) else: os.remove(abspath) def save_log_message(message): """ Saves a log message to the user's home folder for later usage @type message: string @param message: A log message. """ messages = [] path = get_previous_messages_path() if os.path.exists(path): limit = get_log_messages_limit() messages = get_previous_messages() # If the current message already exists, delete the old one # The new one will take it's place at the top tmp = [] for i, m in enumerate(messages): if message != m[1]: tmp.append(m) messages = tmp # Don't allow the number of messages to pile up past the limit while len(messages) > limit: messages.pop() t = time.strftime(LOG_DATETIME_FORMAT) messages.insert(0, (t, message)) f = open(get_previous_messages_path(), "w") s = "" for m in messages: s = """\ -- %s -- %s %s """%(m[0], m[1], s) f.write(s) f.close() def save_repository_path(path): """ Saves a repository path to the user's home folder for later usage If the given path has already been saved, remove the old one from the list and append the new one to the end. @type path: string @param path: A repository path. """ paths = get_repository_paths() if path in paths: paths.pop(paths.index(path)) paths.insert(0, path) limit = get_repository_paths_limit() while len(paths) > limit: paths.pop() f = open(get_repository_paths_path(), "w") f.write(S("\n".join(paths))) f.close() def launch_ui_window(filename, args=[], block=False): """ Launches a UI window in a new process, so that we don't have to worry about nautilus and threading. @type filename: string @param filename: The filename of the window, without the extension @type args: list @param args: A list of arguments to be passed to the window. @rtype: integer @return: The pid of the process (if launched) """ # Hackish. Get's the helper module's path, then assumes it is in # the lib folder. Removes the /lib part of the path. basedir, head = os.path.split( os.path.dirname( os.path.realpath(__file__))) if not head == "util": log.warning("Helper module (%s) not in \"util\" dir" % __file__) # Puts the whole path together. # path = "%s/ui/%s.py" % (basedir, filename) path = os.path.join(basedir, "ui", filename + ".py") if os.path.exists(path): executable = sys.executable if "PYTHON" in list(os.environ.keys()): executable = os.environ["PYTHON"] # Give all subprocesses the name 'RabbitVCS' to give Ubuntu desktop files the possibility # to group those windows in the launcher on WM_CLASS. proc = subprocess.Popen([executable, path] + ['--name', 'RabbitVCS'] + args) if block: proc.wait() return proc else: return None def get_log_messages_limit(): sm = rabbitvcs.util.settings.SettingsManager() return int(sm.get("cache", "number_messages")) def get_repository_paths_limit(): sm = rabbitvcs.util.settings.SettingsManager() return int(sm.get("cache", "number_repositories")) def get_common_directory(paths): common = os.path.commonprefix(abspaths(paths)) while not os.path.exists(common) or os.path.isfile(common): common = os.path.split(common)[0] if common == "": break return common def abspaths(paths): index = 0 for path in paths: paths[index] = os.path.realpath(os.path.abspath(path)) index += 1 return paths def pretty_timedelta(time1, time2, resolution=None): """ Calculate time delta between two C{datetime} objects. (the result is somewhat imprecise, only use for prettyprinting). Was originally based on the function pretty_timedelta from: http://trac.edgewall.org/browser/trunk/trac/util/datefmt.py """ if time1 > time2: time2, time1 = time1, time2 diff = time2 - time1 age_s = int(diff.days * 86400 + diff.seconds) if resolution and age_s < resolution: return "" # I do not see a way to make this less repetitive - to make the # strings fully translatable (i.e. also for languages that have more # or less than two plural forms) we have to state all the strings # explicitely within an ngettext call if age_s <= 60 * 1.9: return ngettext("%i second", "%i seconds",age_s) % age_s elif age_s <= 3600 * 1.9: r = age_s / 60 return ngettext("%i minute", "%i minutes",r) % r elif age_s <= 3600 * 24 * 1.9: r = age_s / 3600 return ngettext("%i hour", "%i hours",r) % r elif age_s <= 3600 * 24 * 7 * 1.9: r = age_s / (3600 * 24) return ngettext("%i day", "%i days",r) % r elif age_s <= 3600 * 24 * 30 * 1.9: r = age_s / (3600 * 24 * 7) return ngettext("%i week", "%i weeks",r) % r elif age_s <= 3600 * 24 * 365 * 1.9: r = age_s / (3600 * 24 * 30) return ngettext("%i month", "%i months",r) % r else: r = age_s / (3600 * 24 * 365) return ngettext("%i year", "%i years",r) % r def utc_offset(timestamp=None): """ Compute the UTC offset of current locale for a timestamp in a portable way, taking care of daylight saving. Positive is east of Greenwich. Result in seconds. If no timestamp is given, the current time is used. """ if timestamp is None: timestamp = time.time() timestamp = int(timestamp) utc = datetime.datetime.utcfromtimestamp(timestamp) local = datetime.datetime.fromtimestamp(timestamp) return int((local - utc).total_seconds()) def _commonpath(l1, l2, common=[]): """ Helper method for the get_relative_path method """ if len(l1) < 1: return (common, l1, l2) if len(l2) < 1: return (common, l1, l2) if l1[0] != l2[0]: return (common, l1, l2) return _commonpath(l1[1:], l2[1:], common+[l1[0]]) def get_relative_path(from_path, to_path): """ Method that returns the relative path between the specified paths """ nice_path1 = from_path.rstrip(os.path.sep).split(os.path.sep) nice_path2 = to_path.rstrip(os.path.sep).split(os.path.sep) (common,l1,l2) = _commonpath(nice_path1, nice_path2) p = [] if len(l1) > 0: p = ['..'] * len(l1) p = p + l2 return os.sep.join(p) def launch_repo_browser(uri): sm = rabbitvcs.util.settings.SettingsManager() repo_browser = sm.get("external", "repo_browser") if repo_browser is not None: subprocess.Popen([ repo_browser, uri ]) def launch_url_in_webbrowser(url): import webbrowser webbrowser.open(url) def parse_path_revision_string(pathrev): index = pathrev.rfind("@") if index == -1: return (pathrev,None) else: return (pathrev[0:index], pathrev[index+1:]) def create_path_revision_string(path, revision=None): if revision: return path + "@" + str(revision) else: return path def url_join(path, *args): return "/".join([path.rstrip("/")] + list(args)) def _quote(text): return six.moves.urllib.parse.quote(text, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE) def _quote_plus(text): return six.moves.urllib.parse.quote_plus(text, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE) def _unquote(text): return six.moves.urllib.parse.unquote(text, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE) def _unquote_plus(text): return six.moves.urllib.parse.unquote_plus(text, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE) quote = _quote quote_plus = _quote_plus unquote = _unquote unquote_plus = _unquote_plus try: unquote("") except TypeError: quote = six.moves.urllib.parse.quote quote_plus = six.moves.urllib.parse.quote_plus unquote = six.moves.urllib.parse.unquote unquote_plus = six.moves.urllib.parse.unquote_plus def quote_url(url_text): (scheme, netloc, path, params, query, fragment) = six.moves.urllib.parse.urlparse(url_text) # netloc_quoted = quote(netloc) path_quoted = quote(path) params_quoted = quote(query) query_quoted = quote_plus(query) fragment_quoted = quote(fragment) url_quoted = six.moves.urllib.parse.urlunparse((scheme, netloc, path_quoted, params_quoted, query_quoted, fragment_quoted)) return url_quoted def unquote_url(url_text): (scheme, netloc, path, params, query, fragment) = six.moves.urllib.parse.urlparse(url_text) # netloc_unquoted = unquote(netloc) path_unquoted = unquote(path) params_unquoted = unquote(query) query_unquoted = unquote_plus(query) fragment_unquoted = unquote(fragment) url_unquoted = six.moves.urllib.parse.urlunparse((scheme, netloc, path_unquoted, params_unquoted, query_unquoted, fragment_unquoted)) return url_unquoted def pretty_filesize(bytes): if bytes >= 1073741824: return str(int(bytes / 1073741824)) + ' GB' elif bytes >= 1048576: return str(int(bytes / 1048576)) + ' MB' elif bytes >= 1024: return str(int(bytes / 1024)) + ' KB' elif bytes < 1024: return str(bytes) + ' bytes' def get_node_kind(path): if os.path.exists(path): if os.path.isfile(path): return "file" else: return "dir" return "none" def walk_tree_depth_first(tree, show_levels=False, preprocess=None, filter=None, start=None): """ A non-recursive generator function that walks through a tree (and all children) yielding results. The tree should be of the form: [(NodeOne, None), (NodeTwo, [(Node2A, None), (Node2B, None), (Node2C, [(Node2C1, None), etc] ] (NodeThree, None), etc...] If show_levels is True, the values returned are (level, value) where level is zero for the top level items in the tree. Otherwise, just "value" is returned. If a callable "preprocess" is supplied, it is applied BEFORE the filter, as each element is encountered. If a callable "filter" is supplied, it is applied to whatever "preprocess" returned, and if it returns False for an item, the item and its children will be skipped. If "start" is given, the walk will be applied only to that node and its children. No preprocessing or filtering will be applied to other elements. """ annotated_tree = [(0, element) for element in tree] to_process = deque(annotated_tree) # If we're not given a starting point, the top is the start found_starting_point = not start while to_process: (level, (node, children)) = to_process.popleft() if not found_starting_point and (node == start): # If we're given a starting point and we've found it, clear the list # and start from here found_starting_point = True level = 0 to_process.clear() # This should NOT be an else case, since we may have just set this flag # to "True" above. if found_starting_point: if preprocess: value = preprocess(node) else: value = node if filter and not filter(value): continue if show_levels: yield (level, value) else: yield value if children: annotated_children = [(level+1, child) for child in children] annotated_children.reverse() to_process.extendleft(annotated_children) def urlize(path): if path.startswith("/"): return "file://%s" % path return path def parse_patch_output(patch_file, base_dir, strip=0): """ Runs the GNU 'patch' utility, parsing the output. This is actually a generator which yields values as each section of the patch is applied. @param patch_file: the location of the patch file @type patch_file: string @param base_dir: the directory in which to apply the patch @type base_dir: string @return: a generator yielding tuples (filename, success, reject_file). "filename" is never None, and should always exist. "success" is True iff the patch executed without any error messages. "reject_file" may be None, but if it exists is the location of rejected "hunks". It's like a bad reality TV dating show. """ PATCHING_RE = re.compile(r"patching file (.*)") REJECT_RE = re.compile(r".*saving rejects to file (.*)") # PATCH flags... # -N: always assume forward diff # -t: batch mode: # skip patches whose headers do not contain file # names (the same as -f); skip patches for which # the file has the wrong version for the Prereq: # line in the patch; and assume that patches are # reversed if they look like they are. env = os.environ.copy().update({"LC_ALL" : "C"}) p = "-p%s" % strip patch_proc = subprocess.Popen(["patch", "-N", "-t", p, "-i", str(patch_file), "--directory", base_dir], stdout = subprocess.PIPE, stderr = subprocess.STDOUT, env = env) # Intialise things... out = codecs.getreader(UTF8_ENCODING)(patch_proc.stdout, SURROGATE_ESCAPE) line = out.readline() patch_match = PATCHING_RE.match(line) current_file = None if patch_match: current_file = patch_match.group(1) elif line: # and not patch_match # There was output, but unexpected. Almost certainly an error of some # sort. patch_proc.wait() output = line + out.read() raise rabbitvcs.vcs.ExternalUtilError("patch", output) # Note the excluded case: empty line. This falls through, skips the loop # and returns. any_errors = False reject_file = None while current_file: line = out.readline().rstrip(" \t\r\n") while not line and patch_proc.poll() is None: line = out.readline().rstrip(" \t\r\n") # Does patch tell us we're starting a new file? patch_match = PATCHING_RE.match(line) # Starting a new file => that's it for the last one, so return the value # No line => End of patch output => ditto if patch_match or not line: yield (current_file, not any_errors, reject_file) if not line: # That's it from patch, so end the generator break # Starting a new file... current_file = patch_match.group(1) any_errors = False reject_file = None else: # Doesn't matter why we're here, anything else means ERROR any_errors = True reject_match = REJECT_RE.match(line) if reject_match: # Have current file, getting reject file info reject_file = reject_match.group(1) # else: we have an unknown error patch_proc.wait() # Don't leave process running... return def HSLtoRGB(h, s, l): """ Convert a color from the HSL space to RGB. @type h: (int, float) @param h: Hue in degrees. @type s: float @param s: Saturation in range 0.0 to 1.0 @type l: float @param l: Luminance in range 0.0 to 1.0 """ if not 0.0 <= s <= 1.0: raise ValueError("Saturation should be >= 0.0 and <= 1.0") if not 0.0 <= l <= 1.0: raise ValueError("Luminance should be >= 0.0 and <= 1.0") if s == 0.0: return (0, 0, 0) sextant = h % 360.0 / 60.0 c = (1.0 - abs(2.0 * l - 1.0)) * s x = (1.0 - abs(sextant % 2.0 - 1.0)) * c m = l - c / 2.0 i = int(sextant) r = [c, x, 0.0, 0.0, x, c][i] g = [x, c, c, x, 0.0, 0.0][i] b = [0.0, 0.0, x, c, c, x][i] return (int((v + m) * 255.0) for v in (r, g, b)) def html_color(r, g, b, a=None): fmt = "%02X" alpha = a or 0 if r < 0x10 and g < 0x10 and b < 0x10 and alpha < 0x10: fmt = "%01X" color = (fmt * 3) % (r, g, b) if not a is None: color += fmt % a return "#" + color """ In Python 3, Gdk.init_check() encodes sys.argv without handling surrogates, causing an UnicodeEncodeError exception while importing Gdk. The following class implements a mechanism to avoid that: - The first Gdk import performed by a program should be preceded by a SanitizeArgv object creation. - After Gdk import, call this object's method restore(). For this reason, the current module MAY NOT import Gdk, directly or indirectly. """ class SanitizeArgv(object): def __init__(self): self.argmap = None if len(sys.argv) and isinstance(sys.argv[0], six.text_type): argmap = [] newargv = [] for arg in sys.argv: newarg = S(arg).display() newargv.append(newarg) argmap.append((newarg, arg)) if arg != newarg: self.argmap = argmap if self.argmap: sys.argv = newargv def restore(self): if self.argmap: newargv = [] i = 0 for arg in sys.argv: while arg != self.argmap[i][0]: i += 1 newargv.append(self.argmap[i][1]) i += 1 sys.argv = newargv rabbitvcs-0.18/rabbitvcs/util/highlighter.py000066400000000000000000000123361362112712700212340ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Syntax highlighter based on the pygments module. """ import six from rabbitvcs.util.strings import S from rabbitvcs.util.helper import html_escape from rabbitvcs.util.settings import SettingsManager from rabbitvcs.util.log import Log logger = Log("rabbitvcs.util.highlighter") HAS_PYGMENTS = True try: import pygments import pygments.formatters import pygments.formatter import pygments.lexers import pygments.util except: HAS_PYGMENTS = False def mklist(arg): if not isinstance(arg, list): arg = [arg] return arg def no_highlight(lines): return [html_escape(S(l), True) for l in mklist(lines)] if not HAS_PYGMENTS: def highlight(filename, sourcelines): return no_highlight(sourcelines) else: # Pygments custom formatter generating Pango makup language. class PangoMarkupFormatter(pygments.formatter.Formatter): def __init__(self, bylines=False, **options): pygments.formatter.Formatter.__init__(self, **options) self.bylines = bylines self.styles = {} for token, style in self.style: start = end = "" if style["color"]: start += ' foreground="#%s"' % style["color"] if style["bgcolor"]: start += ' background="#%s"' % style["bgcolor"] if style["bold"]: start += ' weight="bold"' if style["italic"]: start += ' style="italic"' if style["underline"]: start += ' underline="single"' if style["sans"]: start += ' face="sans"' if style["roman"]: start += ' face="serif"' elif style["mono"]: start += ' face="monospace"' if start == ' weight="bold"': start, end = "", "" elif start == ' style="italic"': start, end = "", "" elif start == ' underline="single"': start, end = "", "" elif start == ' face="monospace"': start, end = "", "" elif start: start = "" % start end = "" self.styles[token] = (start, end) def format(self, tokensource, outfile): self.lastval = "" self.lasttype = None def flush(self): if self.lastval: stylebegin, styleend = self.styles[self.lasttype] outfile.write(stylebegin + self.lastval + styleend) self.lastval = "" def format_single(self, ttype, value): value = html_escape(value, True) if ttype != self.lasttype: flush(self) self.lasttype = ttype self.lastval += value for ttype, value in tokensource: lines = [value] if self.bylines: lines = value.splitlines() if S(value[-1:]) in ["\r", "\n"]: lines.append(value[0:0]) while not ttype in self.styles: ttype = ttype.parent if lines: format_single(self, ttype, lines[0]) for line in lines[1:]: flush(self) outfile.write(six.u("\n")) format_single(self, ttype, line) flush(self) def highlight(filename, sourcelines): if not SettingsManager().get("general", "enable_highlighting"): return no_highlight(sourcelines) sourcelines = mklist(sourcelines) source = "\n".join(sourcelines) try: lexer = pygments.lexers.guess_lexer_for_filename(filename, source) except pygments.util.ClassNotFound: return no_highlight(sourcelines) formatter = PangoMarkupFormatter(bylines=True) lines = pygments.highlight(source, lexer, formatter).splitlines() # Trailing empty lines may have been lost. n = len(sourcelines) - len(lines) if n > 0: lines += [""] * n return lines rabbitvcs-0.18/rabbitvcs/util/log.py000066400000000000000000000221271362112712700175160ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Provides a simple wrapper around the python logger. Right now there is the base Log class, and three specialized classes that inherit from the Log class: ConsoleLog, FileLog, and DualLog. ConsoleLog logs messages to the standard output (command line), FileLog outputs to a log file, and DualLog outputs to both. The programmer does not need to think about the logger types because this will be specified in the user's settings. So to set up your module to log do the following: Usage: from rabbitvcs.util.log import Log log = Log("my.module") log.debug("a debug message") """ from __future__ import absolute_import import os from os.path import expanduser import logging import logging.handlers from rabbitvcs.util.settings import SettingsManager, get_home_folder from rabbitvcs.util.strings import * LEVELS = { "debug": logging.DEBUG, "info": logging.INFO, "warning": logging.WARNING, "error": logging.ERROR, "critical": logging.CRITICAL } settings = SettingsManager() DEFAULT_LEVEL = settings.get("logging", "level").lower() DEFAULT_LOG_TYPE = settings.get("logging", "type") # The following merely sets the log type/level if it hasn't already been set changed = False if DEFAULT_LEVEL not in LEVELS: DEFAULT_LEVEL = "debug" settings.set("logging", "level", DEFAULT_LEVEL.title()) changed = True if not DEFAULT_LOG_TYPE: DEFAULT_LOG_TYPE = "Console" settings.set("logging", "type", DEFAULT_LOG_TYPE) changed = True if changed: settings.write() LOG_PATH = os.path.join(get_home_folder(), "RabbitVCS.log") if not os.path.exists(LOG_PATH): open(LOG_PATH, "a").close() DEFAULT_FORMAT = "%(message)s" FILE_FORMAT = "%(asctime)s %(levelname)s\t%(name)s\t%(message)s" CONSOLE_FORMAT = "%(levelname)s\t%(name)s\t%(message)s" class BaseLog(object): """ Provides a wrapper around the logging module to simplify some logging tasks. This base class should generally not be called. """ def __init__(self, logger="", level=DEFAULT_LEVEL): self.logger = logging.getLogger(logger) self.level = level self.logger.setLevel(LEVELS[level]) self.handler = None def set_level(self, level=DEFAULT_LEVEL): """ Set the mimimum level to be logged. @type level: string @param level: The minimum level to log. (debug, info, warning, error, critical) """ self.level = level self.logger.setLevel(LEVELS[level]) def debug(self, msg=""): """ Pass a debug level log message (Numeric value: 10) @type msg: string @param msg: The message to pass """ self.logger.debug(msg) def info(self, msg=""): """ Pass an info level log message (Numeric value: 20) @type msg: string @param msg: The message to pass """ self.logger.info(msg) def warning(self, msg=""): """ Pass a warning level log message (Numeric value: 30) @type msg: string @param msg: The message to pass """ self.logger.warning(msg) def error(self, msg=""): """ Pass an error level log message (Numeric value: 40) @type msg: string @param msg: The message to pass """ self.logger.error(msg) def critical(self, msg=""): """ Pass a critical level log message (Numeric value: 50) @type msg: string @param msg: The message to pass """ self.logger.critical(msg) def exception(self, msg=""): """ Pass a exception level log message (Numeric value: 50) @type msg: string @param msg: The message to pass """ self.logger.exception(msg) def exception_info(self, msg, exc_info): """ Pass an exception info tuple (as per sys.exc_info() format, (type, value, traceback). @type exc_info: (type, value, traceback) @param exc_info: exception info """ self.logger.debug(msg, exc_info=exc_info) def set_handler(self, handler, format=DEFAULT_FORMAT): """ Set how the logging module should handle log messages. @type handler: logging.Handler @param handler: The class that handles log messages @type format: string @param format: The formatting to be used when displaying messages """ self.handler = handler self.handler.setLevel(LEVELS[self.level]) self.handler.setFormatter(logging.Formatter(format)) self.logger.addHandler(self.handler) class ConsoleLog(BaseLog): """ Inherits from BaseLog and provides a simple interface to log calls to the command line/standard output. Usage: clog = ConsoleLog("rabbitvcs.ui.commit") clog.debug("This function needs refactoring") clog.error("You just screwed the pooch!") """ def __init__(self, logger="", level=DEFAULT_LEVEL): """ @type logger: string @param logger: A keyword describing the source of the log messages @type level: string @param level: The minimum level to log. (debug, info, warning, error, critical) """ BaseLog.__init__(self, logger, level) self.set_handler(logging.StreamHandler(), CONSOLE_FORMAT) class FileLog(BaseLog): """ Inherits from BaseLog and provides a simple interface to log calls to file which is automatically rotated every day and keeps seven days worth of data. Usage: flog = FileLog("rabbitvcs.ui.commit") flog.debug("This function needs refactoring") flog.error("You just screwed the pooch!") """ def __init__(self, logger="", level=DEFAULT_LEVEL): """ @type logger: string @param logger: A keyword describing the source of the log messages @type level: string @param level: The minimum level to log. (debug, info, warning, error, critical) """ BaseLog.__init__(self, logger, level) self.set_handler( logging.handlers.TimedRotatingFileHandler(LOG_PATH, "D", 1, 7, UTF8_ENCODING), FILE_FORMAT ) class DualLog(BaseLog): """ Inherits from BaseLog and provides a simple interface to log calls to both the command line/standard output and a file which is automatically rotated every day. Usage: dlog = DualLog("rabbitvcs.ui.commit") dlog.debug("This function needs refactoring") dlog.error("You just screwed the pooch!") """ def __init__(self, logger="", level=DEFAULT_LEVEL): """ @type logger: string @param logger: A keyword describing the source of the log messages @type level: string @param level: The minimum level to log. (debug, info, warning, error, critical) """ BaseLog.__init__(self, logger, level) self.set_handler( logging.handlers.TimedRotatingFileHandler(LOG_PATH, "D", 1, 7, UTF8_ENCODING), FILE_FORMAT ) self.set_handler(logging.StreamHandler(), CONSOLE_FORMAT) class NullHandler(logging.Handler): """ Handles log messages and doesn't do anything with them """ def emit(self, record): pass class NullLog(BaseLog): """ If the user does not want to generate a log file, use the NullLog. It calls the NullHandler class as its handler. """ def __init__(self, *args, **kwargs): BaseLog.__init__(self, *args, **kwargs) self.set_handler(NullHandler()) Log = NullLog if DEFAULT_LOG_TYPE == "File": Log = FileLog elif DEFAULT_LOG_TYPE == "Console": Log = ConsoleLog elif DEFAULT_LOG_TYPE == "Both": Log = DualLog def reload_log_settings(): """ Refreshes the settings manager and returns a new log instance """ settings = SettingsManager() DEFAULT_LEVEL = settings.get("logging", "level").lower() DEFAULT_LOG_TYPE = settings.get("logging", "type") Log = NullLog if DEFAULT_LOG_TYPE == "File": Log = FileLog elif DEFAULT_LOG_TYPE == "Console": Log = ConsoleLog elif DEFAULT_LOG_TYPE == "Both": Log = DualLog return Log rabbitvcs-0.18/rabbitvcs/util/settings.py000066400000000000000000000224231362112712700205740ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Everything related retrieving and storing configuration keys. """ from __future__ import absolute_import from __future__ import print_function import os from os.path import dirname import shutil import configobj import validate import re from rabbitvcs import package_prefix MULTILINE_ESCAPE_RE = re.compile(r'''([\\'"])''') MULTILINE_UNESCAPE_RE = re.compile(r"\\(.)") def get_home_folder(): """ Returns the location of the hidden folder we use in the home dir. This is used for storing things like previous commit messages and previously used repositories. FIXME: This is a copy of the helper module's function, because I can't have a circular module reference (helper imports Settings right now). @rtype: string @return: The location of our main user storage folder. """ # Make sure we adher to the freedesktop.org XDG Base Directory # Specifications. $XDG_CONFIG_HOME if set, by default ~/.config xdg_config_home = os.environ.get( "XDG_CONFIG_HOME", os.path.join(os.path.expanduser("~"), ".config") ) config_home = os.path.join(xdg_config_home, "rabbitvcs") # Make sure the directories are there if not os.path.isdir(config_home): # FIXME: what if somebody places a file in there? os.makedirs(config_home, 0o700) return config_home SETTINGS_FILE = "%s/settings.conf" % get_home_folder() def find_configspec(): # Search the following paths for a configspec file configspec_paths = [ os.path.join(dirname(__file__), "configspec/configspec.ini"), os.path.join(package_prefix(), "share/rabbitvcs/configspec.ini"), "/usr/share/rabbitvcs/configspec.ini", "/usr/local/share/rabbitvcs/configspec.ini" ] for path in configspec_paths: if os.path.exists(path): return path raise IOError("Cannot find a configspec.ini file") SETTINGS_SPEC = find_configspec() class SettingsManager(object): """ This class provides an shallow interface for the rest of the program to use to interact with our configuration file. Usage:: Get settings: sm = SettingsManager() diff_tool = sm.get("external", "diff_tool") Set settings: sm = SettingsManager() sm.set("external", "diff_tool", "/usr/bin/meld") sm.write() """ def __init__(self): self.settings = configobj.ConfigObj( infile=SETTINGS_FILE, create_empty=True, indent_type=" ", configspec=SETTINGS_SPEC ) self.validator = validate.Validator() valid = self.settings.validate(self.validator) # We cannot use "if not valid" here, since validate() returns a dict # if validation fails! # See: # http://www.voidspace.org.uk/python/articles/configobj.shtml#validation if valid is not True: # What to do here? # We could only get to this point if: # 1. The user config file existed # 2. It was invalid # One option is to copy it to a different file and recreate it... log.warning("User configuration not valid. Backing up and recreating.") self.backup_and_rewrite_config() def get(self, section=None, keyword=None): """ Get the settings for a section and/or keyword If no arguments are given, it just returns all settings @type section: string @param section: A settings section. @type keyword: string @param keyword: A particular setting in a section. @rtype: dictionary or string @return: Either a dictionary or string with setting(s). """ if section is None: return self.settings if keyword is None: return self.settings[section] returner = "" try: returner = self.settings[section][keyword] except KeyError: print("Error: section %s:%s doesn't exist" % (section, keyword)) return returner def set(self, section, keyword, value=""): """ Set settings for a particular section and keyword @type section: string @param section: A settings section. @type keyword: string @param keyword: A particular setting in a section. @type value: string or dictionary @param value: Setting value. """ if section not in self.settings: self.settings[section] = {} self.settings[section][keyword] = value # Multilines are escaped to allow them containing ''' def get_multiline(self, section=None, keyword=None): return MULTILINE_UNESCAPE_RE.sub(r"\1", self.get(section, keyword)) def set_multiline(self, section, keyword, value=""): self.set(section, keyword, MULTILINE_ESCAPE_RE.sub(r"\\\1", value)) def set_comments(self, section, comments=[]): """ Set multi-line comments for a section @type section: string @param section: A settings section. @type comments: list @param comments: A list of strings. """ self.settings.comments[section] = comments def set_inline_comments(self, section, comments=""): """ Set inline comments for a section @type section: string @param section: A settings section. @type comments: string @param comments: A single line comment. """ self.settings.inline_comments[section] = comments def write(self): """ Write the settings and comments to the settings file """ self.settings.write() def clear(self): """ Clear the settings object so that all sections/keywords are gone This function does not write-to-file. Only clears from memory. """ self.settings = configobj.ConfigObj(indent_type=" ") self.settings.filename = SETTINGS_FILE # Maybe we should use self.settings.reset()? def use_default_settings(self): """ Specify a set of default settings and write to file. Called when there is no settings.conf present. """ self.settings = configobj.ConfigObj( DEFAULT_SETTINGS, indent_type=" " ) self.settings.filename = SETTINGS_FILE def get_default(self, section, keyword): """ Get the default settings for a section and/or keyword If no arguments are given, it just returns all settings @type section: string @param section: A settings section. @type keyword: string @param keyword: A particular setting in a section. @rtype: dictionary or string @return: Either a dictionary or string with setting(s). """ if section is None: return DEFAULT_SETTINGS if keyword is None: return DEFAULT_SETTINGS[section] returner = None try: returner = DEFAULT_SETTINGS[section][keyword] except KeyError: print("Error: section %s:%s doesn't exist" % (section, keyword)) return returner def backup_and_rewrite_config(self) : """ Backs up the user configuration file (for debugging) and rewrites a valid config file. The name of the backup file is the name of the settings file plus an incremental count. """ # We need to check that the file doesn't already exist, in case this has # happened before. new_file_free = False renumber = 0 while not new_file_free: new_name = "%s.%02i" % (SETTINGS_FILE, renumber) # FIXME: is this too paranoid? if not os.path.exists(new_name): new_file_free = True created = False try: os.rename(SETTINGS_FILE, new_name) created = True except IOError: # Paranoid again? print("Could not back up user configuration.") if created: self.settings.reset() self.write() else: renumber += 1 if __name__ == "__main__": pass rabbitvcs-0.18/rabbitvcs/util/strings.py000066400000000000000000000173571362112712700204370ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Additional strings support. """ import sys import codecs import re import six import locale __all__ = ["S", "IDENTITY_ENCODING", "UTF8_ENCODING", "SURROGATE_ESCAPE"] unicode_null_string = six.u("") non_alpha_num_re = re.compile("[^A-Za-z0-9]+") SURROGATE_BASE = 0xDC00 RE_SURROGATE = re.compile(six.u("[") + six.unichr(SURROGATE_BASE + 0x80) + six.u("-") + six.unichr(SURROGATE_BASE + 0xFF) + six.u("]")) RE_UTF8 = re.compile("^[Uu][Tt][Ff][ _-]?8$") # Codec that maps ord(byte) == ord(unicode_char). IDENTITY_ENCODING = "latin-1" # An UTF-8 codec that implements surrogates, even in Python 2. UTF8_ENCODING = "rabbitvcs-utf8" def utf8_decode(input, errors="strict"): return codecs.utf_8_decode(input, errors, True) def utf8_encode(input, errors="strict"): output = b'' pos = 0 end = len(input) eh = None while pos < end: n = end m = RE_SURROGATE.search(input, pos) if m: n = m.start() if n > pos: p, m = codecs.utf_8_encode(input[pos:n], errors) output += p pos = n if pos < end: e = UnicodeEncodeError(UTF8_ENCODING, input, pos, pos + 1, "surrogates not allowed") if not eh: eh = codecs.lookup_error(errors) p, n = eh(e) output += p if n <= pos: n = pos + 1 pos = n return (output, len(input)) class Utf8IncrementalEncoder(codecs.IncrementalEncoder): def encode(self, input, final=False): return utf8_encode(input, self.errors)[0] class Utf8IncrementalDecoder(codecs.BufferedIncrementalDecoder): _buffer_decode = codecs.utf_8_decode class Utf8StreamWriter(codecs.StreamWriter): def encode(self, input, errors='strict'): return utf8_encode(input, errors) class Utf8StreamReader(codecs.StreamReader): decode = codecs.utf_8_decode def utf8_search(encoding): encoding = non_alpha_num_re.sub("-", encoding).strip("-").lower() if encoding != UTF8_ENCODING: return None return codecs.CodecInfo( name=UTF8_ENCODING, encode=utf8_encode, decode=utf8_decode, incrementalencoder=Utf8IncrementalEncoder, incrementaldecoder=Utf8IncrementalDecoder, streamwriter=Utf8StreamWriter, streamreader=Utf8StreamReader ) codecs.register(utf8_search) # Emulate surrogateescape codecs error handler because it is not available # Before Python 3.1 SURROGATE_ESCAPE = "rabbitvcs-surrogateescape" def rabbitvcs_surrogate_escape(e): if not isinstance(e, UnicodeError): raise e input = e.object[e.start:e.end] if isinstance(e, UnicodeDecodeError): output = [six.unichr(b) if b < 0x80 else \ six.unichr(SURROGATE_BASE + b) for b in bytearray(input)] return (unicode_null_string.join(output), e.end) if isinstance(e, UnicodeEncodeError): output = b"" for c in input: b = ord(c) - SURROGATE_BASE if not 0x80 <= b <= 0xFF: raise e output += six.int2byte(b) return (output, e.end) raise e codecs.register_error(SURROGATE_ESCAPE, rabbitvcs_surrogate_escape) class S(str): """ Stores a string in native form: unicode with surrogates in Python 3 and utf-8 in Python 2. Provides the following methods: encode: overloaded to use UTF8_ENCODING and SURROGATE_ESCAPE error handler. decode: overloaded to use UTF8_ENCODING and SURROGATE_ESCAPE error handler. bytes: get the string as bytes. unicode: get the string as unicode. display: get the string in native form, without surrogates. """ if str == bytes: # Python 2. def __new__(cls, value, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): if isinstance(value, bytearray): value = bytes(value) if isinstance(value, str): encoding, errors = S._codeargs(encoding, errors) if encoding.lower() != UTF8_ENCODING: value = value.decode(encoding, errors) if isinstance(value, six.text_type): value = value.encode(UTF8_ENCODING, SURROGATE_ESCAPE) elif not isinstance(value, str): value = str(value) return str.__new__(cls, value) def encode(self, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): encoding, errors = self._codeargs(encoding, errors) if encoding.lower() == UTF8_ENCODING: return str(self) value = str.decode(self, UTF8_ENCODING, SURROGATE_ESCAPE) return value.encode(encoding, errors) def decode(self, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): encoding, errors = self._codeargs(encoding, errors) return str.decode(self, encoding, errors) def display(self, encoding=None, errors='replace'): encoding, errors = self._codeargs(encoding, errors) value = str.decode(self, UTF8_ENCODING, errors) return value.encode(encoding, errors) else: # Python 3. def __new__(cls, value, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): if isinstance(value, bytearray): value = bytes(value) if isinstance(value, bytes): encoding, errors = S._codeargs(encoding, errors) value = value.decode(encoding, errors) elif not isinstance(value, str): value = str(value) return str.__new__(cls, value) def encode(self, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): encoding, errors = self._codeargs(encoding, errors) return str.encode(self, encoding, errors) def decode(self, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): return str(self); def display(self, encoding=None, errors='replace'): return RE_SURROGATE.sub(six.unichr(0xFFFD), self) def bytes(self, encoding=UTF8_ENCODING, errors=SURROGATE_ESCAPE): return self.encode(encoding, errors) def unicode(self): return self.decode() def valid(self, encoding=None, errors=SURROGATE_ESCAPE): return self.display(encoding, errors) == self @staticmethod def _codeargs(encoding, errors): if not encoding: encoding = locale.getlocale(locale.LC_MESSAGES)[1] if not encoding: encoding = sys.getdefaultencoding() if RE_UTF8.match(encoding): encoding = UTF8_ENCODING if errors.lower() == 'strict': errors = SURROGATE_ESCAPE return encoding, errors rabbitvcs-0.18/rabbitvcs/vcs/000077500000000000000000000000001362112712700161755ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/__init__.py000066400000000000000000000215451362112712700203150ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log logger = Log("rabbitvcs.vcs") from rabbitvcs.util.helper import get_exclude_paths from rabbitvcs.util.settings import SettingsManager settings = SettingsManager() EXT_UTIL_ERROR = _("The output from '%s' was not able to be processed.\n%s") VCS_SVN = 'svn' VCS_GIT = 'git' VCS_MERCURIAL = 'mercurial' VCS_DUMMY = 'unknown' VCS_FOLDERS = {} if not settings.get("HideItem", "svn"): VCS_FOLDERS[".svn"] = VCS_SVN if not settings.get("HideItem", "git"): VCS_FOLDERS[".git"] = VCS_GIT def _guess(path): # Determine the VCS instance based on the path if path: path_to_check = path.split("@")[0] while path_to_check != "/" and path_to_check != "": for folder, client in list(VCS_FOLDERS.items()): if os.path.isdir(os.path.join(path_to_check, folder)): cache = { "vcs": client, "repo_path": path_to_check } return cache path_to_check = os.path.split(path_to_check)[0] return { "vcs": VCS_DUMMY, "repo_path": path } # Override the standard guessing method to ensure we # can return a dummy object if needed def guess(path): obj = _guess(path) if obj["vcs"] != VCS_DUMMY and settings.get("HideItem", obj["vcs"]): return {"vcs": VCS_DUMMY, "repo_path": path} else: return obj class VCS(object): clients = {} exclude_paths = [] def __init__(self): self.exclude_paths = get_exclude_paths() def dummy(self): if VCS_DUMMY in self.clients: return self.clients[VCS_DUMMY] else: from rabbitvcs.vcs.dummy import Dummy self.clients[VCS_DUMMY] = Dummy() return self.clients[VCS_DUMMY] def svn(self): if settings.get("HideItem", "svn"): return self.dummy() if VCS_SVN in self.clients: return self.clients[VCS_SVN] else: try: from rabbitvcs.vcs.svn import SVN self.clients[VCS_SVN] = SVN() return self.clients[VCS_SVN] except Exception as e: logger.debug("Unable to load SVN module: %s" % e) logger.exception(e) self.clients[VCS_SVN] = self.dummy() return self.clients[VCS_SVN] def git(self, path=None, is_repo_path=False): if settings.get("HideItem", "git"): return self.dummy() if VCS_GIT in self.clients: git = self.clients[VCS_GIT] if git.__class__.__name__ == "Dummy": return self.dummy() if path: if is_repo_path: git.set_repository(path) else: repo_path = git.find_repository_path(path) git.set_repository(repo_path) return git else: try: from rabbitvcs.vcs.git import Git git = Git() if path: if is_repo_path: git.set_repository(path) else: repo_path = git.find_repository_path(path) git.set_repository(repo_path) self.clients[VCS_GIT] = git return self.clients[VCS_GIT] except Exception as e: logger.debug("Unable to load Git module: %s" % e) logger.exception(e) self.clients[VCS_GIT] = self.dummy() return self.clients[VCS_GIT] def mercurial(self, path=None, is_repo_path=False): if settings.get("HideItem", "hg"): return self.dummy() if VCS_MERCURIAL in self.clients: mercurial = self.clients[VCS_MERCURIAL] if path: if is_repo_path: mercurial.set_repository(path) else: repo_path = mercurial.find_repository_path(path) mercurial.set_repository(repo_path) return mercurial else: try: from rabbitvcs.vcs.mercurial import Mercurial mercurial = Mercurial() if path: if is_repo_path: mercurial.set_repository(path) else: repo_path = mercurial.find_repository_path(path) mercurial.set_repository(repo_path) self.clients[VCS_MERCURIAL] = mercurial return self.clients[VCS_MERCURIAL] except Exception as e: logger.debug("Unable to load Mercurial module: %s" % e) logger.exception(e) self.clients[VCS_MERCURIAL] = self.dummy() return self.clients[VCS_MERCURIAL] def client(self, path, vcs=None): if self.should_exclude(path): logger.debug("Excluding path: %s" % path) return self.dummy() # Determine the VCS instance based on the vcs parameter if vcs: if vcs == VCS_SVN: return self.svn() elif vcs == VCS_GIT: return self.git(path) elif vcs == VCS_MERCURIAL: return self.mercurial(path) guess = self.guess(path) if guess["vcs"] == VCS_GIT: return self.git(guess["repo_path"], is_repo_path=False) elif guess["vcs"] == VCS_SVN: return self.svn() elif guess["vcs"] == VCS_MERCURIAL: return self.mercurial(guess["repo_path"], is_repo_path=False) else: return self.dummy() def should_exclude(self, path): for exclude_path in self.exclude_paths: if path.startswith(exclude_path): return True return False def guess(self, path): return guess(path) # Methods that call client methods def statuses(self, path, recurse=True, invalidate=False): client = self.client(path) return client.statuses(path, recurse=recurse, invalidate=invalidate) def status(self, path, summarize=True, invalidate=False): client = self.client(path) return client.status(path, summarize, invalidate) def is_working_copy(self, path): client = self.client(path) return client.is_working_copy(path) def is_in_a_or_a_working_copy(self, path): client = self.client(path) ret = client.is_in_a_or_a_working_copy(path) return ret def is_versioned(self, path): client = self.client(path) return client.is_versioned(path) def is_locked(self, path): client = self.client(path) return client.is_locked(path) def get_items(self, paths, statuses=[]): client = self.client(paths[0]) return client.get_items(paths, statuses) def statuses_for_add(self,paths): client = self.client(paths[0]) return client.STATUSES_FOR_ADD def statuses_for_commit(self, paths): client = self.client(paths[0]) return client.STATUSES_FOR_COMMIT def statuses_for_revert(self, paths): client = self.client(paths[0]) return client.STATUSES_FOR_REVERT def create_vcs_instance(path=None, vcs=None): """ Create a VCS instance based on the working copy path """ return VCS() def guess_vcs(path): vcs = VCS() return vcs.guess(path) class ExternalUtilError(Exception): """ Represents an error caused by unexpected output from an external program. """ def __init__(self, program, output): """ Initialises the error with the external tool and the unexpected output. """ Exception.__init__(self, EXT_UTIL_ERROR % (program, output)) self.program = program self.output = output rabbitvcs-0.18/rabbitvcs/vcs/branch.py000066400000000000000000000026251362112712700200110ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import rabbitvcs.util.helper import rabbitvcs.vcs class BranchEntry(object): def __init__(self, name, tracking=False, revision="", message=""): self.name = name self.tracking = tracking self.revision = revision self.message = message def __str__(self): tracking = self.tracking and " (tracking)" or "" return "" % (self.name, self.revision, tracking) rabbitvcs-0.18/rabbitvcs/vcs/dummy/000077500000000000000000000000001362112712700173305ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/dummy/__init__.py000066400000000000000000000032741362112712700214470ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Concrete VCS dummy implementation. """ from __future__ import absolute_import import rabbitvcs.vcs import rabbitvcs.vcs.status class Dummy(object): def __init__(self): pass def status(self, path, summarize=True, invalidate=False): return rabbitvcs.vcs.status.Status.status_unknown(path) def is_working_copy(self, path): return False def is_in_a_or_a_working_copy(self, path): return False def is_versioned(self, path): return False def get_items(self, paths, statuses=[]): return [] def is_locked(self, path): return False def statuses(self, path, recurse=True, invalidate=False): return [] def revision(self, kind, number=None): return None rabbitvcs-0.18/rabbitvcs/vcs/git/000077500000000000000000000000001362112712700167605ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/README000066400000000000000000000003301362112712700176340ustar00rootroot00000000000000Hopefully a better library will come along for Git eventually, but in the meantime this should supply the basic functionality needed to work with Git. Dependencies ------------ * dulwich >= 0.19.0 * python >= 2.4 rabbitvcs-0.18/rabbitvcs/vcs/git/__init__.py000066400000000000000000000677661362112712700211170ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Concrete VCS implementation for Git functionality. """ from __future__ import absolute_import import os.path from datetime import datetime from .gittyup.client import GittyupClient from .gittyup import objects from rabbitvcs.util import helper from rabbitvcs.util.strings import S import rabbitvcs.vcs import rabbitvcs.vcs.status import rabbitvcs.vcs.log from rabbitvcs.vcs.branch import BranchEntry from rabbitvcs.util.log import Log log = Log("rabbitvcs.vcs.git") from rabbitvcs import gettext _ = gettext.gettext class Revision(object): """ Implements a simple revision object as a wrapper around the gittyup revision object. This allows us to provide a standard interface to the object data. """ def __init__(self, kind, value=None): self.kind = kind.upper() self.value = value if self.kind == "HEAD": self.value = "HEAD" self.is_revision_object = True def __str__(self): if self.value: return S(self.value) return S(self.kind) def __unicode__(self): return self.__str__().unicode() def short(self): if self.value: return S(self.value)[0:7] else: return self.kind def __repr__(self): return self.__str__() def primitive(self): return self.value class Git(object): STATUS = { "normal": gittyup.objects.NormalStatus, "added": gittyup.objects.AddedStatus, "renamed": gittyup.objects.RenamedStatus, "removed": gittyup.objects.RemovedStatus, "modified": gittyup.objects.ModifiedStatus, "killed": gittyup.objects.KilledStatus, "untracked": gittyup.objects.UntrackedStatus, "missing": gittyup.objects.MissingStatus } STATUS_REVERSE = { gittyup.objects.NormalStatus: "normal", gittyup.objects.AddedStatus: "added", gittyup.objects.RenamedStatus: "renamed", gittyup.objects.RemovedStatus: "removed", gittyup.objects.ModifiedStatus: "modified", gittyup.objects.KilledStatus: "killed", gittyup.objects.UntrackedStatus: "untracked", gittyup.objects.MissingStatus: "missing" } STATUSES_FOR_REVERT = [ "missing", "renamed", "modified", "removed" ] STATUSES_FOR_ADD = [ "untracked" ] STATUSES_FOR_COMMIT = [ "untracked", "missing", "renamed", "modified", "added", "removed" ] STATUSES_FOR_STAGE = [ "untracked" ] STATUSES_FOR_UNSTAGE = [ "added" ] def __init__(self, repo=None): self.vcs = rabbitvcs.vcs.VCS_GIT self.interface = "gittyup" if repo: self.client = GittyupClient(repo) else: self.client = GittyupClient() self.cache = rabbitvcs.vcs.status.StatusCache() def set_repository(self, path): self.client.set_repository(path) self.config = self.client.config def config_get(self, key1, key2): return self.client._config_get(key1, key2) def get_repository(self): return self.client.get_repository() def find_repository_path(self, path): return self.client.find_repository_path(path) # # Status Methods # def statuses(self, path, recurse=False, invalidate=False): """ Generates a list of GittyupStatus objects for the specified file. @type path: string @param path: The file to look up. If the file is a directory, it will return a recursive list of child path statuses """ if path in self.cache: if invalidate: del self.cache[path] else: return self.cache.find_path_statuses(path) gittyup_statuses = self.client.status(path) if not len(gittyup_statuses): return [rabbitvcs.vcs.status.Status.status_unknown(path)] else: statuses = [] for st in gittyup_statuses: # gittyup returns status paths relative to the repository root # so we need to convert the path to an absolute path st.path = self.client.get_absolute_path(st.path) # If not recursing, only return the item in question (if a file) # or items directly under the path (if a directory) cmp_path = os.path.join(path, os.path.basename(st.path)) if not recurse and cmp_path != st.path and st.path != path: continue rabbitvcs_status = rabbitvcs.vcs.status.GitStatus(st) self.cache[st.path] = rabbitvcs_status statuses.append(rabbitvcs_status) return statuses def status(self, path, summarize=True, invalidate=False): if path in self.cache: if invalidate: del self.cache[path] else: st = self.cache[path] if summarize: st.summary = st.single return st all_statuses = self.statuses(path, invalidate=invalidate) if summarize: path_status = None for st in all_statuses: if st.path == path: path_status = st break if path_status: path_status.summary = path_status.single else: path_status = rabbitvcs.vcs.status.Status.status_unknown(path) else: path_status = all_statuses[0] return path_status def is_working_copy(self, path): if (os.path.isdir(path) and os.path.isdir(os.path.join(path, ".git"))): return True return False def is_in_a_or_a_working_copy(self, path): if self.is_working_copy(path): return True return (self.find_repository_path(os.path.split(path)[0]) != "") def is_versioned(self, path): if self.is_working_copy(path): return True st = self.status(path) try: return st.is_versioned() except Exception as e: log.error(e) return False return False def is_locked(self, path): return False def get_items(self, paths, statuses=[]): """ Retrieves a list of files that have one of a set of statuses @type paths: list @param paths: A list of paths or files. @type statuses: list @param statuses: A list of statuses. @rtype: list @return: A list of GittyupStatus objects. """ if paths is None: return [] items = [] for path in paths: st = self.statuses(path, recurse=True, invalidate=True) for st_item in st: if st_item.content == "modified" and os.path.isdir(st_item.path): continue if st_item.content in statuses or len(statuses) == 0: items.append(st_item) return items def revision(self, value): """ Create a revision object usable by pysvn @type kind: string @param kind: HEAD or a sha1 hash @type value: integer @param value: Used for kind=number, specifies the revision hash. @rtype: Revision object @return: A Revision object. """ if value is None: return Revision("WORKING") value_upper = value.upper() if value_upper == "HEAD" or value_upper == "BASE": return Revision("HEAD") elif value_upper == "WORKING": return Revision("WORKING") else: return Revision("hash", value) def add(self, paths, recurse=True): """ Add files to a git repository. @type paths: list @param paths: A list of paths or files. @type recurse: boolean @param recurse: Recursively add a directory's children """ return self.stage(paths) def is_tracking(self, name): return self.client.is_tracking("refs/heads/%s" % name) # # Action Methods # def initialize_repository(self, path, bare=False): """ Initialize a Git repository @type path: string @param path: The folder to initialize as a repository @type bare: boolean @param bare: Whether the repository should be "bare" or not """ return self.client.initialize_repository(path, bare) def stage(self, paths): """ Stage files to be committed or tracked @type paths: list @param paths: A list of files """ return self.client.stage(paths) def stage_all(self): """ Stage all files in a repository to be committed or tracked """ return self.client.stage_all() def unstage(self, paths): """ Unstage files so they are not committed or tracked @type paths: list @param paths: A list of files """ return self.client.unstage(paths) def unstage_all(self): """ Unstage all files so they are not committed or tracked @type paths: list @param paths: A list of files """ return self.client.unstage_all() def branch(self, name, revision=Revision("head"), track=False): """ Create a new branch @type name: string @param name: The name of the new branch @type revision: git.Revision @param revision: A revision to branch from. @type track: boolean @param track: Whether or not to track the new branch, or just create it """ return self.client.branch(name, revision.primitive(), track) def branch_delete(self, name): """ Delete a branch @type name: string @param name: The name of the branch """ return self.client.branch_delete(name) def branch_rename(self, old_name, new_name): """ Rename a branch @type old_name: string @param old_name: The name of the branch to be renamed @type new_name: string @param new_name: The name of the new branch """ return self.client.branch_rename(old_name, new_name) def branch_list(self, revision=None): """ List all branches """ revision_str = None if revision: revision_str = revision.primitive() results = self.client.branch_list(revision_str) branches = [] for result in results: branches.append(BranchEntry( result["name"], result["tracking"], result["revision"], result["message"] )) return branches def get_active_branch(self): results = self.client.branch_list() for result in results: if result["tracking"]: return BranchEntry( result["name"], result["tracking"], result["revision"], result["message"] ) return None def checkout(self, paths=[], revision=Revision("HEAD")): """ Checkout a series of paths from a tree or commit. If no tree or commit information is given, it will check out the files from head. If no paths are given, all files will be checked out from head. @type paths: list @param paths: A list of files to checkout @type revision: git.Revision @param revision: The revision object or branch to checkout """ return self.client.checkout(paths, revision.primitive()) def clone(self, host, path, bare=False, origin="origin"): """ Clone a repository @type host: string @param host: The url of the git repository @type path: string @param path: The path to clone to @type bare: boolean @param bare: Create a bare repository or not @type origin: string @param origin: Specify the origin of the repository """ return self.client.clone(host, path, bare, origin) def commit(self, message, parents=None, committer=None, commit_time=None, commit_timezone=None, author=None, author_time=None, author_timezone=None, encoding=None, commit_all=False): """ Commit staged files to the local repository @type message: string @param message: The log message @type parents: list @param parents: A list of parent SHAs. Defaults to head. @type committer: string @param committer: The person committing. Defaults to "user.name " @type commit_time: int @param commit_time: The commit time. Defaults to time.time() @type commit_timezone: int @param commit_timezone: The commit timezone. Defaults to (-1 * time.timezone) @type author: string @param author: The author of the file changes. Defaults to "user.name " @type author_time: int @param author_time: The author time. Defaults to time.time() @type author_timezone: int @param author_timezone: The author timezone. Defaults to (-1 * time.timezone) @type encoding: string @param encoding: The encoding of the commit. Defaults to UTF-8. @type commit_all: boolean @param commit_all: Stage all changed files before committing """ return self.client.commit(message, parents, committer, commit_time, commit_timezone, author, author_time, author_timezone, encoding, commit_all) def remove(self, paths): """ Remove path from the repository. Also deletes the local file. @type paths: list @param paths: A list of paths to remove """ return self.client.remove(paths) def move(self, source, dest): """ Move a file within the repository @type source: string @param source: The source file @type dest: string @param dest: The destination. If dest exists as a directory, source will be added as a child. Otherwise, source will be renamed to dest. """ return self.client.move(source, dest) def pull(self, repository="origin", refspec="master", options=None): """ Fetch objects from a remote repository and merge with the local repository @type repository: string @param repository: The name of the repository @type refspec: string @param refspec: The branch name to pull from """ return self.client.pull(repository, refspec, options) def push(self, repository="origin", refspec="master", tags=True, force_with_lease=False): """ Push objects from the local repository into the remote repository and merge them. @type repository: string @param repository: The name of the repository @type refspec: string @param refspec: The branch name to pull from @type tags: boolean @param tags: True to include tags in push, False to omit """ return self.client.push(repository, refspec, tags, force_with_lease) def fetch_all(self): """ Fetch objects from all remote repositories. This will not merge the files into the local working copy, use pull for that. """ return self.client.fetch_all() def fetch(self, repository, branch=None): """ Fetch objects from a remote repository. This will not merge the files into the local working copy, use pull for that. If branch if provided, fetch only for that branch. @type repository: string @param repository: The git remote from which to fetch @type branch: string @param branch: The branch from which to fetch """ return self.client.fetch(repository, branch) def merge(self, branch): return self.client.merge(branch.primitive()) def remote_add(self, name, host): """ Add a remote repository @type name: string @param name: The name to give to the remote repository @type host: string @param host: The git url to add """ return self.client.remote_add(name, host) def remote_delete(self, name): """ Remove a remote repository @type name: string @param name: The name of the remote repository to remove """ return self.client.remote_delete(name) def remote_rename(self, current_name, new_name): """ Rename a remote repository @type current_name: string @param current_name: The current name of the repository @type new_name: string @param new_name: The name to give to the remote repository """ return self.client.remote_rename(current_name, new_name) def remote_set_url(self, name, url): """ Change a remote repository's url @type name: string @param name: The name of the repository @type url: string @param url: The url for the repository """ return self.client.remote_set_url(name, url) def remote_list(self): """ Return a list of the remote repositories @rtype list @return A list of dicts with keys: remote, url, fetch """ return self.client.remote_list() def tag(self, name, message, revision): """ Create a tag object @type name: string @param name: The name to give the tag @type message: string @param message: A log message @type revision: git.Revision @param revision: The revision to tag. Defaults to HEAD """ return self.client.tag(name, message, revision.primitive()) def tag_delete(self, name): """ Delete a tag @type name: string @param name: The name of the tag to delete """ return self.client.tag_delete(name) def tag_list(self): """ Return a list of Tag objects """ return self.client.tag_list() def log(self, path=None, skip=0, limit=None, revision=Revision("HEAD"), showtype="all"): """ Returns a revision history list @type path string @param path If a path is specified, return commits that contain changes to the specified path only @type revision git.Revision @param revision Determines which branch to find commits for @type start_point sha1 hash string @param start_point Start at a given revision @type limit int @param limit If given, returns a limited number of commits @type refspec string @param refspec Return commits in this refspec only @type showtype string @type showtype Determines which revisions to show. "all" shows all revisions, "branch" shows just the branch given in refspec @returns A list of commits """ # The strptime method relies on locales to work, and may not work with non en_US locales # Temporarily change the locale to en_US so strptime can work consistently # Then change it back at the end of the method import locale current_locale = locale.getlocale() if current_locale[0] is not None: locale.setlocale(locale.LC_ALL, "C") items = self.client.log(path, skip, limit, revision.primitive(), showtype) returner = [] for item in items: revision = self.revision(item["commit"]) date = datetime.strptime(item["commit_date"][0:-6], "%a %b %d %H:%M:%S %Y") try: author = item.get("author", False) or item["committer"] pos = author.find("<") if pos != -1: author = author[0:pos] author = author.strip() except KeyError: author = _("(no author)") message = "" if "message" in item: message = item["message"] changed_paths = [] if "changed_paths" in item: for changed_path in item["changed_paths"]: action = "+%s/-%s" % (changed_path["additions"], changed_path["removals"]) changed_paths.append(rabbitvcs.vcs.log.LogChangedPath( changed_path["path"], action, "", "" )) parents = [] if "parents" in item: for parent in item["parents"]: parents.append(self.revision(parent)) head = False if item["commit"] == self.client.head(): head = True returner.append(rabbitvcs.vcs.log.Log( date, revision, author, message, changed_paths, parents, head )) locale.setlocale(locale.LC_ALL, current_locale) return returner def diff_summarize(self, path1, revision_obj1, path2=None, revision_obj2=None): """ Returns a diff summary between the path(s)/revision(s) @type path1: string @param path1: The absolute path to a file @type revision_obj1: git.Revision() @param revision_obj1: The revision object for path1 @type path2: string @param path2: The absolute path to a file @type revision_obj2: git.Revision() @param revision_obj2: The revision object for path2 """ summary_raw = self.client.diff_summarize(path1, revision_obj1.primitive(), path2, revision_obj2.primitive()) summary = [] for item in summary_raw: summary.append(rabbitvcs.vcs.log.LogChangedPath(item["path"], item["action"], "", "")) return summary def annotate(self, path, revision_obj=Revision("head")): """ Returns an annotation for a specified file @type path: string @param path: The absolute path to a tracked file @type revision: string @param revision: HEAD or a sha1 hash """ return self.client.annotate(path, revision_obj.primitive()) def show(self, path, revision_obj): """ Returns a particular file at a given revision object. @type path: string @param path: The absolute path to a file @type revision_obj: git.Revision() @param revision_obj: The revision object for path """ return self.client.show(path, revision_obj.primitive()) def diff(self, path1, revision_obj1, path2=None, revision_obj2=None): """ Returns the diff between the path(s)/revision(s) @type path1: string @param path1: The absolute path to a file @type revision_obj1: git.Revision() @param revision_obj1: The revision object for path1 @type path2: string @param path2: The absolute path to a file @type revision_obj2: git.Revision() @param revision_obj2: The revision object for path2 """ return self.client.diff(path1, revision_obj1.primitive(), path2, revision_obj2.primitive()) def apply_patch(self, patch_file, base_dir): """ Applies a patch created for this WC. @type patch_file: string @param patch_file: the path to the patch file @type base_dir: string @param base_dir: the base directory from which to interpret the paths in the patch file """ any_failures = False for file, success, rej_file in helper.parse_patch_output(patch_file, base_dir, 1): fullpath = os.path.join(base_dir, file) event_dict = dict() event_dict["path"] = file event_dict["mime_type"] = "" # meh if success: event_dict["action"] = _("Patched") # not in pysvn, but # we have a fallback else: any_failures = True event_dict["action"] = _("Patch Failed") # better wording needed? if rej_file: rej_info = { "path" : rej_file, "action" : _("Rejected Patch"), "mime_type" : None } if self.client.callback_notify: self.client.callback_notify(event_dict) if rej_file: self.client.callback_notify(rej_info) def export(self, path, dest_path, revision): """ Exports a file or directory from a given revision @type path: string @param path: The source file/folder to export @type dest_path: string @param dest_path: The path to put the exported file(s) @type revision: git.Revision @param revision: The revision/tree/commit of the source file being exported """ return self.client.export(path, dest_path, revision.primitive()) def clean(self, path, remove_dir=True, remove_ignored_too=False, remove_only_ignored=False, dry_run=False, force=True): return self.client.clean(path, remove_dir, remove_ignored_too, remove_only_ignored, dry_run, force) def reset(self, path, revision, type=None): """ Reset repository to a specified state @type path: string @param path: The repository file/folder @type revision: git.Revision @param revision: The revision/tree/commit to reset to @type type: string @param type: The type of reset to do. Can be mixed, soft, hard, merge """ return self.client.reset(path, revision.primitive(), type) def get_ignore_files(self, path): paths = [] paths.append(self.client.get_local_ignore_file(path)) paths += self.client.get_global_ignore_files() return paths def get_config_files(self, path): paths = [self.client.get_local_config_file()] return paths def set_callback_notify(self, func): self.client.set_callback_notify(func) def set_callback_progress_update(self, func): self.client.set_callback_progress_update (func) def set_callback_get_user(self, func): self.client.set_callback_get_user(func) def set_callback_get_cancel(self, func): self.client.set_callback_get_cancel(func) def set_callback_cancel(self, func): self.client.callback_cancel = func rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/000077500000000000000000000000001362112712700204655ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/__init__.py000066400000000000000000000000001362112712700225640ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/client.py000066400000000000000000002202161362112712700223200ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # client.py # import os, errno import os.path import re import shutil import fnmatch import time import struct from datetime import datetime from mimetypes import guess_type import time import subprocess import dulwich.errors import dulwich.repo import dulwich.porcelain import dulwich.objects from dulwich.index import write_index_dict, SHA1Writer #from dulwich.patch import write_tree_diff from .exceptions import * from . import util from .objects import * from .command import GittyupCommand from rabbitvcs.util import helper from rabbitvcs.util.strings import * import six.moves.tkinter import six.moves.tkinter_messagebox import six ENCODING = "UTF-8" RE_STATUS = re.compile("^([\sA-Z\?]+)\s(?:\S+\s->\s)?(.*?)$") def callback_notify_null(val): pass def callback_get_user(): from pwd import getpwuid pwuid = getpwuid(os.getuid()) user = pwuid[0] fullname = pwuid[4] host = os.getenv("HOSTNAME") return (fullname, "%s@%s" % (user, host)) def callback_get_cancel(): return False def mkdir_p(path): # http://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise def get_tmp_path(filename): tmpdir = "/tmp/rabbitvcs" mkdir_p(tmpdir) return os.path.join(tmpdir, filename) class GittyupClient(object): UTF8 = UTF8_ENCODING def __init__(self, path=None, create=False): self.callback_notify = callback_notify_null self.callback_progress_update = None self.callback_get_user = callback_get_user self.callback_get_cancel = callback_get_cancel self.global_ignore_patterns = [] self.git_version = None self.numberOfCommandStages = 0 self.numberOfCommandStagesExecuted = 0 if path: try: self.repo = dulwich.repo.Repo(path) self._load_config() self.global_ignore_patterns = self._get_global_ignore_patterns() except dulwich.errors.NotGitRepository: if create: self.initialize_repository(path) self.global_ignore_patterns = self._get_global_ignore_patterns() else: raise NotRepositoryError() else: self.repo = None # # Start Private Methods # def _initialize_index(self): index_path = self.repo.index_path() f = open(index_path, "wb") try: f = SHA1Writer(f) write_index_dict(f, {}) except: pass f.close() def _get_index(self): if not self.repo.has_index(): self._initialize_index() return self.repo.open_index() def _get_tree_at_head(self): try: tree = self.repo[self.repo[self.repo.head()].tree] except KeyError as e: tree = dulwich.objects.Tree() return tree def _get_tree_from_sha1(self, sha1): return self.repo[self.repo[sha1].tree] def _get_tree_index(self, tree=None): if tree is None: tree = self._get_tree_at_head() tree_index = {} if tree: for item in self.repo.object_store.iter_tree_contents(tree.id): tree_index[item[0].decode(self.UTF8)] = (item[1], item[2].decode(self.UTF8)) return tree_index def _get_git_version(self): """ Gets the local git version """ if self.git_version: return self.git_version else: try: proc = subprocess.Popen(["git", "--version"], stdout=subprocess.PIPE, universal_newlines=True) response = proc.communicate()[0].split() version = [int(x) for x in response[2].split(".")] self.git_version = version return self.git_version except Exception as e: return None def _get_global_ignore_patterns(self): """ Get ignore patterns from $GIT_DIR/info/exclude then from core.excludesfile in gitconfig. """ patterns = [] files = self.get_global_ignore_files() for path in files: patterns += self.get_ignore_patterns_from_file(path) return patterns def get_global_ignore_files(self): """ Returns a list of ignore files possible for this repository """ try: git_dir = os.environ["GIT_DIR"] except KeyError: git_dir = os.path.join(self.repo.path, ".git") files = [] excludefile = os.path.join(git_dir, "info", "exclude") files.append(excludefile) try: core_excludesfile = self._config_get(("core", ), "excludesfile") if core_excludesfile: files.append(core_excludesfile) except KeyError: pass return files def get_local_ignore_file(self, path): if not os.path.exists(path): return [] if os.path.isfile(path): path = os.path.basename(path) return os.path.join(path, ".gitignore") def get_ignore_patterns_from_file(self, path): """ Read in an ignore patterns file (i.e. .gitignore, $GIT_DIR/info/exclude) and return a list of patterns """ patterns = [] if os.path.isfile(path): file = open(path, "r") try: for line in file: if line == "" or line.startswith("#"): continue patterns.append(line.rstrip("\n")) except: pass file.close() return patterns def get_local_config_file(self): try: git_dir = os.environ["GIT_DIR"] except KeyError: git_dir = os.path.join(self.repo.path, ".git") return git_dir + "/config" def _ignore_file(self, patterns, filename): """ Determine whether the given file should be ignored """ for pattern in patterns: if fnmatch.fnmatch(filename, pattern) and not pattern.startswith("!"): return True return False def _read_directory_tree(self, path, show_ignored_files=False): files = [] directories = [] for root, dirs, filenames in os.walk(path, topdown=True): try: dirs.remove(".git") removed_git_dir = True except ValueError: pass # Find the relative root path of this folder if root == self.repo.path: rel_root = "" else: rel_root = self.get_relative_path(root) for filename in filenames: files.append(os.path.join(rel_root, filename)) for _d in dirs: directories.append(os.path.join(rel_root, _d)) directories.append(rel_root) #Remove duplicates in list directories=list(set(directories)) return (sorted(files), directories) def _get_blob_from_file(self, path): file = open(path, "rb") try: blob = dulwich.objects.Blob.from_string(file.read()) finally: file.close() return blob def _write_blob_to_file(self, path, blob): dirname = os.path.dirname(path) if not os.path.isdir(dirname): os.makedirs(dirname) file = open(path, "wb") try: file.write(blob.data) finally: file.close() def _load_config(self): self.config = self.repo.get_config() def _config_normalize_section(self, section): # If some old code is using string sections, convert to a tuple if isinstance(section, six.string_types): parts = section.split(" ") s1 = parts.pop(0) s2 = " ".join(parts).replace('"', "") section = (s1, s2) return section def _config_set(self, section, key, value): section = self._config_normalize_section(section) return self.config.set(section, key, value) def _config_get(self, section, key): section = self._config_normalize_section(section) return self.config.get(section, key) def _get_config_user(self): try: config_user_name = S(self._config_get(("user", ), "name")) config_user_email = S(self._config_get(("user", ), "email")) if config_user_name == "" or config_user_email == "": raise KeyError() except KeyError: (config_user_name, config_user_email) = self.callback_get_user() if config_user_name == None and config_user_email == None: return None self._config_set(("user", ), "name", config_user_name) self._config_set(("user", ), "email", config_user_email) self.config.write_to_path() return "%s <%s>" % (config_user_name, config_user_email) def string_unescape(self, s): # Portable utf-8 string unescape. if isinstance(s, six.text_type): s = s.encode(IDENTITY_ENCODING) s = S(s.decode("unicode_escape"), IDENTITY_ENCODING) return S(s.bytes(IDENTITY_ENCODING)) # # Start Public Methods # def initialize_repository(self, path, bare=False): mkdir_p(path) if bare: dulwich.repo.Repo.init_bare(path) else: dulwich.repo.Repo.init(path) self.set_repository(path) def set_repository(self, path): try: self.repo = dulwich.repo.Repo(path) self._load_config() except dulwich.errors.NotGitRepository: raise NotRepositoryError() def get_repository(self): return self.repo.path def find_repository_path(self, path): path_to_check = S(path) while path_to_check != "/" and path_to_check != "": if os.path.isdir(os.path.join(path_to_check, ".git")): return path_to_check path_to_check = os.path.split(path_to_check)[0] return None def get_relative_path(self, path): path = S(path) if path == self.repo.path: return "." return util.relativepath(self.repo.path, path) def get_absolute_path(self, path): path = S(path) if path == ".": return self.repo.path return os.path.join(self.repo.path, path).rstrip("/") def track(self, name): self.repo.refs.set_symbolic_ref(b"HEAD", name) def is_tracking(self, name): return (self.repo.refs.read_ref(b"HEAD")[5:] == name) def tracking(self): return self.repo.refs.read_ref(b"HEAD")[5:] def head(self): return self.repo.refs[b"HEAD"] def stage(self, paths): """ Stage files to be committed or tracked @type paths: list @param paths: A list of files """ index = self._get_index() to_stage = [] if isinstance(paths, (str, six.text_type)): paths = [paths] for path in paths: relative_path = self.get_relative_path(path) absolute_path = self.get_absolute_path(path) self.notify({ "action": "Staged", "path": absolute_path, "mime_type": guess_type(absolute_path)[0] }) to_stage.append(S(relative_path)) self.repo.stage(to_stage) def stage_all(self): """ Stage all files in a repository to be committed or tracked """ index = self._get_index() for status in self.status(): if status in [AddedStatus, RemovedStatus, ModifiedStatus]: abs_path = self.get_absolute_path(status.path) relative_path = self.get_relative_path(status.path) if os.path.isfile(abs_path): self.stage(relative_path) if status == MissingStatus: del index[status.path] index.write() def unstage(self, paths): """ Unstage files so they are not committed or tracked @type paths: list @param paths: A list of files """ index = self._get_index() tree = self._get_tree_index() if isinstance(paths, (str, six.text_type)): paths = [paths] for path in paths: relative_path = S(self.get_relative_path(path)).bytes() if relative_path in index: if relative_path in tree: (ctime, mtime, dev, ino, mode, uid, gid, size, blob_id, flags) = index[relative_path] (mode, blob_id) = tree[relative_path] # If the file is locally modified, set these vars to 0 # I'm not sure yet why this needs to happen, but it does # in order for the file to appear modified and not normal blob = self._get_blob_from_file(path) if blob.id != blob_id: ctime = 0 mtime = 0 dev = 0 ino = 0 uid = 0 gid = 0 size = 0 index[relative_path] = (ctime, mtime, dev, ino, mode, uid, gid, size, blob_id, flags) else: del index[relative_path] else: if relative_path in tree: index[relative_path] = (0, 0, 0, 0, tree[relative_path][0], 0, 0, 0, tree[relative_path][1], 0) self.notify({ "action": "Unstaged", "path": path, "mime_type": guess_type(path)[0] }) index.write() def unstage_all(self): """ Unstage all files so they are not committed or tracked @type paths: list @param paths: A list of files """ index = self._get_index() for status in self.status(): abs_path = self.get_absolute_path(status.path) if os.path.isfile(abs_path): self.unstage(abs_path) def get_staged(self): """ Gets a list of files that are staged """ staged = [] tree = self._get_tree_at_head() index = self._get_index() if len(tree) > 0: for item in index.changes_from_tree(self.repo.object_store, tree.id): ((old_name, new_name), (old_mode, new_mode), (old_sha, new_sha)) = item if new_name: staged.append(new_name) if old_name and old_name != new_name: staged.append(old_name) else: for path in index: staged.append(path) return staged def is_staged(self, path, staged_files=None): """ Determines if the specified path is staged @type path: string @param path: A file path @rtype boolean """ if not staged_files: staged_files = self.get_staged() relative_path = self.get_relative_path(path) return (relative_path in staged_files) def branch(self, name, commit_sha=None, track=False): """ Create a new branch @type name: string @param name: The name of the new branch @type commit_sha: string @param commit_sha: A commit sha to branch from. If None, branches from head @type track: boolean @param track: Whether or not to track the new branch, or just create it """ cmd = ["git", "branch"] if track: cmd.append("-t") if commit_sha is None: commit_sha = self.repo.head() cmd += [name, commit_sha] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def branch_delete(self, name): """ Delete a branch @type name: string @param name: The name of the branch """ ref_name = "refs/heads/%s" % name refs = self.repo.get_refs() if ref_name in refs: if self.is_tracking(ref_name): self.track("refs/heads/master") del self.repo.refs[ref_name] def branch_rename(self, old_name, new_name): """ Rename a branch @type old_name: string @param old_name: The name of the branch to be renamed @type new_name: string @param new_name: The name of the new branch """ old_ref_name = "refs/heads/%s" % old_name new_ref_name = "refs/heads/%s" % new_name refs = self.repo.get_refs() if old_ref_name in refs: self.repo.refs[new_ref_name] = self.repo.refs[old_ref_name] if self.is_tracking(old_ref_name): self.track(new_ref_name) del self.repo.refs[old_ref_name] def branch_list(self, commit_sha=None): """ List all branches """ """ refs = self.repo.get_refs() branches = [] for ref,branch_sha in refs.items(): if ref.startswith("refs/heads"): branch = Branch(ref[11:], branch_sha, self.repo[branch_sha]) branches.append(branch) return branches """ cmd = ["git", "branch", "-lv", "--no-abbrev", "-a"] if commit_sha: cmd += ["--contains", commit_sha] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) branches = [] for line in stdout: if not line: continue components = line.split() if components[0] != "*": components.insert(0, "") tracking = components.pop(0) == "*" and True or False if components[0] == "(no": name = components.pop(0) + " " + components.pop(0) elif components[0] == "(HEAD": continue # Detached head is not a branch. else: name = components.pop(0) revision = components.pop(0) message = " ".join(components) branches.append({ "tracking": tracking, "name": name, "revision": revision, "message": message }) return branches def checkout(self, paths=[], revision="HEAD"): """ Checkout a series of paths from a tree or commit. If no tree or commit information is given, it will check out the files from head. If no paths are given, all files will be checked out from head. @type paths: list @param paths: A list of files to checkout @type revision: string @param revision: The sha or branch to checkout """ if len(paths) == 1 and paths[0] == self.repo.path: paths = [] cmd = ["git", "checkout", "-m", revision] + paths try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def clone(self, host, path, bare=False, origin="origin"): """ Clone a repository @type host: string @param host: The url of the git repository @type path: string @param path: The path to clone to @type bare: boolean @param bare: Create a bare repository or not @type origin: string @param origin: Specify the origin of the repository """ self.numberOfCommandStages = 3 more = ["-o", "origin","--progress"] if bare: more.append("--bare") base_dir = os.path.split(path)[0] cmd = ["git", "clone", host, path] + more isUsername = False isPassword = False self.modifiedHost = host try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=base_dir, notify=self.notify_and_parse_progress, cancel=self.get_cancel()).execute() if stdout[1].find('could not read Username') > -1: # Prompt for username if it does not exist in the url. isUsername, originalRemoteUrl = self.promptUsername(self.modifiedHost) # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl2 = self.promptPassword(self.modifiedHost) elif stdout[1].find('could not read Password') > -1: # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl = self.promptPassword(self.modifiedHost) if isUsername == True or isPassword == True: # Update the cmd with the username and password. cmd = ["git", "clone", self.modifiedHost, path] + more # Try again. (status, stdout, stderr) = GittyupCommand(cmd, cwd=base_dir, notify=self.notify_and_parse_progress, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) # If we prompted for a username or password then it will now be written to the config. Remove it now before continuing. if isUsername == True or isPassword == True: # Load new config. self.repo = dulwich.repo.Repo(path) self._load_config() # Write original url back to config. self._config_set("remote \"origin\"", "url", host) self.config.write_to_path() def commit(self, message, parents=None, committer=None, commit_time=None, commit_timezone=None, author=None, author_time=None, author_timezone=None, encoding=None, commit_all=False): """ Commit staged files to the local repository @type message: string @param message: The log message @type parents: list @param parents: A list of parent SHAs. Defaults to head. @type committer: string @param committer: The person committing. Defaults to "user.name " @type commit_time: int @param commit_time: The commit time. Defaults to time.time() @type commit_timezone: int @param commit_timezone: The commit timezone. Defaults to local timezone. @type author: string @param author: The author of the file changes. Defaults to "user.name " @type author_time: int @param author_time: The author time. Defaults to time.time() @type author_timezone: int @param author_timezone: The author timezone. Defaults to commit timezone. @type encoding: string @param encoding: The encoding of the commit. Defaults to UTF-8. @type commit_all: boolean @param commit_all: Stage all changed files before committing """ if commit_all: self.stage_all() initial_commit = False if encoding is None: encoding = ENCODING if commit_timezone is None: commit_timezone = helper.utc_offset() commit_id = self.repo.do_commit(**helper.to_bytes({ "message": message, "committer": committer, "commit_timestamp": commit_time, "commit_timezone": commit_timezone, "author": author, "author_timestamp": author_time, "author_timezone": author_timezone, "encoding": encoding, "merge_heads": parents}, encoding)) branch_full = self.repo.refs.read_ref(b"HEAD") if branch_full is not None: branch_components = re.search(b"refs/heads/(.+)", branch_full) if (branch_components != None): branch = branch_components.group(1) self.notify("[%s] -> %s" % (S(commit_id), S(branch))) self.notify("To branch: " + S(branch)) #Print tree changes. #dulwich.patch.write_tree_diff(sys.stdout, self.repo.object_store, commit.tree, commit.id) return commit_id def remove(self, paths): """ Remove path from the repository. Also deletes the local file. @type paths: list @param paths: A list of paths to remove """ if isinstance(paths, (str, six.text_type)): paths = [paths] index = self._get_index() for path in paths: relative_path = self.get_relative_path(path) if relative_path in index: del index[relative_path] os.remove(path) index.write() def move(self, source, dest): """ Move a file within the repository @type source: string @param source: The source file @type dest: string @param dest: The destination. If dest exists as a directory, source will be added as a child. Otherwise, source will be renamed to dest. """ index = self._get_index() relative_source = self.get_relative_path(source) relative_dest = self.get_relative_path(dest) # Get a list of affected files so we can update the index source_files = [] if os.path.isdir(source): for name in index: name = name.decode(self.UTF8) if name.startswith(relative_source): source_files.append(name) else: source_files.append(relative_source) # Rename the affected index entries for source_file in source_files: new_path = source_file.replace(relative_source, relative_dest) if os.path.isdir(dest): new_path = os.path.join(new_path, os.path.basename(source_file)) source_file = source_file.encode(self.UTF8) index[new_path.encode(self.UTF8)] = index[source_file] del index[source_file] index.write() # Actually move the file/folder shutil.move(source, dest) def pull(self, repository="origin", refspec="master", options=None): """ Fetch objects from a remote repository and merge with the local repository @type repository: string @param repository: The name of the repository @type refspec: string @param refspec: The branch name to pull from """ self.numberOfCommandStages = 2 cmd = ["git", "pull", "--progress"] if options != None: if options.count("rebase"): cmd.append("--rebase") if options.count("all"): cmd.append("--all") else: cmd.append (repository) cmd.append (refspec) # Setup the section name in the config for the remote target. remoteKey = "remote \"" + repository + "\"" isUsername = False isPassword = False try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_push, cancel=self.get_cancel()).execute() if stdout[0].find('could not read Username') > -1: # Prompt for username if it does not exist in the url. isUsername, originalRemoteUrl = self.promptUsername(remoteKey) # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl2 = self.promptPassword(remoteKey) elif stdout[0].find('could not read Password') > -1: # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl = self.promptPassword(remoteKey) if isUsername == True or isPassword == True: # Try again. (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_push, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) # If we prompted for a password and write it to the config, remove it now before continuing. if isUsername == True or isPassword == True: # Write original url back to config. self._config_set(remoteKey, "url", originalRemoteUrl) self.config.write_to_path() def push(self, repository="origin", refspec="master", tags=True, force_with_lease=False): """ Push objects from the local repository into the remote repository and merge them. @type repository: string @param repository: The name of the repository @type refspec: string @param refspec: The branch name to pull from @type tags: boolean @param tags: True to include tags in push, False to omit """ self.numberOfCommandStages = 2 cmd = ["git", "push", "--progress"] if tags: cmd.extend(["--tags"]) if force_with_lease: cmd.extend(["--force-with-lease"]) cmd.extend([repository, refspec]) # Setup the section name in the config for the remote target. remoteKey = "remote \"" + repository + "\"" isUsername = False isPassword = False try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_push, cancel=self.get_cancel()).execute() if stdout[0].find('could not read Username') > -1: # Prompt for username if it does not exist in the url. isUsername, originalRemoteUrl = self.promptUsername(remoteKey) # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl2 = self.promptPassword(remoteKey) elif stdout[0].find('could not read Password') > -1: # Prompt for password if a username exists in the remote url without a password. isPassword, originalRemoteUrl = self.promptPassword(remoteKey) if isUsername == True or isPassword == True: # Try again. (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_push, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) # If we prompted for a password and write it to the config, remove it now before continuing. if isUsername == True or isPassword == True: # Write original url back to config. self._config_set(remoteKey, "url", originalRemoteUrl) self.config.write_to_path() def onUsername(self, window, username, remoteKey, originalRemoteUrl, isOk): if isOk == True: if username == "": six.moves.tkinter_messagebox.showinfo("Error", "Please enter a username.", parent=window) return else: # Insert password into url. newRemoteUrl = originalRemoteUrl.replace("://", "://" + username + "@") if remoteKey.find("://") == -1: # Write url temporarily back to config. self._config_set(remoteKey, "url", newRemoteUrl) self.config.write_to_path() else: # Change the url in memory, since we don't have a config yet. self.modifiedHost = newRemoteUrl # Close dialog. window.destroy() def onPassword(self, window, password, remoteKey, originalRemoteUrl, isOk): if isOk == True: if password == "": six.moves.tkinter_messagebox.showinfo("Error", "Please enter a password.", parent=window) return else: # Insert password into url. newRemoteUrl = originalRemoteUrl.replace("@", ":" + password + "@") if remoteKey.find("://") == -1: # Write url temporarily back to config. self._config_set(remoteKey, "url", newRemoteUrl) self.config.write_to_path() else: # Change the url in memory, since we don't have a config yet. self.modifiedHost = newRemoteUrl # Close dialog. window.destroy() def promptUsername(self, remoteKey): """ If the github url contains no username, prompt for one and write the url back to the config. Note, we'll set the url back to its original (without the password) after the call completes. https://user@github.com/path/repositoryName.git """ isUsername = False originalRemoteUrl = remoteKey self.modifiedHost = originalRemoteUrl if remoteKey.find("://") == -1: # Get existing url from config, otherwise just use what was provided (the url from cloning, etc). originalRemoteUrl = S(self._config_get(remoteKey, "url")) if originalRemoteUrl.find('@') == -1: # No username or password. Prompt for both. Create dialog. window = six.moves.tkinter.Tk() window.title("Please enter your username") window.resizable(0,0) window["padx"] = 40 window["pady"] = 20 textFrame = six.moves.tkinter.Frame(window) # Create textbox label. entryLabel = six.moves.tkinter.Label(textFrame) entryLabel["text"] = "Username:" entryLabel.pack(side=six.moves.tkinter.LEFT) # Create textbox. entryWidget = six.moves.tkinter.Entry(textFrame) entryWidget["width"] = 25 entryWidget.bind("", (lambda event: self.onUsername(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) entryWidget.bind("", (lambda event: self.onUsername(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) entryWidget.pack(side=six.moves.tkinter.LEFT) entryWidget.focus(); textFrame.pack() # Create OK button. button = six.moves.tkinter.Button(window, width=5, text="OK", command = (lambda: self.onUsername(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) button.pack(side=six.moves.tkinter.RIGHT) # Create Cancel button. button = six.moves.tkinter.Button(window, width=5, text="Cancel", command = (lambda: self.onUsername(window, entryWidget.get(), remoteKey, originalRemoteUrl, False))) button.pack(side=six.moves.tkinter.RIGHT) # Position window in center of screen. self.center(window) # Show dialog. window.mainloop() isUsername = True return isUsername, originalRemoteUrl def promptPassword(self, remoteKey): """ If a username exists in the github url without a password, prompt the user and write the url back to the config. Note, we'll set the url back to its original (without the password) after the call completes. https://user@github.com/path/repositoryName.git """ isPassword = False originalRemoteUrl = remoteKey self.modifiedHost = originalRemoteUrl if remoteKey.find("://") == -1: # Get existing url from config, otherwise just use what was provided (the url from cloning, etc). originalRemoteUrl = S(self._config_get(remoteKey, "url")) # If the url contains a username (@) without a password (:), then prompt for a password. if originalRemoteUrl.find('@') > -1 and originalRemoteUrl.rfind(':') <= 5: # Prompt for password. Create dialog. window = six.moves.tkinter.Tk() window.title("Please enter your password") window.resizable(0,0) window["padx"] = 40 window["pady"] = 20 textFrame = six.moves.tkinter.Frame(window) # Create textbox label. entryLabel = six.moves.tkinter.Label(textFrame) entryLabel["text"] = "Password:" entryLabel.pack(side=six.moves.tkinter.LEFT) # Create textbox. entryWidget = six.moves.tkinter.Entry(textFrame) entryWidget["show"] = "*" entryWidget["width"] = 25 entryWidget.bind("", (lambda event: self.onPassword(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) entryWidget.bind("", (lambda event: self.onPassword(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) entryWidget.pack(side=six.moves.tkinter.LEFT) entryWidget.focus(); textFrame.pack() # Create OK button. button = six.moves.tkinter.Button(window, width=5, text="OK", command = (lambda: self.onPassword(window, entryWidget.get(), remoteKey, originalRemoteUrl, True))) button.pack(side=six.moves.tkinter.RIGHT) # Create Cancel button. button = six.moves.tkinter.Button(window, width=5, text="Cancel", command = (lambda: self.onPassword(window, entryWidget.get(), remoteKey, originalRemoteUrl, False))) button.pack(side=six.moves.tkinter.RIGHT) # Position window in center of screen. self.center(window) # Show dialog. window.mainloop() isPassword = True return isPassword, originalRemoteUrl def fetch(self, repository, branch=None): """ Fetch objects from a remote repository. This will not merge the files into the local working copy, use pull for that. @type repository: string @param repository: The git repository from which to fetch @type branch: string @param branch: The git branch from which to fetch """ cmd = ["git", "fetch", repository] if branch: cmd.append(branch) try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def fetch_all(self): cmd = ["git", "fetch", "--all"] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def merge(self, branch): cmd = ["git", "merge", branch] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def remote_add(self, name, host): """ Add a remote repository @type name: string @param name: The name to give to the remote repository @type host: string @param host: The git url to add """ cmd = ["git", "remote", "add", name, host] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def remote_rename(self, current_name, new_name): """ Rename a remote repository @type current_name: string @param current_name: The current name of the repository @type new_name: string @param new_name: The name to give to the remote repository """ cmd = ["git", "remote", "rename", current_name, new_name] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def remote_set_url(self, name, url): """ Change a remote repository's url @type name: string @param name: The name of the repository @type url: string @param url: The url for the repository """ cmd = ["git", "remote", "set-url", name, url] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def remote_delete(self, name): """ Remove a remote repository @type name: string @param name: The name of the remote repository to remove """ cmd = ["git", "remote", "rm", name] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) def remote_list(self): """ Return a list of the remote repositories @rtype list @return A list of dicts with keys: remote, url, fetch """ cmd = ["git", "remote", "-v"] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) stdout = [] returner = [] for line in stdout: components = line.split() if components: name = components[0] host = components[1] add = True for item in returner: if item["name"] == name: add = False if add: returner.append({ "name": name, "host": host }) return returner def tag(self, name, message, revision="HEAD"): """ Create a tag object @type name: string @param name: The name to give the tag @type message: string @param message: A log message @type revision: string @param revision: The revision to tag. Defaults to HEAD """ dulwich.porcelain.tag(self.repo, name, objectish=revision, message=message) def tag_delete(self, name): """ Delete a tag @type name: string @param name: The name of the tag to delete """ ref_name = S("refs/tags/%s" % name).bytes() refs = self.repo.get_refs() if ref_name in refs: del self.repo.refs[ref_name] def tag_list(self): """ Return a list of Tag objects """ refs = self.repo.get_refs() tags = [] for ref, tag_sha in list(refs.items()): if S(ref).startswith("refs/tags"): if type(self.repo[tag_sha]) == dulwich.objects.Commit: tag = CommitTag(ref[10:], tag_sha, self.repo[tag_sha]) else: tag = Tag(tag_sha, self.repo[tag_sha]) tags.append(tag) return tags def status_porcelain(self, path): if os.path.isdir(path): (files, directories) = self._read_directory_tree(path) else: files = [self.get_relative_path(path)] directories = [] files_hash = {} for file in files: files_hash[file] = True cmd = ["git", "status", "--porcelain", path] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify).execute() except GittyupCommandError as e: self.callback_notify(e) statuses = [] modified_files = [] for line in stdout: components = RE_STATUS.match(line) if components: status = components.group(1) strip_status = status.strip() path = self.string_unescape(components.group(2)) if path[0] == '"' and path[-1] == '"': path = path[1:-1] if status == " D": statuses.append(MissingStatus(path)) elif any(c in strip_status for c in ["M", "R", "U"]): statuses.append(ModifiedStatus(path)) elif strip_status in ["A", "C"]: statuses.append(AddedStatus(path)) elif strip_status == "D": statuses.append(RemovedStatus(path)) elif strip_status == "??": statuses.append(UntrackedStatus(path)) modified_files.append(path) try: del files_hash[path] except Exception as e: pass # Determine untracked directories cmd = ["git", "clean", "-nd", self.repo.path] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify).execute() except GittyupCommandError as e: self.callback_notify(e) untracked_directories = [] for line in stdout: components = re.match("^(Would remove)\s(.*?)$", line) if components: untracked_path = components.group(2) if untracked_path[-1]=='/': untracked_directories.append(untracked_path[:-1]) #Determine the ignored files and directories in Repo cmd = ["git", "clean", "-ndX", self.repo.path] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify).execute() except GittyupCommandError as e: self.callback_notify(e) ignored_directories=[] for line in stdout: components = re.match("^(Would remove)\s(.*?)$", line) if components: ignored_path=components.group(2) if ignored_path[-1]=='/': ignored_directories.append(ignored_path[:-1]) next statuses.append(IgnoredStatus(ignored_path)) self.ignored_paths.append(ignored_path) try: del files_hash[ignored_path] except Exception as e: pass for file,data in list(files_hash.items()): ignore_file=False untracked_file=False for ignored_path in ignored_directories: if S(ignored_path) in file: ignore_file=True break for untracked_path in untracked_directories: if S(untracked_path) in file: untracked_file=True break if untracked_file==True: statuses.append(UntrackedStatus(file)) if ignore_file==True: self.ignored_paths.append(file) elif ignore_file==True: statuses.append(IgnoredStatus(file)) self.ignored_paths.append(file) else: statuses.append(NormalStatus(file)) # Determine status of folders based on child contents for d in directories: d_status = NormalStatus(d) # Check if directory is untracked or a sub-directory of an untracked directory for untracked_path in untracked_directories: if untracked_path in d: d_status = UntrackedStatus(d) break dirPattern = "/%s/" % d if len(d) == 0: dirPattern = "/" # Check if directory includes modified files for file in modified_files: if ("/%s" % file).startswith(dirPattern): # fix, when file startwith same prefix as directory, fix status for root repo path "" d_status = ModifiedStatus(d) break # Check if directory is ignored for ignored_path in ignored_directories: if ignored_path in d: d_status = IgnoredStatus(d) break statuses.append(d_status) return statuses def status_dulwich(self, path): tree = self._get_tree_index() index = self._get_index() if os.path.isdir(path): (files, directories) = self._read_directory_tree(path) else: files = [self.get_relative_path(path)] directories = [] files_hash = {} for file in files: files_hash[file] = True statuses = [] # Calculate statuses for files in the current HEAD modified_files = [] for name in tree: try: if index[name]: inIndex = True except Exception as e: inIndex = False if inIndex: absolute_path = self.get_absolute_path(name) if os.path.isfile(absolute_path): # Cached, determine if modified or not blob = self._get_blob_from_file(absolute_path) if blob.id == tree[name][1]: statuses.append(NormalStatus(name)) else: modified_files.append(name) statuses.append(ModifiedStatus(name)) else: modified_files.append(name) statuses.append(MissingStatus(name)) else: modified_files.append(name) statuses.append(RemovedStatus(name)) try: del files_hash[name] except Exception as e: pass # Calculate statuses for untracked files for name,data in list(files_hash.items()): try: inTreeIndex = tree[name] except Exception as e: inTreeIndex = False try: inIndex = index[name] except Exception as e: inIndex = False if inIndex and not inTreeIndex: modified_files.append(name) statuses.append(AddedStatus(name)) continue # Generate a list of appropriate ignore patterns patterns = [] path_to_check = os.path.dirname(self.get_absolute_path(name)) while path_to_check != self.repo.path: patterns += self.get_ignore_patterns_from_file(self.get_local_ignore_file(path_to_check)) path_to_check = os.path.split(path_to_check)[0] patterns += self.get_ignore_patterns_from_file(self.get_local_ignore_file(self.repo.path)) patterns += self.global_ignore_patterns if not self._ignore_file(patterns, os.path.basename(name)): statuses.append(UntrackedStatus(name)) else: self.ignored_paths.append(name) # Determine status of folders based on child contents for d in directories: d_status = NormalStatus(d) for file in modified_files: if os.path.join(d, os.path.basename(file)) == file: d_status = ModifiedStatus(d) break statuses.append(d_status) return statuses def get_all_ignore_file_paths(self, path): return self.ignored_paths def status(self, path): # TODO - simply get this from the status implementation / avoid global state self.ignored_paths = [] return self.status_porcelain(path) def log(self, path="", skip=0, limit=None, revision="", showtype="all"): cmd = ["git", "--no-pager", "log", "--numstat", "--parents", "--pretty=fuller", "--date-order", "--date=default", "-m"] if showtype == "all": cmd.append("--all") if limit: cmd.append("-%s" % limit) if skip: cmd.append("--skip=%s" % skip) if revision: if showtype=="push": cmd.append("%s.." % revision) else: cmd.append(revision) if path == self.repo.path: path = "" if path: cmd += ["--", path] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify).execute() except GittyupCommandError as e: self.callback_notify(e) return [] revisions = [] revision = {} changed_file = {} pattern_from = re.compile(r' \(from (.*)\)') last_commitId = "" for line in stdout: if line == "": continue if line[0:6] == "commit": match = pattern_from.search(line) commit_line = re.sub(" \(from.*\)","", line).split(" ") fromPath = "" if match: fromPath = match.group(1) if revision: if "changed_paths" not in revision: revision["changed_paths"] = {} if last_commitId != commit_line[1]: revisions.append(revision) revision = {} else: del revision["message"] if len(fromPath) > 0: if "changed_paths" not in revision: revision["changed_paths"] =[] changed_file = { "additions": "-", "removals": "-", "path": "Diff with parent : %s " % fromPath } revision["changed_paths"].append(changed_file) changed_file = {} revision["commit"] = commit_line[1] last_commitId = revision["commit"] revision["parents"] = [] for parent in commit_line[2:]: revision["parents"].append(parent) elif line[0:7] == "Author:": revision["author"] = line[7:].strip() elif line[0:11] == "AuthorDate:": revision["author_date"] = line[11:].strip() elif line[0:7] == "Commit:": revision["committer"] = line[7:].strip() elif line[0:11] == "CommitDate:": revision["commit_date"] = line[11:].strip() elif line[0:4] == " ": message = line[4:] if "message" not in revision: revision["message"] = "" else: revision["message"] += "\n" revision["message"] = revision["message"] + message elif line[0].isdigit() or line[0] in "-": file_line = line.split("\t") if "changed_paths" not in revision: revision["changed_paths"] = [] if len(file_line) == 3: changed_file = { "additions": file_line[0], "removals": file_line[1], "path": self.string_unescape(file_line[2]) } if changed_file['path'][0] == '"' and changed_file['path'][-1] == '"': changed_file['path'] = changed_file['path'][1:-1] revision["changed_paths"].append(changed_file) if revision: revisions.append(revision) return revisions def annotate(self, path, revision_obj="HEAD"): """ Returns an annotation for a specified file @type path: string @param path: The absolute path to a tracked file @type revision: string @param revision: HEAD or a sha1 hash """ relative_path = self.get_relative_path(path) cmd = ["git", "annotate", "-l", revision_obj, relative_path] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) stdout = [] returner = [] for line in stdout: components = re.split("\t", line, 3) if len(components) < 4: continue dt = datetime(*time.strptime(components[2][:-6],"%Y-%m-%d %H:%M:%S")[:-2]) message = components[3].split(")", 1) code = message[1] if len(components) == 5: code = components[4] returner.append({ "revision": components[0], "author": components[1][1:], "date": dt, "line": code, "number": message[0] }) return returner def show(self, path, revision_obj): """ Returns a particular file at a given revision object. @type path: string @param path: The absolute path to a file @type revision_obj: git.Revision() @param revision_obj: The revision object for path """ if not revision_obj: revision_obj = "HEAD" relative_path = self.get_relative_path(path) cmd = ["git", "show", "%s:%s" % (revision_obj, relative_path)] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) stdout = [] return "\n".join(stdout) def diff(self, path1, revision_obj1, path2=None, revision_obj2=None, summarize=False): """ Returns the diff between the path(s)/revision(s) @type path1: string @param path1: The absolute path to a file @type revision_obj1: git.Revision() @param revision_obj1: The revision object for path1 @type path2: string @param path2: The absolute path to a file @type revision_obj2: git.Revision() @param revision_obj2: The revision object for path2 """ relative_path1 = None relative_path2 = None if path1: relative_path1 = self.get_relative_path(path1) if path2: relative_path2 = self.get_relative_path(path2) cmd = ["git", "diff"] if summarize: cmd.append("--name-status") if revision_obj1: cmd += [revision_obj1] if revision_obj2 and path2: cmd += [revision_obj2] if relative_path1: cmd += [relative_path1] if relative_path2 and relative_path2 != relative_path1: cmd += [relative_path2] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) stdout = [] return ''.join(x + "\n" for x in stdout) def diff_summarize(self, path1, revision_obj1, path2=None, revision_obj2=None): results = self.diff(path1, revision_obj1, path2, revision_obj2, True) summary = [] for line in results.split("\n"): if not line: continue (action, path) = (line + "\t").split("\t")[:2] summary.append({ "action": action, "path": path }) return summary def export(self, path, dest_path, revision): """ Exports a file or directory from a given revision @type path: string @param path: The source file/folder to export @type dest_path: string @param dest_path: The path to put the exported file(s) @type revision: string @param revision: The revision/tree/commit of the source file being exported """ tmp_file = get_tmp_path("rabbitvcs-git-export.tar") cmd1 = ["git", "archive", "--format", "tar", "-o", tmp_file, revision, path] cmd2 = ["tar", "-xf", tmp_file, "-C", dest_path] mkdir_p(dest_path) try: (status, stdout, stderr) = GittyupCommand(cmd1, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() (status, stdout, stderr) = GittyupCommand(cmd2, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) stdout = [] self.notify("%s at %s exported to %s" % (path, revision, dest_path)) return "\n".join(stdout) def clean(self, path, remove_dir=True, remove_ignored_too=False, remove_only_ignored=False, dry_run=False, force=True): cmd = ["git", "clean"] if remove_dir: cmd.append("-d") if remove_ignored_too: cmd.append("-x") if remove_only_ignored: cmd.append("-X") if dry_run: cmd.append("-n") if force: cmd.append("-f") relative_path = self.get_relative_path(path) cmd.append(relative_path) try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) return def reset(self, path, revision, type=None): relative_path = self.get_relative_path(path) cmd = ["git", "reset"] if type: cmd.append("--%s" % type) cmd.append(revision) if relative_path: cmd.append(relative_path) try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel()).execute() except GittyupCommandError as e: self.callback_notify(e) return def set_callback_notify(self, func): self.callback_notify = func def set_callback_progress_update(self, func): self.callback_progress_update = func def set_callback_get_user(self, func): self.callback_get_user = func def set_callback_get_cancel(self, func): self.callback_get_cancel = func def notify(self, data): self.callback_notify(data) def notify_and_parse_progress(self, data): # When progress is requested to a git command, it will # respond with the current operation, and that operations current progress # in the following format: ": % (/)". # # When a command has reached 100% the format of this final message assumes the formatt: # ": 100% (/), , done." returnData = {"action":"","path":"","mime_type":""} #print "parsing message: " + str(data) # If data is already a dict, we'll assume it's already been parsed, and return. if isinstance (data, dict): self.notify (data); return # Is this an error? message_components = re.search("^([eE]rror|[fF]atal): (.+)", data) if message_components != None: returnData["action"] = "Error" returnData["path"] = message_components.group(2) self.notify (returnData) return # Check to see if this is a remote command. remote_check = re.search("^(remote: )(.+)$", data) if remote_check != None: returnData["action"] = "Remote" message = remote_check.group(2) else: message = data # First, we'll test to see if this is a progress notification. if "%" not in message: # No, this is just a regular message. # Some messages have a strage tendancy to append a non-printable character, # followed by a right square brace and a capitol "K". This tests for, and # strips these superfluous characters. message_components = re.search("^(.+).\[K", message) if message_components != None: returnData["path"] = message_components.group(1) else: returnData["path"] = message self.notify (returnData) return # Extract the percentage, which will be all numerals directly # prior to '%'. message_components = re.search("^(.+): +([0-9]+)%", message) if message_components == None: print("Error: failed to parse git string: " + data) return fraction = float(message_components.group(2)) / 100 # Convert percentage to fraction. current_action = message_components.group(1) # If we're at 0%, then we want to notify which action we're performing. if fraction == 0: returnData["path"] = current_action self.notify(returnData) #print "stage fraction: " + str (fraction) # If we're using a number of stages, adjust the fraction acordingly. if self.numberOfCommandStages > 0: fraction = (self.numberOfCommandStagesExecuted + fraction) / self.numberOfCommandStages # If we've finished the current stage (100%). if "done" in message: self.numberOfCommandStagesExecuted += 1 # If we've registered a callback for progress, update with the new fraction. if self.callback_progress_update != None: #print "setting pbar: " + str(fraction) self.callback_progress_update(fraction) # If we've finished the whole command (all stages). if fraction == 1 and "done" in message: # Reset stage variables. self.numberOfCommandStages = 0 self.numberOfCommandStagesExecuted = 0 def notify_and_parse_git_pull (self, data): return_data = {"action":"","path":"","mime_type":""} message_parsed = False # Look for "From" line (e.g. "From ssh://server:22/my_project") message_components = re.search("^From (.+)", data) if message_components != None: return_data["action"] = "From" return_data["path"] = message_components.group(1) message_parsed = True # Look for "Branch" line (e.g. "* branch master -> FETCH_HEAD") message_components = re.search("\* branch +([A-z0-9]+) +-> (.+)", data) if message_components != None: return_data["action"] = "Branch" return_data["path"] = message_components.group(1) + " -> " + message_components.group(2) message_parsed = True # Look for a file line (e.g. "src/somefile.py | 5 -++++") message_components = re.search(" +(.+) +\| *([0-9]+) ([+-]+)", data) if message_components != None: return_data["action"] = "Modified" return_data["path"] = message_components.group(1) return_data["mime_type"] = message_components.group(2) + " " + message_components.group(3) message_parsed = True # Look for a updating line (e.g. "Updating ffffff..ffffff") message_components = re.search("^Updating ([a-f0-9.]+)", data) if message_components != None: return_data["action"] = "Updating" return_data["path"] = message_components.group(1) message_parsed = True # Look for a "create mode" line (e.g. "create mode 100755 file.py") message_components = re.search("create mode ([0-9]+) (.+)", data) if message_components != None: return_data["action"] = "Create" return_data["path"] = message_components.group(2) return_data["mime_type"] = "mode: " + message_components.group(1) message_parsed = True # Look for a "delete mode" line (e.g. "create mode 100755 file.py") message_components = re.search("delete mode ([0-9]+) (.+)", data) if message_components != None: return_data["action"] = "Delete" return_data["path"] = message_components.group(2) return_data["mime_type"] = "mode: " + message_components.group(1) message_parsed = True # Look for an "Auto-merging" line (e.g. "Auto-merging src/file.py") message_components = re.search("^Auto-merging (.+)", data) if message_components != None: return_data["action"] = "Merging" return_data["path"] = message_components.group(1) message_parsed = True # Look for a "binary" line (e.g. "icons/file.png" | Bin 0 -> 55555 bytes) message_components = re.search("^[ ](.+) +\| Bin ([0-9]+ -> [0-9]+ bytes)", data) if message_components != None: return_data["action"] = "Binary" return_data["path"] = message_components.group(1) return_data["mime_type"] = message_components.group(2) message_parsed = True # Look for a "rename" line (e.g. "rename src/{foo.py => bar.py} (50%)") message_components = re.search("rename (.+}) \([0-9]+%\)", data) if message_components != None: return_data["action"] = "Rename" return_data["path"] = message_components.group(1) message_parsed = True # Look for a "copy" line (e.g. "copy src/{foo.py => bar.py} (50%)") message_components = re.search("copy (.+}) \([0-9]+%\)", data) if message_components != None: return_data["action"] = "Copy" return_data["path"] = message_components.group(1) message_parsed = True # Prepend "Error" to conflict lines. e.g. : # CONFLICT (content): Merge conflict in file.py. # Automatic merge failed; fix conflicts and then commit the result. message_components = re.search("^CONFLICT \(|Automatic merge failed", data) if message_components != None: return_data["action"] = "Error" return_data["path"] = data message_parsed = True if message_parsed == False: return_data = data self.notify_and_parse_progress (return_data) def notify_and_parse_git_push (self, data): return_data = {"action":"","path":"","mime_type":""} message_parsed = False # Look for to line. e.g. "To gitosis@server.org:project.git". Exclude any # lines that include a space (as this could be a message about something else) message_components = re.search("^To ([^ ]+$)", data) if message_components != None: return_data["action"] = "To" return_data["path"] = message_components.group(1) message_parsed = True # Look for "new branch" line. e.g. " * [new branch] master -> master" message_components = re.search("^ \* \[new branch\] +(.+) -> (.+)", data) if message_components != None: return_data["action"] = "New Branch" return_data["path"] = message_components.group(1) + " -> " + message_components.group(2) message_parsed = True # Look for "rejected" line. e.g. " ![rejected] master -> master (non-fast-forward)". message_components = re.search("!\[rejected\] +(.+)", data) if message_components != None: return_data["action"] = "Rejected" return_data["path"] = message_components.group(1) message_parsed = True if message_parsed == False: return_data = data self.notify_and_parse_progress (return_data) def get_cancel(self): return self.callback_get_cancel def center(self, window): # Temporarily hide the window to avoid update_idletasks() drawing the window in the wrong position. window.withdraw() # Update "requested size" from geometry manager. window.update_idletasks() x = (window.winfo_screenwidth() - window.winfo_reqwidth()) / 2 y = (window.winfo_screenheight() - window.winfo_reqheight()) / 2 window.geometry("+%d+%d" % (x, y)) # Draw the window frame immediately after setting correct window position. window.deiconify() rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/command.py000066400000000000000000000035631362112712700224640ustar00rootroot00000000000000from __future__ import absolute_import # # command.py # import subprocess import fcntl import select import codecs import os from .exceptions import GittyupCommandError from rabbitvcs.util.strings import * def notify_func(data): pass def cancel_func(): return False class GittyupCommand(object): def __init__(self, command, cwd=None, notify=None, cancel=None): self.command = command self.notify = notify_func if notify: self.notify = notify self.cancel = cancel_func if cancel: self.cancel = cancel self.cwd = cwd if not self.cwd: self.cwd = os.getcwd() def get_lines(self, val): returner = [] lines = val.rstrip("\n").split("\n") for line in lines: returner.append(line.rstrip("\x1b[K\n")) return returner def execute(self): env = os.environ.copy() env["LANG"] = "C"; env["PYTHONIOENCODING"] = "UTF-8" env["GIT_TERMINAL_PROMPT"] = "0" env["GIT_SSL_CERT_PASSWORD_PROTECTED"] = "" proc = subprocess.Popen(self.command, cwd=self.cwd, stdin=None, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=env, close_fds=True, preexec_fn=os.setsid) out = codecs.getreader(UTF8_ENCODING)(proc.stdout, SURROGATE_ESCAPE) stdout = [] while True: line = out.readline() if line == '': break line = line.rstrip("\r\n") # Strip trailing newline. self.notify(line) stdout.append(line) if self.cancel(): proc.kill() return (0, stdout, None) rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/exceptions.py000066400000000000000000000005771362112712700232310ustar00rootroot00000000000000# # exceptions.py # class NotRepositoryError(Exception): """Indicates that no Git repository was found.""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) class GittyupCommandError(Exception): """Indicates a command returned an error""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/objects.py000066400000000000000000000072421362112712700224750ustar00rootroot00000000000000# # objects.py # class GittyupStatus(object): path = None is_staged = False def __init__(self, path): self.path = path def __repr__(self): return "" % (self.path, self.identifier) def __eq__(self, other): return (self.identifier == other.identifier) class NormalStatus(GittyupStatus): identifier = "normal" class AddedStatus(GittyupStatus): identifier = "added" class RenamedStatus(GittyupStatus): identifier = "renamed" class RemovedStatus(GittyupStatus): identifier = "removed" class ModifiedStatus(GittyupStatus): identifier = "modified" class KilledStatus(GittyupStatus): identifier = "killed" class UntrackedStatus(GittyupStatus): identifier = "untracked" class MissingStatus(GittyupStatus): identifier = "missing" class IgnoredStatus(GittyupStatus): identifier = "ignored" class NoStatus(GittyupStatus): identifier = "" def __eq__(self, other): return (self.path == other.path) class GittyupObject(object): def __init__(self, sha, obj): self.sha = sha self.obj = obj class Commit(GittyupObject): def __init__(self, sha, obj, changed_paths=[]): self.sha = sha self.obj = obj self.changed_paths = changed_paths def __repr__(self): return "" % self.sha @property def parents(self): return self.obj.parents @property def author(self): return self.obj.author @property def committer(self): return self.obj.committer @property def message(self): return self.obj.message @property def commit_time(self): return self.obj.commit_time @property def commit_timezone(self): return self.obj.commit_timezone @property def author_time(self): return self.obj.author_time @property def author_timezone(self): return self.obj.author_timezone @property def encoding(self): return self.obj.encoding def __eq__(self, other): return self.sha == other.sha class Tag(GittyupObject): def __repr__(self): return "" % self.sha @property def name(self): return self.obj.name @property def tag_type(self): return self.obj.type @property def message(self): return self.obj.message @property def tagger(self): return self.obj.tagger @property def tag_time(self): return self.obj.tag_time @property def tag_timezone(self): return self.obj.tag_timezone class CommitTag(Commit): def __init__(self, name, sha, obj): self._name = name self.sha = sha self.obj = obj def __repr__(self): return "" % (self.name, self.sha) @property def name(self): return self._name def __eq__(self, other): return (self.name == other) @property def tag_type(self): return "" @property def message(self): return self.obj.message @property def tagger(self): return self.obj.committer @property def tag_time(self): return self.obj.commit_time @property def tag_timezone(self): return self.obj.commit_timezone class Tree(GittyupObject): def __repr__(self): return "" % self.sha class Branch(Commit): def __init__(self, name, sha, obj): self._name = name self.sha = sha self.obj = obj def __repr__(self): return "" % (self.name, self.sha) @property def name(self): return self._name def __eq__(self, other): return (self.name == other) rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/000077500000000000000000000000001362112712700216275ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/branch.py000066400000000000000000000031711362112712700234400ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from util import touch parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "branch" if options.cleanup: rmtree(DIR, ignore_errors=True) print("branch.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient() g.initialize_repository(DIR) touch(DIR + "/test1.txt") touch(DIR + "/test2.txt") g.stage([DIR+"/test1.txt", DIR+"/test2.txt"]) g.commit("This is a commit") # Create a new branch, don't track it g.branch("branch1") assert "branch1" in [x['name'] for x in g.branch_list()] # Make sure we are still tracking master assert (g.is_tracking("refs/heads/master")) # Track branch1 g.track("refs/heads/branch1") assert (g.is_tracking("refs/heads/branch1")) # Rename branch1 to branch1b g.branch_rename("branch1", "branch1b") assert "branch1b" in [x['name'] for x in g.branch_list()] # Make sure we are now tracking branch1b assert (g.is_tracking("refs/heads/branch1b")) # Delete branch1b g.branch_delete("branch1b") assert ("branch1b" not in g.branch_list()) # Make sure we are now tracking master assert (g.is_tracking("refs/heads/master")) print("branch.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/clone.py000066400000000000000000000013721362112712700233040ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/clone.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from util import touch parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "clone" if options.cleanup: rmtree(DIR, ignore_errors=True) print("clone.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") g = GittyupClient() g.clone("git://github.com/adamplumb/sprout.git", DIR) print("clone.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/commit.py000066400000000000000000000021021362112712700234640ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from gittyup.objects import * from util import touch, change parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "commit" if options.cleanup: rmtree(DIR, ignore_errors=True) print("commit.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient() g.initialize_repository(DIR) touch(DIR + "/test1.txt") touch(DIR + "/test2.txt") g.stage([DIR+"/test1.txt", DIR+"/test2.txt"]) g.commit("First commit", commit_all=True) change(DIR + "/test1.txt") g.stage([DIR+"/test1.txt"]) g.commit("Second commit", author="Alex Plumb ") print("commit.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/data/000077500000000000000000000000001362112712700225405ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/data/config/000077500000000000000000000000001362112712700240055ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/data/config/config.example000066400000000000000000000005641362112712700266340ustar00rootroot00000000000000# # This is the config file, and # a '#' or ';' character indicates # a comment # ; core variables [core] ; Don't trust file modes filemode = false ; Our diff algorithm [diff] external = /usr/local/bin/diff-wrapper renames = true ; Proxy settings [core] gitproxy="proxy-command" gitproxy=default-proxy ; for all the rest rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/move.py000066400000000000000000000035041362112712700231510ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from gittyup.objects import * from util import touch, change parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "move" if options.cleanup: rmtree(DIR, ignore_errors=True) print("move.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") g = GittyupClient(DIR, create=True) touch(DIR + "/test.txt") # Stage and commit the file g.stage([DIR+"/test.txt"]) g.commit("Adding test.txt") st = g.status() # Move file explicity test os.mkdir(DIR+"/fol") g.move(DIR+"/test.txt", DIR+"/fol/test.txt") st = g.status() assert (not os.path.exists(DIR+"/test.txt")) assert (os.path.exists(DIR+"/fol/test.txt")) assert (g.is_staged(DIR+"/fol/test.txt")) assert (st[0] == RemovedStatus) assert (st[1] == AddedStatus) # Move as children test touch(DIR + "/test2.txt") g.stage([DIR+"/test2.txt"]) g.commit("Adding test2.txt") g.move(DIR+"/test2.txt", DIR+"/fol") st = g.status() assert (not os.path.exists(DIR+"/test2.txt")) assert (os.path.exists(DIR+"/fol/test2.txt")) assert (g.is_staged(DIR+"/fol/test2.txt")) assert (st[1] == RemovedStatus) assert (st[2] == AddedStatus) g.commit("Committing the test2 move") g.move(DIR+"/fol", DIR+"/bar") st = g.status() assert (os.path.exists(DIR+"/bar/test.txt")) assert (st[0] == RemovedStatus) assert (st[2] == AddedStatus) print("move.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/pull.py000066400000000000000000000014571362112712700231640ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/pull.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from util import touch parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "pull" if options.cleanup: rmtree(DIR, ignore_errors=True) print("pull.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") g = GittyupClient(DIR, create=True) g.remote_add("origin", "git://github.com/adamplumb/gittyup.git") g.pull("origin", "master") print("pull.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/remote.py000066400000000000000000000017611362112712700235010ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/remote.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from util import touch parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "remote" if options.cleanup: rmtree(DIR, ignore_errors=True) print("remote.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient(DIR, create=True) g.remote_add("origin", "git://github.com/adamplumb/sprout.git") l = g.remote_list() assert (len(l) == 1) assert (l[0]["host"] == "git://github.com/adamplumb/sprout.git") g.remote_delete("origin") l = g.remote_list() assert (len(l) == 0) print("remote.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/remove.py000066400000000000000000000026731362112712700235060ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from gittyup.objects import * from util import touch, change parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "remove" if options.cleanup: rmtree(DIR, ignore_errors=True) print("remove.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient() g.initialize_repository(DIR) touch(DIR + "/test.txt") # Stage and commit the file g.stage([DIR+"/test.txt"]) g.commit("Adding test.txt") g.remove([DIR+"/test.txt"]) st = g.status() assert (not os.path.exists(DIR+"/test.txt")) assert (g.is_staged(DIR+"/test.txt")) assert (st[0] == RemovedStatus) g.unstage([DIR+"/test.txt"]) st = g.status() assert (not os.path.exists(DIR+"/test.txt")) assert (not g.is_staged(DIR+"/test.txt")) assert (st[0] == MissingStatus) g.checkout([DIR+"/test.txt"]) st = g.status() assert (os.path.exists(DIR+"/test.txt")) assert (not g.is_staged(DIR+"/test.txt")) assert (st[0] == NormalStatus) print("remove.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/run_all.py000077500000000000000000000011031362112712700236330ustar00rootroot00000000000000from __future__ import absolute_import #!/usr/bin/python from sys import argv import os import subprocess def cleanup(modules): for module in modules: subprocess.call(["python", module, "--cleanup"]) modules = [ "branch.py", "stage.py", "commit.py", "tag.py", "remove.py", "clone.py", "move.py", "pull.py", "remote.py" ] if len(argv) == 2 and argv[1] == "--cleanup": cleanup(modules) for module in modules: if subprocess.call(["python", module]) == 1: raise SystemExit("Module test failed") cleanup(modules) rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/stage.py000066400000000000000000000040301362112712700233010ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from gittyup.objects import * from util import touch, change parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "stage" if options.cleanup: rmtree(DIR, ignore_errors=True) print("stage.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient() g.initialize_repository(DIR) touch(DIR + "/test1.txt") touch(DIR + "/test2.txt") # Stage both files g.stage([DIR+"/test1.txt", DIR+"/test2.txt"]) st = g.status(DIR) assert (st[0] == AddedStatus), st assert (st[1] == AddedStatus) assert (st[0].is_staged) # Unstage both files g.unstage([DIR+"/test1.txt", DIR+"/test2.txt"]) st = g.status(DIR) assert (st[0] == UntrackedStatus) assert (st[1] == UntrackedStatus) assert (not st[0].is_staged) # Untracked files should not be staged g.stage_all() st = g.status(DIR) assert (st[0] == UntrackedStatus) assert (st[1] == UntrackedStatus) # test1.txt is changed, so it should get staged and set as Modified g.stage([DIR+"/test1.txt"]) g.commit("Test commit") change(DIR+"/test1.txt") st = g.status(DIR) assert (st[0] == ModifiedStatus) g.stage_all() st = g.status(DIR) assert (st[0] == ModifiedStatus) assert (g.is_staged(DIR+"/" + st[0].path)) assert (not g.is_staged(DIR+"/" + st[1].path)) # Unstage all staged files g.unstage_all() st = g.status(DIR) assert (not g.is_staged(DIR+"/" + st[0].path)) assert (not g.is_staged(DIR+"/" + st[1].path)) assert (st[0] == ModifiedStatus) assert (st[1] == UntrackedStatus) print("stage.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/tag.py000066400000000000000000000021111362112712700227470ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function # # test/stage.py # import os from shutil import rmtree from sys import argv from optparse import OptionParser from gittyup.client import GittyupClient from gittyup.objects import * from util import touch, change parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "tag" if options.cleanup: rmtree(DIR, ignore_errors=True) print("tag.py clean") else: if os.path.isdir(DIR): raise SystemExit("This test script has already been run. Please call this script with --cleanup to start again") os.mkdir(DIR) g = GittyupClient() g.initialize_repository(DIR) touch(DIR + "/test1.txt") touch(DIR + "/test2.txt") g.stage([DIR+"/test1.txt", DIR+"/test2.txt"]) commit_id = g.commit("First commit", commit_all=True) tag_id = g.tag("tag1", "Tagging as tag1", track=True) assert (g.is_tracking("refs/tags/tag1")) assert (len(g.tag_list()) == 1) print("tag.py pass") rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/tests/util.py000066400000000000000000000003451362112712700231600ustar00rootroot00000000000000from __future__ import absolute_import # # util.py # import os def touch(fname, times = None): with open(fname, 'a'): os.utime(fname, times) def change(path): f = open(path, "a") f.write("1") f.close() rabbitvcs-0.18/rabbitvcs/vcs/git/gittyup/util.py000066400000000000000000000037571362112712700220300ustar00rootroot00000000000000from __future__ import absolute_import # # util.py # import os def splitall(path): """Split a path into all of its parts. From: Python Cookbook, Credit: Trent Mick """ allparts = [] while 1: parts = os.path.split(path) if parts[0] == path: allparts.insert(0, parts[0]) break elif parts[1] == path: allparts.insert(0, parts[1]) break else: path = parts[0] allparts.insert(0, parts[1]) return allparts def relativepath(fromdir, tofile): """Find relative path from 'fromdir' to 'tofile'. An absolute path is returned if 'fromdir' and 'tofile' are on different drives. Martin Bless, 2004-03-22. """ f1name = os.path.abspath(tofile) if os.path.splitdrive(f1name)[0]: hasdrive = True else: hasdrive = False f1basename = os.path.basename(tofile) f1dirname = os.path.dirname(f1name) f2dirname = os.path.abspath(fromdir) f1parts = splitall(f1dirname) f2parts = splitall(f2dirname) if hasdrive and (f1parts[0].lower() != f2parts[0].lower()): "Return absolute path since we are on different drives." return f1name while f1parts and f2parts: if hasdrive: if f1parts[0].lower() != f2parts[0].lower(): break else: if f1parts[0] != f2parts[0]: break del f1parts[0] del f2parts[0] result = ['..' for part in f2parts] result.extend(f1parts) result.append(f1basename) return os.sep.join(result) def get_transport_and_path(uri): from dulwich.client import TCPGitClient, SSHGitClient, SubprocessGitClient for handler, transport in (("git://", TCPGitClient), ("git+ssh://", SSHGitClient)): if uri.startswith(handler): host, path = uri[len(handler):].split("/", 1) return transport(host), "/"+path # if its not git or git+ssh, try a local url.. return SubprocessGitClient(), uri rabbitvcs-0.18/rabbitvcs/vcs/log.py000066400000000000000000000036651362112712700173420ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import rabbitvcs.vcs class LogChangedPath(object): path = "" action = "" copy_from_path = "" copy_from_revision = "" def __init__(self, path, action, copy_from_path, copy_from_revision): self.path = path self.action = action self.copy_from_path = copy_from_path self.copy_from_revision = copy_from_revision class Log(object): date = None revision = None author = None message = None parents = [] head = False # A list of LogChangedFiles elements changed_paths = [] def __init__(self, date, revision, author, message, changed_paths, parents=[], head=False): self.date = date self.revision = revision self.author = author self.message = message self.changed_paths = changed_paths self.parents = parents self.head = head def get_date(self): return self.date def set_date(self, date): self.date = date rabbitvcs-0.18/rabbitvcs/vcs/mercurial/000077500000000000000000000000001362112712700201605ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/mercurial/__init__.py000066400000000000000000000173771362112712700223100ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Concrete VCS implementation for Mercurial functionality. """ from __future__ import absolute_import import os.path from datetime import datetime from mercurial import commands, ui, hg from rabbitvcs.util.strings import S import rabbitvcs.vcs import rabbitvcs.vcs.status import rabbitvcs.vcs.log import rabbitvcs.vcs.mercurial.util from rabbitvcs.vcs.branch import BranchEntry from rabbitvcs.util.log import Log log = Log("rabbitvcs.vcs.mercurial") from rabbitvcs import gettext _ = gettext.gettext class Revision(object): """ Implements a simple revision object as a wrapper around the gittyup revision object. This allows us to provide a standard interface to the object data. """ def __init__(self, kind, value=None): self.kind = kind.upper() self.value = value if self.kind == "HEAD": self.value = "HEAD" self.is_revision_object = True def __str__(self): if self.value: return S(self.value) return S(self.kind) def __unicode__(self): return self.__str__().unicode() def short(self): if self.value: return S(self.value)[0:7] else: return self.kind def __repr__(self): return self.__str__() def primitive(self): return self.value class Mercurial(object): STATUS = { "normal": "C", "added": "A", "removed": "R", "modified": "M", "untracked": "?", "missing": "!" } STATUS_REVERSE = { "C": "normal", "A": "added", "R": "removed", "M": "modified", "?": "untracked", "!": "missing" } STATUSES_FOR_REVERT = [ "missing", "modified", "removed" ] STATUSES_FOR_COMMIT = [ "untracked", "missing", "modified", "added", "removed" ] STATUSES_FOR_STAGE = [ "untracked" ] STATUSES_FOR_UNSTAGE = [ "added" ] def __init__(self, repo=None): self.vcs = rabbitvcs.vcs.VCS_MERCURIAL self.interface = "mercurial" self.ui = ui.ui() self.repository = None if repo: self.repository_path = repo self.repository = hg.repository(self.ui, self.repository_path) self.cache = rabbitvcs.vcs.status.StatusCache() def set_repository(self, path): self.repository_path = path self.repository = hg.repository(self.ui, self.repository_path) def get_repository(self): return self.repository_path def find_repository_path(self, path): path_to_check = path while path_to_check != "/" and path_to_check != "": if os.path.isdir(os.path.join(path_to_check, ".hg")): return path_to_check path_to_check = os.path.split(path_to_check)[0] return None def get_relative_path(self, path): if path == self.repository_path: return "" return rabbitvcs.vcs.mercurial.util.relativepath(self.repository_path, path) def get_absolute_path(self, path): return os.path.join(self.repository_path, path).rstrip("/") def statuses(self, path, recurse=True, invalidate=False): mercurial_statuses = self.repository.status(clean=True, unknown=True) # the status method returns a series of tuples filled with files matching # the statuses below tuple_order = ["modified", "added", "removed", "missing", "unknown", "ignored", "clean"] # go through each tuple (each of which has a defined status), and # generate a flat list of rabbitvcs statuses statuses = [] index = 0 directories = {} for status_tuple in mercurial_statuses: content = tuple_order[index] for item in status_tuple: st_path = self.get_absolute_path(item) rabbitvcs_status = rabbitvcs.vcs.status.MercurialStatus({ "path": st_path, "content": content }) statuses.append(rabbitvcs_status) # determine the statuses of the parent folders dir_content = content if content in self.STATUSES_FOR_REVERT: dir_content = "modified" path_to_check = os.path.dirname(st_path) while True: if path_to_check not in directories or directories[path_to_check] not in self.STATUSES_FOR_COMMIT: rabbitvcs_status = rabbitvcs.vcs.status.MercurialStatus({ "path": path_to_check, "content": dir_content }) statuses.append(rabbitvcs_status) directories[path_to_check] = dir_content if path_to_check == "" or path_to_check == self.repository_path: break path_to_check = os.path.split(path_to_check)[0] index += 1 return statuses def status(self, path, summarize=True, invalidate=False): all_statuses = self.statuses(path, invalidate=invalidate) if summarize: path_status = None for st in all_statuses: if st.path == path: path_status = st break if path_status: path_status.summary = path_status.single else: path_status = rabbitvcs.vcs.status.Status.status_unknown(path) else: path_status = all_statuses[0] return path_status def is_working_copy(self, path): if (os.path.isdir(path) and os.path.isdir(os.path.join(path, ".hg"))): return True return False def is_in_a_or_a_working_copy(self, path): if self.is_working_copy(path): return True return (self.find_repository_path(os.path.split(path)[0]) != "") def is_versioned(self, path): if self.is_working_copy(path): return True st = self.status(path) try: return st.is_versioned() except Exception as e: log.error(e) return False return False def is_locked(self, path): return False def get_items(self, paths, statuses=[]): if paths is None: return [] items = [] for path in paths: st = self.statuses(path, invalidate=True) for st_item in st: if st_item.content == "modified" and os.path.isdir(st_item.path): continue if st_item.content in statuses or len(statuses) == 0: items.append(st_item) return items # # Actions # rabbitvcs-0.18/rabbitvcs/vcs/mercurial/util.py000066400000000000000000000047621362112712700215200ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os def splitall(path): """Split a path into all of its parts. From: Python Cookbook, Credit: Trent Mick """ allparts = [] while 1: parts = os.path.split(path) if parts[0] == path: allparts.insert(0, parts[0]) break elif parts[1] == path: allparts.insert(0, parts[1]) break else: path = parts[0] allparts.insert(0, parts[1]) return allparts def relativepath(fromdir, tofile): """Find relative path from 'fromdir' to 'tofile'. An absolute path is returned if 'fromdir' and 'tofile' are on different drives. Martin Bless, 2004-03-22. """ f1name = os.path.abspath(tofile) if os.path.splitdrive(f1name)[0]: hasdrive = True else: hasdrive = False f1basename = os.path.basename(tofile) f1dirname = os.path.dirname(f1name) f2dirname = os.path.abspath(fromdir) f1parts = splitall(f1dirname) f2parts = splitall(f2dirname) if hasdrive and (f1parts[0].lower() != f2parts[0].lower()): "Return absolute path since we are on different drives." return f1name while f1parts and f2parts: if hasdrive: if f1parts[0].lower() != f2parts[0].lower(): break else: if f1parts[0] != f2parts[0]: break del f1parts[0] del f2parts[0] result = ['..' for part in f2parts] result.extend(f1parts) result.append(f1basename) return os.sep.join(result) rabbitvcs-0.18/rabbitvcs/vcs/status.py000066400000000000000000000373321362112712700201020ustar00rootroot00000000000000from __future__ import absolute_import # # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2010 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # import os.path import unittest import six from datetime import datetime import rabbitvcs.vcs from rabbitvcs.util.strings import S from rabbitvcs.util.log import Log from six.moves import range log = Log("rabbitvcs.vcs.status") from rabbitvcs import gettext _ = gettext.gettext # These are the statuses that we might represent with icons status_normal = 'normal' status_modified = 'modified' status_added = 'added' status_deleted = 'deleted' status_ignored = 'ignored' status_read_only = 'read-only' status_locked = 'locked' status_unknown = 'unknown' # Specifically: this means something IN A WORKING COPY but not added status_unversioned = 'unversioned' status_missing = 'missing' status_replaced = 'replaced' # "complicated" = anything we display with that exclamation mark icon status_complicated = 'complicated' status_calculating = 'calculating' status_error = 'error' MODIFIED_CHILD_STATUSES = [ status_modified, status_added, status_deleted, status_missing, status_replaced ] class StatusCache(object): keys = [ None, status_normal, status_modified, status_added, status_deleted, status_ignored, status_read_only, status_locked, status_unknown, status_unversioned, status_missing, status_replaced, status_complicated, status_calculating, status_error ] authors = [] revisions = [] def __init__(self): self.cache = {} def __setitem__(self, path, status): try: content_index = self.keys.index(status.simple_content_status()) metadata_index = self.keys.index(status.simple_metadata_status()) try: author_index = self.authors.index(status.author) except ValueError as e: self.authors.append(status.author) author_index = len(self.authors) -1 try: revision_index = self.revisions.index(status.revision) except ValueError as e: self.revisions.append(status.revision) revision_index = len(self.revisions) -1 self.cache[path] = ( status.__class__, content_index, metadata_index, revision_index, author_index, status.date ) except Exception as e: log.debug(e) def __getitem__(self, path): try: (statusclass, content_index, metadata_index, revision_index, author_index, date) = self.cache[path] content = self.keys[content_index] metadata = self.keys[metadata_index] revision = self.revisions[revision_index] author = self.authors[author_index] status = Status(path, content, metadata, revision=revision, author=author, date=date) status.__class__ = statusclass return status except Exception as e: log.debug(e) def __delitem__(self, path): try: del self.cache[path] except KeyError as e: log.debug(e) def __contains__(self, path): return path in self.cache def find_path_statuses(self, path): statuses = [] if os.path.isdir(path): for key, value in list(self.cache.items()): if key.startswith(path): statuses.append(self.__getitem__(key)) else: statuses.append(self.__getitem__(path)) return statuses class Status(object): @staticmethod def status_unknown(path): return Status(path, status_unknown, summary = status_unknown) @staticmethod def status_error(path): return Status(path, status_error, summary = status_error) @staticmethod def status_calc(path): return Status(path, status_calculating, summary = status_calculating) vcs_type = rabbitvcs.vcs.VCS_DUMMY clean_statuses = ['unchanged'] content_status_map = None metadata_status_map = None def __init__(self, path, content, metadata=None, summary=None, revision=None, author=None, date=None): """ The status objects accepts the following items @type path: string @param path: The path to the item @type content: string @param content: The content status @type metadata: string @param metadata: The property status @type summary: string @param summary: The summary status @type revision: string or int @param revision: The last commit revision of the item @type author: string @param author: The commit author @type date: int @param date: The timestamp of the commit time """ self.path = path self.content = content self.metadata = metadata self.remote_content = None self.remote_metadata = None self.single = self._make_single_status() self.summary = summary self.revision = revision self.author = author self.date = date def _make_single_status(self): """ Given our text_status and a prop_status, simplify to a single "simple" status. If we don't know how to simplify our particular combination of status, call it an error. """ # Content status dominates single = self.simple_content_status() or status_error if single in Status.clean_statuses: if self.metadata: single = self.simple_metadata_status() or status_error return single def simple_content_status(self): if self.content_status_map: return self.content_status_map.get(self.content, self.content) else: return self.content def simple_metadata_status(self): if self.metadata and self.metadata_status_map: return self.metadata_status_map.get(self.metadata) else: return self.metadata def make_summary(self, child_statuses = []): """ Summarises statuses for directories. """ summary = status_unknown status_set = set([st.single for st in child_statuses]) if not status_set: self.summary = self.single if status_complicated in status_set: self.summary = status_complicated elif self.single in ["added", "modified", "deleted"]: # These take priority over child statuses self.summary = self.single elif len(set(MODIFIED_CHILD_STATUSES) & status_set): self.summary = status_modified else: self.summary = self.single return summary def is_versioned(self): return self.single is not status_unversioned def is_modified(self): # This may need to be more sophisticated... eg. is read-only modified? # Unknown? etc... return self.single is not status_normal def has_modified(self): # Includes self being modified! return self.summary is not status_normal def __repr__(self): return "<%s %s (%s) %s/%s>" % (_("RabbitVCS status for"), self.path, self.vcs_type, self.simple_content_status(), self.simple_metadata_status()) def __getstate__(self): attrs = self.__dict__.copy() # Force strings to Unicode to avoid json implicit conversion. for key in attrs: if isinstance(attrs[key], (six.string_types, six.text_type)): attrs[key] = S(attrs[key]).unicode() attrs['__type__'] = type(self).__name__ attrs['__module__'] = type(self).__module__ return attrs def __setstate__(self, state_dict): del state_dict['__type__'] del state_dict['__module__'] # Store strings in native str type. for key in state_dict: if isinstance(state_dict[key], (six.string_types, six.text_type)): state_dict[key] = str(S(state_dict[key])) self.__dict__ = state_dict class SVNStatus(Status): vcs_type = rabbitvcs.vcs.VCS_SVN content_status_map = { 'normal': status_normal, 'added': status_added, 'missing': status_missing, 'unversioned': status_unversioned, 'deleted': status_deleted, 'replaced': status_modified, 'modified': status_modified, 'merged': status_modified, 'conflicted': status_complicated, 'ignored': status_ignored, 'obstructed': status_complicated, # FIXME: is this the best representation of 'externally populated'? 'external': status_normal, 'incomplete': status_complicated } metadata_status_map = { 'normal': status_normal, 'none': status_normal, 'modified': status_modified } #external - an unversioned path populated by an svn:external property #incomplete - a directory doesn't contain a complete entries list def __init__(self, pysvn_status): revision = author = date = None if pysvn_status.entry: revision = int(pysvn_status.entry.commit_revision.number) author = pysvn_status.entry.commit_author date = int(pysvn_status.entry.commit_time) # There is a potential problem here: I'm pretty sure that PySVN statuses # do NOT have translatable representations, so this will always come out # to be 'normal', 'modified' etc Status.__init__( self, pysvn_status.path, content=str(pysvn_status.text_status), metadata=str(pysvn_status.prop_status), revision=revision, author=author, date=date ) # self.remote_content = getattr(pysvn_status, "repos_text_status", None) # self.remote_metadata = getattr(pysvn_status, "repos_prop_status", None) self.remote_content = str(pysvn_status.repos_text_status) self.remote_metadata = str(pysvn_status.repos_prop_status) class GitStatus(Status): vcs_type = 'git' content_status_map = { 'normal': status_normal, 'added': status_added, 'missing': status_missing, 'untracked': status_unversioned, 'removed': status_deleted, 'modified': status_modified, 'renamed': status_modified, 'ignored': status_ignored } metadata_status_map = { 'normal': status_normal, None: status_normal } def __init__(self, gittyup_status): super(GitStatus, self).__init__( gittyup_status.path, content=str(gittyup_status.identifier), metadata=None) class MercurialStatus(Status): vcs_type = 'mercurial' content_status_map = { 'clean': status_normal, 'added': status_added, 'missing': status_missing, 'unknown': status_unversioned, 'removed': status_deleted, 'modified': status_modified, 'ignored': status_ignored } metadata_status_map = { 'normal': status_normal, None: status_normal } def __init__(self, mercurial_status): super(MercurialStatus, self).__init__( mercurial_status["path"], content=str(mercurial_status["content"]), metadata=None) STATUS_TYPES = [ Status, SVNStatus, GitStatus, MercurialStatus ] class TestStatusObjects(unittest.TestCase): @classmethod def __initclass__(self): self.base = "/path/to/test" self.children = [ os.path.join(self.base, chr(x)) for x in range(97,123) ] def testsingle_clean(self): status = Status(self.base, status_normal) self.assertEqual(status.single, status_normal) def testsingle_changed(self): status = Status(self.base, status_modified) self.assertEqual(status.single, status_modified) def testsingle_propclean(self): status = Status(self.base, status_normal, status_normal) self.assertEqual(status.single, status_normal) def testsingle_propchanged(self): status = Status(self.base, status_normal, status_modified) self.assertEqual(status.single, status_modified) def testsummary_clean(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_normal) def testsummary_changed(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_modified) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_modified) def testsummary_added(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_added) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_modified) def testsummary_complicated(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_complicated) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_complicated) def testsummary_propchange(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_normal, status_modified) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_modified) def testsummary_bothchange(self): top_status = Status(self.base, status_normal) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_complicated, status_modified) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_complicated) def testsummary_topadded(self): top_status = Status(self.base, status_added) child_sts = [Status(path, status_normal) for path in self.children] child_sts[1] = Status(child_sts[1].path, status_modified, status_modified) top_status.make_summary(child_sts) self.assertEqual(top_status.summary, status_added) TestStatusObjects.__initclass__() if __name__ == "__main__": unittest.main() rabbitvcs-0.18/rabbitvcs/vcs/svn/000077500000000000000000000000001362112712700170035ustar00rootroot00000000000000rabbitvcs-0.18/rabbitvcs/vcs/svn/__init__.py000066400000000000000000001647311362112712700211300ustar00rootroot00000000000000# # This is an extension to the Nautilus file manager to allow better # integration with the Subversion source control system. # # Copyright (C) 2006-2008 by Jason Field # Copyright (C) 2007-2008 by Bruce van der Kooij # Copyright (C) 2008-2008 by Adam Plumb # # RabbitVCS 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. # # RabbitVCS 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 RabbitVCS; If not, see . # """ Concrete VCS implementation for Subversion functionality. """ from __future__ import absolute_import import subprocess import os import shutil import os.path from os.path import isdir, isfile, dirname, islink, realpath from datetime import datetime import pysvn import rabbitvcs.vcs import rabbitvcs.vcs.status import rabbitvcs.vcs.log from rabbitvcs.util import helper from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import structure_map from rabbitvcs.util.strings import * import six from six.moves import map from six.moves import range log = Log("rabbitvcs.vcs.svn") from rabbitvcs import gettext _ = gettext.gettext # Extra "action" for "commit completed" commit_completed = "commit_completed" @structure_map def pure_unicode(obj): """ Map object string subclass components to real unicode type. Pysvn (using PyCXX) does not like string subclasses as arguments and requires unsubclassed string/unicode objects. In addition, it fails on Python2 non-ascii byte strings when converting them to utf-8. This function is called each time there is a risk of passing string or unicode objects to the pysvn API. """ if isinstance(obj, (six.string_types, six.text_type)): obj = S(obj).unicode() return obj class Revision(object): """ Implements a simple revision object as a wrapper around the pysvn revision object. This allows us to provide a standard interface to the object data. """ KINDS = { "unspecified": pysvn.opt_revision_kind.unspecified, "number": pysvn.opt_revision_kind.number, "date": pysvn.opt_revision_kind.date, "committed": pysvn.opt_revision_kind.committed, "previous": pysvn.opt_revision_kind.previous, "working": pysvn.opt_revision_kind.working, "head": pysvn.opt_revision_kind.head, "base": pysvn.opt_revision_kind.base } def __init__(self, kind, value=None): self.kind = S(kind).lower() self.value = value self.is_revision_object = True # TODO Shift to options factory? if self.value and str(self.value).lower().strip() == 'head': self.kind = "head" if self.value is None and self.kind in ("number", "date"): self.kind = "head" if self.kind == "head": self.value = None self.__revision_kind = self.KINDS[self.kind] self.__revision = None try: if self.value is not None: self.__revision = pysvn.Revision(self.__revision_kind, self.value) else: self.__revision = pysvn.Revision(self.__revision_kind) except Exception as e: log.exception(e) def __str__(self): if self.value: return S(self.value) return S(self.kind) def __unicode__(self): return self.__str__().unicode() def short(self): return self.__str__() def __repr__(self): return self.__str__() def primitive(self): return self.__revision class SVN(object): """ """ STATUS = { "none" : pysvn.wc_status_kind.none, "unversioned" : pysvn.wc_status_kind.unversioned, "normal" : pysvn.wc_status_kind.normal, "added" : pysvn.wc_status_kind.added, "missing" : pysvn.wc_status_kind.missing, "deleted" : pysvn.wc_status_kind.deleted, "replaced" : pysvn.wc_status_kind.replaced, "modified" : pysvn.wc_status_kind.modified, "merged" : pysvn.wc_status_kind.merged, "conflicted" : pysvn.wc_status_kind.conflicted, "ignored" : pysvn.wc_status_kind.ignored, "obstructed" : pysvn.wc_status_kind.obstructed, "external" : pysvn.wc_status_kind.external, "incomplete" : pysvn.wc_status_kind.incomplete } STATUSES_FOR_COMMIT = list(map(str, [ pysvn.wc_status_kind.unversioned, pysvn.wc_status_kind.added, pysvn.wc_status_kind.deleted, pysvn.wc_status_kind.replaced, pysvn.wc_status_kind.modified, pysvn.wc_status_kind.missing, pysvn.wc_status_kind.obstructed ])) STATUSES_FOR_REVERT = list(map(str, [ pysvn.wc_status_kind.missing, pysvn.wc_status_kind.added, pysvn.wc_status_kind.modified, pysvn.wc_status_kind.deleted ])) STATUSES_FOR_ADD = list(map(str, [ pysvn.wc_status_kind.unversioned, pysvn.wc_status_kind.obstructed ])) STATUSES_FOR_RESOLVE = list(map(str, [ pysvn.wc_status_kind.conflicted ])) STATUSES_FOR_CHECK = list(map(str, [ pysvn.wc_status_kind.added, pysvn.wc_status_kind.deleted, pysvn.wc_status_kind.replaced, pysvn.wc_status_kind.modified, pysvn.wc_status_kind.missing, pysvn.wc_status_kind.conflicted, ])) PROPERTIES = { "executable": "svn:executable", "mime-type": "svn:mime-type", "ignore": "svn:ignore", "keywords": "svn:keywords", "eol-style": "svn:eol-style", "externals": "svn:externals", "special": "svn:special" } NOTIFY_ACTIONS = { pysvn.wc_notify_action.add: _("Added"), pysvn.wc_notify_action.copy: _("Copied"), pysvn.wc_notify_action.delete: _("Deleted"), pysvn.wc_notify_action.restore: _("Restored"), pysvn.wc_notify_action.revert: _("Reverted"), pysvn.wc_notify_action.failed_revert: _("Failed Revert"), pysvn.wc_notify_action.resolved: _("Resolved"), pysvn.wc_notify_action.skip: _("Skipped"), pysvn.wc_notify_action.update_delete: _("Deleted"), pysvn.wc_notify_action.update_add: _("Added"), pysvn.wc_notify_action.update_started: _("Updating"), pysvn.wc_notify_action.update_update: _("Updated"), pysvn.wc_notify_action.update_completed: _("Completed"), pysvn.wc_notify_action.update_external: _("External"), pysvn.wc_notify_action.status_completed: _("Completed"), pysvn.wc_notify_action.status_external: _("External"), pysvn.wc_notify_action.commit_modified: _("Modified"), pysvn.wc_notify_action.commit_added: _("Added"), pysvn.wc_notify_action.commit_deleted: _("Deleted"), pysvn.wc_notify_action.commit_replaced: _("Replaced"), pysvn.wc_notify_action.commit_postfix_txdelta: _("Changed"), pysvn.wc_notify_action.annotate_revision: _("Annotated"), pysvn.wc_notify_action.locked: _("Locked"), pysvn.wc_notify_action.unlocked: _("Unlocked"), pysvn.wc_notify_action.failed_lock: _("Failed Lock"), pysvn.wc_notify_action.failed_unlock: _("Failed Unlock") } NOTIFY_ACTIONS_COMPLETE = [ pysvn.wc_notify_action.status_completed, pysvn.wc_notify_action.update_completed, commit_completed ] NOTIFY_STATES = { pysvn.wc_notify_state.inapplicable: _("Inapplicable"), pysvn.wc_notify_state.unknown: _("Unknown"), pysvn.wc_notify_state.unchanged: _("Unchanged"), pysvn.wc_notify_state.missing: _("Missing"), pysvn.wc_notify_state.obstructed: _("Obstructed"), pysvn.wc_notify_state.changed: _("Changed"), pysvn.wc_notify_state.merged: _("Merged"), pysvn.wc_notify_state.conflicted: _("Conflicted") } NODE_KINDS_REVERSE = { pysvn.node_kind.none: "none", pysvn.node_kind.file: "file", pysvn.node_kind.dir: "dir", pysvn.node_kind.unknown: "unknown" } def __init__(self): self.client = pysvn.Client() self.interface = "pysvn" self.vcs = rabbitvcs.vcs.VCS_SVN self.cache = rabbitvcs.vcs.status.StatusCache() def statuses(self, path, recurse=True, update=False, invalidate=False): """ Look up the status for path. """ spath = S(path) if spath in self.cache: if invalidate: del self.cache[spath] else: return self.cache.find_path_statuses(spath) on_error = rabbitvcs.vcs.status.Status.status_unknown(path) if not self.is_in_a_or_a_working_copy(path): return [on_error] try: pysvn_statuses = self.client_status(path, depth=pysvn.depth.infinity, update=update) if not len(pysvn_statuses): # This is NOT in the PySVN documentation, but sometimes it # returns an empty list if the file goes missing... return [on_error] else: statuslist = [] for st in pysvn_statuses: # If not recursing, only return the item in question (if a file) # or items directly under the path (if a directory) st_path = S(st.path) cmp_path = os.path.join(path, os.path.basename(st_path)) if not recurse and cmp_path != st_path and st_path != path: continue rabbitvcs_status = rabbitvcs.vcs.status.SVNStatus(st) self.cache[st_path] = rabbitvcs_status statuslist.append(rabbitvcs_status) return statuslist except pysvn.ClientError as ex: # TODO: uncommenting these might not be a good idea #~ traceback.print_exc() log.debug("Exception occurred in SVN.status() for %s" % path) log.exception(ex) return [on_error] def client_info(self, path): if islink(path): path = realpath(path) return self.client.info(pure_unicode(path)) def client_status(self, *args, **kwargs): return self.client.status(*pure_unicode(args), **pure_unicode(kwargs)) def find_repository_path(self, path): path_to_check = path while path_to_check != "/" and path_to_check != "": if os.path.isdir(os.path.join(path_to_check, ".svn")): return path_to_check path_to_check = os.path.split(path_to_check)[0] return None def status(self, path, summarize=True, invalidate=False): spath = S(path) if spath in self.cache: if invalidate: del self.cache[spath] else: st = self.cache[spath] if summarize: st.summary = st.single return st all_statuses = self.statuses(path, recurse=summarize) if summarize: path_status = None for st in all_statuses: if S(st.path) == spath: path_status = st break path_status.make_summary(all_statuses) else: path_status = all_statuses[0] return path_status def is_working_copy(self, path): try: # when a versioned directory is removed and replaced with a # non-versioned directory (one that doesn't have a working copy # administration area, or .svn directory) you can't do a status # call on that item itself (results in an exception). # # Note that this is not a conflict, it's more of a corruption. # And it's associated with the status "obstructed". The only # way to make sure that we're dealing with a working copy # is by verifying the SVN administration area exists. if (isdir(path) and self.client_info(path) and isdir(os.path.join(path, ".svn"))): return True return False except Exception as e: # FIXME: ClientError client in use on another thread #~ log.debug("EXCEPTION in is_working_copy(): %s" % str(e)) return False def is_in_a_or_a_working_copy(self, path): if self.is_working_copy(path): return True if self.find_repository_path(os.path.split(path)[0]): return True return False def is_versioned(self, path): if self.is_working_copy(path): return True else: try: # info will return nothing for an unversioned file inside a working copy if (self.is_in_a_or_a_working_copy(path) and self.client_info(path)): return True except Exception as e: log.exception("is_versioned exception for %s" % path) return False def is_status(self, path, status_kind): try: status = self.status(path, summarize=False) except Exception as e: log.exception("is_status exception for %s" % path) return False # If looking for "NORMAL", then both statuses must be normal (or propstatus=none) # Otherwise, it is an either or situation if status_kind == pysvn.wc_status_kind.normal: return (status.data["text_status"] == status_kind and (status.data["prop_status"] == status_kind or status.data["prop_status"] == pysvn.wc_status_kind.none)) else: return (status.data["text_status"] == status_kind or status.data["prop_status"] == status_kind) return False def is_locked(self, path): is_locked = False path = pure_unicode(path) try: is_locked = self.client.info2(path, recurse=False)[0][1].lock is not None except pysvn.ClientError as e: return False #log.exception("is_locked exception for %s" % path) return is_locked def get_items(self, paths, statuses=[]): """ Retrieves a list of files that have one of a set of statuses @type paths: list @param paths: A list of paths or files. @type statuses: list @param statuses: A list of pysvn.wc_status_kind statuses. @rtype: list @return: A list of statuses """ items = [] for path in paths: sts = self.statuses(path, invalidate=True) for st in sts: if (not statuses) or (st.content in statuses or st.metadata in statuses): items.append(st) return items def get_remote_updates(self, paths): if paths is None: return [] items = [] for path in paths: try: sts = self.statuses(path, update=True, invalidate=True) except Exception as e: log.exception(e) continue for st in sts: if st.remote_content is None and st.remote_metadata is None: continue if st.remote_content == "none" and st.remote_metadata == "none": continue items.append(st) return items def get_repo_url(self, path): """ Retrieve the repository URL for the given working copy path @type path: string @param path: A working copy path. @rtype: string @return: A repository URL. """ # If the given path is a URL, the user is passing a repository url # In that case we already have the url if self.is_path_repository_url(path): return path # If the given path is not part of a working copy, keep trying the # parent path to see if it is part of a working copy path = self.get_versioned_path(os.path.abspath(path)) if not path: return "" returner = "" try: info = self.client_info(path) returner = S(info["url"], IDENTITY_ENCODING).bytes() except Exception as e: log.exception(e) return returner def get_repo_root_url(self, path): """ Retrieve the repository URL for the given working copy path FYI this method was not added until svn 1.6.x @type path: string @param path: A working copy path. @rtype: string @return: A repository URL. """ returner = "" try: info = self.client.info2(pure_unicode(path), recurse=False) returner = info[0][1]["repos_root_URL"] except Exception as e: log.exception(e) return returner def is_path_repository_url(self, path): for proto in ("http://", "https://", "svn://", "svn+ssh://", "file://"): if path.startswith(proto): return True return False def get_revision(self, path): """ Retrieve the current revision number for a path @type path: string @param path: A working copy path. @rtype: integer @return: A repository revision. """ info = self.client_info(path) returner = None try: returner = info["commit_revision"].number except KeyError as e: log.exception("KeyError exception in svn.py get_revision() for %s" % path) except AttributeError as e: log.exception("AttributeError exception in svn.py get_revision() for %s" % path) return returner def get_head(self, path): """ Retrieve the HEAD revision for a repository. @type path: string @param path: A working copy path. @rtype: integer @return: A repository revision. """ info = self.client_info(path) returner = None try: returner = info["revision"].number except KeyError as e: log.exception("KeyError exception in svn.py get_head() for %s" % path) except AttributeError as e: log.exception("AttributeError exception in svn.py get_head() for %s" % path) return returner def find_merge_candidate_revisions(self, from_url, to_path): """ Return the list of revisions from from_url that are not already merged into to_path. @type from_url: string @param from_url: A repository URL to merge from. @type to_path: string @param to_path: A working copy path to merge into. @rtype: list @return: A list of revisions not already merged. """ from_url_root = self.get_repo_root_url(from_url) from_branch = from_url.replace(from_url_root, '') from_branch = from_branch.rstrip('/') merge_info = self.propget(to_path, "svn:mergeinfo") merged_revisions = [] for branch in merge_info.split('\n'): if not branch.startswith(from_branch + ':'): continue revisions = branch.split(':')[1] # branch:rev,rev-rev,... for rev in revisions.split(','): if rev.find('-') != -1: (rev_s, rev_e) = rev.split('-') merged_revisions += list(range(int(rev_s), int(rev_e) + 1)) else: merged_revisions.append(int(rev)) from_log = self.log(from_url, strict_node_history=False) from_revisions = [ int(l.revision.short()) for l in from_log ] to_log = self.log(to_path, strict_node_history=False) to_revisions = [ int(l.revision.short()) for l in to_log ] candidate_revisions = list(set(from_revisions) - set(to_revisions) - set(merged_revisions)) return candidate_revisions # # properties # def get_versioned_path(self, path): """ Generates a safe path to use with the prop* functions. If the given path is unversioned, go to the next path up. @type path: string @param path: A file or directory path. @rtype: string @return: A prop* function-safe path. """ path_to_check = path path_to_use = None while path_to_check != "/" and path_to_check != "": if self.is_versioned(path_to_check): path_to_use = path_to_check return path_to_use path_to_check = os.path.split(path_to_check)[0] return path_to_use def propset(self, path, prop_name, prop_value, overwrite=False, recurse=False): """ Adds an svn property to a path. If the item is unversioned, add a recursive property to the parent path @type path: string @param path: A file or directory path. @type prop_name: string @param prop_name: An svn property name. @type prop_value: string @param prop_value: An svn property value/pattern. @type recurse: boolean @param recurse: If True, the property will be applied to all subdirectories as well. """ path = self.get_versioned_path(path) if overwrite: props = prop_value else: props = self.propget(path, prop_name) props = "%s%s" % (props, prop_value) try: self.client.propset( pure_unicode(prop_name), pure_unicode(props), pure_unicode(path), recurse=recurse ) return True except pysvn.ClientError as e: log.exception("pysvn.ClientError exception in svn.py propset() for %s" % S(path).display()) except TypeError as e: log.exception("TypeError exception in svn.py propset() %s" % S(path).display()) return False def proplist(self, path, rev=None): """ Retrieves a dictionary of properties for a path. @type path: string @param path: A file or directory path. @rtype: dictionary @return: A dictionary of properties. """ path = pure_unicode(path) if rev: returner = self.client.proplist(path, revision=rev) else: returner = self.client.proplist(path) if returner: returner = returner[0][1] else: returner = {} return returner def propget(self, path, prop_name, rev=None): """ Retrieves a dictionary of the prop_value of the given path and prop_name @type path: string @param path: A file or directory path. @type prop_name: string or self.PROPERTIES @param prop_name: An svn property name. @rtype: dictionary @return: A dictionary where the key is the path, the value is the prop_value. """ path = self.get_versioned_path(pure_unicode(path)) prop_name = pure_unicode(prop_name) try: if rev: returner = self.client.propget( prop_name, path, recurse=True, revision=rev ) else: returner = self.client.propget( prop_name, path, recurse=True ) except pysvn.ClientError as e: log.exception("pysvn.ClientError exception in svn.py propget() for %s" % path) return "" try: returner = returner[path] except KeyError as e: returner = "" return returner def propdel(self, path, prop_name, recurse=True): """ Removes a property from a given path @type path: string @param path: A file or directory path. @type prop_name: string or self.PROPERTIES @param prop_name: An svn property name. @type recurse: boolean @param recurse: If True, the property will be deleted from any subdirectories also having the property set. """ path = self.get_versioned_path(path) returner = False try: self.client.propdel( pure_unicode(prop_name), pure_unicode(path), recurse=recurse ) returner = True except pysvn.ClientError as e: log.exception("pysvn.ClientError exception in svn.py propdel() for %s" % S(path).display()) except TypeError as e: log.exception("TypeError exception in svn.py propdel() %s" % S(path).display()) return returner def propdetails(self, path): """ Each property on a path may be modified in the WC, deleted or added. This method compares the properties on the local path to the base and identifies which. @param path: the path (file or dir) in the WC to check @type path: a path for something in a WC @return a dict of the form: {prop_name: {"value": value (WC value, unless deleted then base value), "status": status of property} } """ local_props = self.proplist(path) base_props = self.proplist(path, rev=Revision("base").primitive()) prop_details = {} local_propnames = set(local_props.keys()) base_propnames = set(base_props.keys()) for propname in (local_propnames | base_propnames): if propname in (local_propnames & base_propnames): # These are the property names that are common to the WC and # base. If their values have changed, list them as changed if local_props[propname] == base_props[propname]: prop_details[propname] = {"status": rabbitvcs.vcs.status.status_normal, "value": local_props[propname]} else: prop_details[propname] = {"status": rabbitvcs.vcs.status.status_modified, "value": local_props[propname]} elif propname in local_propnames: prop_details[propname] = {"status": rabbitvcs.vcs.status.status_added, "value": local_props[propname]} elif propname in base_propnames: prop_details[propname] = {"status": rabbitvcs.vcs.status.status_deleted, "value": base_props[propname]} return prop_details def revpropset(self, prop_name, prop_value, url, rev=None, force=False): """ Adds an svn property to a path. If the item is unversioned, add a recursive property to the parent path @type url: string @param url: A url to attach the prop to @type prop_name: string @param prop_name: An svn property name. @type prop_value: string @param prop_value: An svn property value/pattern. @type rev: pysvn.Revision object @param rev: The revision to attach the prop to @type force: boolean @param force: If True, the property will be forced """ if rev is None: rev = self.revision("head") self.client.revpropset(pure_unicode(prop_name), pure_unicode(prop_value), pure_unicode(url), revision=rev.primitive()) def revproplist(self, url, rev=None): """ Retrieves a dictionary of properties for a url. @type url: string @param url: A repository url @type rev: pysvn.Revision object @param rev: The revision to attach the prop to @rtype: tuple(revision object, propsdict) @return: A tuple with revision information and property dictionary """ if rev is None: rev = self.revision("head") return self.client.revproplist(pure_unicode(url), rev.primitive())[1] def revpropget(self, url, prop_name, rev=None): """ Retrieves the revprop value for a specific url/propname/revision @type url: string @param url: A repository url @type prop_name: string or self.PROPERTIES @param prop_name: An svn property name. @type rev: pysvn.Revision object @param rev: The revision to attach the prop to @rtype: tuple(revision object, propsdict) @return: A tuple with revision information and property dictionary """ if rev is None: rev = self.revision("head") return self.client.revpropget( pure_unicode(prop_name), pure_unicode(url), revision=rev.primitive() ) def revpropdel(self, url, prop_name, rev=None, force=False): """ Removes a property from a given path @type url: string @param url: A repository url @type prop_name: string or self.PROPERTIES @param prop_name: An svn property name. @type rev: pysvn.Revision object @param rev: The revision to attach the prop to @type force: boolean @param force: If True, the property deletion will be forced """ if rev is None: rev = self.revision("head") return self.client.revpropdel( pure_unicode(prop_name), pure_unicode(url), revision=rev.primitive(), force=force ) # # callbacks # def set_callback_cancel(self, func): self.client.callback_cancel = func def callback_cancel(self): if hasattr(self.client, "callback_cancel"): self.client.callback_cancel() def set_callback_notify(self, func): self.client.callback_notify = func def set_callback_get_log_message(self, func): self.client.callback_get_log_message = func def set_callback_get_login(self, func): self.client.callback_get_login = func def set_callback_ssl_server_trust_prompt(self, func): self.client.callback_ssl_server_trust_prompt = func def set_callback_ssl_client_cert_password_prompt(self, func): self.client.callback_ssl_client_cert_password_prompt = func def set_callback_ssl_client_cert_prompt(self, func): self.client.callback_ssl_client_cert_prompt = func # # revision # def revision(self, kind, date=None, number=None): """ Create a revision object usable by pysvn @type kind: string @param kind: An svn.REVISIONS keyword. @type date: integer @param date: Used for kind=date, in the form of UNIX TIMESTAMP (secs). @type number: integer @param number: Used for kind=number, specifies the revision number. @rtype: pysvn.Revision object @return: A pysvn.Revision object. """ # TODO: Don't use kwargs for date/number, just accept a "value" as a # regular arg value = None if date: value = date elif number: value = number return Revision(kind, value) # # actions # def add(self, paths, recurse=True): """ Add files or directories to the repository @type paths: list @param paths: A list of files/directories. @type recurse: boolean @param recurse: Recursively add a directory's children """ return self.client.add(pure_unicode(paths), recurse) def add_backwards(self, path): """ This will add the given path to version control, and any parent directories that themselves require adding. It is essential that "path" contains a WC somewhere in its hierarchy. @param path: the path to add to version control @type path: string """ head, tail = pure_unicode(path),"" tails = list() # We need to add backwards-recursively, since patch could create # files any level deep in the tree while not (self.is_working_copy(head) or self.is_versioned(head)): head, tail = os.path.split(head) tails.insert(0, tail) # If we get all the way to the FS root, something really dumb # has happened. assert head, "No longer in a working copy!" # Walk back up the tree... for tail in tails: head = os.path.join(head, tail) self.client.add(head, depth=pysvn.depth.empty) def copy(self, src, dest, revision=Revision("head")): """ Copy files/directories from src to dest. src or dest may both be either a local path or a repository URL. revision is a pysvn.Revision object. @type src: string @param src: Source URL or path. @type dest: string @param dest: Destination URL or path. @type revision: pysvn.Revision object @param revision: A pysvn.Revision object. """ src = helper.urlize(pure_unicode(src)) dest = helper.urlize(pure_unicode(dest)) return self.client.copy(src, dest, revision.primitive()) def copy_all(self, sources, dest_url_or_path, copy_as_child=False, make_parents=False, ignore_externals=False): """ Copy sources to the dest_url_or_path. @type sources: list of tuples @param sources: A list of tuples (url_or_path,revision) @type dest_url_or_path: string @param dest_url_or_path: Destination URL or path. @type copy_as_child: boolean @param copy_as_child: If there are multiple sources, copy as child to dest_url_or_path (assumed to be a folder) @type make_parents: boolean @param make_parents: TBD @type ignore_externals: boolean @param ignore_externals: Omit externals """ return self.client.copy2(pure_unicode(sources), pure_unicode(dest_url_or_path), copy_as_child, make_parents, None, ignore_externals) def checkout(self, url, path, recurse=True, revision=Revision("head"), ignore_externals=False): """ Checkout a working copy from a vcs repository @type url: string @param url: A repository url. @type path: string @param path: A local destination for the working copy. @type recurse: boolean @param recurse: Whether or not to run a recursive checkout. @type revision: pysvn.Revision @param revision: Revision to checkout, defaults to HEAD. @type ignore_externals: boolean @param ignore_externals: Whether or not to ignore externals. """ url = helper.urlize(pure_unicode(url)) return self.client.checkout(url, pure_unicode(path), recurse=recurse, revision=revision.primitive(), ignore_externals=ignore_externals) def cleanup(self, path): """ Clean up a working copy. @type path: string @param path: A local working copy path. """ return self.client.cleanup(pure_unicode(path)) def revert(self, paths): """ Revert files or directories so they are unversioned @type paths: list @param paths: A list of files/directories. """ return self.client.revert(pure_unicode(paths)) def commit(self, paths, log_message="", recurse=False, keep_locks=False): """ Commit a list of files to the repository. @type paths: list @param paths: A list of files/directories. @type log_message: string @param log_message: A commit log message. @type recurse: boolean @param recurse: Whether or not to recurse into sub-directories. @type keep_locks: boolean @param keep_locks: Whether or not to keep locks on commit. """ kwargs = {"keep_locks": keep_locks} try: # Simply setting recurse=False will not stop child files from getting # committed. The pysvn.depth kwarg must be set to empty. # Unfortunately, older pysvn/svn installations do not have the depth # enum so for those, recurse must be used. kwargs["depth"] = (recurse and pysvn.depth.infinity or pysvn.depth.empty) except AttributeError: kwargs["recurse"] = recurse retval = self.client.checkin(pure_unicode(paths), pure_unicode(log_message), **kwargs) dummy_commit_dict = { "revision": retval, "action": rabbitvcs.vcs.svn.commit_completed } self.client.callback_notify(dummy_commit_dict) return retval def log(self, url_or_path, revision_start=Revision("head"), revision_end=Revision("number", 0), limit=0, discover_changed_paths=True, strict_node_history=False): """ Retrieve log items for a given path in the repository @type url_or_path: string @param url_or_path: Path for which to get log items for @type revision_start: pysvn.Revision @param revision_start: Most recent revision. Defaults to HEAD @type revision_end: pysvn.Revision @param revision_end: Oldest revision. Defaults to rev 0. @type limit: int @param limit: The maximum number of items to return. Defaults to 0. """ log = self.client.log(pure_unicode(url_or_path), revision_start.primitive(), revision_end.primitive(), discover_changed_paths, strict_node_history, limit) returner = [] for item in log: revision = Revision(pysvn.opt_revision_kind.number, item.revision.number) date = datetime.fromtimestamp(item.date) if hasattr(item, "date") else datetime(1900, 1, 1) author = _("(no author)") if hasattr(item, "author"): author = item["author"] message = "" if hasattr(item, "message"): message = item["message"] changed_paths = [] for changed_path in item.changed_paths: copy_from_rev = "" if hasattr(changed_path.copyfrom_revision, "number"): copy_from_rev = self.revision("number", changed_path.copyfrom_revision.number) copy_from_path = "" if hasattr(changed_path, "copy_from_path"): copy_from_path = changed_path.copy_from_path changed_paths.append(rabbitvcs.vcs.log.LogChangedPath( changed_path.path, changed_path.action, copy_from_path, copy_from_rev )) returner.append(rabbitvcs.vcs.log.Log( date, revision, author, message, changed_paths, None )) return returner def export(self, src_url_or_path, dest_path, revision=Revision("head"), recurse=True, ignore_externals=False, force=False, native_eol=None): """ Export files from either a working copy or repository into a local path without versioning information. @type src_url_or_path: string @param src_url_or_path: A repository url. @type dest_path: string @param dest_path: A local destination for the working copy. @type revision: pysvn.Revision @param revision: The revision to retrieve from the repository. @type ignore_externals: boolean @param ignore_externals: Whether or not to ignore externals. @type recurse: boolean @param recurse: Whether or not to run a recursive checkout. """ self.client.export(pure_unicode(src_url_or_path), pure_unicode(dest_path), force, revision.primitive(), native_eol, ignore_externals, recurse) def import_(self, path, url, log_message, ignore=False): """ Import an unversioned file or directory structure into a repository. @type path: string @param path: An unversioned file or directory structure @type url: string @param url: A repository location to put the imported files @type log_message: string @param log_message: Log message to use for commit @type ignore: boolean @param ignore: Disregard svn:ignore props """ url = helper.urlize(url) return self.client.import_(pure_unicode(path), pure_unicode(url), pure_unicode(log_message), ignore) def lock(self, url_or_path, lock_comment, force=False): """ Lock a url or path. @type url_or_path: string @param url_or_path: A url or path to lock @type lock_comment: string @param lock_comment: A log message to go along with the lock. @type force: boolean @param force: Steal the locks of others if they exist. """ return self.client.lock(pure_unicode(url_or_path), pure_unicode(lock_comment), force) def relocate(self, from_url, to_url, path, recurse=True): """ Relocate the working copy from from_url to to_url for path @type from_url: string @param from_url: A url to relocate from @type to_url: string @param to_url: A url to relocate to @type path: string @param path: The path of the local working copy """ from_url = helper.urlize(pure_unicode(from_url)) to_url = helper.urlize(pure_unicode(to_url)) return self.client.relocate(from_url, to_url, path, recurse) def move(self, src_url_or_path, dest_url_or_path): """ Schedule a file to be moved around the repository @type src_url_or_path: string @param src_url_or_path: A url/path to move from @type dest_url_or_path: string @param dest_url_or_path: A url/path to move to """ src_url_or_path = pure_unicode(src_url_or_path) dest_url_or_path = pure_unicode(dest_url_or_path) if hasattr(self.client, "move2"): return self.client.move2([src_url_or_path], dest_url_or_path) else: return self.client.move(src_url_or_path, dest_url_or_path, force=True) def move_all(self, sources, dest_url_or_path, move_as_child=False, make_parents=False): """ Move sources to the dest_url_or_path. @type sources: list of tuples @param sources: A list of tuples (url_or_path,revision) @type dest_url_or_path: string @param dest_url_or_path: Destination URL or path. @type move_as_child: boolean @param move_as_child: If there are multiple sources, move as child to dest_url_or_path (assumed to be a folder) @type make_parents: boolean @param make_parents: TBD """ return self.client.move2(pure_unicode(sources), pure_unicode(dest_url_or_path), move_as_child=move_as_child, make_parents=make_parents) def remove(self, url_or_path, force=False, keep_local=False): """ Schedule a file to be removed from the repository @type url_or_path: string @param url_or_path: A url/path to remove @type force: boolean @param force: Force renaming, despite conflicts. Defaults to false. @type keep_local: boolean @param keep_local: Keep the local copy (don't just delete it) """ return self.client.remove(pure_unicode(url_or_path), force, keep_local) def revert(self, paths, recurse=False): """ Revert files or directories from the repository @type paths: list @param paths: A list of files/directories. @type recurse: boolean @param recurse: Recursively add a directory's children """ return self.client.revert(pure_unicode(paths), recurse) def resolve(self, path, recurse=True): """ Mark conflicted files as resolved @type path: string @param path: A local path to resolve @type recurse: boolean @param recurse: Recursively add a directory's children """ return self.client.resolved(pure_unicode(path), recurse) def switch(self, path, url, revision=Revision("head")): """ Switch the working copy to another repository source. @type path: string @param path: A local path to a working copy @type url: string @param url: The repository location to switch to @type revision: pysvn.Revision @param revision: The revision of the repository to switch to (Def:HEAD) """ url = helper.urlize(pure_unicode(url)) return self.client.switch(pure_unicode(path), url, revision.primitive()) def unlock(self, path, force=False): """ Unlock locked files. @type path: string @param path: A local path to resolve @type force: boolean @param force: If locked by another user, unlock it anyway. """ return self.client.unlock(pure_unicode(path), force) def update(self, path, recurse=True, revision=Revision("head"), ignore_externals=False): """ Update a working copy. @type path: string @param path: A local path to update @type recurse: boolean @param recurse: Update child folders recursively @type revision: pysvn.Revision @param revision: Revision to update to (Def: HEAD) @type ignore_externals: boolean @param ignore_externals: Ignore external items """ return self.client.update(pure_unicode(path), recurse, revision.primitive(), ignore_externals) def annotate(self, url_or_path, from_revision=Revision("number", 1), to_revision=Revision("head")): """ Get the annotate results for the given file and revision range. @type url_or_path: string @param url_or_path: A url or local path @type from_revision: pysvn.Revision @param from_revision: Revision from (def: 1) @type to_revision: pysvn.Revision @param to_revision: Revision to (def: HEAD) """ return self.client.annotate(pure_unicode(url_or_path), from_revision.primitive(), to_revision.primitive()) def merge_ranges(self, source, ranges_to_merge, peg_revision, target_wcpath, notice_ancestry=False, force=False, dry_run=False, record_only=False): """ Merge a range of revisions. @type source: string @param source: A repository location @type ranges_to_merge: list of tuples @param ranges_to_merge: A list of revision ranges to merge @type peg_revision: pysvn.Revision @param peg_revision: Indicates which revision in sources is valid. @type target_wcpath: string @param target_wcpath: Target working copy path @type notice_ancestry: boolean @param notice_ancestry: unsure @type force: boolean @param force: unsure @type dry_run: boolean @param dry_run: Do a test/dry run or not @type record_only: boolean @param record_only: unsure TODO: Will firm up the parameter documentation later """ return self.client.merge_peg2(pure_unicode(source), ranges_to_merge, peg_revision.primitive(), pure_unicode(target_wcpath), notice_ancestry=notice_ancestry, force=force, dry_run=dry_run, record_only=record_only) def has_merge2(self): """ Tests whether the user has a later version of pysvn/svn installed with more merge features """ return hasattr(self.client, "merge_peg2") def merge_trees(self, url_or_path1, revision1, url_or_path2, revision2, local_path, force=False, recurse=True, dry_run=False, record_only=False): """ Merge two trees into one. @type url_or_path1: string @param url_or_path1: From WC/URL location @type revision1: pysvn.Revision @param revision1: Indicates the revision of the URL/Path @type url_or_path2: string @param url_or_path2: To WC/URL location @type revision2: pysvn.Revision @param revision2: Indicates the revision of the URL/Path @type local_path: string @param local_path: Target working copy path @type force: boolean @param force: unsure @type recurse: boolean @param recurse: Merge children recursively @type dry_run: boolean @param dry_run: Do a test/dry run or not @type record_only: boolean @param record_only: unsure TODO: Will firm up the parameter documentation later """ url_or_path1 = helper.urlize(pure_unicode(url_or_path1)) url_or_path2 = helper.urlize(pure_unicode(url_or_path2)) return self.client.merge(url_or_path1, revision1.primitive(), url_or_path2, revision2.primitive(), pure_unicode(local_path), force = force, recurse = recurse, dry_run = dry_run, record_only = record_only) def has_merge_reintegrate(self): """ Tests whether the user has a later version of pysvn/svn installed with more merge features """ return hasattr(self.client, "merge_reintegrate") def merge_reintegrate(self, url_or_path, revision, local_path, dry_run=False): """ Merge a branch into trunk @type url_or_path: string @param url_or_path: From WC/URL location @type revision: Revision() @param revision: Indicates the revision of the URL/Path @type local_path: string @param local_path: Target working copy path @type dry_run: boolean @param dry_run: Do a test/dry run or not """ return self.client.merge_reintegrate(pure_unicode(url_or_path), revision.primitive(), pure_unicode(local_path), dry_run = dry_run) def diff(self, tmp_path, url_or_path, revision1, url_or_path2, revision2, recurse=True, ignore_ancestry=False, diff_deleted=True, ignore_content_type=False): """ Returns the diff text between the base code and the working copy. @type tmp_path: string @param tmp_path: Temporal path to store the diff @type url_or_path: string @param url_or_path: From WC/URL location @type revision1: pysvn.Revision @param revision1: Indicates the revision of the URL/Path (def: pysvn.Revision( opt_revision_kind.base )) @type url_or_path2: string @param url_or_path2: From WC/URL location @type revision2: pysvn.Revision @param revision2: Indicates the revision of the URL/Path (def: pysvn.Revision( opt_revision_kind.working )) @type recurse: boolean @param recurse: Whether or not to recurse into sub-directories. (def: True) @type ignore_ancestry: boolean @param ignore_ancestry: Whether or not to recurse into sub-directories. (def: False) @type diff_deleted: boolean @param diff_deleted: Whether or not to recurse into sub-directories. (def: True) @type ignore_content_type: boolean @param ignore_content_type: Whether or not to recurse into sub-directories. (def: False) """ return self.client.diff(pure_unicode(tmp_path), pure_unicode(url_or_path), revision1.primitive(), pure_unicode(url_or_path2), revision2.primitive(), recurse, ignore_ancestry, diff_deleted, ignore_content_type) def diff_summarize(self, url_or_path1, revision1, url_or_path2, revision2, recurse=True, ignore_ancestry=False): """ Returns a summary of changed items between two paths/revisions @type url_or_path1: string @param url_or_path1: First WC/URL location @type revision1: pysvn.Revision @param revision1: Indicates the revision of the URL/Path (def: pysvn.Revision( opt_revision_kind.base )) @type url_or_path2: string @param url_or_path2: Second WC/URL location @type revision2: pysvn.Revision @param revision2: Indicates the revision of the URL/Path (def: pysvn.Revision( opt_revision_kind.working )) @type recurse: boolean @param recurse: Whether or not to recurse into sub-directories. (def: True) @type ignore_ancestry: boolean @param ignore_ancestry: Whether or not to recurse into sub-directories. (def: False) @type depth: pysvn.depth enum @param depth: a replacement for recurse """ return self.client.diff_summarize(pure_unicode(url_or_path1), revision1.primitive(), pure_unicode(url_or_path2), revision2.primitive(), recurse, ignore_ancestry) def list(self, url_or_path, revision=Revision("HEAD"), recurse=True): url_or_path = helper.urlize(url_or_path) return self.client.list(pure_unicode(url_or_path), revision=revision.primitive(), recurse=recurse) def mkdir(self, url_or_path, log_message): """ Make a new directory in the repository or working copy @type url_or_path: string @param url_or_path: Url in the repository or path in working copy @type log_message: string @param log_message: A log message to use in your commit """ return self.client.mkdir(pure_unicode(url_or_path), pure_unicode(log_message)) def apply_patch(self, patch_file, base_dir): """ Applies a patch created for this WC. @type patch_file: string @param patch_file: the path to the patch file @type base_dir: string @param base_dir: the base directory from which to interpret the paths in the patch file """ any_failures = False for file, success, rej_file in helper.parse_patch_output(patch_file, base_dir): fullpath = os.path.join(base_dir, file) event_dict = dict() event_dict["path"] = file event_dict["mime_type"] = "" # meh if success: event_dict["action"] = _("Patched") # not in pysvn, but # we have a fallback else: any_failures = True event_dict["action"] = _("Patch Failed") # better wording needed? # Creates its own notifications. self.add_backwards(fullpath) if rej_file: rej_info = { "path" : rej_file, "action" : _("Rejected Patch"), "mime_type" : None } if self.client.callback_notify: self.client.callback_notify(event_dict) if rej_file: self.client.callback_notify(rej_info) def is_version_less_than(self, version): """ @type version: tuple @param version: A version tuple to compare pysvn's version to """ if version[0] > pysvn.version[0]: return True if ((version[0] == pysvn.version[0]) and (version[1] > pysvn.version[1])): return True if ((version[0] == pysvn.version[0]) and (version[1] == pysvn.version[1]) and (version[2] > pysvn.version[2])): return True if ((version[0] == pysvn.version[0]) and (version[1] == pysvn.version[1]) and (version[2] == pysvn.version[2]) and (version[3] > pysvn.version[3])): return True return False rabbitvcs-0.18/scripts/000077500000000000000000000000001362112712700151125ustar00rootroot00000000000000rabbitvcs-0.18/scripts/README000066400000000000000000000013201362112712700157660ustar00rootroot00000000000000Scripts README ---------------- To start a new translation: $ sh initialize_new_translation.sh This will create a .po file in the /trunk/rabbitvcs/po directory with the name .po. Translate the strings in the .po file any way you want. To install a translation: $ sh install_translation.sh This will take your .po file and install it in the /trunk/rabbitvcs/locale//LC_MESSAGES folder. To test a translation: $ LANGUAGE= /path/to/trunk/clients/cli/rabbitvcs commit For more on translating, see our wiki page at: http://wiki.rabbitvcs.org/wiki/contribute/translate rabbitvcs-0.18/scripts/import_launchpad_translations.sh000077500000000000000000000011511362112712700236010ustar00rootroot00000000000000#!/bin/sh # This script should be run from the scripts directory LOCALE_TGZ=$1 if [ -z "$LOCALE_TGZ" ]; then echo "usage: ./import_launchpad_translations.sh LOCALE_TGZ" exit 1 fi rm -rf translations mkdir translations cd translations tar xzf $LOCALE_TGZ rm -rf templates for mo in `ls`; do if [ -f ../../locale/$mo/LC_MESSAGES/RabbitVCS.mo ]; then mv $mo/LC_MESSAGES/* ../../locale/$mo/LC_MESSAGES/RabbitVCS.mo else mkdir -p ../../locale/$mo/LC_MESSAGES mv $mo/LC_MESSAGES/rabbit-vcs.mo ../../locale/$mo/LC_MESSAGES/RabbitVCS.mo fi done cd .. rm -rf translations rabbitvcs-0.18/scripts/initialize_new_translation.sh000077500000000000000000000005311362112712700231000ustar00rootroot00000000000000#!/bin/sh LOCALE=$1 if [ -z "$LOCALE" ] then echo "usage: ./initialize_new_translation.sh LOCALE" exit 1 fi msginit --input=../rabbitvcs/po/RabbitVCS.pot --locale=$LOCALE \ --output-file=../rabbitvcs/po/$LOCALE.po echo "" echo "Once you have translated the strings, install the strings with \ the install_translations.sh script" rabbitvcs-0.18/scripts/install_po_files.sh000077500000000000000000000003671362112712700210050ustar00rootroot00000000000000#!/bin/sh # Converts all the po source files into mo binary files and installs them in # the correct location for i in `ls ../po/*.po`; do filename=`basename $i` locale=`echo ${filename%.*}` ./install_translation.sh $locale $i done rabbitvcs-0.18/scripts/install_translation.sh000077500000000000000000000005151362112712700215360ustar00rootroot00000000000000#!/bin/sh LOCALE=$1 POFILE=$2 if [ -z "$POFILE" -o -z "$LOCALE" ] then echo "usage: ./install_translation.sh LOCALE POFILE" exit 1 fi mkdir -p ../locale/$LOCALE/LC_MESSAGES msgfmt --output-file=../locale/$LOCALE/LC_MESSAGES/RabbitVCS.mo $POFILE echo "Translations installed to ../locale/$LOCALE/LC_MESSAGES/RabbitVCS.mo" rabbitvcs-0.18/scripts/sync_strings.sh000077500000000000000000000013631362112712700202010ustar00rootroot00000000000000#!/bin/sh # Sync our translation template file with the actual strings # 1. Extracts strings from gtkbuilder xml files into .h files # 2. Extracts gettext strings from py files # 3. Deletes the glade .h files cd .. for i in `find . | grep '\.xml' | grep -v '\.svn' | grep -v '\.xml\.h'`; do intltool-extract --type=gettext/glade $i done cd rabbitvcs echo "util/helper.py" > POTFILES.in find . -type f | egrep '(ui|.xml)' | grep -v \.svn | grep -v \.h | grep -v \.pyc >> POTFILES.in sed -i 's|\.xml|.xml.h|g' POTFILES.in sed -i 's|\.\/||g' POTFILES.in mv POTFILES.in ../po/POTFILES.in xgettext -L Python --keyword=_ --keyword=N_ -o ../po/RabbitVCS.pot -f ../po/POTFILES.in for i in `find . | grep '\.xml\.h' | grep -v '\.svn'`; do rm -f $i done rabbitvcs-0.18/setup.cfg000066400000000000000000000000461362112712700152440ustar00rootroot00000000000000[bdist_rpm] group = Development/Tools rabbitvcs-0.18/setup.py000066400000000000000000000132461362112712700151430ustar00rootroot00000000000000from __future__ import absolute_import from __future__ import print_function #!/usr/bin/env python # If you didn't know already, this is a Python distutils setup script. It borrows # heavily from Phatch's (see: http://photobatch.stani.be/). # # There's a lot of comments here (on purpose) so people can actually learn from # this and don't have to figure out everything on their own. # # This setup script is used to build distribution specific packages. # # For more information see: http://docs.python.org/dist/dist.html # # TODO: this all feels just a little too shell scripty, refactoring it later # might be a good idea. # NOTES: # System-wide directories: # Scalable emblems go in: /usr/share/icons/hicolor/scalable/emblems # # User-specific directories: # Scalable emblems go in: ~/.icons/hicolor/scalable # # Common directories # See: http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html # Configuration information goes in: ~/.config/rabbitvcs/ # Data goes in: ~/.local/share/rabbitvcs import sys import os import os.path import subprocess from distutils.core import setup import distutils.sysconfig PREFIX = sys.prefix # If the user passed --prefix=... then use the new prefix for c in sys.argv: if c.startswith("--prefix="): PREFIX = c.split("=", 1)[1].strip() #============================================================================== # Variables #============================================================================== # Some descriptive variables # This will eventually be passed to the setup function, but we already need them # for doing some other stuff so we have to declare them here. name = "rabbitvcs" version = "0.18" description = "Easy version control" long_description = """RabbitVCS is a set of graphical tools written to provide simple and straightforward access to the version control systems you use.""" author = "Adam Plumb" author_email = "adamplumb@gmail.com" url = "http://www.rabbitvcs.org" license = "GNU General Public License version 2 or later" #============================================================================== # Paths #============================================================================== icon_theme_directory = "share/icons/hicolor" locale_directory = "share/locale" #============================================================================== # Helper functions #============================================================================== def include_by_pattern(directory, directory_to_install, pattern): files_to_include = [] for root, dirs, files in os.walk(directory): for file in files: if file.endswith(pattern): files_to_include.append(( root.replace(directory, directory_to_install), [os.path.join(root, file)] )) return files_to_include #============================================================================== # Gather all the files that need to be included #============================================================================== # Packages packages = [] for root, dirs, files in os.walk("rabbitvcs"): if "__init__.py" in files: packages.append(root.replace(os.path.sep, ".")) # Translation translations = include_by_pattern("locale", locale_directory, ".mo") # Icons icons = include_by_pattern("data/icons/hicolor", icon_theme_directory, ".svg") icons += include_by_pattern("data/icons/hicolor", icon_theme_directory, ".png") # Config parsing specification config_spec = [( "share/rabbitvcs", ["rabbitvcs/util/configspec/configspec.ini"] )] # Documentation documentation = [("share/doc/rabbitvcs", [ "AUTHORS", "MAINTAINERS" ])] # Save build information so we can access the prefix later path = "rabbitvcs/buildinfo.py" buildinfo = '''rabbitvcs_prefix = "%s" icon_path = "%s/%s" ''' % (PREFIX, PREFIX, icon_theme_directory) fh = open(path, "w") fh.write(buildinfo) fh.close() #============================================================================== # Ready to install #============================================================================== # Calling the setup function will actually install RabbitVCS and also creates # an .egg-info file in /usr/lib/python/site-packages/ or # /usr/share/python-support/rabbitvcs when generating a Debian package. dist = setup( # The following arguments will be included in the .egg.info file, # for a list of available arguments and their descriptions see: # - http://docs.python.org/dist/module-distutils.core.html name=name, version=version, description=description, long_description=long_description, author=author, author_email=author_email, url=url, license=license, # There are actually several arguments that are used to install files: # - py_modules: installs specific modules to site-packages # - packages: install complete packages (directories with an __init__.py # file) into site-packages # - data_files: any file you want, anywhere you want it packages=packages, package_data={ "rabbitvcs": [ # Include our GtkBuilder UI files right into the package "ui/xml/*.xml", "ui/xml/dialogs/*.xml" ] }, data_files=translations + icons + documentation + config_spec ) # # Post installation # # Make sure the icon cache is deleted and recreated if sys.argv[1] == "install": if os.uname()[0] != 'Darwin': print("Running gtk-update-icon-cache") subprocess.Popen( ["gtk-update-icon-cache", os.path.join(PREFIX, icon_theme_directory)], stdout=subprocess.PIPE ).communicate()[0]