pax_global_header00006660000000000000000000000064123000777430014515gustar00rootroot0000000000000052 comment=62fd544bec227e9fd0cdee7f4025a98d75bb788b rabbitvcs-0.16/000077500000000000000000000000001230007774300134225ustar00rootroot00000000000000rabbitvcs-0.16/AUTHORS000066400000000000000000000002271230007774300144730ustar00rootroot00000000000000Jason Field Bruce van der Kooij Adam Plumb Jason Heeris rabbitvcs-0.16/COPYING000066400000000000000000000431031230007774300144560ustar00rootroot00000000000000 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.16/MAINTAINERS000066400000000000000000000003471230007774300151230ustar00rootroot00000000000000Adam Plumb E-mail: adamplumb@gmail.com Userid: adamplumb Jason Heeris E-mail: jason.heeris@gmail.com Userid: jasonheeris Andreas E-mail: electronics45@gmail.com Daniel O'Connor E-mail: daniel.oconnor@gmail.com Userid: clockwerxrabbitvcs-0.16/README000066400000000000000000000020641230007774300143040ustar00rootroot00000000000000RabbitVCS ---------- RabbitVCS is a set of graphical tools written to provide simple and straightforward access to the version control systems you use. RabbitVCS is now distributed in two parts. The first part is the python module that is not connected to any file manager or text editor. This is what is now known as "rabbitvcs". The second part is the series of front-ends or clients that we distribute. These consist of a Nautilus extension, a Thunar extension, a Gedit plugin, and a command line utility. All of these clients use the same python module as a back-end. Requires: pygtk >= 2.12 python-gobject >= 2.14 python-configobj >= 4.4.0 For spell checking of commit messages: python-gtkspell For subversion: python-svn >= 1.7.2 subversion >= 1.4.6 For git: dulwich >= 0.6.1 git Recommends: meld (graphical diff tool) Install: (as root or using sudo) $ python setup.py install Each clients' README file contains details on their dependencies and installation. Homepage: http://www.rabbitvcs.org rabbitvcs-0.16/clients/000077500000000000000000000000001230007774300150635ustar00rootroot00000000000000rabbitvcs-0.16/clients/caja/000077500000000000000000000000001230007774300157615ustar00rootroot00000000000000rabbitvcs-0.16/clients/caja/README000066400000000000000000000013451230007774300166440ustar00rootroot00000000000000RabbitVCS 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 nemo 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.16/clients/caja/RabbitVCS.py000066400000000000000000000575541230007774300201320ustar00rootroot00000000000000# # 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 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, 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 # Do NOT change this to "CAJA". RabbitVCS has an internal reference to this name. os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"] = "1" import os.path from os.path import isdir, isfile, realpath, basename import datetime #import matevfs from gi.repository import Caja, GObject, Gtk, GdkPixbuf 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 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{NautilusVFSFile}. It looks like::: #: #: nautilusVFSFile_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. nautilusVFSFile_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, path): return path.replace("file://", "") def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.nautilusVFSFile_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.nautilusVFSFile_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 xrange(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 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. 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_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": conditions = CajaMenuConditions(conditions_dict) menu = CajaMainContextMenu(self, window.base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress": 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") return CajaMainContextMenu(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 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 import rabbitvcs.util.helper path = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8").replace("/", ":") profile_data_file = os.path.join( rabbitvcs.util.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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_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 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_table[path] = item # log.debug("get_background_items() called") window.base_dir = path 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.nautilusVFSFile_table: item = self.nautilusVFSFile_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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.nautilusVFSFile_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.16/clients/cli/000077500000000000000000000000001230007774300156325ustar00rootroot00000000000000rabbitvcs-0.16/clients/cli/README000066400000000000000000000007411230007774300165140ustar00rootroot00000000000000RabbitVCS 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.16/clients/cli/rabbitvcs000077500000000000000000000037321230007774300175440ustar00rootroot00000000000000#!/usr/bin/env python # # 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 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.16/clients/gedit/000077500000000000000000000000001230007774300161575ustar00rootroot00000000000000rabbitvcs-0.16/clients/gedit/README000066400000000000000000000017101230007774300170360ustar00rootroot00000000000000RabbitVCS 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. 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.16/clients/gedit/rabbitvcs-gedit2.gedit-plugin000066400000000000000000000003441230007774300236250ustar00rootroot00000000000000[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.16/clients/gedit/rabbitvcs-gedit3.plugin000066400000000000000000000003351230007774300225340ustar00rootroot00000000000000[Plugin] Loader=python 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.16/clients/gedit/rabbitvcs-plugin.py000066400000000000000000001100311230007774300220000ustar00rootroot00000000000000# # 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 try: from gi.repository import Gedit, GObject from gi.repository import Gtk as gtk os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"] = "1" GTK3 = True except ImportError: import gedit import gobject import gtk GTK3 = False 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() if GTK3: 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) else: class RabbitVCSGedit2Plugin(gedit.Plugin): def __init__(self): gedit.Plugin.__init__(self) self._instances = {} self.id_name = "RabbitVCSContextMenuID" def activate(self, window): self._instances[window] = RabbitVCSWindowHelper(self, window) handler_ids = [] for signal in ('tab-added', 'tab-removed'): method = getattr(self, 'on_window_' + signal.replace('-', '_')) handler_ids.append(window.connect(signal, method)) window.set_data(self.id_name, handler_ids) if window in self._instances: for view in window.get_views(): self._instances[window].connect_view(view, self.id_name) def deactivate(self, window): widgets = [window] + 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 window in self._instances: self._instances[window].deactivate() del self._instances[window] def update_ui(self, window): if window in self._instances: self._instances[window].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 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: 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): if GTK3: return item.make_gtk3_menu_item(id_magic) else: return item.make_gtk_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.16/clients/nautilus-3.0/000077500000000000000000000000001230007774300172255ustar00rootroot00000000000000rabbitvcs-0.16/clients/nautilus-3.0/README000066400000000000000000000015061230007774300201070ustar00rootroot00000000000000RabbitVCS 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 python/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.16/clients/nautilus-3.0/RabbitVCS.py000066400000000000000000000570221230007774300213640ustar00rootroot00000000000000# # 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 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, 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 os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"] = "1" import os.path from os.path import isdir, isfile, realpath, basename import datetime from gi.repository import Nautilus, GObject, Gtk, GdkPixbuf 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 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{NautilusVFSFile}. It looks like::: #: #: nautilusVFSFile_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. nautilusVFSFile_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, path): return path.replace("file://", "") def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.nautilusVFSFile_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.nautilusVFSFile_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 xrange(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 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_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": conditions = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, window.base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress": 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") return NautilusMainContextMenu(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 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 import rabbitvcs.util.helper path = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8").replace("/", ":") profile_data_file = os.path.join( rabbitvcs.util.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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_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 = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_table[path] = item # log.debug("get_background_items() called") window.base_dir = path return NautilusMainContextMenu(self, path, [path]).get_menu() 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.nautilusVFSFile_table: item = self.nautilusVFSFile_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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.nautilusVFSFile_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.16/clients/nautilus/000077500000000000000000000000001230007774300167275ustar00rootroot00000000000000rabbitvcs-0.16/clients/nautilus/README000066400000000000000000000016671230007774300176210ustar00rootroot00000000000000RabbitVCS Nautilus Extension This extension is meant to be used with the Nautilus File Manager, Requirements: * nautilus (>= v2.22.0) * nautilus-python (>= 0.5.1) * python-dbus (> 0.80) * (all other RabbitVCS requirements) To install: To install for all users, copy RabbitVCS.py to: /usr/lib/nautilus/extensions-2.0/python To install for a single user, copy RabbitVCS.py to: ~/.nautilus/python-extensions If you are using nautilus-python >= 1.0 you should install to: ~/.local/share/nautilus-python/extensions In both cases, you may need to create the python/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.16/clients/nautilus/RabbitVCS.py000066400000000000000000000505471230007774300210730ustar00rootroot00000000000000# # 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 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, 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.path from os.path import isdir, isfile, realpath, basename import datetime import gnomevfs import nautilus import pysvn import gobject import gtk 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 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 _ = 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): """ 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{NautilusVFSFile}. It looks like::: #: #: nautilusVFSFile_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. nautilusVFSFile_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 __init__(self): # 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( "RabbitVCS::status_column", "status", _("RVCS Status"), "" ), nautilus.Column( "RabbitVCS::revision_column", "revision", _("RVCS Revision"), "" ), nautilus.Column( "RabbitVCS::author_column", "author", _("RVCS Author"), "" ), nautilus.Column( "RabbitVCS::age_column", "age", _("RVCS Age"), "" ) ) 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.OPERATION_COMPLETE if not self.valid_uri(item.get_uri()): return nautilus.OPERATION_FAILED path = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.nautilusVFSFile_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.nautilusVFSFile_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.OPERATION_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 xrange(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.OPERATION_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 values.items(): item.add_string_attribute(key, value) def update_status(self, item, path, status): import rabbitvcs.ui 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 = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") paths.append(path) self.nautilusVFSFile_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": conditions = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, window.get_data("base_dir"), paths, conditions).get_menu() return menu if conditions_dict != "in-progress": self.status_checker.generate_menu_conditions_async(provider, window.get_data("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 = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") paths.append(path) self.nautilusVFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") return NautilusMainContextMenu(self, window.get_data("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 self.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 import rabbitvcs.util.helper path = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8").replace("/", ":") profile_data_file = os.path.join( rabbitvcs.util.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 = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") self.nautilusVFSFile_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 = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, path, [path], conditions).get_menu() return menu window.set_data("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 = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") self.nautilusVFSFile_table[path] = item # log.debug("get_background_items() called") window.set_data("base_dir", path) return NautilusMainContextMenu(self, path, [path]).get_menu() 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 self.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.nautilusVFSFile_table: item = self.nautilusVFSFile_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 = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8") if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.nautilusVFSFile_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('RabbitVCS::PropertyPage', label, 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.16/clients/nautilusold/000077500000000000000000000000001230007774300174265ustar00rootroot00000000000000rabbitvcs-0.16/clients/nautilusold/README000066400000000000000000000014031230007774300203040ustar00rootroot00000000000000RabbitVCS NautilusOld Extension This extension is meant to be used with older versions of the Nautilus File Manager. Requirements: * nautilus (<= v2.22.0) * nautilus-python (>= 0.4.3) * (all other RabbitVCS requirements) To install: To install for all users, copy RabbitVCS.py to: /usr/lib/nautilus/extensions-1.0/python To install for a single user, copy RabbitVCS.py to: ~/.nautilus/python-extensions In both cases, you may need to create the python/python-extensions folder. Restart nautilus with the following commands: $ nautilus -q $ nohup nautilus > /dev/null & Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.16/clients/nautilusold/RabbitVCS.py000066400000000000000000000563001230007774300215630ustar00rootroot00000000000000# # 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 . # """ TODO 1. Integrate translations 2. Add more of the v0.13 menu items 3. or figure out a way to use the regular nautilus extension's menu items/logic 4. or clean up the current menuitem logic in some other way """ __version__ = "0.13.beta1" import copy import glob import gnomevfs import gobject import gtk import nautilus import os import pysvn import sys # RabbitVCS is actually more than just this module so we need to add the entire # directory to the path to be able to find our other modules. Because on import # Python generates compiled (.pyc) versions of Python source code files we have # to strip the 'c' from the extension to find the actual file. sys.path.append(os.path.dirname(os.path.realpath(__file__.rstrip("c")))) # FIXME: this (and other) should be moved into a rabbitvcs module to prevent # collisions with other modules on the path. import rabbitvcs.util.helper #============================================================================== ENABLE_ATTRIBUTES = True RECURSIVE_STATUS = True ENABLE_EMBLEMS = True class RabbitVCS(nautilus.InfoProvider, nautilus.MenuProvider, nautilus.ColumnProvider): """ 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 = { pysvn.wc_status_kind.added : "rabbitvcs-added", pysvn.wc_status_kind.deleted: "rabbitvcs-deleted", pysvn.wc_status_kind.modified: "rabbitvcs-modified", pysvn.wc_status_kind.conflicted: "rabbitvcs-conflicted", pysvn.wc_status_kind.normal: "rabbitvcs-normal", pysvn.wc_status_kind.ignored: "rabbitvcs-ignored", pysvn.wc_status_kind.obstructed: "rabbitvcs-obstructed" } #-------------------------------------------------------------------------- def __init__(self): """ Constructor - initialise our required storage """ # This list keeps track of any files we have come across that will # need to be re-scanned if there is a commit/revert. self.monitoredFiles = [] # This list keeps a record of all of the files we're planning to scan # when we get some idle time self.scanStack = [] #-------------------------------------------------------------------------- def OnIdle(self): """ We use the idle handler to pop items from our scan stack and run a status scan on them. We do this so that we don't hog the processor each time a folder is opened. """ if len(self.scanStack): self.ScanFile(self.scanStack.pop()) return True else: return False #-------------------------------------------------------------------------- def get_columns(self): """ This is the function called by Nautilus to find out what extra columns we can supply to it. """ return (nautilus.Column("NautilusPython::revision_column", "revision", "Revision", "The file revision"), nautilus.Column("NautilusPython::user_column", "user", "SVN User", "The SVN user") ) #-------------------------------------------------------------------------- def update_file_info (self, file): """ Callback from Nautilus to get the file status. """ if file.get_uri_scheme() != 'file': return path = gnomevfs.get_local_path_from_uri(file.get_uri()) c = pysvn.Client() try: entry = c.info(path) except: return if not entry: return # We'll scan the files during idle time, so add it to our stack self.scanStack.append(file) if len(self.scanStack) == 1: gobject.idle_add(self.OnIdle) #-------------------------------------------------------------------------- def ScanFile(self, file): """ This is where the magic happens! This function check the current status of *file*, and updates the display with the relevant emblem. file - A NautilusFileItem to check """ # Transform the URI to a path path = gnomevfs.get_local_path_from_uri(file.get_uri()) # Get the SVN info about the path c = pysvn.Client() entry = c.info(path) # Update the columns if we're supposed to if ENABLE_ATTRIBUTES: file.add_string_attribute('revision', str(entry.revision.number)) author = entry.commit_author if not author: author = "" file.add_string_attribute('user', author) # Update the display emblems if we're supposed to if ENABLE_EMBLEMS: if os.path.isdir(path): # We're a folder st = c.status(path, recurse=RECURSIVE_STATUS) # Check if this folder had been added for x in st: if x.path == path and x.text_status == pysvn.wc_status_kind.added: file.add_emblem(self.EMBLEMS[pysvn.wc_status_kind.added]) return # Check if any of the contents of the folder have been modified t = set([ pysvn.wc_status_kind.modified, pysvn.wc_status_kind.added, pysvn.wc_status_kind.deleted]) statuses = set([s.text_status for s in st]) if len( t & statuses ): file.add_emblem(self.EMBLEMS[pysvn.wc_status_kind.modified]) else: file.add_emblem(self.EMBLEMS[pysvn.wc_status_kind.normal]) else: # We're a file # Get our status st = c.status(path, recurse=False)[0] # Display an emblem if we have a match for the status if st.text_status in self.EMBLEMS: file.add_emblem(self.EMBLEMS[st.text_status]) # Keep a note of this file object in case we have commits etc. t = [ pysvn.wc_status_kind.modified, pysvn.wc_status_kind.added, pysvn.wc_status_kind.deleted] if st.text_status in t: if file not in self.monitoredFiles: self.monitoredFiles.append(file) else: try: self.monitoredFiles.remove(file) except: pass #-------------------------------------------------------------------------- def get_file_items(self, window, files): """ Menu activated with files selected """ # At the moment we're only handling single files or folders if len(files) < 1: return file = files[0] if file is None: return path = gnomevfs.get_local_path_from_uri(file.get_uri()) items = [ ('NautilusPython::svndelete_file_item', 'Delete' , 'Remove files from the repository.', self.OnDelete, "rabbitvcs-delete"), ('NautilusPython::svnrename_file_item', 'Rename' , 'Rename a file in the repository', self.OnRename, "rabbitvcs-rename"), ('NautilusPython::svnrefreshstatus_file_item', 'Refresh Status', 'Refresh the display status of the selected files.', self.OnRefreshStatus, "rabbitvcs-refresh"), ('NautilusPython::svnrepo_file_item', 'Repository Browser' , 'View Repository Sources', self.OnRepoBrowser, gtk.STOCK_FIND) ] if len( files ) == 1: items += [ ('NautilusPython::svnlog_file_item', 'Log' , 'Log of %s' % file.get_name(), self.OnShowLog, "rabbitvcs-show_log"), ('NautilusPython::svnupdate_file_item', 'Update' , 'Get the latest code from the repository.', self.OnUpdate, "rabbitvcs-update") ] # Check if this is a folder, and if so if it's under source control if os.path.isdir(path): # Check if this folder is versioned if os.path.isdir(os.path.join(path, ".svn")): # Check if any of our children are modified. c = pysvn.Client() st = c.status(path, recurse=RECURSIVE_STATUS) statuses = set([x.text_status for x in st]) t = set([ pysvn.wc_status_kind.modified, pysvn.wc_status_kind.added, pysvn.wc_status_kind.deleted]) if len( t & statuses ): # If so, add some useful menu items items += [ ('NautilusPython::svnmkdiff_file_item', 'Patch', 'Create a patch of %s from the repository version'%file.get_name(), self.OnMkDiff, "rabbitvcs-diff"), ('NautilusPython::svnrevert_file_item', 'Revert' , 'Revert %s back to the repository version.'%file.get_name(), self.OnRevert, "rabbitvcs-revert")] items += [ ('NautilusPython::svncommit_file_item', 'Commit' , 'Commit %s to the repository.' % file.get_name(), self.OnCommit, "rabbitvcs-commit"), ('NautilusPython::svnproperties_file_item', 'Properties', 'File properties for %s.'%file.get_name(), self.OnProperties, "rabbitvcs-properties") ] else: # Check if the parent is under source control if os.path.isdir(os.path.join(os.path.split(path)[0], ".svn")): items = [('NautilusPython::svnadd_file_item', 'Add' , 'Add %s to the repository.'%file.get_name(), self.OnAdd, "rabbitvcs-add")] else: items = [('NautilusPython::svncheckout_file_item', 'Checkout' , 'Checkout code from an SVN repository', self.OnCheckout, "rabbitvcs-checkout")] else: # We're a file, so lets check if we're in a versioned folder if os.path.isdir(os.path.join(os.path.split(path)[0], ".svn")): # OK we're in a versioned folder - are we already in SVN? c = pysvn.Client() st = c.status(path)[0] if not st.is_versioned: # If not, we can only offer to add the file. items = [('NautilusPython::svnadd_file_item', 'Add' , 'Add %s to the repository.'%file.get_name(), self.OnAdd, "rabbitvcs-add")] # Add the revert and diff items if we've changed from the repos version if st.text_status in [pysvn.wc_status_kind.added, pysvn.wc_status_kind.modified]: items += [ ('NautilusPython::svnrevert_file_item', 'Revert' , 'Revert %s back to the repository version.'%file.get_name(), self.OnRevert, "rabbitvcs-revert"), ] if len(files) == 1: items += [ ('NautilusPython::svncommit_file_item', 'Commit' , 'Commit %s to the repository.' % file.get_name(), self.OnCommit, "rabbitvcs-commit"), ('NautilusPython::svndiff_file_item', 'Diff' , 'Diff %s against the repository version' % file.get_name(), self.OnShowDiff, "rabbitvcs-diff"), ('NautilusPython::svnmkdiff_file_item', 'Patch', 'Create a patch of %s from the repository version'%file.get_name(), self.OnMkDiff, "rabbitvcs-createpatch"), ] # Add the conflict resolution menu items if st.text_status in [pysvn.wc_status_kind.conflicted]: items += [ ('NautilusPython::svnrevert_file_item', 'Revert' , 'Revert %s back to the repository version.'%file.get_name(), self.OnRevert, "rabbitvcs-revert"), ] if len(files) == 1: items += [ ('NautilusPython::svneditconflict_file_item', 'Edit Conflicts' , 'Edit the conflicts found when updating %s.'%file.get_name(), self.OnEditConflicts, None), ('NautilusPython::svnresolveconflict_file_item', 'Resolved' , 'Mark %s as resolved.'%file.get_name(), self.OnResolveConflicts, "rabbitvcs-resolve")] items += [ ('NautilusPython::svnproperties_file_item', 'Properties', 'File properties for %s.'%file.get_name(), self.OnProperties, "rabbitvcs-properties") ] else: items = [] return self.create_menu(window, items, files) #-------------------------------------------------------------------------- def get_background_items(self, window, file): """ Menu activated on window background """ if file.get_uri() == "x-nautilus-desktop:///": return path = gnomevfs.get_local_path_from_uri(file.get_uri()) window.set_data("base_dir", os.path.realpath(unicode(path))) if not os.path.isdir(os.path.join(path,".svn")): items = [ ('NautilusPython::svncheckout_file_item', 'Checkout' , 'Checkout code from an SVN repository', self.OnCheckout, "rabbitvcs-checkout") ] else: items = [ ('NautilusPython::svnlog_file_item', 'Log' , 'SVN Log of %s' % file.get_name(), self.OnShowLog, "rabbitvcs-show_log"), ('NautilusPython::svncommit_file_item', 'Commit' , 'Commit %s back to the repository.' % file.get_name(), self.OnCommit, "rabbitvcs-commit"), ('NautilusPython::svnrepo_file_item', 'Repository Browser' , 'View Repository Sources', self.OnRepoBrowser, gtk.STOCK_FIND), ('NautilusPython::svnupdate_file_item', 'Update' , 'Get the latest code from the repository.', self.OnUpdate, "rabbitvcs-update"), ('NautilusPython::svnrefreshstatus_file_item', 'Refresh', 'Refresh the display status of %s.'%file.get_name(), self.OnRefreshStatus, "rabbitvcs-refresh"), ('NautilusPython::svnmkdiffdir_file_item', 'Patch', 'Create a patch of %s from the repository version'%file.get_name(), self.OnMkDiffDir, "rabbitvcs-diff"), ('NautilusPython::svnproperties_file_item', 'Properties', 'File properties for %s.'%file.get_name(), self.OnProperties, "rabbitvcs-properties") ] return self.create_menu(window, items, [file]) def create_menu(self, window, items, paths): """ While I can add submenu items in nautilus-python 0.5.0, I can't get the submenu item activate signal to connect to a callback method menuitem = nautilus.MenuItem('NautilusPython::Svn', 'RabbitVCS', '', "rabbitvcs") if hasattr(menuitem, "set_submenu"): submenu = nautilus.Menu() menuitem.set_submenu(submenu) for item in items: i = nautilus.MenuItem( item[0], item[1], item[2], item[4] ) i.connect('activate', item[3], window, paths) submenu.append_item( i ) return menuitem, """ menuitems = [] for item in items: i = nautilus.MenuItem( item[0], item[1], item[2], item[4] ) i.connect('activate', item[3], window, paths) menuitems.append(i) return menuitems #-------------------------------------------------------------------------- def RescanFilesAfterProcess(self, pid): """ Rescans all of the files on our *monitoredFiles* list after the process specified by *pid* completes. """ # We need a function that can check the file status once the process has completed. def ThreadProc(): # First we need to see if the commit process is still running if os.path.exists("/proc/" + str(pid)): # If so, check its status by reading the status file from /proc f = open("/proc/%d/status"%pid).readlines() # if it's a zombie process, then we can waitpid() on it to end the process if "zombie" in f[1]: os.waitpid(pid, 0) # Return true to get another callback after the next timeout return True else: # The process has completed, so we now want to rescan the # files we're monitoring to see if their status has changed. We # need to make a copy of monitoredFiles as the rescanning process # will affect it. checkList = copy.copy(self.monitoredFiles) while len(checkList): checkList.pop().invalidate_extension_info() return False # Add our callback function on a 1 second timeout gobject.timeout_add(1000, ThreadProc) #-------------------------------------------------------------------------- def OnEditConflicts(self, menuitem, window, files): """ Edit Conflicts menu handler. """ file = files[0] path = gnomevfs.get_local_path_from_uri(file.get_uri()) rabbitvcs.util.helper.launch_diff_tool(path + ".mine", path) #-------------------------------------------------------------------------- def OnResolveConflicts(self, menuitem, window, files): """ Resolve Conflicts menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("resolve", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnRevert(self, menuitem, window, files): """ Revert menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("revert", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnCheckout(self, menuitem, window, files): """ Checkout menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("checkout", paths) #-------------------------------------------------------------------------- def OnShowDiff(self, menuitem, window, files): """ Diff menu handler. """ paths = self.get_paths_from_files(files) rabbitvcs.util.helper.launch_diff_tool(*paths) #-------------------------------------------------------------------------- def OnShowLog(self, menuitem, window, files): """ Show Log menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("log", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnCommit(self, menuitem, window, files): """ Commit menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("commit", ["--base-dir=" + window.get_data("base_dir")] + paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnUpdate(self, menuitem, window, files): """ Update menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("update", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnAdd(self, menuitem, window, files): """ Add menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("add", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnDelete(self, menuitem, window, files): """ Delete menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("delete", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnRename(self, menuitem, window, files): """ Delete menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("rename", paths) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnRepoBrowser(self, menuitem, window, files): """ Repository Browser menu handler. """ paths = self.get_paths_from_files(files) pid = rabbitvcs.util.helper.launch_ui_window("browser", [paths[0]]) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnRefreshStatus(self, menuitem, window, files): """ Refresh status menu handler. Invalidates the status of all of the selected files. """ for file in files: file.invalidate_extension_info() #-------------------------------------------------------------------------- def OnProperties(self, menuitem, window, files): """ Properties menu handler. """ file = files[0] path = gnomevfs.get_local_path_from_uri(file.get_uri()) pid = rabbitvcs.util.helper.launch_ui_window("property_editor", [path]) self.RescanFilesAfterProcess(pid) #-------------------------------------------------------------------------- def OnMkDiff(self, menuitem, window, files): """ MkDiff menu handler. """ paths = self.get_paths_from_files(files) proc = launch_ui_window("createpatch", paths) self.rabbitvcs_extension.execute_after_process_exit(proc) #-------------------------------------------------------------------------- def OnMkDiffDir(self, menuitem, window, files): """ MkDiffDir menu handler. """ paths = self.get_paths_from_files(files) proc = launch_ui_window("createpatch", paths) self.rabbitvcs_extension.execute_after_process_exit(proc) def get_paths_from_files(self, files): paths = [] for file in files: paths.append(gnomevfs.get_local_path_from_uri(file.get_uri())) return paths #============================================================================== rabbitvcs-0.16/clients/nemo/000077500000000000000000000000001230007774300160215ustar00rootroot00000000000000rabbitvcs-0.16/clients/nemo/README000066400000000000000000000014331230007774300167020ustar00rootroot00000000000000RabbitVCS Nautilus3 Extension This extension is meant to be used with the Nautilus File Manager 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 nautilus > /dev/null & Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.16/clients/nemo/RabbitVCS.py000066400000000000000000000572731230007774300201700ustar00rootroot00000000000000# # 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 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, 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 os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"] = "1" import os.path from os.path import isdir, isfile, realpath, basename import datetime from gi.repository import Nemo, GObject, Gtk, GdkPixbuf 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 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, 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{NautilusVFSFile}. It looks like::: #: #: nautilusVFSFile_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. nautilusVFSFile_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, path): return path.replace("file://", "") def __init__(self): factory = Gtk.IconFactory() rabbitvcs_icons = [ "scalable/actions/rabbitvcs-settings.svg", "scalable/actions/rabbitvcs-export.svg", "scalable/actions/rabbitvcs-properties.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: 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 Nemo.OperationResult.COMPLETE if not self.valid_uri(item.get_uri()): return Nemo.OperationResult.FAILED path = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) # log.debug("update_file_info() called for %s" % path) invalidate = False if path in self.nautilusVFSFile_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.nautilusVFSFile_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 xrange(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 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 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_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": conditions = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(self, window.base_dir, paths, conditions).get_menu() return menu if conditions_dict != "in-progress": 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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) paths.append(path) self.nautilusVFSFile_table[path] = item if len(paths) == 0: return [] # log.debug("get_file_items() called") return NautilusMainContextMenu(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 import rabbitvcs.util.helper path = unicode(gnomevfs.get_local_path_from_uri(item.get_uri()), "utf-8").replace("/", ":") profile_data_file = os.path.join( rabbitvcs.util.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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_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 = NautilusMenuConditions(conditions_dict) menu = NautilusMainContextMenu(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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) self.nautilusVFSFile_table[path] = item # log.debug("get_background_items() called") window.base_dir = path return NautilusMainContextMenu(self, path, [path]).get_menu() 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 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-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.nautilusVFSFile_table: item = self.nautilusVFSFile_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 = rabbitvcs.util.helper.unquote_url(self.get_local_path(item.get_uri())) if self.vcs_client.is_in_a_or_a_working_copy(path): paths.append(path) self.nautilusVFSFile_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 = Nemo.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 "Nemo.MenuItem"s). """ signal = "activate" def make_menu_item(self, item, id_magic): # return item.make_nautilus_menu_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 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.16/clients/osx_finder/000077500000000000000000000000001230007774300172235ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/000077500000000000000000000000001230007774300210465ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Add.workflow/000077500000000000000000000000001230007774300240365ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Add.workflow/Contents/000077500000000000000000000000001230007774300256335ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Add.workflow/Contents/Info.plist000066400000000000000000000011641230007774300276050ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Add NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Add.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300275345ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Add.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001103751230007774300321740ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Annotate.workflow/000077500000000000000000000000001230007774300251175ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Annotate.workflow/Contents/000077500000000000000000000000001230007774300267145ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Annotate.workflow/Contents/Info.plist000066400000000000000000000011711230007774300306640ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Annotate NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Annotate.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300306155ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Annotate.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110341230007774300332460ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Branch.workflow/000077500000000000000000000000001230007774300245435ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Branch.workflow/Contents/000077500000000000000000000000001230007774300263405ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Branch.workflow/Contents/Info.plist000066400000000000000000000011671230007774300303150ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Branch NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Branch.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300302415ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Branch.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001107041230007774300326750ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Branch.workflow/Contents/document.wflow000066400000000000000000000160701230007774300312420ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Browse Repository.workflow/000077500000000000000000000000001230007774300267475ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/000077500000000000000000000000001230007774300305445ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/Info.plist000066400000000000000000000012021230007774300325070ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Browse Repository NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300324455ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001106401230007774300350210ustar00rootroot00000000000000rabbitvcs-0.16/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.16/clients/osx_finder/services/SVN Browse Repository.workflow/Contents/document.wflow000066400000000000000000000160571230007774300334530ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Check for modifications.workflow/000077500000000000000000000000001230007774300277435ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/000077500000000000000000000000001230007774300315405ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/Info.plist000066400000000000000000000012101230007774300335020ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Check for modifications NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Check for modifications.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300334415ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001112121230007774300360110ustar00rootroot00000000000000rabbitvcs-0.16/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.wflow000066400000000000000000000160611230007774300343630ustar00rootroot00000000000000rabbitvcs-0.16/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.16/clients/osx_finder/services/SVN Checkout....workflow/000077500000000000000000000000001230007774300253255ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Checkout....workflow/Contents/000077500000000000000000000000001230007774300271225ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Checkout....workflow/Contents/Info.plist000066400000000000000000000011761230007774300310770ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Checkout... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.folder rabbitvcs-0.16/clients/osx_finder/services/SVN Checkout....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300310235ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Checkout....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001100671230007774300334610ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Checkout....workflow/Contents/document.wflow000066400000000000000000000161011230007774300320170ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Commit....workflow/000077500000000000000000000000001230007774300250105ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Commit....workflow/Contents/000077500000000000000000000000001230007774300266055ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Commit....workflow/Contents/Info.plist000066400000000000000000000011721230007774300305560ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Commit... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Commit....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300305065ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Commit....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001104321230007774300331400ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Commit....workflow/Contents/document.wflow000066400000000000000000000160561230007774300315130ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Delete.workflow/000077500000000000000000000000001230007774300245505ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Delete.workflow/Contents/000077500000000000000000000000001230007774300263455ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Delete.workflow/Contents/Info.plist000066400000000000000000000011671230007774300303220ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Delete NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Delete.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300302465ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Delete.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106461230007774300327070ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Delete.workflow/Contents/document.wflow000066400000000000000000000160551230007774300312520ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Diff (Side by side view).workflow/000077500000000000000000000000001230007774300274375ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/000077500000000000000000000000001230007774300312345ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/Info.plist000066400000000000000000000012111230007774300331770ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Diff (Side by side view) NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Diff (Side by side view).workflow/Contents/QuickLook/000077500000000000000000000000001230007774300331355ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001110641230007774300355120ustar00rootroot00000000000000rabbitvcs-0.16/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.wflow000066400000000000000000000160711230007774300340600ustar00rootroot00000000000000rabbitvcs-0.16/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.16/clients/osx_finder/services/SVN Diff.workflow/000077500000000000000000000000001230007774300242165ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Diff.workflow/Contents/000077500000000000000000000000001230007774300260135ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Diff.workflow/Contents/Info.plist000066400000000000000000000011651230007774300277660ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Diff NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Diff.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300277145ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Diff.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110071230007774300323450ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Export....workflow/000077500000000000000000000000001230007774300250415ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Export....workflow/Contents/000077500000000000000000000000001230007774300266365ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Export....workflow/Contents/Info.plist000066400000000000000000000011721230007774300306070ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Export... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Export....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300305375ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Export....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001107271230007774300332000ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Export....workflow/Contents/document.wflow000066400000000000000000000160671230007774300315460ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Ignore.workflow/000077500000000000000000000000001230007774300245715ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Ignore.workflow/Contents/000077500000000000000000000000001230007774300263665ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Ignore.workflow/Contents/Info.plist000066400000000000000000000011671230007774300303430ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Ignore NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Ignore.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300302675ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Ignore.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106631230007774300327270ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Ignore.workflow/Contents/document.wflow000066400000000000000000000160561230007774300312740ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Log.workflow/000077500000000000000000000000001230007774300240675ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Log.workflow/Contents/000077500000000000000000000000001230007774300256645ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Log.workflow/Contents/Info.plist000066400000000000000000000011641230007774300276360ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Log NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Log.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300275655ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Log.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001110261230007774300322170ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Log.workflow/Contents/document.wflow000066400000000000000000000160651230007774300305720ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Mark Resolved.workflow/000077500000000000000000000000001230007774300260045ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/000077500000000000000000000000001230007774300276015ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/Info.plist000066400000000000000000000011761230007774300315560ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Mark Resolved NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300315025ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001111451230007774300340570ustar00rootroot00000000000000rabbitvcs-0.16/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.16/clients/osx_finder/services/SVN Mark Resolved.workflow/Contents/document.wflow000066400000000000000000000160641230007774300325060ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Merge....workflow/000077500000000000000000000000001230007774300246175ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Merge....workflow/Contents/000077500000000000000000000000001230007774300264145ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Merge....workflow/Contents/Info.plist000066400000000000000000000011711230007774300303640ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Merge... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Merge....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300303155ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Merge....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001112251230007774300327500ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Merge....workflow/Contents/document.wflow000066400000000000000000000160671230007774300313240ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Properties.workflow/000077500000000000000000000000001230007774300255025ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Properties.workflow/Contents/000077500000000000000000000000001230007774300272775ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Properties.workflow/Contents/Info.plist000066400000000000000000000011731230007774300312510ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Properties NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Properties.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300312005ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Properties.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001106701230007774300336360ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Properties.workflow/Contents/document.wflow000066400000000000000000000160621230007774300322020ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Rename.workflow/000077500000000000000000000000001230007774300245555ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Rename.workflow/Contents/000077500000000000000000000000001230007774300263525ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Rename.workflow/Contents/Info.plist000066400000000000000000000011671230007774300303270ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Rename NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Rename.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300302535ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Rename.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001105411230007774300327060ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Rename.workflow/Contents/document.wflow000066400000000000000000000160561230007774300312600ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Revert.workflow/000077500000000000000000000000001230007774300246155ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Revert.workflow/Contents/000077500000000000000000000000001230007774300264125ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Revert.workflow/Contents/Info.plist000066400000000000000000000011671230007774300303670ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Revert NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Revert.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300303135ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Revert.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001104711230007774300327500ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Revert.workflow/Contents/document.wflow000066400000000000000000000160561230007774300313200ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Switch....workflow/000077500000000000000000000000001230007774300250215ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Switch....workflow/Contents/000077500000000000000000000000001230007774300266165ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Switch....workflow/Contents/Info.plist000066400000000000000000000011721230007774300305670ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Switch... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Switch....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300305175ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Switch....workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001105661230007774300331610ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Switch....workflow/Contents/document.wflow000066400000000000000000000160561230007774300315240ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Update to....workflow/000077500000000000000000000000001230007774300254055ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Update to....workflow/Contents/000077500000000000000000000000001230007774300272025ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Update to....workflow/Contents/Info.plist000066400000000000000000000011751230007774300311560ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Update to... NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.item rabbitvcs-0.16/clients/osx_finder/services/SVN Update to....workflow/Contents/QuickLook/000077500000000000000000000000001230007774300311035ustar00rootroot00000000000000Thumbnail.png000066400000000000000000001112411230007774300334550ustar00rootroot00000000000000rabbitvcs-0.16/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.16/clients/osx_finder/services/SVN Update to....workflow/Contents/document.wflow000066400000000000000000000160721230007774300321060ustar00rootroot00000000000000 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.16/clients/osx_finder/services/SVN Update.workflow/000077500000000000000000000000001230007774300245705ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Update.workflow/Contents/000077500000000000000000000000001230007774300263655ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Update.workflow/Contents/Info.plist000066400000000000000000000011711230007774300303350ustar00rootroot00000000000000 NSServices NSMenuItem default SVN Update NSMessage runWorkflowAsService NSRequiredContext NSApplicationIdentifier com.apple.finder NSSendFileTypes public.folder rabbitvcs-0.16/clients/osx_finder/services/SVN Update.workflow/Contents/QuickLook/000077500000000000000000000000001230007774300302665ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/services/SVN Update.workflow/Contents/QuickLook/Thumbnail.png000066400000000000000000001074061230007774300327270ustar00rootroot00000000000000PNG  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.16/clients/osx_finder/services/SVN Update.workflow/Contents/document.wflow000066400000000000000000000160651230007774300312730ustar00rootroot00000000000000 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.16/clients/osx_finder/toolbar_button/000077500000000000000000000000001230007774300222605ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/toolbar_button/English.lproj/000077500000000000000000000000001230007774300247765ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/toolbar_button/English.lproj/InfoPlist.strings000066400000000000000000000001341230007774300303160ustar00rootroot00000000000000/* Localized versions of Info.plist keys */ rabbitvcs-0.16/clients/osx_finder/toolbar_button/English.lproj/MainMenu.xib000066400000000000000000003755541230007774300272360ustar00rootroot00000000000000 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.16/clients/osx_finder/toolbar_button/Info.plist000066400000000000000000000016241230007774300242330ustar00rootroot00000000000000 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.16/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/000077500000000000000000000000001230007774300273005ustar00rootroot00000000000000rabbitvcs-0.16/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/TemplateIcon.icns000066400000000000000000001461361230007774300325550ustar00rootroot00000000000000icns^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.16/clients/osx_finder/toolbar_button/SCToolbarButton.xcodeproj/project.pbxproj000066400000000000000000000317061230007774300323630ustar00rootroot00000000000000// !$*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.16/clients/osx_finder/toolbar_button/SCToolbarButton_Prefix.pch000066400000000000000000000002251230007774300273140ustar00rootroot00000000000000// // Prefix header for all source files of the 'CocoPopUp' target in the 'CocoPopUp' project // #ifdef __OBJC__ #import #endif rabbitvcs-0.16/clients/osx_finder/toolbar_button/fileListBuilder.h000066400000000000000000000003551230007774300255160ustar00rootroot00000000000000// // 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.16/clients/osx_finder/toolbar_button/fileListBuilder.m000066400000000000000000000053161230007774300255250ustar00rootroot00000000000000#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.16/clients/osx_finder/toolbar_button/main.m000066400000000000000000000334561230007774300233750ustar00rootroot00000000000000 #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.16/clients/osx_finder/toolbar_button/schelper.icns000066400000000000000000001261121230007774300247460ustar00rootroot00000000000000icnsJics#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.16/clients/thunar/000077500000000000000000000000001230007774300163645ustar00rootroot00000000000000rabbitvcs-0.16/clients/thunar/README000066400000000000000000000012141230007774300172420ustar00rootroot00000000000000RabbitVCS Thunar Extension This extension is meant to be used with the Thunar File Manager, Requirements: * thunar (>= v0.4.0) * thunarx-python (>= v0.2.0) * dbus-python (>= 0.80) * (all other RabbitVCS requirements) To install: If you are running Thunar v1.1.0 or later, copy RabbitVCS.py to: /usr/lib/thunarx-2/python. If you are running Thunar < v1.1.0, copy RabbitVCS.py to: /usr/lib/thunarx-1/python. In both cases, you may need to create the python folder. Troubleshooting: See the known-issues section of our website: http://wiki.rabbitvcs.org/wiki/support/known-issues rabbitvcs-0.16/clients/thunar/RabbitVCS.py000066400000000000000000000273471230007774300205320ustar00rootroot00000000000000# # 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 import copy import os.path from os.path import isdir, isfile, realpath, basename import datetime import time import threading import urllib import thunarx import pysvn import gobject import gtk from rabbitvcs.vcs.svn import SVN 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.decorators import timeit, disable from rabbitvcs.util.contextmenu import 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(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{NautilusVFSFile}. It looks like::: #: #: nautilusVFSFile_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. nautilusVFSFile_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): return urllib.unquote(item.get_uri().replace("file://", "")) #~ @disable # @timeit def get_file_actions(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(unicode(self.get_local_path(item), "utf-8")) paths.append(path) self.nautilusVFSFile_table[path] = item if len(paths) == 0: return [] return ThunarxMainContextMenu(self, window.get_data("base_dir"), paths).get_menu() #~ @disable @timeit def get_folder_actions(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(unicode(self.get_local_path(item), "utf-8")) self.nautilusVFSFile_table[path] = item # log.debug("get_background_items() called") window.set_data("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(unicode(self.get_local_path(item), "utf-8")) paths.append(path) self.nautilusVFSFile_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("") ppage.set_label_widget(label) ppage.add(page) return [ppage] from rabbitvcs.util.contextmenuitems import * class ThunarxContextMenu(rabbitvcs.util.contextmenu.MenuBuilder): """ Provides a standard Gtk Context Menu class used for all context menus in gtk dialogs/windows. """ signal = "activate" def make_menu_item(self, item, id_magic): return item.make_thunar_action(id_magic) def attach_submenu(self, menu_node, submenu_list): menu_node.set_sub_actions(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.16/data/000077500000000000000000000000001230007774300143335ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/000077500000000000000000000000001230007774300154465ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/000077500000000000000000000000001230007774300171055ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/16x16/000077500000000000000000000000001230007774300176725ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/16x16/actions/000077500000000000000000000000001230007774300213325ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/16x16/actions/rabbitvcs-push.png000066400000000000000000000011051230007774300247710ustar00rootroot00000000000000PNG  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.16/data/icons/hicolor/index.theme000066400000000000000000000533531230007774300212510ustar00rootroot00000000000000[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.16/data/icons/hicolor/scalable/000077500000000000000000000000001230007774300206535ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/scalable/actions/000077500000000000000000000000001230007774300223135ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-about.svg000066400000000000000000000323261230007774300261310ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-add.svg000066400000000000000000000346361230007774300255550ustar00rootroot00000000000000 image/svg+xml Add 2006-01-04 Andreas Nilsson http://tango-project.org add plus rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-annotate.svg000066400000000000000000000371111230007774300266250ustar00rootroot00000000000000 image/svg+xml System-log-out 2007-08-27 Lapo Calamandrei Kalle Persson logout exit man sign running rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-applypatch.svg000066400000000000000000000255171230007774300271700ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-asynchronous.svg000066400000000000000000000777021230007774300275610ustar00rootroot00000000000000 image/svg+xml Send and Receive Mail Jakub Steiner Andreas Nilsson, Garrett LeSage mail e-mail send receive rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-branch.svg000066400000000000000000000264321230007774300262550ustar00rootroot00000000000000 image/svg+xml View Fullscreen http://jimmac.musichall.cz Jakub Steiner window maximize fullscreen view rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-bug.svg000066400000000000000000000370061230007774300255740ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-changes.svg000066400000000000000000000245261230007774300264320ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-checkmods.svg000066400000000000000000001105471230007774300267610ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Call Start receiver phone call start answer rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-checkout.svg000066400000000000000000001024311230007774300266170ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-cleanup.svg000066400000000000000000000400571230007774300264460ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-clear.svg000066400000000000000000000400571230007774300261050ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-commit.svg000066400000000000000000000212251230007774300263030ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-compare.svg000066400000000000000000000432661230007774300264520ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-createpatch.svg000066400000000000000000000162001230007774300272730ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-dbus.svg000066400000000000000000000267161230007774300257620ustar00rootroot00000000000000 image/svg+xml Konversation application icon March 2006 Andreas Nilsson http://tango-project.org konversation chat irc rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-delete.svg000066400000000000000000001326551230007774300262670ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Trashbin 2006-04-19 delete remove trashbin trashcan rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-diff.svg000066400000000000000000001050241230007774300257230ustar00rootroot00000000000000 image/svg+xml Edit Find edit find locate search Steven Garrity Jakub Steiner rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-drive.svg000066400000000000000000000564751230007774300261430ustar00rootroot00000000000000 image/svg+xml Drive - Hard Disk Jakub Steiner hdd hard drive fixed media solid http://jimmac.musichall.cz rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-editconflicts.svg000066400000000000000000000401341230007774300276450ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Paste edit paste rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-emblems.svg000066400000000000000000003557161230007774300264560ustar00rootroot00000000000000 image/svg+xml Photos 2006-06-11 Lapo Calamandrei rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-export.svg000066400000000000000000000563541230007774300263470ustar00rootroot00000000000000 image/svg+xml Folder Drag Accept Jakub Steiner http://jimmac.musichall.cz/ folder directory storage drag accept rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-help.svg000066400000000000000000000317131230007774300257460ustar00rootroot00000000000000 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.16/data/icons/hicolor/scalable/actions/rabbitvcs-import.svg000066400000000000000000001330331230007774300263260ustar00rootroot00000000000000 image/svg+xml Jakub Steiner, Lapo Calamandrei Drive Harddisk hdd drive hard fixed media rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-lock.svg000066400000000000000000000507461230007774300257550ustar00rootroot00000000000000 image/svg+xml Lock Screen Jakub Steiner video display lock screen password session screensaver http://jimmac.musichall.cz/ rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-merge.svg000066400000000000000000000432661230007774300261230ustar00rootroot00000000000000 image/svg+xml Restore View http://jimmac.musichall.cz Jakub Steiner window fullscreen view. restore rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-monkey.svg000066400000000000000000000577461230007774300263360ustar00rootroot00000000000000 image/svg+xml face-monkey Ulisse Perusin based on the work of someone who didn't fill the metadata... emotes monkey rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-properties.svg000066400000000000000000000614211230007774300272110ustar00rootroot00000000000000 image/svg+xml Document Properties document settings preferences properties tweak Jakub Steiner http://jimmac.musichall.cz rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-refresh.svg000066400000000000000000000423101230007774300264470ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz View Refresh reload refresh view Ricardo 'Rick' González rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-relocate.svg000066400000000000000000000220211230007774300266040ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-rename.svg000066400000000000000000000315051230007774300262640ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Text Editor rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-reset.svg000066400000000000000000000752441230007774300261470ustar00rootroot00000000000000 image/svg+xml Document Revert document revert Lapo Calamandrei 2007-02-15 rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-resolve.svg000066400000000000000000000400571230007774300264760ustar00rootroot00000000000000 image/svg+xml Ulisse Perusin uli.peru@gmail.com edit-clear rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-revert.svg000066400000000000000000000214311230007774300263210ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-run.svg000066400000000000000000001073761230007774300256330ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei System Run run launch exec rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-settings.svg000066400000000000000000000650041230007774300266560ustar00rootroot00000000000000 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.16/data/icons/hicolor/scalable/actions/rabbitvcs-show_log.svg000066400000000000000000000762411230007774300266440ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Log Viewer log viewer inspect system utility 3 set 2006 rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-stop.svg000066400000000000000000000274071230007774300260100ustar00rootroot00000000000000 image/svg+xml Stop 2005-10-16 Andreas Nilsson stop halt error Jakub Steiner rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-switch.svg000066400000000000000000000176331230007774300263240ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Go Jump go jump seek arrow pointer rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-unlock.svg000066400000000000000000000746051230007774300263200ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Ulisse Perusin Keys keys key password authentication rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-unstage.svg000066400000000000000000000203311230007774300264560ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/actions/rabbitvcs-update.svg000066400000000000000000000217401230007774300262770ustar00rootroot00000000000000 image/svg+xml Jakub Steiner http://jimmac.musichall.cz Edit Undo edit undo revert Andreas Nilsson Lapo Calamandrei rabbitvcs-0.16/data/icons/hicolor/scalable/apps/000077500000000000000000000000001230007774300216165ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/scalable/apps/rabbitvcs-small.svg000066400000000000000000000215201230007774300254240ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/apps/rabbitvcs.svg000066400000000000000000000307631230007774300243270ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/000077500000000000000000000000001230007774300222775ustar00rootroot00000000000000rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/README000066400000000000000000000004601230007774300231570ustar00rootroot00000000000000TortoiseSVN - 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.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-added.svg000066400000000000000000000061151230007774300273000ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-calculating.svg000066400000000000000000000374731230007774300305400ustar00rootroot00000000000000 image/svg+xml Lapo Calamandrei Clock clock time date rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-complicated.svg000066400000000000000000000101741230007774300305230ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-conflicted.svg000066400000000000000000000101741230007774300303510ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-deleted.svg000066400000000000000000000066321230007774300276510ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-error.svg000066400000000000000000000212531230007774300273700ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-ignored.svg000066400000000000000000000072151230007774300276700ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-locked.svg000066400000000000000000000325511230007774300275030ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-modified.svg000066400000000000000000000076141230007774300300240ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-normal.svg000066400000000000000000000070361230007774300275320ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-obstructed.svg000066400000000000000000000101741230007774300304150ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-read_only.svg000066400000000000000000000070251230007774300302140ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/data/icons/hicolor/scalable/emblems/emblem-rabbitvcs-unversioned.svg000066400000000000000000000165661230007774300306130ustar00rootroot00000000000000 image/svg+xml rabbitvcs-0.16/locale/000077500000000000000000000000001230007774300146615ustar00rootroot00000000000000rabbitvcs-0.16/locale/ca/000077500000000000000000000000001230007774300152445ustar00rootroot00000000000000rabbitvcs-0.16/locale/ca/LC_MESSAGES/000077500000000000000000000000001230007774300170315ustar00rootroot00000000000000rabbitvcs-0.16/locale/ca/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000030051230007774300211430ustar00rootroot00000000000000L  !&-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.16/locale/cs/000077500000000000000000000000001230007774300152665ustar00rootroot00000000000000rabbitvcs-0.16/locale/cs/LC_MESSAGES/000077500000000000000000000000001230007774300170535ustar00rootroot00000000000000rabbitvcs-0.16/locale/cs/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000221221230007774300211660ustar00rootroot00000000000000    *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.16/locale/de/000077500000000000000000000000001230007774300152515ustar00rootroot00000000000000rabbitvcs-0.16/locale/de/LC_MESSAGES/000077500000000000000000000000001230007774300170365ustar00rootroot00000000000000rabbitvcs-0.16/locale/de/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000521751230007774300211640ustar00rootroot00000000000000>   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.16/locale/en_GB/000077500000000000000000000000001230007774300156335ustar00rootroot00000000000000rabbitvcs-0.16/locale/en_GB/LC_MESSAGES/000077500000000000000000000000001230007774300174205ustar00rootroot00000000000000rabbitvcs-0.16/locale/en_GB/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000675261230007774300215540ustar00rootroot00000000000000\ 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.16/locale/es/000077500000000000000000000000001230007774300152705ustar00rootroot00000000000000rabbitvcs-0.16/locale/es/LC_MESSAGES/000077500000000000000000000000001230007774300170555ustar00rootroot00000000000000rabbitvcs-0.16/locale/es/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000665111230007774300212020ustar00rootroot00000000000000~   & 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.16/locale/es_CL/000077500000000000000000000000001230007774300156465ustar00rootroot00000000000000rabbitvcs-0.16/locale/es_CL/LC_MESSAGES/000077500000000000000000000000001230007774300174335ustar00rootroot00000000000000rabbitvcs-0.16/locale/es_CL/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000470221230007774300215540ustar00rootroot00000000000000*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.16/locale/fa/000077500000000000000000000000001230007774300152475ustar00rootroot00000000000000rabbitvcs-0.16/locale/fa/LC_MESSAGES/000077500000000000000000000000001230007774300170345ustar00rootroot00000000000000rabbitvcs-0.16/locale/fa/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000024541230007774300211550ustar00rootroot00000000000000x 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.16/locale/fi/000077500000000000000000000000001230007774300152575ustar00rootroot00000000000000rabbitvcs-0.16/locale/fi/LC_MESSAGES/000077500000000000000000000000001230007774300170445ustar00rootroot00000000000000rabbitvcs-0.16/locale/fi/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000036211230007774300211620ustar00rootroot00000000000000",/<  / :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.16/locale/fr/000077500000000000000000000000001230007774300152705ustar00rootroot00000000000000rabbitvcs-0.16/locale/fr/LC_MESSAGES/000077500000000000000000000000001230007774300170555ustar00rootroot00000000000000rabbitvcs-0.16/locale/fr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000767321230007774300212100ustar00rootroot00000000000000 Q$$%%"%7%J%_%p% %%2%%%%;%6&L&a&q&1&8&& '#&'J'_'r''('' '''($(3(((-(6 )1A)s)$)))))**/*?*V* h*t*&***** +7+HV+-+:+,(,.,>, M, Y, e,s,z, ~,, , ,, ,,|- -- -/- --..1.?H.6.5.".#/7O7c77777777 7B7 18 ;8E8"W8 z88)88888 8888899 9-949 D9Q9 X9 d99 999 9999 9 :: $:/:6::: C:O:W:"^::::::::; ; ;;4; D;O;S;X;g; m; {;;;;;;;;; < < <'<@< Z<d<w<<<<< <<<<<= == $=.=>= E=O=W=k=z===== == >> >%>8>G>`> >>>>>>&>>>*?6A?x?? ?????@@6@P@j@@@@@@@A0AJAcA hAsA A2A0A,A#B*B @BNB^BoBxBBBB&B(BC=C!FChCCC CCC CC CCCC CC C DDAD-\D*D$D*DEA$E%fE,E,E+EQFdFhF nFxF"}F%FFFFFF$G,GBG XGdG_HfHlHsH#HH$HHI .I!8I&ZI%I;IIJ(J(=J fJsJJwJ#JJJJ K KLLMM*M:MQMhM }MM;MMMNPNgNNNN3NMNLO-bO)OOOO P.PMP jPwP PPPPQ"Q6Q?R8SRR4RRR S"S8SGSaSrSS SS,SST!/TQTkTSTLT-$U;RU!U UUUUUV$V+V3V GVhV|V'V VVW WW W7WW, X7X'QX#yXHX>X;%Y%aY*YY*YYY YZZ )Z 4Z BZLZUZqZ&Z ZZZZ Z,Z[1[7Q[[[[ [[[mx\\ ]]G],d] ] ]]%]!] ^$^-?^m^*^!^^^^__'_=_S_i_z______``0`G` b`o```"`9`a"a7aKaba!xaaJaabb%b+b :bDb)cbbb(bbb cccccc*d .d9dBd Xd2yddd dKde e*e>e ^eje.seee eeeeeeffff6f>fSfjfsf!ff f f,fggg!g@g Tgbgg gg ggg g-g h$h8h!Lh/nh!h hhh hhii'i+i /i=iBi Wi eipitiiiiiijjj$,j"Qjtjjj jjjj kk "k.kHk`k xk k kkk k kkk%k$l;l Zl"fll$lll lllm m z!z+{1-{*_{{2{){,{L%|%r||&|)||}^}/r} }}}},nDjl?4Lo ~gBlf&LuY4_W<mPF]": 1jC7H$t +3m>X0R`19-zi($= x?qsaU{ThGi)O[J5c( V"D^.eyW'*dKKP~ApO[Y^hRvpIHrN%8Q6+r} ] !:yM v&/unb5ZtM ,IUX=ws!q|\N.`cF'xk%C}9kZ#;V;23g\*2od{)<QTGB zAw-E7J/| EfSS#6>0bea_@@8%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)Commit to:Edit Property DetailsEnter Name and Email DetailsFiles to lockFolder NameFrom RevisionFrom URLFrom: (URL and revision to merge)Import 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 MessagesProgram used to compare filesProperties for:RabbitVCSRemote 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 previous revisionCompare with working copyCompleted AddCompleted Branch/tagCompleted CheckoutCompleted CleanupCompleted CommitCompleted ExportCompleted ImportCompleted LockCompleted MergeCompleted Merge TestCompleted RelocateCompleted RenameCompleted ResolveCompleted RevertCompleted RollbackCompleted SwitchCompleted UnlockCompleted UpdateConfig file:ConfirmationContent 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 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 ProgramsFile 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:ImportImport - %sImport an item into a repositoryInclude ignored filesInvalidateIssuer: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:PullRabbitVCSRabbitVCS ErrorRealm:RecursiveRefreshRefresh InformationRefresh StatusRefresh the list of properties.Release Lock...Release lock on an itemRelocateRelocate your working copyRelocate...Remote Repository ManagerRemotesRenameRename...Repository BrowserRepository URLRepository paths clearedRepository successfully createdRepository:ReservedResolveRestoreRestore 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 RevisionRolling Back...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 repositorySelectSelect / Deselect allSelect a FileSelect a FolderSelect a programSettingsShow Changes...Show LogShow RabbitVCS debugging toolsShow a file's log informationShow changes against previous revisionShow changes between paths and revisionsShow changes between revisionsShow logShow new version on the left sideShow unversioned filesShowing Revisions:SizeStart Point:StatusSteal the locksStop on copySwitchSwitch...TagTagger: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 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 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 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-01 23:05+0000 Last-Translator: Clyssandre Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n > 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) Il 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é100Un conflit a été trouvé dans le fichier suivant :Ajouter une brancheAjouter un messageAjouter un TagFicher(s) affecté(s) (double-clic pour comparer avec la version de base)AuthentificationDétail de la brancheBranchesDétails du certificatChanger le dépôt de votre copie de travailFichiers modifiés (double-clic pour comparer avec la version de base)Envoyer vers :É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)Message d'importationLiensMessages du journalOptions de journalisationMé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émentaireMerci d'ajouter vos détails d'authentificationMerci de décrire pourquoi vous verrouillez ces fichiersMerci de fournir vos fichier de certification sslMessages précédentsProgramme utilisé pour comparer des fichiersPropriétés pour:RabbitVCSDépôts distantsURI distante :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'URLInformation sur la versionCopie de travail :Copie de travailLes propriétés sélectionnées seront appliquées de manière récursive.Êtes vous sur de vouloir supprimer %item%?RabbitVCSErreur 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 correctifAppliquer le correctif pour le repertoire...Appliquer le correctif...Appliquer la propriété récursivementApplication du fichier correctif...Ê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 ?AuthentificationInformations d'authentification nettoyéesAuteurAuteur :Auteurs :BrancheGestionnaire de branchesBranch/tagBranch/tag...Branche :BranchesNavigateur de référentielParcourir dansNaviguez vers un fichier ou un dossierParcourir...BugsAnnulerImpossible d'annoter le dossierChangementChanger 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...CheckoutCheckout - %sMettre à 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.Nettoyer votre copie de travailNettoyage...NettoyerNettoyage demandé.... Commencer le nettoyage de la copie de travail ?Nettoyer vos informations d'authentificationDupliquerFermer cette boîte de dialogue.EnvoyerEnvoyer les modifications au dépôt.Comparer des fichiers ou dossiersComparer les révisionsComparaison côte à côteComparer les différences entre deux fichiersComparer avec la baseComparer avec les révisions précédentesComparer avec la copie de travailAjout terminéBranch/tag terminéCheckout terminéNettoyage terminéEnvoi terminéExportation terminéeImportation terminéeVerrouillage terminéFusion terminéeTest de fusion terminéRelocalisation terminéeRenommage terminéRésolution terminéeRétablissement terminéAnnulation terminéeBasculement terminéDéverrouillage terminéMise à jour 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 vers...Créer un dossier…Créer un correctifCré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 faitCréation du fichier correctifDateDate :DebugDebug inverséSupprimerConfirmation de la suppressionSupprimer les propriétés récursivementSupprimer la propriétéSupprimer cette propriétéSupprimer cette propriété (récursive)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 ?Editer l'auteurEditer l'auteur...Modifier les détailsEditer le message de journalEditer le message de journal...Editer les propriétés de la révision...Éditer...E-mail :Activer les emblèmesActiver les attributs de fichierActiver les vérifications récursives des statutsAnglaisExporterExporter - %sExporter une copie de travail ou un dépôt sans information de versionnageExporterExtensionProgrammes externesLe fichier n'est pas versionnéEmpreinte :TerminéForcer un appel à invalidate_extension_info()%d objet(s) trouvé(s)Depuis :GénéralObtenir le verrouObtenir le verrou...GitGrapheHEADAideHôteHôte :Comment voulez-vous procéder ?IgnorerIgnorer l'ascendanceIgnorer les fichiers :ImporterImportation - %sImporter un objet dans un dépôtInclure les fichiers ignorésInvaliderÉmetteur :Conserver l'historique de l'ancienne brancheLangage:Limite:LigneListe des options de comparaisonsCharger/RafraîchirChargement...Verrouiller localement un objetVerrouiller les fichiersVerrouilléJournalJournal - %sMessage du journalJournalisationIdentifiant :Marquer un conflit sur un objet comme résoluFusionnerAssistant de fusionMerger manuellementFusionner une gamme de révisionsMerger les modifications avec la branche localeFusionner deux arbres différentsFusion...MessageMessage:Type MIMENiveau minimum à journaliserPlus d'actions...Déplacer vers...N/ANomNom et E-mailNom:Nouvel emplacement :Nouveau nom :Nouveau...NonMessages de notificationNuméroNombre d'URL à retenirNombre de messages à retenirOmettre les externesEnregistrer seulement la fusionOuvrirOuvrir un terminalOuvrir un fichierOuvrir depuis la première révisionOuvrir depuis la seconde révisionMot de passe :Fichier correctif appliquéFichier correctif crééRépertoireChemin :Messages précédentsMessages précèdents nettoyésPropriétésPropriétés - %sPropriétéChangement de propriétéÉditeur de propriétéÉtat de la propriétéPropriété :RécupérerRabbitVCSErreur RabbitVCSDomaine:RécursifRafraîchirActualiser les informationsRafraîchir le statutRafraîchir la liste de propriétés.Relâcher le verrou...Relâcher le verrou d'un objetRelocaliserRelocaliser votre copie de travailRelocalisation…Gestionnaire de Dépôts à distanceDistantsRenommerRenommer...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éRésoudreRestaurerRestaurer un fichier manquantRétablirRétablir un objet à son état non modifiéRétablir la propriétéRétablir la propriété (récursive)Rétablir la propriété à son état d'origineRétablir la propriété à son état d'origine (récursive)Rétablir tout ce qu'on voitRévisionRévision :Retour à la RévisionRetour en arrière...Exécution de la commande d'Ajout...Exécution de la commande Branch/tag...Exécution de la commande Checkout...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 du test de fusion...Exécution de la commande de relocalisation...Exécution de la commande de renommage...Exécution de la commande de résolution...Exécution de la commande de rétablissement...Exécution de la commande de basculement...Exécution de la commande de déverrouillage...SSL Client CertificationSauvegarderEnregistrer sous...Sauvegarder l'authentificationDonné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ôtSélectionnerTous sélectionner/déselectionnerSélectionnez un fichierSélectionnez un dossierSélectionnez un programmeParamètresVoir le journalConsulter le journalAfficher les outils de débogage de RabbitVCSMontrer le journal d'information d'un fichierComparer avec la révision précédenteAfficher les changements entre les chemins et les révisionsMontrer les différences entre les révisionsConsulter le journalAfficher la nouvelle version à gaucheMontrer les fichiers non versionnésConsulter une révisions:TaillePoint de départ :ÉtatVoler le verrouStopper à la copieBasculementBasculement...TagEtiquetterTagsTester la fusionTexteChangement du texteÉtat du texteRemerciements :Le 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.Le chemin indiqué n'est pas une copie de travailLes 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 champ 'emplacement 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.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/Chemin :URL :Impossible de récupérer les propriétés de la listeImpossible de définir une nouvelle valeur pour la propriété.InconnuDéverrouillerMettre à jourMettre à jour le Dépôt localMettre à jour vers la révisionMettre à jour un fichier vers une version préciseMettre à jour une copie de travailMettre à jour à la révision...Mise à jour...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.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 objetVoir le diff unifié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]Vous devez spécifier un chemin de destination.À l'instantlabelle(s) objet(s) sélectionné(s)versrabbitvcs-0.16/locale/he/000077500000000000000000000000001230007774300152555ustar00rootroot00000000000000rabbitvcs-0.16/locale/he/LC_MESSAGES/000077500000000000000000000000001230007774300170425ustar00rootroot00000000000000rabbitvcs-0.16/locale/he/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000115671230007774300211700ustar00rootroot00000000000000Ida0 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.16/locale/hr/000077500000000000000000000000001230007774300152725ustar00rootroot00000000000000rabbitvcs-0.16/locale/hr/LC_MESSAGES/000077500000000000000000000000001230007774300170575ustar00rootroot00000000000000rabbitvcs-0.16/locale/hr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000645301230007774300212030ustar00rootroot00000000000000~   & 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.16/locale/hu/000077500000000000000000000000001230007774300152755ustar00rootroot00000000000000rabbitvcs-0.16/locale/hu/LC_MESSAGES/000077500000000000000000000000001230007774300170625ustar00rootroot00000000000000rabbitvcs-0.16/locale/hu/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000674401230007774300212110ustar00rootroot00000000000000~   & 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#PBtBBB DDDD DD DEEER7EE E1EQECF/UFFFFF,F G #G/G!GGiGxGH$$H;IH6HH0HI$I5IIIYItIII,IIIJ.JEJC[JFJ-J:KOKeKnKKKK KK!KK)L#0LTLL LM MB$MgM)MM"M"M=N5NN6NN N%NO O O +O9O SO!`OO O*O O8OP+P4KPP PPPPdUQQQ QEQ/7RgR R%R"RRR7SISIhS*SbS&@TgT}TTTTTT UU2UNUeU{UUUUUUUV-V1JV |VVVVV)VWR9W"WW WWWW"X&X=X)YX XXhXY+YDYaY)YYY Y,Y!Z'Z .ZK:Z Z ZZ(Z Z ZLZ=[O[ V[ b[ l[w[|[[[.[%[[ [%\*\J\ ^\l\s\{\&\\ \\\\\ ] ] ])]:=] x]]$]"]]] ]^^/^?^C^ H^ R^\^c^ g^t^z^^^#^^^__ 2_S_\_z__ _____ _` `9` O` ]`g`v` ` ``)` `` `` a )a5aDaZava a aa a a7a"b.:b(ibJbb b cc,cFcbc|ccccccd0dIdbd{dddd d2d2e,Fe%seeeeeef(f#>f;bf.ff,f g!g(g1gGg `g jgwgggg gKg4 h*Bh+mhhh<h i)i0HiEyiii ii*i/ j ;jFj NjZj.qjjjj+jl l(l,1l0^l,l=l3l,.m [m.im,m)m?m$/n"Tn%wn(nnn$nnoJtbz<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: rabbit-vcs 0.13.3 v01 Report-Msgid-Bugs-To: POT-Creation-Date: 2010-11-26 09:51-0500 PO-Revision-Date: 2010-06-22 09:46+0000 Last-Translator: csola48 Language-Team: hungarian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=n != 1; X-Launchpad-Export-Date: 2010-12-09 23:36+0000 X-Generator: Launchpad (build Unknown) X-Poedit-Country: HUNGARY X-Poedit-Language: Hungarian X-Poedit-SourceCharset: utf-8 %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 - Befejezve100Üzenet hozzáadásaÉrintett fájl/ok/ (kettős klikkantással összehasonlítás a bázissal)AzonosításTanúsítvány részleteiTároló cseréje az Ön munkapéldányhozVáltozott fájlok (kettős klikkantással összehasonlítás a bázissal)BeküldésTulajdonság részleteinek szerkesztéseZárolt fájlokDosszié neveRevíziótólEttől az URL-tőlInnen: (URL és revízió egyesítve)Import üzenetLinkNapló üzenetekNaplózási beállításokÜzenetFigyelem: a tulajdonságok változása azonnal megtörténik. Megnézheti és visszavonhatja a változás használatát minden tételre va menüben. OpciókAdja meg az Ön azonosítóitÍrja le, miért akarja zárolni ezeket a fájlokat?Kérjük adja meg az Ön SSL igazoló fájljátKorábbi üzenetekProgram a fájlok összehasonlításáhozTulajdonságok ehhez:RabbitVCSTávoli URI:TárolóRevíziós területRevízióRevíziós táblaRevízióigEddig: (URL és revízió egyesítve)URL előzményekURL egyesítve innenVerzió információMunkapéldány:MunkapéldányKiválasztott tulajdonságok rekurzívan lesznek használva.Akarja törölni a/z/ %item% tételt?RabbitVCSRabbitVCS ErrorEgyesítő varázslóNévjegyRabbitVCS névjegyeMindig elfogadEgyszer elfogadEseményHozzáadásJelkép hozzáadásaEgy új tulajdonság hozzáadásaEgy jelkép hozzáadásaHozzáadás a mellőzött fájl listáhozDosszié 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:JegyzetJegyzet - %sJegyzet egy fájlhozJegyzet...Egysé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...Tulajdonság megadása rekurzívanHibajaví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?HitelesítésHitelesítési információ törölveSzerzőSzerzők:Branch/tagBranch/tag...Tároló fa böngészéseBöngészésFájl vagy dosszié böngészéseBöngészés...Program hibaNem lehet jegyzetet fűzni a könyvtárhozVáltozásMunkapéldány helyének megváltoztatása a tárolóbanTanúsítvány ellenőrzéseMódosítások ellenőrzése...Tárolóhoz készített módosítások ellenőrzéseMunkapéldány ellenőrzéseEllenőrzésEllenőrzés - %sEllenőrzés...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.Válassza ezt a módszert, ha két különböző branchot kíván egyesíteni a munkapéldányában.Munkapéldány tisztításaTisztítás...TisztításTisztítást igényelt.... Kezdődhet a munkapéldány tisztítása?Az Ön azonosítási információinak törlésePárbeszéd bezárása.Bekü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ánnyalHozzáadás befejezveBranch/tag parancs befejezveEllenőrzés befejezveTisztítás befejezveBeküldés befejezveExportálás befejezveImportálás befejezveZárás befejezveEgyesítés befejezveEgyesítés teszt befejezveÁthelyezés befejezveÁtnevezés befejezveFeloldás befejezveVisszavonás befejezveKapcsoló parancs befejezveNyitás befejezveFrissítés befejezveMegerősítésMá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...Dosszié készítése...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 dossziébanDosszié 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átumNyomkövetésNyomkövetés visszafeléTörlésMegerősítés törlése...Rekurzív tulajdonságok törléseTulajdonság törléseEzen tulajdonság törléseEzen tulajdonság törlése (rekurzívan)VisszautasítÖsszehasonlító menü...Törölni akarja a kiválasztott tulajdonságot minden fájlnál és alkönyvtárban ezen könyvtárban?Szerző szerkesztéseSzerző szerkesztése...Napló üzenet szerkesztéseNapló üzenet szerkesztése...Revízió tulajdonságok szerkesztése...Szerkesztés...Jelképek engedélyezveFájl attributomok engedélyezveRekurzív állapotellenőrzés engedélyezveangolExportExport - %sEgy munkapéldány vagy tároló verziókezelésen kívűli információvalExport...KiterjesztésKülső programokEz a fájl nincs verzió kontroll alatt.Ujjlenyomat:BefejezveEgy érvénytelen kiterjesztés információ lehívásának kényszerítéseTalált %d elemetInnen:ÁltalánosZárolásZárás...HEADSúgóHost:Eredet mellőzéseMellőzött tétel fájl kiterjesztés szerintMellőzött tétel fájl név szerintImportImport - %sEgy tétel importálása a tárolóbaMellőzött fájlokat tartalmazÉrvénytelenítésKibocsájtó:Nyelv:Határ:SorÖsszehasonlító lista beállításokBetöltés/FrissítésBetöltés...Helyi zárolt tételekZárolt fájlokZárvaNaplóNapló - %sNapló bejegyzésNaplózásFelhasználó név:Egy konfliktusos tétel megoldottként való megjelöléseEgyesítésEgyesítés segédEgy revíziós terület egyesítéseKét különböző fa egyesítéseEgyesítés...ÜzenetMime típusMinimális naplóbejegyzésTöbb lépés...Áthelyezés...N/ANévÚj hely:Új név:Új...NemÉrtesítésSzámMegjegyzett URL-ek számaMegjegyzett üzenetek számaKülső tárolók kihagyásaCsak rögzítése az egyesítésnekMegnyitrevertFájl megnyitásaAz első revízió megnyitásaA második revízió megnyitásaJelszó:Hibajavító fájl alkalmazvaHibajavító fájl elkészítveÚtvonalÚtvonal:Előző üzenetElőző üzenet törölveTulajdonságokTulajdonságok - %sTulajdonságTulajdonság változásaTulajdonság szerkesztőTulajdonság állapotTulajdonság:RabbitVCSRabbitVCS hibaÖvezet:RekurzívFrissítésFrissített állapotTulajdonságok listájának frissítése.Nyitás...Egy tétel kinyitásaÁthelyezMunkapéldány áthelyezéseÁthelyez...ÁtnevezésÁtnevezés...Tároló böngészésTároló útvonal törölveTároló sikeresen elkészítveFenntartottFeloldásVisszaállítvaElveszett tétel visszatöltéseVisszavonásEgy tétel nem módosított állapotának visszavonásaVisszavont tulajdonságTulajdonsá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)Minden látható visszavonásaRevízióRevízió:Hozzáadás parancs fut...Branch/tag parancs fut...Ellenőrzés parancs fut...Beküldés parancs fut...Exportálás parancs fut...Importálás parancs fut...Zárás parancs fut...Egyesítés parancs futEgyesítés teszt futÁthelyezés parancs fut...Átnevezés parancs fut...Feloldás parancs fut...Visszavonás parancs futKapcsoló parancs fut...Nyitás parancs fut...SSL kliens igazolásMentés másként…Hitelesítés mentéseMentett adatJegyzett tételek törölve lesznek a tárolóbólJegyzett tételek lesznek átnevezve a tárolóbanJegyzett tételek hozzáadása a tárolóhozKiválasztás / Összes kiválasztásFájl választásaDosszié választásaEgy program választásaBeállításokVáltozások mutatása...Napló mutatásaRabbitVCS nyomkövető eszköz mutatásaFájl napló információ mutatásaVáltozások mutatása az útvonal és a revízió közöttVáltozások mutatása két revízió közöttNapló mutatásaVerziókezelésen kívüli fájlok mutatásaRevíziók mutatása:MéretÁllapotZárolások ellopásaMásolás megállításaKapcsolóKapcsoló...Egyesítés tesztSzövegSzöveg változásSzöveg állapotKöszönet:A nyomkövetés menü a problémák diagnózisára a RabbitVCS-t használjaAz 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é.A tétel a kukába kerül.Új név mező szükségesA tároló URL és a végcél útvonal mezőket igényelnek.Tároló URL mező igényeltTároló helye mező igényeltTulajdonságok mentésénél probléma adódott.Hiba a tároló készítésekor. Ellenőrizze, hogy a dosszié üres.Eddig:Típus:URL/ÚtvonalURL:Tulajdonság lista nem állítható helyreNem engedélyezett a tulajdonság új értéke.IsmeretlenNyitásFrissítésRevízió frissítéseEgy fájl frissítése speciális revízióhozMunkapéldány frissítéseRevízió frissítése...Frissítés...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. Például: 4-7,9,11,15-HEAD Az összes revízió egyesítéséhez hagyja üresen a szövegdobozt.Érvényeség:ÉrtékÉrték:Összehasonlító nézet a munkapéldánnyalÖ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ó nézetRabbitVCS beállítások nézete vagy cseréjeÖ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 megnézése az utolsó változás ótaEgy tétel tulajdonságainak nézeteEgységes összehasonlító nézetHová akarja másolni a kijelölést?Hová akarja áthelyezni a kijelölést?MunkapéldányIgenMeg kell adni a végcél útvonalat.a kiválasztott tétel/ek/eddigrabbitvcs-0.16/locale/it/000077500000000000000000000000001230007774300152755ustar00rootroot00000000000000rabbitvcs-0.16/locale/it/LC_MESSAGES/000077500000000000000000000000001230007774300170625ustar00rootroot00000000000000rabbitvcs-0.16/locale/it/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000656321230007774300212120ustar00rootroot00000000000000~   & 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.16/locale/ja/000077500000000000000000000000001230007774300152535ustar00rootroot00000000000000rabbitvcs-0.16/locale/ja/LC_MESSAGES/000077500000000000000000000000001230007774300170405ustar00rootroot00000000000000rabbitvcs-0.16/locale/ja/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000457041230007774300211660ustar00rootroot00000000000000o<.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.16/locale/nb/000077500000000000000000000000001230007774300152605ustar00rootroot00000000000000rabbitvcs-0.16/locale/nb/LC_MESSAGES/000077500000000000000000000000001230007774300170455ustar00rootroot00000000000000rabbitvcs-0.16/locale/nb/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000644421230007774300211730ustar00rootroot00000000000000~   & 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.16/locale/nl/000077500000000000000000000000001230007774300152725ustar00rootroot00000000000000rabbitvcs-0.16/locale/nl/LC_MESSAGES/000077500000000000000000000000001230007774300170575ustar00rootroot00000000000000rabbitvcs-0.16/locale/nl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000001000551230007774300211740ustar00rootroot00000000000000wh'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.16/locale/oc/000077500000000000000000000000001230007774300152625ustar00rootroot00000000000000rabbitvcs-0.16/locale/oc/LC_MESSAGES/000077500000000000000000000000001230007774300170475ustar00rootroot00000000000000rabbitvcs-0.16/locale/oc/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000121361230007774300211660ustar00rootroot00000000000000m@ 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.16/locale/pl/000077500000000000000000000000001230007774300152745ustar00rootroot00000000000000rabbitvcs-0.16/locale/pl/LC_MESSAGES/000077500000000000000000000000001230007774300170615ustar00rootroot00000000000000rabbitvcs-0.16/locale/pl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000520731230007774300212040ustar00rootroot00000000000000: 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.16/locale/pt_BR/000077500000000000000000000000001230007774300156675ustar00rootroot00000000000000rabbitvcs-0.16/locale/pt_BR/LC_MESSAGES/000077500000000000000000000000001230007774300174545ustar00rootroot00000000000000rabbitvcs-0.16/locale/pt_BR/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000713301230007774300215740ustar00rootroot00000000000000 #(")":"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.16/locale/ro/000077500000000000000000000000001230007774300153015ustar00rootroot00000000000000rabbitvcs-0.16/locale/ro/LC_MESSAGES/000077500000000000000000000000001230007774300170665ustar00rootroot00000000000000rabbitvcs-0.16/locale/ro/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000225571230007774300212150ustar00rootroot000000000000004L    )?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.16/locale/ru/000077500000000000000000000000001230007774300153075ustar00rootroot00000000000000rabbitvcs-0.16/locale/ru/LC_MESSAGES/000077500000000000000000000000001230007774300170745ustar00rootroot00000000000000rabbitvcs-0.16/locale/ru/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000603271230007774300212200ustar00rootroot00000000000000)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+A?ASA B,BBB\BEOCCGCCD94DnD D'D#D#DE2EPE!kE(E)EEE>F+VFF'FFFF/GXMGGG0G3 H >H&_HHH.HH)H4I;INInI0III JJ-JAJJ!J KK$%KJK PK[KvKK K K'K KKCK4?L tL~L LL!LLL L L" M;.M jMuM*M1MMN N6#N1ZNNNNNN NN'N,O6JO(O<OOO-P/DP tPPPP'P6PQ+QAQ#RQvQQQQQQQ+ R9R6NRRRR4R2 S#>SbS#{S7SCST*T'BT,jTT!TTTU+!UMU#dU*UEUU$V7V/TV#V8VVVW3WFW8^W"W=WW/X(@X iXvX!X4XXXY /Y:YZYkjY-YMZKRZBZ)Z^ [%j[0[m[/\3\ ;\I\N\k\$|\F\*\'];]jS]^^^=^!9_K[__G_G `S`=X``#`` #X(7G{shn\B4xV"O-,9j}~e'80/M: )I(*Hzi 1o3t@vW$rT >!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.16/locale/sk/000077500000000000000000000000001230007774300152765ustar00rootroot00000000000000rabbitvcs-0.16/locale/sk/LC_MESSAGES/000077500000000000000000000000001230007774300170635ustar00rootroot00000000000000rabbitvcs-0.16/locale/sk/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000376061230007774300212130ustar00rootroot00000000000000Q &<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.16/locale/sl/000077500000000000000000000000001230007774300152775ustar00rootroot00000000000000rabbitvcs-0.16/locale/sl/LC_MESSAGES/000077500000000000000000000000001230007774300170645ustar00rootroot00000000000000rabbitvcs-0.16/locale/sl/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000100701230007774300211760ustar00rootroot00000000000000FLa| 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.16/locale/sr/000077500000000000000000000000001230007774300153055ustar00rootroot00000000000000rabbitvcs-0.16/locale/sr/LC_MESSAGES/000077500000000000000000000000001230007774300170725ustar00rootroot00000000000000rabbitvcs-0.16/locale/sr/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000023571230007774300212150ustar00rootroot00000000000000xy        & 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.16/locale/sv/000077500000000000000000000000001230007774300153115ustar00rootroot00000000000000rabbitvcs-0.16/locale/sv/LC_MESSAGES/000077500000000000000000000000001230007774300170765ustar00rootroot00000000000000rabbitvcs-0.16/locale/sv/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000522011230007774300212120ustar00rootroot00000000000000GT 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.16/locale/th/000077500000000000000000000000001230007774300152745ustar00rootroot00000000000000rabbitvcs-0.16/locale/th/LC_MESSAGES/000077500000000000000000000000001230007774300170615ustar00rootroot00000000000000rabbitvcs-0.16/locale/th/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000007701230007774300212010ustar00rootroot00000000000000$,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.16/locale/zh_CN/000077500000000000000000000000001230007774300156625ustar00rootroot00000000000000rabbitvcs-0.16/locale/zh_CN/LC_MESSAGES/000077500000000000000000000000001230007774300174475ustar00rootroot00000000000000rabbitvcs-0.16/locale/zh_CN/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000616511230007774300215740ustar00rootroot00000000000000}   ) > 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.16/locale/zh_TW/000077500000000000000000000000001230007774300157145ustar00rootroot00000000000000rabbitvcs-0.16/locale/zh_TW/LC_MESSAGES/000077500000000000000000000000001230007774300175015ustar00rootroot00000000000000rabbitvcs-0.16/locale/zh_TW/LC_MESSAGES/RabbitVCS.mo000066400000000000000000000123271230007774300216220ustar00rootroot00000000000000sL       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.16/po/000077500000000000000000000000001230007774300140405ustar00rootroot00000000000000rabbitvcs-0.16/po/POTFILES.in000066400000000000000000000030171230007774300156160ustar00rootroot00000000000000util/helper.py ui/export.py ui/reset.py ui/merge.py ui/update.py ui/create.py ui/xml/about.xml.h ui/xml/merge.xml.h ui/xml/update.xml.h ui/xml/commit.xml.h ui/xml/property_editor.xml.h ui/xml/annotate.xml.h ui/xml/log.xml.h ui/xml/notification.xml.h ui/xml/properties.xml.h ui/xml/lock.xml.h ui/xml/browser.xml.h ui/xml/pull.xml.h ui/xml/ignore.xml.h ui/xml/dialogs/name_email_prompt.xml.h ui/xml/dialogs/certificate.xml.h ui/xml/dialogs/conflict_decision.xml.h ui/xml/dialogs/error_notification.xml.h ui/xml/dialogs/confirmation.xml.h ui/xml/dialogs/ssl_client_cert_prompt.xml.h ui/xml/dialogs/delete_confirmation.xml.h ui/xml/dialogs/message_box.xml.h ui/xml/dialogs/loading.xml.h ui/xml/dialogs/property.xml.h ui/xml/dialogs/create_folder.xml.h ui/xml/dialogs/previous_messages.xml.h ui/xml/clean.xml.h ui/xml/settings.xml.h ui/xml/add.xml.h ui/xml/cleanup.xml.h ui/xml/reset.xml.h ui/xml/import.xml.h ui/xml/git-update.xml.h ui/xml/manager.xml.h ui/xml/relocate.xml.h ui/xml/property_page.xml.h ui/editconflicts.py ui/revprops.py ui/annotate.py ui/widget.py ui/property_editor.py ui/commit.py ui/revert.py ui/settings.py ui/markresolved.py ui/__init__.py ui/add.py ui/relocate.py ui/property_page.py ui/tags.py ui/ignore.py ui/import.py ui/unlock.py ui/properties.py ui/action.py ui/renderers/__init__.py ui/rename.py ui/wraplabel.py ui/clone.py ui/browser.py ui/delete.py ui/open.py ui/dialog.py ui/lock.py ui/about.py ui/stage.py ui/log.py ui/clean.py ui/updateto.py ui/cleanup.py ui/unstage.py ui/remotes.py ui/diff.py util/contextmenuitems.py rabbitvcs-0.16/po/README000066400000000000000000000006601230007774300147220ustar00rootroot00000000000000How 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.16/po/RabbitVCS.pot000066400000000000000000001075361230007774300163570ustar00rootroot00000000000000# 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: 2012-08-24 08:37-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: util/helper.py:127 msgid "just now" msgstr "" #: util/helper.py:129 #, python-format msgid "%d minute(s) ago" msgstr "" #: util/helper.py:688 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "" msgstr[1] "" #: util/helper.py:691 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "" msgstr[1] "" #: util/helper.py:694 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "" msgstr[1] "" #: util/helper.py:697 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "" msgstr[1] "" #: util/helper.py:700 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "" msgstr[1] "" #: util/helper.py:703 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "" msgstr[1] "" #: util/helper.py:706 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "" msgstr[1] "" #: ui/export.py:45 ui/export.py:124 #, python-format msgid "Export - %s" msgstr "" #: ui/export.py:72 ui/export.py:141 ui/clone.py:57 msgid "The repository URL and destination path are both required fields." msgstr "" #: ui/export.py:92 ui/export.py:161 msgid "Export" msgstr "" #: ui/export.py:93 ui/export.py:162 msgid "Running Export Command..." msgstr "" #: ui/export.py:104 ui/export.py:170 msgid "Completed Export" msgstr "" #: ui/reset.py:105 ui/xml/reset.xml.h:14 util/contextmenuitems.py:695 msgid "Reset" msgstr "" #: ui/reset.py:106 msgid "Running Reset Command..." msgstr "" #: ui/reset.py:113 msgid "Completed Reset" msgstr "" #: ui/merge.py:94 msgid "Running Merge Test" msgstr "" #: ui/merge.py:95 msgid "Completed Merge Test" msgstr "" #: ui/merge.py:97 msgid "Running Merge Command" msgstr "" #: ui/merge.py:98 ui/merge.py:543 msgid "Completed Merge" msgstr "" #: ui/merge.py:109 ui/merge.py:536 msgid "Merge" msgstr "" #: ui/merge.py:451 msgid "No active branch" msgstr "" #: ui/merge.py:462 msgid "Author:" msgstr "" #: ui/merge.py:474 ui/tags.py:165 msgid "Date:" msgstr "" #: ui/merge.py:485 ui/xml/browser.xml.h:3 ui/tags.py:109 ui/tags.py:176 msgid "Revision:" msgstr "" #: ui/merge.py:497 ui/tags.py:128 ui/tags.py:188 msgid "Message:" msgstr "" #: ui/merge.py:537 msgid "Running Merge Command..." msgstr "" #: ui/update.py:53 ui/update.py:97 ui/xml/update.xml.h:6 #: util/contextmenuitems.py:351 msgid "Update" msgstr "" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:95 msgid "Updating..." msgstr "" #: ui/update.py:56 ui/update.py:103 ui/updateto.py:103 msgid "Completed Update" msgstr "" #: ui/create.py:51 msgid "Repository successfully created" msgstr "" #: ui/create.py:53 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "" #: ui/create.py:67 util/contextmenuitems.py:656 msgid "Initialize Repository" msgstr "" #: ui/create.py:68 msgid "Setting up repository..." msgstr "" #: ui/create.py:70 msgid "Completed repository setup" msgstr "" #: ui/xml/about.xml.h:1 msgid "Links" msgstr "" #: ui/xml/about.xml.h:2 msgid "Version Information" msgstr "" #: ui/xml/about.xml.h:3 msgid "RabbitVCS" msgstr "" #: ui/xml/about.xml.h:4 util/contextmenuitems.py:603 msgid "About" msgstr "" #: ui/xml/about.xml.h:5 msgid "Authors:" msgstr "" #: ui/xml/about.xml.h:6 msgid "Thanks:" msgstr "" #: ui/xml/merge.xml.h:1 msgid "From URL" msgstr "" #: ui/xml/merge.xml.h:2 msgid "From: (URL and revision to merge)" msgstr "" #: ui/xml/merge.xml.h:3 ui/xml/update.xml.h:1 ui/xml/reset.xml.h:1 #: ui/xml/git-update.xml.h:1 msgid "Options" msgstr "" #: ui/xml/merge.xml.h:4 msgid "Revision Range" msgstr "" #: ui/xml/merge.xml.h:5 msgid "To: (URL and revision to merge)" msgstr "" #: ui/xml/merge.xml.h:6 msgid "URL to merge from" msgstr "" #: ui/xml/merge.xml.h:7 msgid "Working Copy" msgstr "" #: ui/xml/merge.xml.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/xml/merge.xml.h:9 msgid "" "Choose this method if you wish to merge two different branches into your " "working copy." msgstr "" #: ui/xml/merge.xml.h:10 msgid "Choose this method if you wish to reintegrate a branch into the trunk." msgstr "" #: ui/xml/merge.xml.h:11 ui/widget.py:908 ui/widget.py:914 msgid "HEAD" msgstr "" #: ui/xml/merge.xml.h:12 msgid "Ignore ancestry" msgstr "" #: ui/xml/merge.xml.h:13 msgid "Merge Assistant" msgstr "" #: ui/xml/merge.xml.h:14 msgid "Merge a range of revisions" msgstr "" #: ui/xml/merge.xml.h:15 msgid "Merge two different trees" msgstr "" #: ui/xml/merge.xml.h:16 msgid "Only record the merge" msgstr "" #: ui/xml/merge.xml.h:17 ui/xml/update.xml.h:4 msgid "Recursive" msgstr "" #: ui/xml/merge.xml.h:18 msgid "Reintegrate a branch" msgstr "" #: ui/xml/merge.xml.h:19 ui/annotate.py:127 ui/annotate.py:228 #: ui/widget.py:909 ui/browser.py:89 ui/log.py:48 ui/log.py:337 ui/log.py:570 msgid "Revision" msgstr "" #: ui/xml/merge.xml.h:20 msgid "Show log" msgstr "" #: ui/xml/merge.xml.h:21 msgid "Test Merge" msgstr "" #: ui/xml/merge.xml.h:22 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/update.xml.h:2 ui/xml/reset.xml.h:4 msgid "Revision" msgstr "" #: ui/xml/update.xml.h:3 msgid "Omit Externals" msgstr "" #: ui/xml/update.xml.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/xml/commit.xml.h:1 ui/xml/dialogs/create_folder.xml.h:1 msgid "Add Message" msgstr "" #: ui/xml/commit.xml.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" #: ui/xml/commit.xml.h:3 msgid "Commit to:" msgstr "" #: ui/xml/commit.xml.h:4 ui/commit.py:307 ui/commit.py:360 ui/commit.py:423 #: util/contextmenuitems.py:357 msgid "Commit" msgstr "" #: ui/xml/commit.xml.h:5 ui/xml/lock.xml.h:4 #: ui/xml/dialogs/previous_messages.xml.h:3 ui/xml/import.xml.h:5 msgid "Previous Messages" msgstr "" #: ui/xml/commit.xml.h:6 ui/xml/lock.xml.h:5 ui/xml/add.xml.h:2 msgid "Select / Deselect all" msgstr "" #: ui/xml/commit.xml.h:7 msgid "Show unversioned files" msgstr "" #: ui/xml/property_editor.xml.h:1 msgid "Remote URI:" msgstr "" #: ui/xml/property_editor.xml.h:2 msgid "Working Copy:" msgstr "" #: ui/xml/property_editor.xml.h:3 msgid "Add a new property." msgstr "" #: ui/xml/property_editor.xml.h:4 msgid "Close this dialog." msgstr "" #: ui/xml/property_editor.xml.h:5 msgid "Property Editor" msgstr "" #: ui/xml/property_editor.xml.h:6 msgid "Refresh the list of properties." msgstr "" #: ui/xml/annotate.xml.h:1 msgid "From Revision" msgstr "" #: ui/xml/annotate.xml.h:2 msgid "To Revision" msgstr "" #: ui/xml/annotate.xml.h:3 msgid "Annotate" msgstr "" #: ui/xml/log.xml.h:1 msgid "100" msgstr "" #: ui/xml/log.xml.h:2 msgid "Affected File(s) (double-click to compare with base)" msgstr "" #: ui/xml/log.xml.h:3 ui/xml/dialogs/previous_messages.xml.h:1 msgid "Message" msgstr "" #: ui/xml/log.xml.h:4 msgid "Revisions Table" msgstr "" #: ui/xml/log.xml.h:5 msgid "Limit:" msgstr "" #: ui/xml/log.xml.h:6 msgid "Log" msgstr "" #: ui/xml/log.xml.h:7 ui/log.py:271 ui/log.py:272 msgid "N/A" msgstr "" #: ui/xml/log.xml.h:8 msgid "Refresh" 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 ui/dialog.py:136 msgid "to" msgstr "" #: ui/xml/notification.xml.h:1 msgid "Notification Messages" msgstr "" #: ui/xml/properties.xml.h:1 msgid "Properties for:" msgstr "" #: ui/xml/properties.xml.h:2 msgid "Selected properties will be applied recursively." msgstr "" #: ui/xml/properties.xml.h:3 util/contextmenuitems.py:472 msgid "Delete" msgstr "" #: ui/xml/properties.xml.h:4 msgid "Delete properties recursively" msgstr "" #: ui/xml/properties.xml.h:5 msgid "Edit..." msgstr "" #: ui/xml/properties.xml.h:6 msgid "New..." msgstr "" #: ui/xml/properties.xml.h:7 util/contextmenuitems.py:585 msgid "Properties" msgstr "" #: ui/xml/properties.xml.h:8 msgid "URL/Path:" msgstr "" #: ui/xml/lock.xml.h:1 msgid "Files to lock" msgstr "" #: ui/xml/lock.xml.h:2 msgid "Please describe why you are locking these files" msgstr "" #: ui/xml/lock.xml.h:3 msgid "Lock Files" msgstr "" #: ui/xml/lock.xml.h:6 msgid "Steal the locks" msgstr "" #: ui/xml/browser.xml.h:1 msgid "Load/Refresh" msgstr "" #: ui/xml/browser.xml.h:2 util/contextmenuitems.py:383 msgid "Repository Browser" msgstr "" #: ui/xml/browser.xml.h:4 msgid "URL:" msgstr "" #: ui/xml/pull.xml.h:1 msgid "Pull Information" msgstr "" #: ui/xml/pull.xml.h:2 ui/xml/git-update.xml.h:2 msgid "Merge changes into local branch" msgstr "" #: ui/xml/pull.xml.h:3 msgid "Pull" msgstr "" #: ui/xml/ignore.xml.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/xml/ignore.xml.h:2 msgid "Ignore" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:1 msgid "Enter Name and Email Details" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:2 msgid "Email:" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:3 msgid "Name and Email" msgstr "" #: ui/xml/dialogs/name_email_prompt.xml.h:4 ui/xml/property_page.xml.h:2 #: ui/tags.py:99 msgid "Name:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:1 msgid "Certificate Details" msgstr "" #: ui/xml/dialogs/certificate.xml.h:2 msgid "Accept Forever" msgstr "" #: ui/xml/dialogs/certificate.xml.h:3 msgid "Accept Once" msgstr "" #: ui/xml/dialogs/certificate.xml.h:4 msgid "Check Certificate" msgstr "" #: ui/xml/dialogs/certificate.xml.h:5 msgid "Deny" msgstr "" #: ui/xml/dialogs/certificate.xml.h:6 msgid "Fingerprint:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:7 ui/widget.py:1187 msgid "Host:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:8 msgid "Issuer:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:9 #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:3 msgid "Realm:" msgstr "" #: ui/xml/dialogs/certificate.xml.h:10 msgid "Valid:" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:1 msgid "A conflict was found in the following file:" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:2 msgid "Accept Mine" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:3 msgid "Accept Theirs" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:4 msgid "After the editing conflict, mark the file as resolved." msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:5 msgid "Cancel" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:6 msgid "Edit Conflicts" msgstr "" #: ui/xml/dialogs/conflict_decision.xml.h:7 msgid "Merge Manually" msgstr "" #: ui/xml/dialogs/error_notification.xml.h:1 msgid "RabbitVCS Error" msgstr "" #: ui/xml/dialogs/error_notification.xml.h:2 msgid "RabbitVCS Error" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:1 ui/dialog.py:297 msgid "Are you sure you want to continue?" msgstr "" #: ui/xml/dialogs/confirmation.xml.h:2 msgid "Confirmation" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:1 msgid "Please provide your ssl certification file" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:2 msgid "Path:" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:4 msgid "SSL Client Certification" msgstr "" #: ui/xml/dialogs/ssl_client_cert_prompt.xml.h:5 msgid "Save Authentication" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:2 msgid "" "Are you sure you want to delete %item%?" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:3 msgid "Delete Confirmation" msgstr "" #: ui/xml/dialogs/delete_confirmation.xml.h:4 msgid "The item(s) will be sent to the trash can." msgstr "" #: ui/xml/dialogs/message_box.xml.h:1 ui/dialog.py:52 ui/log.py:338 #: ui/log.py:571 msgid "Message" msgstr "" #: ui/xml/dialogs/loading.xml.h:1 ui/commit.py:124 ui/add.py:94 #: ui/unlock.py:85 ui/lock.py:111 msgid "Loading..." msgstr "" #: ui/xml/dialogs/property.xml.h:1 msgid "Edit Property Details" msgstr "" #: ui/xml/dialogs/property.xml.h:2 msgid "Apply property recursively" msgstr "" #: ui/xml/dialogs/property.xml.h:3 msgid "Property" msgstr "" #: ui/xml/dialogs/property.xml.h:4 msgid "Property:" msgstr "" #: ui/xml/dialogs/property.xml.h:5 msgid "Value:" msgstr "" #: ui/xml/dialogs/create_folder.xml.h:2 msgid "Folder Name" msgstr "" #: ui/xml/dialogs/create_folder.xml.h:3 msgid "Create Folder..." msgstr "" #: ui/xml/dialogs/previous_messages.xml.h:2 msgid "Previous Messages" msgstr "" #: ui/xml/clean.xml.h:1 msgid "Clean your Repository" msgstr "" #: ui/xml/clean.xml.h:2 ui/clean.py:75 util/contextmenuitems.py:691 msgid "Clean" msgstr "" #: ui/xml/clean.xml.h:3 msgid "Dry run" msgstr "" #: ui/xml/clean.xml.h:4 msgid "Force" msgstr "" #: ui/xml/clean.xml.h:5 msgid "Remove directories" msgstr "" #: ui/xml/clean.xml.h:6 msgid "Remove ignored files, too" msgstr "" #: ui/xml/clean.xml.h:7 msgid "Remove only ignored files" msgstr "" #: ui/xml/clean.xml.h:8 msgid "Remove untracked files from the working tree" msgstr "" #: ui/xml/settings.xml.h:1 msgid "Authentication" msgstr "" #: ui/xml/settings.xml.h:2 msgid "Checker type:" msgstr "" #: ui/xml/settings.xml.h:3 msgid "Configuration Editor" msgstr "" #: ui/xml/settings.xml.h:4 msgid "Log Messages" msgstr "" #: ui/xml/settings.xml.h:5 msgid "Logging Options" msgstr "" #: ui/xml/settings.xml.h:6 msgid "Memory usage: " msgstr "" #: ui/xml/settings.xml.h:7 msgid "Other Information" msgstr "" #: ui/xml/settings.xml.h:8 msgid "Process ID:" msgstr "" #: ui/xml/settings.xml.h:9 msgid "Program used to compare files" msgstr "" #: ui/xml/settings.xml.h:10 msgid "RabbitVCS" msgstr "" #: ui/xml/settings.xml.h:11 msgid "URL History" msgstr "" #: ui/xml/settings.xml.h:12 msgid "Browse..." msgstr "" #: ui/xml/settings.xml.h:13 msgid "Clear your authentication information" msgstr "" #: ui/xml/settings.xml.h:14 msgid "Enable emblems" msgstr "" #: ui/xml/settings.xml.h:15 msgid "Enable file attributes" msgstr "" #: ui/xml/settings.xml.h:16 msgid "Enable recursive status checks" msgstr "" #: ui/xml/settings.xml.h:17 msgid "External Programs" msgstr "" #: ui/xml/settings.xml.h:18 msgid "General" msgstr "" #: ui/xml/settings.xml.h:19 msgid "Git" msgstr "" #: ui/xml/settings.xml.h:20 msgid "Language:" msgstr "" #: ui/xml/settings.xml.h:21 msgid "Logging" msgstr "" #: ui/xml/settings.xml.h:22 msgid "Minimum level to log" msgstr "" #: ui/xml/settings.xml.h:23 msgid "Number of URLs to remember" msgstr "" #: ui/xml/settings.xml.h:24 msgid "Number of messages to remember" msgstr "" #: ui/xml/settings.xml.h:25 msgid "Refresh Information" msgstr "" #: ui/xml/settings.xml.h:26 msgid "Restart Checker" msgstr "" #: ui/xml/settings.xml.h:27 msgid "Saved Data" msgstr "" #: ui/xml/settings.xml.h:28 util/contextmenuitems.py:597 msgid "Settings" msgstr "" #: ui/xml/settings.xml.h:29 msgid "Show RabbitVCS debugging tools" msgstr "" #: ui/xml/settings.xml.h:30 msgid "Show new version on the left side" msgstr "" #: ui/xml/settings.xml.h:31 msgid "Status Checker" msgstr "" #: ui/xml/settings.xml.h:32 msgid "Stop Checker" msgstr "" #: ui/xml/settings.xml.h:33 msgid "The debug menu is used to diagnose problems with RabbitVCS itself" msgstr "" #: ui/xml/settings.xml.h:34 msgid "Type:" msgstr "" #: ui/xml/settings.xml.h:35 ui/settings.py:43 msgid "Unknown" msgstr "" #: ui/xml/add.xml.h:1 ui/widget.py:1301 ui/add.py:178 ui/add.py:203 #: ui/tags.py:273 util/contextmenuitems.py:449 msgid "Add" msgstr "" #: ui/xml/cleanup.xml.h:1 ui/cleanup.py:56 msgid "Cleaning Up..." msgstr "" #: ui/xml/cleanup.xml.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" #: ui/xml/reset.xml.h:2 msgid "Path" msgstr "" #: ui/xml/reset.xml.h:3 msgid "Reset your Repository" msgstr "" #: ui/xml/reset.xml.h:5 msgid "" "Hard - Matches the working tree and index to that of the \n" "tree being switched to" msgstr "" #: ui/xml/reset.xml.h:7 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:10 msgid "Mixed - Reset the index but not the working tree" msgstr "" #: ui/xml/reset.xml.h:11 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:13 msgid "None" msgstr "" #: ui/xml/reset.xml.h:15 msgid "Reset current HEAD to specified state." msgstr "" #: ui/xml/import.xml.h:1 msgid "Import Message" msgstr "" #: ui/xml/import.xml.h:2 msgid "Repository" msgstr "" #: ui/xml/import.xml.h:3 ui/import.py:80 util/contextmenuitems.py:539 msgid "Import" msgstr "" #: ui/xml/import.xml.h:4 msgid "Include ignored files" msgstr "" #: ui/xml/git-update.xml.h:3 msgid "Update Local Repository" msgstr "" #: ui/xml/manager.xml.h:1 msgid "label" msgstr "" #: ui/xml/relocate.xml.h:1 msgid "Change the repository of your working copy" msgstr "" #: ui/xml/relocate.xml.h:2 msgid "From:" msgstr "" #: ui/xml/relocate.xml.h:3 ui/relocate.py:87 msgid "Relocate" msgstr "" #: ui/xml/relocate.xml.h:4 msgid "To:" msgstr "" #: ui/xml/property_page.xml.h:1 msgid "Content status:" msgstr "" #: ui/xml/property_page.xml.h:3 msgid "Property status:" msgstr "" #: ui/xml/property_page.xml.h:4 util/contextmenuitems.py:363 msgid "RabbitVCS" msgstr "" #: ui/xml/property_page.xml.h:5 msgid "VCS:" msgstr "" #: ui/revprops.py:65 ui/property_editor.py:155 ui/properties.py:158 msgid "Unable to retrieve properties list" 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:127 ui/annotate.py:228 ui/browser.py:89 ui/log.py:337 #: ui/log.py:570 msgid "Author" msgstr "" #: ui/annotate.py:128 ui/annotate.py:229 ui/browser.py:89 ui/dialog.py:52 #: ui/log.py:338 ui/log.py:571 msgid "Date" 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/widget.py:910 msgid "Branch" msgstr "" #: ui/widget.py:915 msgid "Number" msgstr "" #: ui/widget.py:918 msgid "Working Copy" msgstr "" #: ui/widget.py:1142 msgid "Repository:" msgstr "" #: ui/widget.py:1161 msgid "Branch:" msgstr "" #: ui/widget.py:1296 msgid "Add line:" msgstr "" #: ui/property_editor.py:55 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:60 msgid "" "Do you want to delete the selected properties from all files and " "subdirectories\n" "beneath this directory?" msgstr "" #: ui/property_editor.py:101 msgid "File is not under version control." msgstr "" #: ui/property_editor.py:111 ui/properties.py:63 ui/remotes.py:66 msgid "Name" msgstr "" #: ui/property_editor.py:111 ui/properties.py:63 msgid "Value" msgstr "" #: ui/property_editor.py:111 msgid "Reserved" msgstr "" #: ui/property_editor.py:111 ui/revert.py:129 msgid "Status" msgstr "" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "" #: ui/commit.py:80 ui/revert.py:62 ui/revert.py:128 ui/markresolved.py:61 #: ui/add.py:71 ui/unlock.py:61 ui/action.py:122 ui/browser.py:89 #: ui/lock.py:70 ui/stage.py:63 ui/log.py:348 ui/log.py:586 ui/unstage.py:63 msgid "Path" msgstr "" #: ui/commit.py:80 ui/revert.py:62 ui/revert.py:128 ui/markresolved.py:61 #: ui/add.py:71 ui/unlock.py:61 ui/lock.py:70 ui/stage.py:63 ui/unstage.py:63 msgid "Extension" msgstr "" #: ui/commit.py:81 ui/revert.py:63 ui/markresolved.py:62 msgid "Text Status" msgstr "" #: ui/commit.py:81 ui/revert.py:63 ui/markresolved.py:62 msgid "Property Status" msgstr "" #: ui/commit.py:131 ui/add.py:97 ui/unlock.py:109 ui/lock.py:114 #, python-format msgid "Found %d item(s)" msgstr "" #: ui/commit.py:308 ui/commit.py:361 ui/commit.py:424 msgid "Running Commit Command..." msgstr "" #: ui/commit.py:314 ui/commit.py:370 ui/commit.py:433 msgid "Completed Commit" msgstr "" #: ui/commit.py:387 msgid "Close Branch" msgstr "" #: ui/revert.py:50 ui/revert.py:103 ui/revert.py:115 ui/revert.py:168 #: util/contextmenuitems.py:478 msgid "Revert" 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/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:297 msgid "Select a program" msgstr "" #: ui/settings.py:306 msgid "Are you sure you want to clear your repository paths?" msgstr "" #: ui/settings.py:313 msgid "Repository paths cleared" msgstr "" #: ui/settings.py:317 msgid "Are you sure you want to clear your previous messages?" msgstr "" #: ui/settings.py:324 msgid "Previous messages cleared" msgstr "" #: ui/settings.py:328 msgid "Are you sure you want to clear your authentication information?" msgstr "" #: ui/settings.py:345 msgid "Authentication information cleared" msgstr "" #: ui/markresolved.py:48 ui/markresolved.py:102 util/contextmenuitems.py:484 msgid "Mark as Resolved" msgstr "" #: ui/markresolved.py:103 msgid "Running Resolved Command..." msgstr "" #: ui/markresolved.py:106 msgid "Completed Mark as Resolved" msgstr "" #: ui/__init__.py:55 msgid "" "You must specify a version control system using the --vcs [svn|git] option" msgstr "" #: ui/add.py:179 ui/add.py:204 msgid "Running Add Command..." msgstr "" #: ui/add.py:181 ui/add.py:206 msgid "Completed Add" msgstr "" #: ui/relocate.py:77 msgid "The from and to url fields are both required." msgstr "" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "" #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "" #: ui/property_page.py:146 msgid "Repository URL" 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:145 ui/tags.py:284 msgid "Save" msgstr "" #: ui/tags.py:153 msgid "Tagger:" msgstr "" #: ui/tags.py:230 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/ignore.py:100 msgid "Ignore file:" 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/unlock.py:48 ui/unlock.py:127 msgid "Unlock" msgstr "" #: ui/unlock.py:128 msgid "Running Unlock Command..." msgstr "" #: ui/unlock.py:131 msgid "Completed Unlock" msgstr "" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "" #: ui/action.py:122 ui/log.py:348 ui/log.py:586 msgid "Action" msgstr "" #: ui/action.py:122 msgid "Mime Type" msgstr "" #: ui/action.py:378 msgid "Finished" msgstr "" #: ui/action.py:382 #, python-format msgid "%s - Finished" msgstr "" #: ui/action.py:405 msgid "Log Message" msgstr "" #: ui/rename.py:49 msgid "The requested file or folder does not exist." msgstr "" #: ui/rename.py:53 ui/rename.py:85 ui/rename.py:114 ui/browser.py:476 msgid "Rename" msgstr "" #: ui/rename.py:53 ui/browser.py:476 msgid "New Name:" msgstr "" #: ui/rename.py:61 msgid "The new name field is required" msgstr "" #: ui/rename.py:86 ui/rename.py:115 msgid "Running Rename Command..." msgstr "" #: ui/rename.py:92 ui/rename.py:121 msgid "Completed Rename" msgstr "" #: ui/clone.py:47 ui/clone.py:65 util/contextmenuitems.py:661 msgid "Clone" msgstr "" #: ui/clone.py:66 msgid "Running Clone Command..." msgstr "" #: ui/clone.py:73 msgid "Completed Clone" msgstr "" #: ui/browser.py:89 msgid "Size" msgstr "" #: ui/browser.py:331 msgid "Select" msgstr "" #: ui/browser.py:352 msgid "Create folder..." msgstr "" #: ui/browser.py:357 msgid "Copy to..." msgstr "" #: ui/browser.py:362 msgid "Copy URL to clipboard" msgstr "" #: ui/browser.py:367 msgid "Move to..." msgstr "" #: ui/browser.py:537 msgid "Where do you want to copy the selection?" msgstr "" #: ui/browser.py:538 ui/browser.py:567 msgid "New Location:" msgstr "" #: ui/browser.py:566 msgid "Where do you want to move the selection?" msgstr "" #: ui/dialog.py:36 #, 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:259 msgid "Select a File" msgstr "" #: ui/dialog.py:278 msgid "Save As..." msgstr "" #: ui/dialog.py:325 msgid "the selected item(s)" msgstr "" #: ui/dialog.py:396 msgid "Added a folder to the repository" msgstr "" #: ui/lock.py:71 msgid "Locked" msgstr "" #: ui/lock.py:122 msgid "Yes" msgstr "" #: ui/lock.py:163 msgid "Get Lock" msgstr "" #: ui/lock.py:164 msgid "Running Lock Command..." msgstr "" #: ui/lock.py:173 msgid "Completed Lock" msgstr "" #: ui/stage.py:50 ui/stage.py:101 util/contextmenuitems.py:700 msgid "Stage" msgstr "" #: ui/stage.py:102 msgid "Running Stage Command..." msgstr "" #: ui/stage.py:105 msgid "Completed Stage" msgstr "" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "" #: ui/log.py:349 msgid "Copy From Path" msgstr "" #: ui/log.py:349 msgid "Copy From Revision" msgstr "" #: ui/log.py:570 msgid "Graph" msgstr "" #: ui/log.py:798 msgid "View diff against working copy" msgstr "" #: ui/log.py:803 util/contextmenuitems.py:413 msgid "View diff against previous revision" msgstr "" #: ui/log.py:808 msgid "View diff between revisions" msgstr "" #: ui/log.py:813 msgid "Compare with working copy" msgstr "" #: ui/log.py:818 util/contextmenuitems.py:431 msgid "Compare with previous revision" msgstr "" #: ui/log.py:823 msgid "Compare revisions" msgstr "" #: ui/log.py:829 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:835 msgid "Show changes between revisions" msgstr "" #: ui/log.py:840 msgid "Update to this revision" msgstr "" #: ui/log.py:841 msgid "Update the selected path to this revision" msgstr "" #: ui/log.py:846 ui/log.py:850 msgid "Edit author..." msgstr "" #: ui/log.py:854 msgid "Edit log message..." msgstr "" #: ui/log.py:858 msgid "Edit revision properties..." msgstr "" #: ui/log.py:1119 msgid "Edit author" msgstr "" #: ui/log.py:1131 msgid "Edit log message" msgstr "" #: ui/clean.py:76 msgid "Running Clean Command..." msgstr "" #: ui/clean.py:86 msgid "Completed Clean" msgstr "" #: ui/updateto.py:83 msgid "Rollback To Revision" msgstr "" #: ui/updateto.py:84 msgid "Rolling Back..." msgstr "" #: ui/updateto.py:92 msgid "Completed Rollback" msgstr "" #: ui/updateto.py:94 msgid "Update To Revision" msgstr "" #: ui/updateto.py:120 msgid "What revision/branch do you want to checkout?" msgstr "" #: ui/updateto.py:141 msgid "Checkout" msgstr "" #: ui/updateto.py:142 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:148 msgid "Completed Checkout" msgstr "" #: ui/cleanup.py:55 util/contextmenuitems.py:513 msgid "Cleanup" msgstr "" #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "" #: ui/unstage.py:50 ui/unstage.py:101 util/contextmenuitems.py:705 msgid "Unstage" msgstr "" #: ui/unstage.py:102 msgid "Running Unstage Command..." msgstr "" #: ui/unstage.py:105 msgid "Completed Unstage" msgstr "" #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "" #: ui/remotes.py:66 msgid "Host" msgstr "" #: ui/diff.py:321 msgid "View diff as side-by-side comparison" msgstr "" #: util/contextmenuitems.py:303 msgid "Debug" msgstr "" #: util/contextmenuitems.py:308 msgid "Bugs" msgstr "" #: util/contextmenuitems.py:313 msgid "Open Shell" msgstr "" #: util/contextmenuitems.py:319 msgid "Refresh Status" msgstr "" #: util/contextmenuitems.py:324 msgid "Debug Revert" msgstr "" #: util/contextmenuitems.py:325 msgid "Reverts everything it sees" msgstr "" #: util/contextmenuitems.py:331 msgid "Invalidate" msgstr "" #: util/contextmenuitems.py:332 msgid "Force an invalidate_extension_info() call" msgstr "" #: util/contextmenuitems.py:338 msgid "Add Emblem" msgstr "" #: util/contextmenuitems.py:339 msgid "Add an emblem" msgstr "" #: util/contextmenuitems.py:345 msgid "Checkout..." msgstr "" #: util/contextmenuitems.py:346 msgid "Check out a working copy" msgstr "" #: util/contextmenuitems.py:352 msgid "Update a working copy" msgstr "" #: util/contextmenuitems.py:358 msgid "Commit modifications to the repository" msgstr "" #: util/contextmenuitems.py:368 msgid "RabbitVCS SVN" msgstr "" #: util/contextmenuitems.py:373 msgid "RabbitVCS Git" msgstr "" #: util/contextmenuitems.py:378 msgid "RabbitVCS Hg" msgstr "" #: util/contextmenuitems.py:384 msgid "Browse a repository tree" msgstr "" #: util/contextmenuitems.py:389 msgid "Check for Modifications..." msgstr "" #: util/contextmenuitems.py:390 msgid "Check for modifications made to the repository" msgstr "" #: util/contextmenuitems.py:395 msgid "Diff Menu..." msgstr "" #: util/contextmenuitems.py:396 msgid "List of comparison options" msgstr "" #: util/contextmenuitems.py:401 msgid "View diff against base" msgstr "" #: util/contextmenuitems.py:402 msgid "View the modifications made to a file" msgstr "" #: util/contextmenuitems.py:407 msgid "View diff between files/folders" msgstr "" #: util/contextmenuitems.py:408 msgid "View the differences between two files" msgstr "" #: util/contextmenuitems.py:414 msgid "View the modifications made to a file since its last change" msgstr "" #: util/contextmenuitems.py:419 msgid "Compare with base" msgstr "" #: util/contextmenuitems.py:420 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:425 msgid "Compare files/folders" msgstr "" #: util/contextmenuitems.py:426 msgid "Compare the differences between two items" msgstr "" #: util/contextmenuitems.py:432 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:437 msgid "Show Changes..." msgstr "" #: util/contextmenuitems.py:438 msgid "Show changes between paths and revisions" msgstr "" #: util/contextmenuitems.py:443 msgid "Show Log" msgstr "" #: util/contextmenuitems.py:444 msgid "Show a file's log information" msgstr "" #: util/contextmenuitems.py:450 msgid "Schedule items to be added to the repository" msgstr "" #: util/contextmenuitems.py:455 msgid "Add to ignore list" msgstr "" #: util/contextmenuitems.py:460 msgid "Update to revision..." msgstr "" #: util/contextmenuitems.py:461 msgid "Update a file to a specific revision" msgstr "" #: util/contextmenuitems.py:466 msgid "Rename..." msgstr "" #: util/contextmenuitems.py:467 msgid "Schedule an item to be renamed on the repository" msgstr "" #: util/contextmenuitems.py:473 msgid "Schedule an item to be deleted from the repository" msgstr "" #: util/contextmenuitems.py:479 msgid "Revert an item to its unmodified state" msgstr "" #: util/contextmenuitems.py:485 msgid "Mark a conflicted item as resolved" msgstr "" #: util/contextmenuitems.py:490 msgid "Restore" msgstr "" #: util/contextmenuitems.py:491 msgid "Restore a missing item" msgstr "" #: util/contextmenuitems.py:495 msgid "Relocate..." msgstr "" #: util/contextmenuitems.py:496 msgid "Relocate your working copy" msgstr "" #: util/contextmenuitems.py:501 msgid "Get Lock..." msgstr "" #: util/contextmenuitems.py:502 msgid "Locally lock items" msgstr "" #: util/contextmenuitems.py:507 msgid "Release Lock..." msgstr "" #: util/contextmenuitems.py:508 msgid "Release lock on an item" msgstr "" #: util/contextmenuitems.py:514 msgid "Clean up working copy" msgstr "" #: util/contextmenuitems.py:519 msgid "Export..." msgstr "" #: util/contextmenuitems.py:520 msgid "Export a working copy or repository with no versioning information" msgstr "" #: util/contextmenuitems.py:533 msgid "Create Repository here" msgstr "" #: util/contextmenuitems.py:534 msgid "Create a repository in a folder" msgstr "" #: util/contextmenuitems.py:540 msgid "Import an item into a repository" msgstr "" #: util/contextmenuitems.py:549 msgid "Branch/tag..." msgstr "" #: util/contextmenuitems.py:550 msgid "Copy an item to another location in the repository" msgstr "" #: util/contextmenuitems.py:555 msgid "Switch..." msgstr "" #: util/contextmenuitems.py:556 msgid "Change the repository location of a working copy" msgstr "" #: util/contextmenuitems.py:561 msgid "Merge..." msgstr "" #: util/contextmenuitems.py:562 msgid "A wizard with steps for merging" msgstr "" #: util/contextmenuitems.py:567 msgid "Annotate..." msgstr "" #: util/contextmenuitems.py:568 msgid "Annotate a file" msgstr "" #: util/contextmenuitems.py:573 msgid "Create Patch..." msgstr "" #: util/contextmenuitems.py:574 msgid "Creates a unified diff file with all changes you made" msgstr "" #: util/contextmenuitems.py:579 msgid "Apply Patch..." msgstr "" #: util/contextmenuitems.py:580 msgid "Applies a unified diff file to the working copy" msgstr "" #: util/contextmenuitems.py:586 msgid "View the properties of an item" msgstr "" #: util/contextmenuitems.py:591 msgid "Help" msgstr "" #: util/contextmenuitems.py:592 msgid "View help" msgstr "" #: util/contextmenuitems.py:598 msgid "View or change RabbitVCS settings" msgstr "" #: util/contextmenuitems.py:604 msgid "About RabbitVCS" msgstr "" #: util/contextmenuitems.py:609 msgid "Open" msgstr "" #: util/contextmenuitems.py:610 msgid "Open a file" msgstr "" #: util/contextmenuitems.py:618 msgid "Browse to" msgstr "" #: util/contextmenuitems.py:619 msgid "Browse to a file or folder" msgstr "" #: util/contextmenuitems.py:624 msgid "Revert property" msgstr "" #: util/contextmenuitems.py:626 msgid "Revert this property to its original state" msgstr "" #: util/contextmenuitems.py:630 msgid "Revert property (recursive)" msgstr "" #: util/contextmenuitems.py:632 msgid "Revert this property to its original state (recursive)" msgstr "" #: util/contextmenuitems.py:637 msgid "Delete property" msgstr "" #: util/contextmenuitems.py:639 msgid "Delete this property" msgstr "" #: util/contextmenuitems.py:643 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:645 msgid "Delete this property (recursive)" msgstr "" #: util/contextmenuitems.py:650 msgid "Edit details" msgstr "" #: util/contextmenuitems.py:652 msgid "Show and edit property details" msgstr "" #: util/contextmenuitems.py:666 msgid "Fetch/Pull" msgstr "" #: util/contextmenuitems.py:671 msgid "Push" msgstr "" #: util/contextmenuitems.py:676 msgid "Branches" msgstr "" #: util/contextmenuitems.py:681 msgid "Tags" msgstr "" #: util/contextmenuitems.py:686 msgid "Remotes" msgstr "" #: util/contextmenuitems.py:710 msgid "Edit conflicts" msgstr "" #: util/contextmenuitems.py:736 msgid "Ignore item by filename" msgstr "" #: util/contextmenuitems.py:755 msgid "Ignore item by file extension" msgstr "" rabbitvcs-0.16/po/cs.po000066400000000000000000000663171230007774300150220ustar00rootroot00000000000000# 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.16/po/de.po000066400000000000000000001003311230007774300147660ustar00rootroot00000000000000# 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.16/po/es.po000066400000000000000000001375141230007774300150220ustar00rootroot00000000000000# 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.16/po/es_CL.po000066400000000000000000000774701230007774300154040ustar00rootroot00000000000000# 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.16/po/fa.po000066400000000000000000001111331230007774300147660ustar00rootroot00000000000000# 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.16/po/fi.po000066400000000000000000001112161230007774300150000ustar00rootroot00000000000000# 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.16/po/fr.po000066400000000000000000001434541230007774300150220ustar00rootroot00000000000000# 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. # 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-01 23:05+0000\n" "Last-Translator: Clyssandre \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: util/helper.py:109 msgid "just now" msgstr "À l'instant" #: util/helper.py:111 #, python-format msgid "%d minute(s) ago" msgstr "Il y a %d minute(s)" #: util/helper.py:631 #, python-format msgid "%i second" msgid_plural "%i seconds" msgstr[0] "%i seconde" msgstr[1] "%i secondes" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i minute" msgstr[1] "%i minutes" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i heure" msgstr[1] "%i heures" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i jour" msgstr[1] "%i jours" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i semaine" msgstr[1] "%i semaines" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i mois" msgstr[1] "%i mois" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i année" msgstr[1] "%i années" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Debug" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Bugs" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "Ouvrir un terminal" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Rafraîchir le statut" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Debug inversé" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Rétablir tout ce qu'on voit" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Invalider" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Forcer un appel à invalidate_extension_info()" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Ajouter un emblème" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Ajouter un emblème" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Mettre à jour" #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Obtenir une copie de travail" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Mettre à jour" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Mettre à jour une copie de travail" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Envoyer" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Envoyer les modifications au dépôt." #: 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 "Navigateur de dépôt" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Navigateur de référentiel" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Vérifier les modifications ..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Vérifiez les modifications apportées au référentiel" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Menu des différences..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Liste des options de comparaisons" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Voir les différences avec la base" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Voir les modifications faites sur un fichier" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Voir les différences entre les fichiers/dossiers" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Voir les différences entre deux fichiers" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Voir les différences par rapport à la révision précédente" #: util/contextmenuitems.py:376 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:381 msgid "Compare with base" msgstr "Comparer avec la base" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Comparer des fichiers ou dossiers" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Comparer les différences entre deux fichiers" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Comparer avec les révisions précédentes" #: util/contextmenuitems.py:394 msgid "Compare with previous revision using side-by-side comparison tool" msgstr "" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Voir le journal" #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Afficher les changements entre les chemins et les révisions" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Consulter le journal" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Montrer le journal d'information d'un fichier" #: 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 "Ajouter" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Ajouter au dépôt" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Ajouter à la liste de fichier ignorés" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Mettre à jour à la révision..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Mettre à jour un fichier vers une version précise" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Renommer..." #: util/contextmenuitems.py:429 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:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Supprimer" #: util/contextmenuitems.py:435 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:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Rétablir" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Rétablir un objet à son état non modifié" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Résoudre" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Marquer un conflit sur un objet comme résolu" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Restaurer" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Restaurer un fichier manquant" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Relocalisation…" #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Relocaliser votre copie de travail" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Obtenir le verrou..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Verrouiller localement un objet" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Relâcher le verrou..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Relâcher le verrou d'un objet" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Nettoyer" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Nettoyer votre copie de travail" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Exporter" #: util/contextmenuitems.py:482 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:487 msgid "Create Repository here" msgstr "Créer un dépôt ici" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Créer un dépôt dans un dossier" #: util/contextmenuitems.py:493 ui/import.py:80 ui/glade/import.glade.h:3 msgid "Import" msgstr "Importer" #: util/contextmenuitems.py:494 msgid "Import an item into a repository" msgstr "Importer un objet dans un dépôt" #: 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 "Copier un objet vers un autre emplacement dans le dépôt" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Basculement..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Changer l'emplacement d'une copie de travail" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Fusion..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Un assistant de fusion en étapes" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Annoter..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Annoter un fichier" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Créer un correctif..." #: util/contextmenuitems.py:528 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:533 msgid "Apply Patch..." msgstr "Appliquer le correctif..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Applique un fichier diff unifié de la copie de travail" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Propriétés" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Consulter les propriétés d'un objet" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Aide" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Consulter l'aide" #: 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 "Consulter ou modifier les paramètres de RabbitVCS" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "À propos" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "À propos de RabbitVCS" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Ouvrir" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Ouvrir un fichier" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Parcourir dans" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Naviguez vers un fichier ou un dossier" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Rétablir la propriété" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Rétablir la propriété à son état d'origine" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Rétablir la propriété (récursive)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Rétablir la propriété à son état d'origine (récursive)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Supprimer la propriété" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Supprimer cette propriété" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Supprimer cette propriété (récursive)" #: util/contextmenuitems.py:604 msgid "Edit details" msgstr "Modifier les détails" #: 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 "Dupliquer" #: 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 "Branches" #: util/contextmenuitems.py:635 msgid "Tags" msgstr "Tags" #: util/contextmenuitems.py:640 msgid "Remotes" msgstr "Distants" #: 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 "Mise à jour..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Mise à jour terminée" #: ui/updateto.py:82 msgid "Rollback To Revision" msgstr "Retour à la Révision" #: ui/updateto.py:83 msgid "Rolling Back..." msgstr "Retour en arrière..." #: ui/updateto.py:91 msgid "Completed Rollback" msgstr "Annulation terminée" #: ui/updateto.py:93 msgid "Update To Revision" msgstr "Mettre à jour vers la révision" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Checkout" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "Mise à jour %s..." #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Checkout terminé" #: 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 "Répertoire" #: 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 "Chargement..." #: 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 objet(s) trouvé(s)" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Exécution de la commande d'Ajout..." #: ui/add.py:159 msgid "Completed Add" msgstr "Ajout terminé" #: ui/ignore.py:100 msgid "Ignore file:" msgstr "Ignorer les fichiers :" #: ui/tags.py:62 msgid "Tag Manager" msgstr "" #: 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 "Nom:" #: 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 "Révision :" #: 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 "Sauvegarder" #: ui/tags.py:153 msgid "Tagger:" msgstr "Etiquetter" #: ui/tags.py:165 ui/merge.py:427 ui/merge.py:477 msgid "Date:" msgstr "Date :" #: ui/tags.py:230 ui/branches.py:209 ui/remotes.py:128 #, python-format msgid "Are you sure you want to delete %s?" msgstr "Êtes-vous sûr de vouloir supprimer %s ?" #: ui/tags.py:275 msgid "Add Tag" msgstr "Ajouter un Tag" #: ui/tags.py:293 msgid "Tag Detail" msgstr "Détail du Tag" #: ui/export.py:45 ui/export.py:114 #, python-format msgid "Export - %s" msgstr "Exporter - %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 "Les champs 'URL du dépôt' et 'chemin de destination' sont requis." #: ui/export.py:92 ui/export.py:151 msgid "Export" msgstr "Exporter" #: ui/export.py:93 ui/export.py:152 msgid "Running Export Command..." msgstr "Exécution de la commande d'exportation..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Exportation terminée" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Appliquer le correctif" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Appliquer le correctif pour le repertoire..." #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Application du fichier correctif..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Fichier correctif appliqué" #: ui/branches.py:62 msgid "Branch Manager" msgstr "Gestionnaire de branches" #: ui/branches.py:63 msgid "Branches" msgstr "Branches" #: ui/branches.py:73 ui/widget.py:855 msgid "Branch" msgstr "Branche" #: ui/branches.py:110 msgid "Start Point:" msgstr "Point de départ :" #: ui/branches.py:129 msgid "Keep old branch's history" msgstr "Conserver l'historique de l'ancienne branche" #: ui/branches.py:138 msgid "Set as active branch" msgstr "" #: ui/branches.py:280 msgid "Add Branch" msgstr "Ajouter une branche" #: ui/branches.py:304 msgid "Branch Detail" msgstr "Détail de la branche" #: 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 "Date" #: 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 "Message" #: 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 "Importation - %s" #: ui/import.py:68 msgid "The repository URL field is required." msgstr "Le champ 'URL du dépôt' est requit." #: ui/import.py:81 msgid "Running Import Command..." msgstr "Exécution de la commande d'importation..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importation terminée" #: ui/rename.py:48 msgid "The requested file or folder does not exist." msgstr "Le fichier ou répertoire demandé n'existe pas." #: ui/rename.py:52 ui/rename.py:84 ui/rename.py:113 ui/browser.py:470 msgid "Rename" msgstr "Renommer" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Nouveau nom :" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Le champ 'nouveau nom' est requit." #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Exécution de la commande de renommage..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Renommage terminé" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "État du texte" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "État de la propriété" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Exécution de la commande d'Envoi..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Envoi terminé" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "État" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Voir une comparaison côte à côte du diff" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Exécution du test de fusion..." #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Test de fusion terminé" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Exécution de la commande de fusion" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Fusion terminée" #: ui/merge.py:102 msgid "Merge" msgstr "Fusionner" #: 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 "" "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:108 msgid "Select a Folder" msgstr "Sélectionnez un dossier" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "vers" #: ui/dialog.py:261 msgid "Select a File" msgstr "Sélectionnez un fichier" #: ui/dialog.py:280 msgid "Save As..." msgstr "Enregistrer sous..." #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Êtes vous sur de vouloir continuer ?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "le(s) objet(s) sélectionné(s)" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Ajouter un répertoire au dépot" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Exécution de la commande de rétablissement..." #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Rétablissement terminé" #: 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 "Les champs 'depuis' et 'URL' sont requis." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Relocaliser" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Exécution de la commande de relocalisation..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Relocalisation terminée" #: 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 "Révision" #: 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 "Voir le diff unifié" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Comparaison côte à côte" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Exécution de la commande de résolution..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Résolution terminée" #: ui/changes.py:49 msgid "More Actions..." msgstr "Plus d'actions..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Changement" #: ui/changes.py:279 msgid "Property Change" msgstr "Changement de propriété" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Oui" #: ui/changes.py:321 msgid "No" msgstr "Non" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Ouvrir depuis la première révision" #: ui/changes.py:415 msgid "Open from second revision" msgstr "Ouvrir depuis la seconde révision" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Impossible d'annoter le dossier" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Annoter - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Ligne" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Texte" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "Le champ 'depuis la révision' est requis." #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Journal - %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 "Action" #: ui/log.py:338 msgid "Copy From Path" msgstr "Copier depuis le chemin" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Copier depuis la révision" #: ui/log.py:556 msgid "Graph" msgstr "Graphe" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Comparer avec la copie de travail" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Voir les différences entre les révisions" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Comparer avec la copie de travail" #: ui/log.py:806 msgid "Compare revisions" msgstr "Comparer les révisions" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "Comparer avec la révision précédente" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Montrer les différences entre les révisions" #: 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 "Editer l'auteur..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Editer le message de journal..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Editer les propriétés de la révision..." #: ui/log.py:1047 msgid "Edit author" msgstr "Editer l'auteur" #: ui/log.py:1059 msgid "Edit log message" msgstr "Editer le message de journal" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Inconnu" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "Anglais" #: ui/settings.py:119 msgid "Config file:" msgstr "Fichier de configuration :" #: ui/settings.py:294 msgid "Select a program" msgstr "Sélectionnez un programme" #: ui/settings.py:303 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:310 msgid "Repository paths cleared" msgstr "Chemins du dépôt nettoyés" #: ui/settings.py:314 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:321 msgid "Previous messages cleared" msgstr "Messages précèdents nettoyés" #: ui/settings.py:325 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:342 msgid "Authentication information cleared" msgstr "Informations d'authentification nettoyées" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Impossible de récupérer les propriétés de la liste" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Vous devez spécifier un chemin de destination." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Exécution de la commande Branch/tag..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Branch/tag terminé" #: ui/lock.py:73 msgid "Locked" msgstr "Verrouillé" #: ui/lock.py:167 msgid "Get Lock" msgstr "Obtenir le verrou" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Exécution de la commande de verrouillage..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Verrouillage terminé" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Le champ 'emplacement du dépôt' est requit." #: ui/switch.py:80 msgid "Switch" msgstr "Basculement" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Exécution de la commande de basculement..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Basculement terminé" #: 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 "Numéro" #: ui/widget.py:861 msgid "Working Copy" msgstr "Copie de travail" #: ui/widget.py:1056 msgid "Repository:" msgstr "Dépôt :" #: ui/widget.py:1075 msgid "Branch:" msgstr "Branche :" #: ui/widget.py:1093 ui/glade/dialogs.glade.h:30 msgid "Host:" msgstr "Hôte :" #: ui/widget.py:1194 msgid "Add line:" msgstr "Ajouter une ligne :" #: 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 "Exécution de la commande Checkout..." #: ui/remotes.py:59 msgid "Remote Repository Manager" msgstr "Gestionnaire de Dépôts à distance" #: ui/remotes.py:60 msgid "Remote Repositories" msgstr "Dépôts distants" #: ui/remotes.py:66 ui/properties.py:63 ui/property_editor.py:112 msgid "Name" msgstr "Nom" #: ui/remotes.py:66 msgid "Host" msgstr "Hôte" #: ui/property_page.py:126 msgid "Repository URL" msgstr "URL du dépôt" #: ui/createpatch.py:68 ui/createpatch.py:86 ui/createpatch.py:162 #: ui/createpatch.py:262 msgid "Create Patch" msgstr "Créer un correctif" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "Le chemin indiqué n'est pas une copie de travail" #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Création du fichier correctif" #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Fichier correctif créé" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Propriétés - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Valeur" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Une erreur est survenue durant la sauvegarde de vos propriétés." #: 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 "" "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:61 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:102 msgid "File is not under version control." msgstr "Le fichier n'est pas versionné" #: ui/property_editor.py:112 msgid "Reserved" msgstr "Réservé" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Impossible de définir une nouvelle valeur pour la propriété." #: ui/__init__.py:50 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/action.py:118 msgid "Mime Type" msgstr "Type MIME" #: ui/action.py:338 msgid "Finished" msgstr "Terminé" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Terminé" #: ui/action.py:365 msgid "Log Message" msgstr "Message du journal" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Déverrouiller" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Exécution de la commande de déverrouillage..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Déverrouillage terminé" #: ui/browser.py:89 msgid "Size" msgstr "Taille" #: ui/browser.py:326 msgid "Select" msgstr "Sélectionner" #: ui/browser.py:348 msgid "Create folder..." msgstr "Créer un dossier..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Copier vers..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "Copier l'URL dans le presse-papier" #: ui/browser.py:363 msgid "Move to..." msgstr "Déplacer vers..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Où voulez-vous copier la sélection ?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Nouvel emplacement :" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Où voulez-vous déplacer la sélection ?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Nettoyage..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Nettoyage terminé" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Dépôt créé avec succès" #: ui/create.py:48 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/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Propriétés pour:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "" "Les propriétés sélectionnées seront appliquées de manière récursive." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Supprimer les propriétés récursivement" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Éditer..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Nouveau..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Chemin :" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Charger/Rafraîchir" #: 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 "Un conflit a été trouvé dans le fichier suivant :" #: ui/glade/dialogs.glade.h:2 ui/glade/commit.glade.h:1 msgid "Add Message" msgstr "Ajouter un message" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Détails du certificat" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Éditer les détails de la propriété" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "Veuillez saisir votre nom et email" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Nom du dossier" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Message" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Merci d'ajouter vos détails d'authentification" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Merci de fournir vos fichier de certification ssl" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Messages précédents" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Êtes vous sur de vouloir supprimer %item%?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "Erreur RabbitVCS" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Accepter définitivement" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "Accepter le mien" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Accepter temporairement" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "Accepter le leur" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Appliquer la propriété récursivement" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Authentification" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "Annuler" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Vérifier le certificat" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Confirmation" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Créer un dossier…" #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Confirmation de la suppression" #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Refuser" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "E-mail :" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Empreinte :" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "Comment voulez-vous procéder ?" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Émetteur :" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Identifiant :" #: ui/glade/dialogs.glade.h:35 msgid "Merge Manually" msgstr "Merger manuellement" #: ui/glade/dialogs.glade.h:37 msgid "Name and Email" msgstr "Nom et E-mail" #: ui/glade/dialogs.glade.h:40 msgid "Password:" msgstr "Mot de passe :" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Chemin :" #: 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 "Messages précédents" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Propriété" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Propriété :" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "Erreur RabbitVCS" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Domaine:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL Client Certification" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Sauvegarder l'authentification" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Changement du texte" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "Les objets seront envoyés à la corbeille." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Valide:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Valeur:" #: 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 "Merger les modifications avec la branche locale" #: ui/glade/pull.glade.h:3 msgid "Pull" msgstr "Récupérer" #: ui/glade/manager.glade.h:1 msgid "label" msgstr "label" #: ui/glade/about.glade.h:1 msgid "Links" msgstr "Liens" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Information sur la version" #: 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 "Remerciements :" #: ui/glade/property_page.glade.h:1 msgid "Content status:" msgstr "Statut du contenu :" #: 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 "" "Ficher(s) affecté(s) (double-clic pour comparer avec la version de " "base)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Tableau de révisions" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Limite:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Journal" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Rafraîchir" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Consulter une révisions:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Stopper à la copie" #: ui/glade/cleanup.glade.h:2 msgid "" "Cleanup Requested....\n" "\n" "Begin working copy cleanup?" msgstr "" "Nettoyage demandé....\n" "\n" "Commencer le nettoyage de la copie de travail ?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Authentification" #: 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 "Messages du journal" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Options de journalisation" #: ui/glade/settings.glade.h:6 msgid "Memory usage: " msgstr "Mémoire occupée : " #: ui/glade/settings.glade.h:7 msgid "Other Information" msgstr "Information complémentaire" #: ui/glade/settings.glade.h:8 msgid "Process ID:" msgstr "" #: ui/glade/settings.glade.h:9 msgid "Program used to compare files" msgstr "Programme utilisé pour comparer des fichiers" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "Historique des URL" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Parcourir..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Nettoyer vos informations d'authentification" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Activer les emblèmes" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Activer les attributs de fichier" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Activer les vérifications récursives des statuts" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Programmes externes" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Général" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "Git" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Langage:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Journalisation" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Niveau minimum à journaliser" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Nombre d'URL à retenir" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Nombre de messages à retenir" #: ui/glade/settings.glade.h:25 msgid "Refresh Information" msgstr "Actualiser les informations" #: ui/glade/settings.glade.h:26 msgid "Restart Checker" msgstr "" #: ui/glade/settings.glade.h:27 msgid "Saved Data" msgstr "Données sauvegardées" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "Afficher les outils de débogage de RabbitVCS" #: ui/glade/settings.glade.h:30 msgid "Show new version on the left side" msgstr "Afficher la nouvelle version à gauche" #: 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 "" "Le menu Déboger est utilisé pour diagnostiquer des problèmes avec RabbitVCS " "elle-même" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Type:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Fichiers à verrouiller" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Merci de décrire pourquoi vous verrouillez ces fichiers" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Verrouiller les fichiers" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Tous sélectionner/déselectionner" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Voler le verrou" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Depuis la révision" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Vers la révision" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Annoter" #: ui/glade/ignore.glade.h:1 msgid "Ignore and exclude files from being tracked" msgstr "" #: ui/glade/ignore.glade.h:2 msgid "Ignore" msgstr "Ignorer" #: ui/glade/commit.glade.h:2 msgid "Changed Files (double-click to compare with base)" msgstr "" "Fichiers modifiés (double-clic pour comparer avec la version de base)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Envoyer vers :" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Montrer les fichiers non versionnés" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Messages de notification" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "URI distante :" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Copie de travail :" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Ajouter une nouvelle propriété" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Fermer cette boîte de dialogue." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Éditeur de propriété" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Rafraîchir la liste de propriétés." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Changer le dépôt de votre copie de travail" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Depuis :" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Vers :" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Options" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "Mettre à jour le Dépôt local" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Révision" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Omettre les externes" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Récursif" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Message d'importation" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Dépôt" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Inclure les fichiers ignorés" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Depuis l'URL" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Depuis: (URL et révision à fusionner)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Gamme de révision" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Vers: (URL et révision à fusionner)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "Fusionner depuis l'URL" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Copie de travail" #: 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 "" "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/glade/merge.glade.h:9 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/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Ignorer l'ascendance" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Assistant de fusion" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Fusionner une gamme de révisions" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Fusionner deux arbres différents" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Enregistrer seulement la fusion" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Consulter le journal" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Tester la fusion" #: 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 "" "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." #~ msgid "Completed" #~ msgstr "Terminé" #~ msgid "(no author)" #~ msgstr "(pas d'auteur)" #~ 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 "Resolved" #~ msgstr "Résolu" #~ 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" #~ msgid "Conflicted" #~ msgstr "En conflit" rabbitvcs-0.16/po/he.po000066400000000000000000001136321230007774300150020ustar00rootroot00000000000000# 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.16/po/hr.po000066400000000000000000001325301230007774300150150ustar00rootroot00000000000000# 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.16/po/hu.po000066400000000000000000001353431230007774300150250ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: rabbit-vcs 0.13.3 v01\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-26 09:51-0500\n" "PO-Revision-Date: 2010-06-22 09:46+0000\n" "Last-Translator: csola48 \n" "Language-Team: hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2010-12-09 23:36+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: HUNGARY\n" "X-Poedit-Language: Hungarian\n" "X-Poedit-SourceCharset: utf-8\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 mp" msgstr[1] "%i mp" #: util/helper.py:634 #, python-format msgid "%i minute" msgid_plural "%i minutes" msgstr[0] "%i perc" msgstr[1] "%i perc" #: util/helper.py:637 #, python-format msgid "%i hour" msgid_plural "%i hours" msgstr[0] "%i óra" msgstr[1] "%i óra" #: util/helper.py:640 #, python-format msgid "%i day" msgid_plural "%i days" msgstr[0] "%i nap" msgstr[1] "%i nap" #: util/helper.py:643 #, python-format msgid "%i week" msgid_plural "%i weeks" msgstr[0] "%i hét" msgstr[1] "%i hét" #: util/helper.py:646 #, python-format msgid "%i month" msgid_plural "%i months" msgstr[0] "%i hónap" msgstr[1] "%i hónap" #: util/helper.py:649 #, python-format msgid "%i year" msgid_plural "%i years" msgstr[0] "%i év" msgstr[1] "%i év" #: util/contextmenuitems.py:270 msgid "Debug" msgstr "Nyomkövetés" #: util/contextmenuitems.py:275 msgid "Bugs" msgstr "Program hiba" #: util/contextmenuitems.py:280 msgid "Open Shell" msgstr "revert" #: util/contextmenuitems.py:286 msgid "Refresh Status" msgstr "Frissített állapot" #: util/contextmenuitems.py:291 msgid "Debug Revert" msgstr "Nyomkövetés visszafelé" #: util/contextmenuitems.py:292 msgid "Reverts everything it sees" msgstr "Minden látható visszavonása" #: util/contextmenuitems.py:298 msgid "Invalidate" msgstr "Érvénytelenítés" #: util/contextmenuitems.py:299 msgid "Force an invalidate_extension_info() call" msgstr "Egy érvénytelen kiterjesztés információ lehívásának kényszerítése" #: util/contextmenuitems.py:305 msgid "Add Emblem" msgstr "Jelkép hozzáadása" #: util/contextmenuitems.py:306 msgid "Add an emblem" msgstr "Egy jelkép hozzáadása" #: util/contextmenuitems.py:312 msgid "Checkout..." msgstr "Ellenőrzés..." #: util/contextmenuitems.py:313 msgid "Check out a working copy" msgstr "Munkapéldány ellenőrzése" #: util/contextmenuitems.py:318 ui/update.py:53 ui/update.py:97 #: ui/glade/update.glade.h:6 msgid "Update" msgstr "Frissítés" #: util/contextmenuitems.py:319 msgid "Update a working copy" msgstr "Munkapéldány frissítése" #: util/contextmenuitems.py:324 ui/commit.py:288 ui/commit.py:384 #: ui/glade/commit.glade.h:4 msgid "Commit" msgstr "Beküldés" #: util/contextmenuitems.py:325 msgid "Commit modifications to the repository" msgstr "Módosítás beküldése a tárolóba" #: 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 "Tároló böngészés" #: util/contextmenuitems.py:346 msgid "Browse a repository tree" msgstr "Tároló fa böngészése" #: util/contextmenuitems.py:351 msgid "Check for Modifications..." msgstr "Módosítások ellenőrzése..." #: util/contextmenuitems.py:352 msgid "Check for modifications made to the repository" msgstr "Tárolóhoz készített módosítások ellenőrzése" #: util/contextmenuitems.py:357 msgid "Diff Menu..." msgstr "Összehasonlító menü..." #: util/contextmenuitems.py:358 msgid "List of comparison options" msgstr "Összehasonlító lista beállítások" #: util/contextmenuitems.py:363 msgid "View diff against base" msgstr "Összehasonlító nézet a munkapéldánnyal" #: util/contextmenuitems.py:364 msgid "View the modifications made to a file" msgstr "Fájlhoz készített módosítás nézete" #: util/contextmenuitems.py:369 msgid "View diff between files/folders" msgstr "Összehasonlító nézet fájlok/dossziék között" #: util/contextmenuitems.py:370 msgid "View the differences between two files" msgstr "Összehasonlító nézet két fájl között" #: util/contextmenuitems.py:375 ui/log.py:786 msgid "View diff against previous revision" msgstr "Összehasonlító nézet az előző revízióval" #: util/contextmenuitems.py:376 msgid "View the modifications made to a file since its last change" msgstr "Egy fájl módosítások megnézése az utolsó változás óta" #: util/contextmenuitems.py:381 msgid "Compare with base" msgstr "Összehasonlítás a bázissal" #: util/contextmenuitems.py:382 msgid "Compare with base using side-by-side comparison tool" msgstr "Összehasonlítás a bázissal a párhuzamos összehasonlító eszközzel" #: util/contextmenuitems.py:387 msgid "Compare files/folders" msgstr "Fájl/dosszié összehasonlítása" #: util/contextmenuitems.py:388 msgid "Compare the differences between two items" msgstr "Különbségek összehasonlítása két tétel között" #: util/contextmenuitems.py:393 ui/log.py:801 msgid "Compare with previous revision" msgstr "Összehasonlítás az előző revízióval" #: util/contextmenuitems.py:394 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" #: util/contextmenuitems.py:399 msgid "Show Changes..." msgstr "Változások mutatása..." #: util/contextmenuitems.py:400 msgid "Show changes between paths and revisions" msgstr "Változások mutatása az útvonal és a revízió között" #: util/contextmenuitems.py:405 msgid "Show Log" msgstr "Napló mutatása" #: util/contextmenuitems.py:406 msgid "Show a file's log information" msgstr "Fájl napló információ mutatása" #: 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 "Hozzáadás" #: util/contextmenuitems.py:412 msgid "Schedule items to be added to the repository" msgstr "Jegyzett tételek hozzáadása a tárolóhoz" #: util/contextmenuitems.py:417 msgid "Add to ignore list" msgstr "Hozzáadás a mellőzött fájl listához" #: util/contextmenuitems.py:422 msgid "Update to revision..." msgstr "Revízió frissítése..." #: util/contextmenuitems.py:423 msgid "Update a file to a specific revision" msgstr "Egy fájl frissítése speciális revízióhoz" #: util/contextmenuitems.py:428 msgid "Rename..." msgstr "Átnevezés..." #: util/contextmenuitems.py:429 msgid "Schedule an item to be renamed on the repository" msgstr "Jegyzett tételek lesznek átnevezve a tárolóban" #: util/contextmenuitems.py:434 ui/glade/properties.glade.h:3 msgid "Delete" msgstr "Törlés" #: util/contextmenuitems.py:435 msgid "Schedule an item to be deleted from the repository" msgstr "Jegyzett tételek törölve lesznek a tárolóból" #: util/contextmenuitems.py:440 ui/revert.py:50 ui/revert.py:103 #: ui/revert.py:115 ui/revert.py:168 msgid "Revert" msgstr "Visszavonás" #: util/contextmenuitems.py:441 msgid "Revert an item to its unmodified state" msgstr "Egy tétel nem módosított állapotának visszavonása" #: util/contextmenuitems.py:446 ui/resolve.py:48 ui/resolve.py:102 msgid "Resolve" msgstr "Feloldás" #: util/contextmenuitems.py:447 msgid "Mark a conflicted item as resolved" msgstr "Egy konfliktusos tétel megoldottként való megjelölése" #: util/contextmenuitems.py:452 msgid "Restore" msgstr "Visszaállítva" #: util/contextmenuitems.py:453 msgid "Restore a missing item" msgstr "Elveszett tétel visszatöltése" #: util/contextmenuitems.py:457 msgid "Relocate..." msgstr "Áthelyez..." #: util/contextmenuitems.py:458 msgid "Relocate your working copy" msgstr "Munkapéldány áthelyezése" #: util/contextmenuitems.py:463 msgid "Get Lock..." msgstr "Zárás..." #: util/contextmenuitems.py:464 msgid "Locally lock items" msgstr "Helyi zárolt tételek" #: util/contextmenuitems.py:469 msgid "Release Lock..." msgstr "Nyitás..." #: util/contextmenuitems.py:470 msgid "Release lock on an item" msgstr "Egy tétel kinyitása" #: util/contextmenuitems.py:475 ui/cleanup.py:55 msgid "Cleanup" msgstr "Tisztítás" #: util/contextmenuitems.py:476 msgid "Clean up working copy" msgstr "Munkapéldány tisztítása" #: util/contextmenuitems.py:481 msgid "Export..." msgstr "Export..." #: util/contextmenuitems.py:482 msgid "Export a working copy or repository with no versioning information" msgstr "Egy munkapéldány vagy tároló verziókezelésen kívűli információval" #: util/contextmenuitems.py:487 msgid "Create Repository here" msgstr "Tároló készítése ide" #: util/contextmenuitems.py:488 msgid "Create a repository in a folder" msgstr "Tároló készítése ebben a dossziéban" #: 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 "Egy tétel importálása a tárolóba" #: 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 "Egy tétel másolása másik helyre a tárolóban" #: util/contextmenuitems.py:509 msgid "Switch..." msgstr "Kapcsoló..." #: util/contextmenuitems.py:510 msgid "Change the repository location of a working copy" msgstr "Munkapéldány helyének megváltoztatása a tárolóban" #: util/contextmenuitems.py:515 msgid "Merge..." msgstr "Egyesítés..." #: util/contextmenuitems.py:516 msgid "A wizard with steps for merging" msgstr "Egyesítő varázsló" #: util/contextmenuitems.py:521 msgid "Annotate..." msgstr "Jegyzet..." #: util/contextmenuitems.py:522 msgid "Annotate a file" msgstr "Jegyzet egy fájlhoz" #: util/contextmenuitems.py:527 msgid "Create Patch..." msgstr "Hibajavítás készítése..." #: util/contextmenuitems.py:528 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" #: util/contextmenuitems.py:533 msgid "Apply Patch..." msgstr "Hibajavítás alkalmazása..." #: util/contextmenuitems.py:534 msgid "Applies a unified diff file to the working copy" msgstr "Egységes összehasonlító fájl alkalmazása a munkapéldányban" #: util/contextmenuitems.py:539 ui/glade/properties.glade.h:7 msgid "Properties" msgstr "Tulajdonságok" #: util/contextmenuitems.py:540 msgid "View the properties of an item" msgstr "Egy tétel tulajdonságainak nézete" #: util/contextmenuitems.py:545 msgid "Help" msgstr "Súgó" #: util/contextmenuitems.py:546 msgid "View help" msgstr "Súgó nézet" #: util/contextmenuitems.py:551 ui/glade/settings.glade.h:28 msgid "Settings" msgstr "Beállítások" #: util/contextmenuitems.py:552 msgid "View or change RabbitVCS settings" msgstr "RabbitVCS beállítások nézete vagy cseréje" #: util/contextmenuitems.py:557 ui/glade/about.glade.h:4 msgid "About" msgstr "Névjegy" #: util/contextmenuitems.py:558 msgid "About RabbitVCS" msgstr "RabbitVCS névjegye" #: util/contextmenuitems.py:563 msgid "Open" msgstr "Megnyit" #: util/contextmenuitems.py:564 msgid "Open a file" msgstr "Fájl megnyitása" #: util/contextmenuitems.py:572 msgid "Browse to" msgstr "Böngészés" #: util/contextmenuitems.py:573 msgid "Browse to a file or folder" msgstr "Fájl vagy dosszié böngészése" #: util/contextmenuitems.py:578 msgid "Revert property" msgstr "Visszavont tulajdonság" #: util/contextmenuitems.py:580 msgid "Revert this property to its original state" msgstr "Eredeti tulajdonságok visszaállítása" #: util/contextmenuitems.py:584 msgid "Revert property (recursive)" msgstr "Tulajdonságok visszaállítása (rekurzívan)" #: util/contextmenuitems.py:586 msgid "Revert this property to its original state (recursive)" msgstr "Ezen tulajdonság eredeti állapotba való visszaállítása (rekurzívan)" #: util/contextmenuitems.py:591 msgid "Delete property" msgstr "Tulajdonság törlése" #: util/contextmenuitems.py:593 msgid "Delete this property" msgstr "Ezen tulajdonság törlése" #: util/contextmenuitems.py:597 msgid "Delete property (recursive)" msgstr "" #: util/contextmenuitems.py:599 msgid "Delete this property (recursive)" msgstr "Ezen tulajdonság törlése (rekurzívan)" #: 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 "Mellőzött tétel fájl név szerint" #: util/contextmenuitems.py:685 msgid "Ignore item by file extension" msgstr "Mellőzött tétel fájl kiterjesztés szerint" #: ui/update.py:54 ui/update.py:98 ui/updateto.py:94 msgid "Updating..." msgstr "Frissítés..." #: ui/update.py:56 ui/update.py:103 ui/updateto.py:102 msgid "Completed Update" msgstr "Frissítés befejezve" #: 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 "Revízió frissítése" #: ui/updateto.py:138 ui/checkout.py:173 msgid "Checkout" msgstr "Ellenőrzés" #: ui/updateto.py:139 #, python-format msgid "Checking out %s..." msgstr "" #: ui/updateto.py:145 ui/checkout.py:184 msgid "Completed Checkout" msgstr "Ellenőrzés befejezve" #: 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 "Útvonal" #: 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 "Kiterjesztés" #: 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 "Betöltés..." #: ui/add.py:98 ui/commit.py:100 ui/lock.py:118 ui/unlock.py:107 #, python-format msgid "Found %d item(s)" msgstr "Talált %d elemet" #: ui/add.py:157 msgid "Running Add Command..." msgstr "Hozzáadás parancs fut..." #: ui/add.py:159 msgid "Completed Add" msgstr "Hozzáadás befejezve" #: 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 "Revízió:" #: 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 "A tároló URL és a végcél útvonal mezőket igényelnek." #: 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 "Exportálás parancs fut..." #: ui/export.py:104 ui/export.py:160 msgid "Completed Export" msgstr "Exportálás befejezve" #: ui/applypatch.py:57 ui/applypatch.py:113 ui/applypatch.py:143 msgid "Apply Patch" msgstr "Hibajavítás alkalmazása" #: ui/applypatch.py:74 msgid "Apply Patch To Directory..." msgstr "Hibajavítás alkalmazása a könyvtárra" #: ui/applypatch.py:114 ui/applypatch.py:144 msgid "Applying Patch File..." msgstr "Hibajavító fájl alkalmazása..." #: ui/applypatch.py:116 ui/applypatch.py:146 msgid "Patch File Applied" msgstr "Hibajavító fájl alkalmazva" #: 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 "Üzenet" #: 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 "Tároló URL mező igényelt" #: ui/import.py:81 msgid "Running Import Command..." msgstr "Importálás parancs fut..." #: ui/import.py:89 msgid "Completed Import" msgstr "Importálás befejezve" #: 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 "Átnevezés" #: ui/rename.py:52 ui/browser.py:470 ui/glade/dialogs.glade.h:39 msgid "New Name:" msgstr "Új név:" #: ui/rename.py:60 msgid "The new name field is required" msgstr "Új név mező szükséges" #: ui/rename.py:85 ui/rename.py:114 msgid "Running Rename Command..." msgstr "Átnevezés parancs fut..." #: ui/rename.py:91 ui/rename.py:120 msgid "Completed Rename" msgstr "Átnevezés befejezve" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Text Status" msgstr "Szöveg állapot" #: ui/commit.py:206 ui/revert.py:63 ui/checkmods.py:68 ui/resolve.py:62 #: ui/createpatch.py:120 msgid "Property Status" msgstr "Tulajdonság állapot" #: ui/commit.py:289 ui/commit.py:385 msgid "Running Commit Command..." msgstr "Beküldés parancs fut..." #: ui/commit.py:295 ui/commit.py:394 msgid "Completed Commit" msgstr "Beküldés befejezve" #: ui/commit.py:314 ui/revert.py:129 ui/createpatch.py:216 #: ui/property_editor.py:112 msgid "Status" msgstr "Állapot" #: ui/diff.py:284 msgid "View diff as side-by-side comparison" msgstr "Összehasonlító nézet, mint párhuzamos összehasonlítás" #: ui/merge.py:87 msgid "Running Merge Test" msgstr "Egyesítés teszt fut" #: ui/merge.py:88 msgid "Completed Merge Test" msgstr "Egyesítés teszt befejezve" #: ui/merge.py:90 msgid "Running Merge Command" msgstr "Egyesítés parancs fut" #: ui/merge.py:91 msgid "Completed Merge" msgstr "Egyesítés befejezve" #: ui/merge.py:102 msgid "Merge" msgstr "Egyesítés" #: 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 "" "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:" #: ui/dialog.py:108 msgid "Select a Folder" msgstr "Dosszié választása" #: ui/dialog.py:138 ui/glade/log.glade.h:11 msgid "to" msgstr "eddig" #: ui/dialog.py:261 msgid "Select a File" msgstr "Fájl választása" #: ui/dialog.py:280 msgid "Save As..." msgstr "Mentés másként…" #: ui/dialog.py:299 ui/glade/dialogs.glade.h:19 msgid "Are you sure you want to continue?" msgstr "Biztos, hogy folytatni akarja?" #: ui/dialog.py:327 msgid "the selected item(s)" msgstr "a kiválasztott tétel/ek/" #: ui/dialog.py:398 msgid "Added a folder to the repository" msgstr "Dosszié hozzáadása a tárolóhoz" #: ui/revert.py:104 ui/revert.py:169 msgid "Running Revert Command..." msgstr "Visszavonás parancs fut" #: ui/revert.py:106 ui/revert.py:171 msgid "Completed Revert" msgstr "Visszavonás befejezve" #: 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 "Az URL tartomány határainak megadása szükséges." #: ui/relocate.py:87 ui/glade/relocate.glade.h:3 msgid "Relocate" msgstr "Áthelyez" #: ui/relocate.py:88 msgid "Running Relocate Command..." msgstr "Áthelyezés parancs fut..." #: ui/relocate.py:95 msgid "Completed Relocate" msgstr "Áthelyezés befejezve" #: 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ízió" #: 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 "Szerző" #: ui/checkmods.py:160 ui/changes.py:50 ui/changes.py:420 msgid "View unified diff" msgstr "Egységes összehasonlító nézet" #: ui/checkmods.py:165 ui/changes.py:425 msgid "Compare side by side" msgstr "Párhuzamos összehasonlítás" #: ui/resolve.py:103 msgid "Running Resolve Command..." msgstr "Feloldás parancs fut..." #: ui/resolve.py:106 msgid "Completed Resolve" msgstr "Feloldás befejezve" #: ui/changes.py:49 msgid "More Actions..." msgstr "Több lépés..." #: ui/changes.py:279 ui/changes.py:364 msgid "Change" msgstr "Változás" #: ui/changes.py:279 msgid "Property Change" msgstr "Tulajdonság változása" #: ui/changes.py:321 ui/lock.py:126 msgid "Yes" msgstr "Igen" #: ui/changes.py:321 msgid "No" msgstr "Nem" #: ui/changes.py:410 msgid "Open from first revision" msgstr "Az első revízió megnyitása" #: ui/changes.py:415 msgid "Open from second revision" msgstr "A második revízió megnyitása" #: ui/annotate.py:57 msgid "Cannot annotate a directory" msgstr "Nem lehet jegyzetet fűzni a könyvtárhoz" #: ui/annotate.py:63 #, python-format msgid "Annotate - %s" msgstr "Jegyzet - %s" #: ui/annotate.py:127 ui/annotate.py:228 msgid "Line" msgstr "Sor" #: ui/annotate.py:128 ui/annotate.py:229 msgid "Text" msgstr "Szöveg" #: ui/annotate.py:143 msgid "The from revision field must be an integer" msgstr "A revízió mező egész szám kell legyen" #: ui/log.py:120 #, python-format msgid "Log - %s" msgstr "Napló - %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 "Esemény" #: ui/log.py:338 msgid "Copy From Path" msgstr "Másolás az útvonalról" #: ui/log.py:338 msgid "Copy From Revision" msgstr "Másolás a revízióból" #: ui/log.py:556 msgid "Graph" msgstr "" #: ui/log.py:781 msgid "View diff against working copy" msgstr "Összehasonlító nézet a munkapéldánnyal" #: ui/log.py:791 msgid "View diff between revisions" msgstr "Összehasonlító nézet revíziók között" #: ui/log.py:796 msgid "Compare with working copy" msgstr "Összehasonlítás a munkapéldánnyal" #: ui/log.py:806 msgid "Compare revisions" msgstr "Revíziók összehasonlítása" #: ui/log.py:812 msgid "Show changes against previous revision" msgstr "" #: ui/log.py:818 msgid "Show changes between revisions" msgstr "Változások mutatása két revízió között" #: 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 "Szerző szerkesztése..." #: ui/log.py:837 msgid "Edit log message..." msgstr "Napló üzenet szerkesztése..." #: ui/log.py:841 msgid "Edit revision properties..." msgstr "Revízió tulajdonságok szerkesztése..." #: ui/log.py:1047 msgid "Edit author" msgstr "Szerző szerkesztése" #: ui/log.py:1059 msgid "Edit log message" msgstr "Napló üzenet szerkesztése" #: ui/settings.py:43 ui/glade/settings.glade.h:35 msgid "Unknown" msgstr "Ismeretlen" #: ui/settings.py:45 msgid "There was an error communicating with the status checker service." msgstr "" #: ui/settings.py:59 msgid "English" msgstr "angol" #: ui/settings.py:119 msgid "Config file:" msgstr "" #: ui/settings.py:294 msgid "Select a program" msgstr "Egy program választása" #: ui/settings.py:303 msgid "Are you sure you want to clear your repository paths?" msgstr "Biztos, hogy akarja törölni a tároló útvonalakat?" #: ui/settings.py:310 msgid "Repository paths cleared" msgstr "Tároló útvonal törölve" #: ui/settings.py:314 msgid "Are you sure you want to clear your previous messages?" msgstr "Biztos, hogy akarja törölni a korábbi üzeneteket?" #: ui/settings.py:321 msgid "Previous messages cleared" msgstr "Előző üzenet törölve" #: ui/settings.py:325 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?" #: ui/settings.py:342 msgid "Authentication information cleared" msgstr "Hitelesítési információ törölve" #: ui/revprops.py:65 ui/properties.py:158 ui/property_editor.py:155 msgid "Unable to retrieve properties list" msgstr "Tulajdonság lista nem állítható helyre" #: ui/branch.py:99 msgid "You must supply a destination path." msgstr "Meg kell adni a végcél útvonalat." #: ui/branch.py:115 msgid "Branch/tag" msgstr "Branch/tag" #: ui/branch.py:116 msgid "Running Branch/tag Command..." msgstr "Branch/tag parancs fut..." #: ui/branch.py:118 msgid "Completed Branch/tag" msgstr "Branch/tag parancs befejezve" #: ui/lock.py:73 msgid "Locked" msgstr "Zárva" #: ui/lock.py:167 msgid "Get Lock" msgstr "Zárolás" #: ui/lock.py:168 msgid "Running Lock Command..." msgstr "Zárás parancs fut..." #: ui/lock.py:177 msgid "Completed Lock" msgstr "Zárás befejezve" #: ui/switch.py:70 msgid "The repository location is a required field." msgstr "Tároló helye mező igényelt" #: ui/switch.py:80 msgid "Switch" msgstr "Kapcsoló" #: ui/switch.py:81 msgid "Running Switch Command..." msgstr "Kapcsoló parancs fut..." #: ui/switch.py:89 msgid "Completed Switch" msgstr "Kapcsoló parancs befejezve" #: 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 "Szám" #: ui/widget.py:861 msgid "Working Copy" msgstr "Munkapéldány" #: 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 "Ellenőrzés - %s" #: ui/checkout.py:174 msgid "Running Checkout Command..." msgstr "Ellenőrzés parancs fut..." #: 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év" #: 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 "Hibajavítás készítése" #: ui/createpatch.py:112 ui/createpatch.py:208 msgid "The given path is not a working copy" msgstr "A megadott útvonal nem a munkapéldányé." #: ui/createpatch.py:163 ui/createpatch.py:263 msgid "Creating Patch File..." msgstr "Hibajavító fájl készítése..." #: ui/createpatch.py:193 ui/createpatch.py:292 msgid "Patch File Created" msgstr "Hibajavító fájl elkészítve" #: ui/properties.py:55 #, python-format msgid "Properties - %s" msgstr "Tulajdonságok - %s" #: ui/properties.py:63 ui/property_editor.py:112 msgid "Value" msgstr "Érték" #: ui/properties.py:179 msgid "There was a problem saving your properties." msgstr "Tulajdonságok mentésénél probléma adódott." #: 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 "" "Figyelem: a tulajdonságok változása azonnal megtörténik. Megnézheti " "és visszavonhatja a változás használatát minden tételre va menüben.\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 "" "Törölni akarja a kiválasztott tulajdonságot minden fájlnál és alkönyvtárban\n" "ezen könyvtárban?" #: ui/property_editor.py:102 msgid "File is not under version control." msgstr "Ez a fájl nincs verzió kontroll alatt." #: ui/property_editor.py:112 msgid "Reserved" msgstr "Fenntartott" #: ui/property_editor.py:189 msgid "Unable to set new value for property." msgstr "Nem engedélyezett a tulajdonság új értéke." #: 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 típus" #: ui/action.py:338 msgid "Finished" msgstr "Befejezve" #: ui/action.py:342 #, python-format msgid "%s - Finished" msgstr "%s - Befejezve" #: ui/action.py:365 msgid "Log Message" msgstr "Napló bejegyzés" #: ui/unlock.py:48 ui/unlock.py:125 msgid "Unlock" msgstr "Nyitás" #: ui/unlock.py:126 msgid "Running Unlock Command..." msgstr "Nyitás parancs fut..." #: ui/unlock.py:129 msgid "Completed Unlock" msgstr "Nyitás befejezve" #: ui/browser.py:89 msgid "Size" msgstr "Méret" #: ui/browser.py:326 msgid "Select" msgstr "" #: ui/browser.py:348 msgid "Create folder..." msgstr "Dosszié létrehozása..." #: ui/browser.py:353 msgid "Copy to..." msgstr "Másolás..." #: ui/browser.py:358 msgid "Copy URL to clipboard" msgstr "URL másolása a vágólapra" #: ui/browser.py:363 msgid "Move to..." msgstr "Áthelyezés..." #: ui/browser.py:531 msgid "Where do you want to copy the selection?" msgstr "Hová akarja másolni a kijelölést?" #: ui/browser.py:532 ui/browser.py:561 msgid "New Location:" msgstr "Új hely:" #: ui/browser.py:560 msgid "Where do you want to move the selection?" msgstr "Hová akarja áthelyezni a kijelölést?" #: ui/cleanup.py:56 ui/glade/cleanup.glade.h:1 msgid "Cleaning Up..." msgstr "Tisztítás..." #: ui/cleanup.py:58 msgid "Completed Cleanup" msgstr "Tisztítás befejezve" #: ui/create.py:46 msgid "Repository successfully created" msgstr "Tároló sikeresen elkészítve" #: ui/create.py:48 msgid "" "There was an error creating the repository. Make sure the given folder is " "empty." msgstr "Hiba a tároló készítésekor. Ellenőrizze, hogy a dosszié üres." #: ui/glade/properties.glade.h:1 msgid "Properties for:" msgstr "Tulajdonságok ehhez:" #: ui/glade/properties.glade.h:2 msgid "Selected properties will be applied recursively." msgstr "Kiválasztott tulajdonságok rekurzívan lesznek használva." #: ui/glade/properties.glade.h:4 msgid "Delete properties recursively" msgstr "Rekurzív tulajdonságok törlése" #: ui/glade/properties.glade.h:5 msgid "Edit..." msgstr "Szerkesztés..." #: ui/glade/properties.glade.h:6 msgid "New..." msgstr "Új..." #: ui/glade/properties.glade.h:8 msgid "URL/Path:" msgstr "URL/Útvonal" #: ui/glade/browser.glade.h:1 msgid "Load/Refresh" msgstr "Betöltés/Frissítés" #: 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 "Üzenet hozzáadása" #: ui/glade/dialogs.glade.h:3 msgid "Certificate Details" msgstr "Tanúsítvány részletei" #: ui/glade/dialogs.glade.h:4 msgid "Edit Property Details" msgstr "Tulajdonság részleteinek szerkesztése" #: ui/glade/dialogs.glade.h:5 msgid "Enter Name and Email Details" msgstr "" #: ui/glade/dialogs.glade.h:6 msgid "Folder Name" msgstr "Dosszié neve" #: ui/glade/dialogs.glade.h:7 ui/glade/log.glade.h:3 msgid "Message" msgstr "Üzenet" #: ui/glade/dialogs.glade.h:8 msgid "Please add your authentication details" msgstr "Adja meg az Ön azonosítóit" #: ui/glade/dialogs.glade.h:9 msgid "Please provide your ssl certification file" msgstr "Kérjük adja meg az Ön SSL igazoló fájlját" #: ui/glade/dialogs.glade.h:10 msgid "Previous Messages" msgstr "Korábbi üzenetek" #: ui/glade/dialogs.glade.h:12 msgid "" "Are you sure you want to delete %item%?" msgstr "" "Akarja törölni a/z/ %item% tételt?" #: ui/glade/dialogs.glade.h:13 msgid "RabbitVCS Error" msgstr "RabbitVCS Error" #: ui/glade/dialogs.glade.h:14 msgid "Accept Forever" msgstr "Mindig elfogad" #: ui/glade/dialogs.glade.h:15 msgid "Accept Mine" msgstr "" #: ui/glade/dialogs.glade.h:16 msgid "Accept Once" msgstr "Egyszer elfogad" #: ui/glade/dialogs.glade.h:17 msgid "Accept Theirs" msgstr "" #: ui/glade/dialogs.glade.h:18 msgid "Apply property recursively" msgstr "Tulajdonság megadása rekurzívan" #: ui/glade/dialogs.glade.h:20 msgid "Authentication" msgstr "Hitelesítés" #: ui/glade/dialogs.glade.h:21 msgid "Cancel" msgstr "" #: ui/glade/dialogs.glade.h:22 msgid "Check Certificate" msgstr "Tanúsítvány ellenőrzése" #: ui/glade/dialogs.glade.h:23 msgid "Confirmation" msgstr "Megerősítés" #: ui/glade/dialogs.glade.h:24 msgid "Conflict Resolution Decision" msgstr "" #: ui/glade/dialogs.glade.h:25 msgid "Create Folder..." msgstr "Dosszié készítése..." #: ui/glade/dialogs.glade.h:26 msgid "Delete Confirmation" msgstr "Megerősítés törlése..." #: ui/glade/dialogs.glade.h:27 msgid "Deny" msgstr "Visszautasít" #: ui/glade/dialogs.glade.h:28 msgid "Email:" msgstr "" #: ui/glade/dialogs.glade.h:29 msgid "Fingerprint:" msgstr "Ujjlenyomat:" #: ui/glade/dialogs.glade.h:31 msgid "How do you want to handle this?" msgstr "" #: ui/glade/dialogs.glade.h:32 msgid "Issuer:" msgstr "Kibocsájtó:" #: ui/glade/dialogs.glade.h:34 msgid "Login:" msgstr "Felhasználó név:" #: 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 "Jelszó:" #: ui/glade/dialogs.glade.h:41 msgid "Path:" msgstr "Útvonal:" #: 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 "Előző üzenet" #: ui/glade/dialogs.glade.h:43 msgid "Property" msgstr "Tulajdonság" #: ui/glade/dialogs.glade.h:44 msgid "Property:" msgstr "Tulajdonság:" #: ui/glade/dialogs.glade.h:45 msgid "RabbitVCS Error" msgstr "RabbitVCS hiba" #: ui/glade/dialogs.glade.h:46 msgid "Realm:" msgstr "Övezet:" #: ui/glade/dialogs.glade.h:47 msgid "SSL Client Certification" msgstr "SSL kliens igazolás" #: ui/glade/dialogs.glade.h:48 msgid "Save Authentication" msgstr "Hitelesítés mentése" #: ui/glade/dialogs.glade.h:49 msgid "Text Change" msgstr "Szöveg változás" #: ui/glade/dialogs.glade.h:50 msgid "The item(s) will be sent to the trash can." msgstr "A tétel a kukába kerül." #: ui/glade/dialogs.glade.h:51 msgid "Valid:" msgstr "Érvényeség:" #: ui/glade/dialogs.glade.h:52 msgid "Value:" msgstr "Érték:" #: 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 "Link" #: ui/glade/about.glade.h:2 msgid "Version Information" msgstr "Verzió információ" #: ui/glade/about.glade.h:3 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/about.glade.h:5 msgid "Authors:" msgstr "Szerzők:" #: ui/glade/about.glade.h:6 msgid "Thanks:" msgstr "Köszönet:" #: 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 "" "Érintett fájl/ok/ (kettős klikkantással összehasonlítás a bázissal)" #: ui/glade/log.glade.h:4 msgid "Revisions Table" msgstr "Revíziós tábla" #: ui/glade/log.glade.h:5 msgid "Limit:" msgstr "Határ:" #: ui/glade/log.glade.h:6 msgid "Log" msgstr "Napló" #: ui/glade/log.glade.h:8 msgid "Refresh" msgstr "Frissítés" #: ui/glade/log.glade.h:9 msgid "Showing Revisions:" msgstr "Revíziók mutatása:" #: ui/glade/log.glade.h:10 msgid "Stop on copy" msgstr "Másolás megállítása" #: ui/glade/cleanup.glade.h:2 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?" #: ui/glade/settings.glade.h:1 msgid "Authentication" msgstr "Azonosítás" #: 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 "Napló üzenetek" #: ui/glade/settings.glade.h:5 msgid "Logging Options" msgstr "Naplózási beállítások" #: 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 a fájlok összehasonlításához" #: ui/glade/settings.glade.h:10 msgid "RabbitVCS" msgstr "RabbitVCS" #: ui/glade/settings.glade.h:11 msgid "URL History" msgstr "URL előzmények" #: ui/glade/settings.glade.h:12 msgid "Browse..." msgstr "Böngészés..." #: ui/glade/settings.glade.h:13 msgid "Clear your authentication information" msgstr "Az Ön azonosítási információinak törlése" #: ui/glade/settings.glade.h:14 msgid "Enable emblems" msgstr "Jelképek engedélyezve" #: ui/glade/settings.glade.h:15 msgid "Enable file attributes" msgstr "Fájl attributomok engedélyezve" #: ui/glade/settings.glade.h:16 msgid "Enable recursive status checks" msgstr "Rekurzív állapotellenőrzés engedélyezve" #: ui/glade/settings.glade.h:17 msgid "External Programs" msgstr "Külső programok" #: ui/glade/settings.glade.h:18 msgid "General" msgstr "Általános" #: ui/glade/settings.glade.h:19 msgid "Git" msgstr "" #: ui/glade/settings.glade.h:20 msgid "Language:" msgstr "Nyelv:" #: ui/glade/settings.glade.h:21 msgid "Logging" msgstr "Naplózás" #: ui/glade/settings.glade.h:22 msgid "Minimum level to log" msgstr "Minimális naplóbejegyzés" #: ui/glade/settings.glade.h:23 msgid "Number of URLs to remember" msgstr "Megjegyzett URL-ek száma" #: ui/glade/settings.glade.h:24 msgid "Number of messages to remember" msgstr "Megjegyzett üzenetek száma" #: 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 "Mentett adat" #: ui/glade/settings.glade.h:29 msgid "Show RabbitVCS debugging tools" msgstr "RabbitVCS nyomkövető eszköz mutatása" #: 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 "A nyomkövetés menü a problémák diagnózisára a RabbitVCS-t használja" #: ui/glade/settings.glade.h:34 msgid "Type:" msgstr "Típus:" #: ui/glade/lock.glade.h:1 msgid "Files to lock" msgstr "Zárolt fájlok" #: ui/glade/lock.glade.h:2 msgid "Please describe why you are locking these files" msgstr "Írja le, miért akarja zárolni ezeket a fájlokat?" #: ui/glade/lock.glade.h:3 msgid "Lock Files" msgstr "Zárolt fájlok" #: ui/glade/lock.glade.h:5 ui/glade/add.glade.h:2 ui/glade/commit.glade.h:6 msgid "Select / Deselect all" msgstr "Kiválasztás / Összes kiválasztás" #: ui/glade/lock.glade.h:6 msgid "Steal the locks" msgstr "Zárolások ellopása" #: ui/glade/annotate.glade.h:1 msgid "From Revision" msgstr "Revíziótól" #: ui/glade/annotate.glade.h:2 msgid "To Revision" msgstr "Revízióig" #: ui/glade/annotate.glade.h:3 msgid "Annotate" msgstr "Jegyzet" #: 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 "" "Változott fájlok (kettős klikkantással összehasonlítás a bázissal)" #: ui/glade/commit.glade.h:3 msgid "Commit to:" msgstr "Beküldés" #: ui/glade/commit.glade.h:7 msgid "Show unversioned files" msgstr "Verziókezelésen kívüli fájlok mutatása" #: ui/glade/notification.glade.h:1 msgid "Notification Messages" msgstr "Értesítés" #: ui/glade/property_editor.glade.h:1 msgid "Remote URI:" msgstr "Távoli URI:" #: ui/glade/property_editor.glade.h:2 msgid "Working Copy:" msgstr "Munkapéldány:" #: ui/glade/property_editor.glade.h:3 msgid "Add a new property." msgstr "Egy új tulajdonság hozzáadása" #: ui/glade/property_editor.glade.h:4 msgid "Close this dialog." msgstr "Párbeszéd bezárása." #: ui/glade/property_editor.glade.h:5 msgid "Property Editor" msgstr "Tulajdonság szerkesztő" #: ui/glade/property_editor.glade.h:6 msgid "Refresh the list of properties." msgstr "Tulajdonságok listájának frissítése." #: ui/glade/relocate.glade.h:1 msgid "Change the repository of your working copy" msgstr "Tároló cseréje az Ön munkapéldányhoz" #: ui/glade/relocate.glade.h:2 msgid "From:" msgstr "Innen:" #: ui/glade/relocate.glade.h:4 msgid "To:" msgstr "Eddig:" #: ui/glade/git-update.glade.h:1 ui/glade/update.glade.h:1 #: ui/glade/merge.glade.h:3 msgid "Options" msgstr "Opciók" #: ui/glade/git-update.glade.h:3 msgid "Update Local Repository" msgstr "" #: ui/glade/update.glade.h:2 msgid "Revision" msgstr "Revízió" #: ui/glade/update.glade.h:3 msgid "Omit Externals" msgstr "Külső tárolók kihagyása" #: ui/glade/update.glade.h:4 ui/glade/merge.glade.h:16 msgid "Recursive" msgstr "Rekurzív" #: ui/glade/update.glade.h:5 msgid "Rollback to specified revision number" msgstr "" #: ui/glade/import.glade.h:1 msgid "Import Message" msgstr "Import üzenet" #: ui/glade/import.glade.h:2 msgid "Repository" msgstr "Tároló" #: ui/glade/import.glade.h:4 msgid "Include ignored files" msgstr "Mellőzött fájlokat tartalmaz" #: ui/glade/merge.glade.h:1 msgid "From URL" msgstr "Ettől az URL-től" #: ui/glade/merge.glade.h:2 msgid "From: (URL and revision to merge)" msgstr "Innen: (URL és revízió egyesítve)" #: ui/glade/merge.glade.h:4 msgid "Revision Range" msgstr "Revíziós terület" #: ui/glade/merge.glade.h:5 msgid "To: (URL and revision to merge)" msgstr "Eddig: (URL és revízió egyesítve)" #: ui/glade/merge.glade.h:6 msgid "URL to merge from" msgstr "URL egyesítve innen" #: ui/glade/merge.glade.h:7 msgid "Working Copy" msgstr "Munkapéldány" #: 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á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." #: ui/glade/merge.glade.h:9 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." #: ui/glade/merge.glade.h:11 msgid "Ignore ancestry" msgstr "Eredet mellőzése" #: ui/glade/merge.glade.h:12 msgid "Merge Assistant" msgstr "Egyesítés segéd" #: ui/glade/merge.glade.h:13 msgid "Merge a range of revisions" msgstr "Egy revíziós terület egyesítése" #: ui/glade/merge.glade.h:14 msgid "Merge two different trees" msgstr "Két különböző fa egyesítése" #: ui/glade/merge.glade.h:15 msgid "Only record the merge" msgstr "Csak rögzítése az egyesítésnek" #: ui/glade/merge.glade.h:18 msgid "Show log" msgstr "Napló mutatása" #: ui/glade/merge.glade.h:19 msgid "Test Merge" msgstr "Egyesítés teszt" #: 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 "" "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.16/po/it.po000066400000000000000000001366241230007774300150300ustar00rootroot00000000000000# 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.16/po/ja.po000066400000000000000000001313501230007774300147750ustar00rootroot00000000000000# 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.16/po/nb.po000066400000000000000000001325021230007774300150020ustar00rootroot00000000000000# 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.16/po/nl.po000066400000000000000000001372751230007774300150300ustar00rootroot00000000000000# 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.16/po/oc.po000066400000000000000000001130101230007774300147750ustar00rootroot00000000000000# 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.16/po/pl.po000066400000000000000000001272421230007774300150230ustar00rootroot00000000000000# 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.16/po/pt_BR.po000066400000000000000000001405141230007774300154130ustar00rootroot00000000000000# 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.16/po/ro.po000066400000000000000000001162071230007774300150270ustar00rootroot00000000000000# 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.16/po/ru.po000066400000000000000000001413221230007774300150310ustar00rootroot00000000000000# 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.16/po/sk.po000066400000000000000000001261151230007774300150230ustar00rootroot00000000000000# 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.16/po/sl.po000066400000000000000000001126611230007774300150250ustar00rootroot00000000000000# 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.16/po/sr.po000066400000000000000000001111271230007774300150270ustar00rootroot00000000000000# 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.16/po/sv.po000066400000000000000000001313031230007774300150310ustar00rootroot00000000000000# 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.16/po/th.po000066400000000000000000001104351230007774300150170ustar00rootroot00000000000000# 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.16/po/zh_CN.po000066400000000000000000001273711230007774300154140ustar00rootroot00000000000000# 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.16/po/zh_TW.po000066400000000000000000001125531230007774300154420ustar00rootroot00000000000000# 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.16/rabbitvcs/000077500000000000000000000000001230007774300154015ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/__init__.py000066400000000000000000000056241230007774300175210ustar00rootroot00000000000000# # 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 # Hack to make RabbitVCS win in the battle against TortoiseHg try: import mercurial.demandimport mercurial.demandimport.enable = lambda: None except Exception, e: pass version = "0.16.0" 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) gettext = _gettext.translation(APP_NAME, LOCALE_DIR, languages=langs, fallback=True) 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, 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, e: return "%s/data/icons/hicolor" % os.path.dirname(os.path.dirname(os.path.realpath(__file__))) rabbitvcs-0.16/rabbitvcs/debug/000077500000000000000000000000001230007774300164675ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/debug/__init__.py000066400000000000000000000017031230007774300206010ustar00rootroot00000000000000# # 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.16/rabbitvcs/debug/ipython_view.py000066400000000000000000000373641230007774300216020ustar00rootroot00000000000000''' Provides IPython console widget. @author: Eitan Isaacson @organization: IBM Corporation @copyright: Copyright (c) 2007 IBM Corporation @license: BSD All rights reserved. This program and the accompanying materials are made available under the terms of the BSD which accompanies this distribution, and is available at U{http://www.opensource.org/licenses/bsd-license.php} ''' import gtk, gobject import re import sys import os import pango from StringIO import StringIO import thread try: import IPython except ImportError: IPython = None class IterableIPShell: ''' Create an IPython instance. Does not start a blocking event loop, instead allow single iterations. This allows embedding in GTK+ without blockage. @ivar IP: IPython instance. @type IP: IPython.iplib.InteractiveShell @ivar iter_more: Indicates if the line executed was a complete command, or we should wait for more. @type iter_more: integer @ivar history_level: The place in history where we currently are when pressing up/down. @type history_level: integer @ivar complete_sep: Seperation delimeters for completion function. @type complete_sep: _sre.SRE_Pattern ''' def __init__(self,argv=[],user_ns=None,user_global_ns=None, cin=None, cout=None,cerr=None, input_func=None): ''' @param argv: Command line options for IPython @type argv: list @param user_ns: User namespace. @type user_ns: dictionary @param user_global_ns: User global namespace. @type user_global_ns: dictionary. @param cin: Console standard input. @type cin: IO stream @param cout: Console standard output. @type cout: IO stream @param cerr: Console standard error. @type cerr: IO stream @param input_func: Replacement for builtin raw_input() @type input_func: function ''' if input_func: IPython.iplib.raw_input_original = input_func if cin: IPython.Shell.Term.cin = cin if cout: IPython.Shell.Term.cout = cout if cerr: IPython.Shell.Term.cerr = cerr # This is to get rid of the blockage that accurs during # IPython.Shell.InteractiveShell.user_setup() IPython.iplib.raw_input = lambda x: None self.term = IPython.genutils.IOTerm(cin=cin, cout=cout, cerr=cerr) os.environ['TERM'] = 'dumb' excepthook = sys.excepthook self.IP = IPython.Shell.make_IPython( argv,user_ns=user_ns, user_global_ns=user_global_ns, embedded=True, shell_class=IPython.Shell.InteractiveShell) self.IP.system = lambda cmd: self.shell(self.IP.var_expand(cmd), header='IPython system call: ', verbose=self.IP.rc.system_verbose) sys.excepthook = excepthook self.iter_more = 0 self.history_level = 0 self.complete_sep = re.compile('[\s\{\}\[\]\(\)]') def execute(self): ''' Executes the current line provided by the shell object. ''' self.history_level = 0 orig_stdout = sys.stdout sys.stdout = IPython.Shell.Term.cout try: line = self.IP.raw_input(None, self.iter_more) if self.IP.autoindent: self.IP.readline_startup_hook(None) except KeyboardInterrupt: self.IP.write('\nKeyboardInterrupt\n') self.IP.resetbuffer() # keep cache in sync with the prompt counter: self.IP.outputcache.prompt_count -= 1 if self.IP.autoindent: self.IP.indent_current_nsp = 0 self.iter_more = 0 except: self.IP.showtraceback() else: self.iter_more = self.IP.push(line) if (self.IP.SyntaxTB.last_syntax_error and self.IP.rc.autoedit_syntax): self.IP.edit_syntax_error() if self.iter_more: self.prompt = str(self.IP.outputcache.prompt2).strip() if self.IP.autoindent: self.IP.readline_startup_hook(self.IP.pre_readline) else: self.prompt = str(self.IP.outputcache.prompt1).strip() sys.stdout = orig_stdout def historyBack(self): ''' Provides one history command back. @return: The command string. @rtype: string ''' self.history_level -= 1 return self._getHistory() def historyForward(self): ''' Provides one history command forward. @return: The command string. @rtype: string ''' self.history_level += 1 return self._getHistory() def _getHistory(self): ''' Get's the command string of the current history level. @return: Historic command string. @rtype: string ''' try: rv = self.IP.user_ns['In'][self.history_level].strip('\n') except IndexError: self.history_level = 0 rv = '' return rv def updateNamespace(self, ns_dict): ''' Add the current dictionary to the shell namespace. @param ns_dict: A dictionary of symbol-values. @type ns_dict: dictionary ''' self.IP.user_ns.update(ns_dict) def complete(self, line): ''' Returns an auto completed line and/or posibilities for completion. @param line: Given line so far. @type line: string @return: Line completed as for as possible, and possible further completions. @rtype: tuple ''' split_line = self.complete_sep.split(line) possibilities = self.IP.complete(split_line[-1]) if possibilities: def _commonPrefix(str1, str2): ''' Reduction function. returns common prefix of two given strings. @param str1: First string. @type str1: string @param str2: Second string @type str2: string @return: Common prefix to both strings. @rtype: string ''' for i in range(len(str1)): if not str2.startswith(str1[:i+1]): return str1[:i] return str1 common_prefix = reduce(_commonPrefix, possibilities) completed = line[:-len(split_line[-1])]+common_prefix else: completed = line return completed, possibilities def shell(self, cmd,verbose=0,debug=0,header=''): ''' Replacement method to allow shell commands without them blocking. @param cmd: Shell command to execute. @type cmd: string @param verbose: Verbosity @type verbose: integer @param debug: Debug level @type debug: integer @param header: Header to be printed before output @type header: string ''' stat = 0 if verbose or debug: print header+cmd # flush stdout so we don't mangle python's buffering if not debug: input, output = os.popen4(cmd) print output.read() output.close() input.close() class ConsoleView(gtk.TextView): ''' Specialized text view for console-like workflow. @cvar ANSI_COLORS: Mapping of terminal colors to X11 names. @type ANSI_COLORS: dictionary @ivar text_buffer: Widget's text buffer. @type text_buffer: gtk.TextBuffer @ivar color_pat: Regex of terminal color pattern @type color_pat: _sre.SRE_Pattern @ivar mark: Scroll mark for automatic scrolling on input. @type mark: gtk.TextMark @ivar line_start: Start of command line mark. @type line_start: gtk.TextMark ''' ANSI_COLORS = {'0;30': 'Black', '0;31': 'Red', '0;32': 'Green', '0;33': 'Brown', '0;34': 'Blue', '0;35': 'Purple', '0;36': 'Cyan', '0;37': 'LightGray', '1;30': 'DarkGray', '1;31': 'DarkRed', '1;32': 'SeaGreen', '1;33': 'Yellow', '1;34': 'LightBlue', '1;35': 'MediumPurple', '1;36': 'LightCyan', '1;37': 'White'} def __init__(self): ''' Initialize console view. ''' gtk.TextView.__init__(self) self.modify_font(pango.FontDescription('Mono')) self.set_cursor_visible(True) self.text_buffer = self.get_buffer() self.mark = self.text_buffer.create_mark('scroll_mark', self.text_buffer.get_end_iter(), False) for code in self.ANSI_COLORS: self.text_buffer.create_tag(code, foreground=self.ANSI_COLORS[code], weight=700) self.text_buffer.create_tag('0') self.text_buffer.create_tag('notouch', editable=False) self.color_pat = re.compile('\x01?\x1b\[(.*?)m\x02?') self.line_start = \ self.text_buffer.create_mark('line_start', self.text_buffer.get_end_iter(), True) self.connect('key-press-event', self.onKeyPress) def write(self, text, editable=False): gobject.idle_add(self._write, text, editable) def _write(self, text, editable=False): ''' Write given text to buffer. @param text: Text to append. @type text: string @param editable: If true, added text is editable. @type editable: boolean ''' segments = self.color_pat.split(text) segment = segments.pop(0) start_mark = self.text_buffer.create_mark(None, self.text_buffer.get_end_iter(), True) self.text_buffer.insert(self.text_buffer.get_end_iter(), segment) if segments: ansi_tags = self.color_pat.findall(text) for tag in ansi_tags: i = segments.index(tag) self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(), segments[i+1], tag) segments.pop(i) if not editable: self.text_buffer.apply_tag_by_name('notouch', self.text_buffer.get_iter_at_mark(start_mark), self.text_buffer.get_end_iter()) self.text_buffer.delete_mark(start_mark) self.scroll_mark_onscreen(self.mark) def showPrompt(self, prompt): gobject.idle_add(self._showPrompt, prompt) def _showPrompt(self, prompt): ''' Prints prompt at start of line. @param prompt: Prompt to print. @type prompt: string ''' self._write(prompt) self.text_buffer.move_mark(self.line_start, self.text_buffer.get_end_iter()) def changeLine(self, text): gobject.idle_add(self._changeLine, text) def _changeLine(self, text): ''' Replace currently entered command line with given text. @param text: Text to use as replacement. @type text: string ''' iter = self.text_buffer.get_iter_at_mark(self.line_start) iter.forward_to_line_end() self.text_buffer.delete(self.text_buffer.get_iter_at_mark(self.line_start), iter) self._write(text, True) def getCurrentLine(self): ''' Get text in current command line. @return: Text of current command line. @rtype: string ''' rv = self.text_buffer.get_slice( self.text_buffer.get_iter_at_mark(self.line_start), self.text_buffer.get_end_iter(), False) return rv def showReturned(self, text): gobject.idle_add(self._showReturned, text) def _showReturned(self, text): ''' Show returned text from last command and print new prompt. @param text: Text to show. @type text: string ''' iter = self.text_buffer.get_iter_at_mark(self.line_start) iter.forward_to_line_end() self.text_buffer.apply_tag_by_name( 'notouch', self.text_buffer.get_iter_at_mark(self.line_start), iter) self._write('\n'+text) if text: self._write('\n') self._showPrompt(self.prompt) self.text_buffer.move_mark(self.line_start,self.text_buffer.get_end_iter()) self.text_buffer.place_cursor(self.text_buffer.get_end_iter()) def onKeyPress(self, widget, event): ''' Key press callback used for correcting behavior for console-like interfaces. For example 'home' should go to prompt, not to begining of line. @param widget: Widget that key press accored in. @type widget: gtk.Widget @param event: Event object @type event: gtk.gdk.Event @return: Return True if event should not trickle. @rtype: boolean ''' insert_mark = self.text_buffer.get_insert() insert_iter = self.text_buffer.get_iter_at_mark(insert_mark) selection_mark = self.text_buffer.get_selection_bound() selection_iter = self.text_buffer.get_iter_at_mark(selection_mark) start_iter = self.text_buffer.get_iter_at_mark(self.line_start) if event.keyval == gtk.keysyms.Home: if event.state & gtk.gdk.CONTROL_MASK or event.state & gtk.gdk.MOD1_MASK: pass elif event.state & gtk.gdk.SHIFT_MASK: self.text_buffer.move_mark(insert_mark, start_iter) return True else: self.text_buffer.place_cursor(start_iter) return True elif event.keyval == gtk.keysyms.Left: insert_iter.backward_cursor_position() if not insert_iter.editable(True): return True elif not event.string: pass elif start_iter.compare(insert_iter) <= 0 and \ start_iter.compare(selection_iter) <= 0: pass elif start_iter.compare(insert_iter) > 0 and \ start_iter.compare(selection_iter) > 0: self.text_buffer.place_cursor(start_iter) elif insert_iter.compare(selection_iter) < 0: self.text_buffer.move_mark(insert_mark, start_iter) elif insert_iter.compare(selection_iter) > 0: self.text_buffer.move_mark(selection_mark, start_iter) return self.onKeyPressExtend(event) def onKeyPressExtend(self, event): ''' For some reason we can't extend onKeyPress directly (bug #500900). ''' pass class IPythonView(ConsoleView, IterableIPShell): ''' Sub-class of both modified IPython shell and L{ConsoleView} this makes a GTK+ IPython console. ''' def __init__(self): ''' Initialize. Redirect I/O to console. ''' ConsoleView.__init__(self) self.cout = StringIO() IterableIPShell.__init__(self, cout=self.cout,cerr=self.cout, input_func=self.raw_input) # self.connect('key_press_event', self.keyPress) self.execute() self.cout.truncate(0) self.showPrompt(self.prompt) self.interrupt = False def raw_input(self, prompt=''): ''' Custom raw_input() replacement. Get's current line from console buffer. @param prompt: Prompt to print. Here for compatability as replacement. @type prompt: string @return: The current command line text. @rtype: string ''' if self.interrupt: self.interrupt = False raise KeyboardInterrupt return self.getCurrentLine() def onKeyPressExtend(self, event): ''' Key press callback with plenty of shell goodness, like history, autocompletions, etc. @param event: Event object. @type event: gtk.gdk.Event @return: True if event should not trickle. @rtype: boolean ''' if event.state & gtk.gdk.CONTROL_MASK and event.keyval == 99: self.interrupt = True self._processLine() return True elif event.keyval == gtk.keysyms.Return: self._processLine() return True elif event.keyval == gtk.keysyms.Up: self.changeLine(self.historyBack()) return True elif event.keyval == gtk.keysyms.Down: self.changeLine(self.historyForward()) return True elif event.keyval == gtk.keysyms.Tab: if not self.getCurrentLine().strip(): return False completed, possibilities = self.complete(self.getCurrentLine()) if len(possibilities) > 1: slice = self.getCurrentLine() self.write('\n') for symbol in possibilities: self.write(symbol+'\n') self.showPrompt(self.prompt) self.changeLine(completed or slice) return True def _processLine(self): ''' Process current command line. ''' self.history_pos = 0 self.execute() rv = self.cout.getvalue() if rv: rv = rv.strip('\n') self.showReturned(rv) self.cout.truncate(0) rabbitvcs-0.16/rabbitvcs/services/000077500000000000000000000000001230007774300172245ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/services/__init__.py000066400000000000000000000000001230007774300213230ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/services/checkerservice.py000066400000000000000000000421261230007774300225700ustar00rootroot00000000000000# # 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). """ import os, os.path import sys import simplejson try: from gi.repository import GObject as gobject except ImportError: import gobject try: from gi.repository import GLib as glib except: import glib import dbus import dbus.glib # FIXME: this might actually already set the default loop import dbus.mainloop.glib import dbus.service import rabbitvcs.util.decorators import rabbitvcs.util._locale import rabbitvcs.util.helper 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 json_dict.has_key('path'): 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 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 = simplejson.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 = rabbitvcs.util.helper.process_memory(os.getpid()) checker_mem = self.status_checker.get_memory_usage() return own_mem + checker_mem @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='sbbb', out_signature='s') def CheckStatus(self, path, recurse=False, invalidate=False, summary=False): """ Requests a status check from the underlying status checker. """ status = self.status_checker.check_status(unicode(path), recurse=recurse, summary=summary, invalidate=invalidate) return self.encoder.encode(status) @dbus.service.method(INTERFACE, in_signature='as', out_signature='s') def GenerateMenuConditions(self, paths): upaths = [] for path in paths: upaths.append(unicode(path)) path_dict = self.status_checker.generate_menu_conditions(upaths) return simplejson.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: """ 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 = simplejson.JSONDecoder(object_hook=decode_status) self.status_checker = None start() 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) except dbus.DBusException, 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, 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, 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(path, 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, 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) assert status.path == path, "Status check returned the wrong path "\ "(asked about %s, got back %s)" % \ (path, status.path) 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. gobject.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(path, recurse, invalidate, summary, dbus_interface=INTERFACE, timeout=TIMEOUT, reply_handler=reply_handler, error_handler=error_handler) except dbus.DBusException, 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: gobject.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(json): # Note that this a closure referring to the outer functions callback # parameter path_dict = simplejson.loads(json) 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. gobject.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, {}) try: self.status_checker.GenerateMenuConditions(paths, dbus_interface=INTERFACE, timeout=TIMEOUT, reply_handler=reply_handler, error_handler=error_handler) except dbus.DBusException, 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): gobject.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. gobject.threads_init() dbus.glib.threads_init() # This registers our service name with the bus session_bus = dbus.SessionBus() service_name = dbus.service.BusName(SERVICE, session_bus) mainloop = gobject.MainLoop() checker_service = StatusCheckerService(session_bus, mainloop) gobject.idle_add(sys.stdout.write, "Started status checker service\n") gobject.idle_add(sys.stdout.flush) 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.16/rabbitvcs/services/service.py000066400000000000000000000062021230007774300212360ustar00rootroot00000000000000# # 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. """ 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.16/rabbitvcs/services/statuschecker.py000066400000000000000000000043731230007774300224550ustar00rootroot00000000000000# # 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. """ import rabbitvcs.vcs import rabbitvcs.vcs.status import simplejson from rabbitvcs import gettext _ = gettext.gettext from rabbitvcs.util.log import Log log = Log("rabbitvcs.services.statuschecker") class StatusChecker: """ 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.16/rabbitvcs/test.py000066400000000000000000000023501230007774300167320ustar00rootroot00000000000000# # 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.16/rabbitvcs/tests/000077500000000000000000000000001230007774300165435ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/tests/__init__.py000066400000000000000000000017031230007774300206550ustar00rootroot00000000000000# # 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.16/rabbitvcs/tests/nautilus.py000066400000000000000000000006041230007774300207610ustar00rootroot00000000000000""" 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.16/rabbitvcs/tests/test_rabbitvcs.py000066400000000000000000000131701230007774300221350ustar00rootroot00000000000000# # 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. """ # 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 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.16/rabbitvcs/ui/000077500000000000000000000000001230007774300160165ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/ui/__init__.py000066400000000000000000000203011230007774300201230ustar00rootroot00000000000000# # 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. """ import os try: from gi.repository import GObject as gobject except ImportError: import gobject if "NAUTILUS_PYTHON_REQUIRE_GTK3" in os.environ and os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"]: from gi.repository import Gtk as gtk else: import gtk 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: 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: gtk.gdk.threads_enter() window.destroy() if threaded: gtk.gdk.threads_leave() 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: gobject.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, data): if (data.keyval == gtk.keysyms.Escape): self.on_cancel_clicked(widget) return True if (data.state & gtk.gdk.CONTROL_MASK and gtk.gdk.keyval_name(data.keyval).lower() == "w"): self.on_cancel_clicked(widget) return True if (data.state & gtk.gdk.CONTROL_MASK and gtk.gdk.keyval_name(data.keyval).lower() == "q"): self.on_cancel_clicked(widget) return True if (data.state & gtk.gdk.CONTROL_MASK and gtk.gdk.keyval_name(data.keyval).lower() == "r"): self.on_refresh_clicked(widget) return True class InterfaceNonView: """ 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.16/rabbitvcs/ui/about.py000066400000000000000000000064511230007774300175100ustar00rootroot00000000000000# # 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 string import re import pygtk import gobject import gtk import rabbitvcs from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import pysvn import configobj from rabbitvcs import gettext _ = gettext.gettext class About: """ This class provides an interface to the About window. """ def __init__(self): def url_hook(dialog, url): rabbitvcs.util.helper.launch_url_in_webbrowser(url) gtk.about_dialog_set_url_hook(url_hook) self.about = gtk.AboutDialog() self.about.set_name(rabbitvcs.APP_NAME) # The set_program_name method was not added until PyGTK 2.12 if hasattr(self.about, "set_program_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" authors_path = os.path.join(doc_path_root, dir, "AUTHORS") if os.path.exists(authors_path): # At this point we have found a likely-looking AUTHORS break else: # 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")) versions = [] versions.append("Subversion - %s" % string.join(map(str,pysvn.svn_version), ".")) versions.append("Pysvn - %s" % string.join(map(str,pysvn.version), ".")) versions.append("ConfigObj - %s" % str(configobj.__version__)) self.about.set_comments("\n".join(versions)) def run(self): self.about.show_all() self.about.run() self.about.destroy() if __name__ == "__main__": window = About() window.run() rabbitvcs-0.16/rabbitvcs/ui/action.py000066400000000000000000000605001230007774300176460ustar00rootroot00000000000000# # 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 import threading from os.path import basename import shutil import pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util import rabbitvcs.vcs import rabbitvcs.util.helper from rabbitvcs.ui.dialog import MessageBox from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.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: 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() def toggle_ok_button(self, sensitive): if not self.client_in_same_thread: gtk.gdk.threads_enter() self.finished = True self.get_widget("ok").set_sensitive(sensitive) self.get_widget("saveas").set_sensitive(sensitive) if not self.client_in_same_thread: gtk.gdk.threads_leave() def append(self, entry): if not self.client_in_same_thread: gtk.gdk.threads_enter() self.table.append(entry) self.table.scroll_to_bottom() if not self.client_in_same_thread: gtk.gdk.threads_leave() def get_title(self): return self.get_widget("Notification").get_title() def set_title(self, title): if not self.client_in_same_thread: gtk.gdk.threads_enter() self.get_widget("Notification").set_title(title) if not self.client_in_same_thread: gtk.gdk.threads_leave() def set_header(self, header): self.set_title(header) if not self.client_in_same_thread: gtk.gdk.threads_enter() self.get_widget("action").set_markup( "%s" % header ) if not self.client_in_same_thread: gtk.gdk.threads_leave() 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) 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): 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 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: if not self.client_in_same_thread: gtk.gdk.threads_enter() self.notification.pbar.update(fraction) if not self.client_in_same_thread: gtk.gdk.threads_leave() 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) """ if self.message is None: gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.TextChange(_("Log Message")) result = dialog.run() gtk.gdk.threads_leave() should_continue = (result[0] == gtk.RESPONSE_OK) return should_continue, result[1].encode("utf-8") else: return True, self.message.encode("utf-8") 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) gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.Authentication( realm, may_save ) result = dialog.run() gtk.gdk.threads_leave() 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) """ gtk.gdk.threads_enter() if not data: return (False, 0, False) dialog = rabbitvcs.ui.dialog.Certificate( data["realm"], data["hostname"], data["issuer_dname"], data["valid_from"], data["valid_until"], data["finger_print"] ) result = dialog.run() gtk.gdk.threads_leave() 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) """ gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.CertAuthentication( realm, may_save ) result = dialog.run() gtk.gdk.threads_leave() return result 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) """ gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.SSLClientCertPrompt( realm, may_save ) result = dialog.run() gtk.gdk.threads_leave() return result 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(message) 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: returner = func(*args, **kwargs) except Exception, 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 self.client.NOTIFY_ACTIONS.has_key(data["action"]): 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): rabbitvcs.util.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): gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.NameEmailPrompt() result = dialog.run() gtk.gdk.threads_leave() return result def conflict_filter(self, data): if str(data).startswith("ERROR:"): path = data[27:] rabbitvcs.util.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): gtk.gdk.threads_enter() dialog = rabbitvcs.ui.dialog.NameEmailPrompt() result = dialog.run() gtk.gdk.threads_leave() return result def conflict_filter(self, data): if str(data).startswith("ERROR:"): path = data[27:] rabbitvcs.util.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.16/rabbitvcs/ui/add.py000066400000000000000000000212461230007774300171250ustar00rootroot00000000000000# # 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 thread from time import sleep import pygtk import gobject import gtk 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.util.helper 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 gtk.gdk.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) self.statuses = self.vcs.statuses_for_add(paths) self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [gobject.TYPE_BOOLEAN, 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": 1 } }], 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() # # Helpers # def load(self): gtk.gdk.threads_enter() self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths, self.statuses) if self.show_ignored: for path in 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() self.get_widget("status").set_text(_("Found %d item(s)") % len(self.items)) gtk.gdk.threads_leave() def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.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: thread.start_new_thread(self.load, ()) except Exception, e: log.exception(e) def delete_items(self, widget, data=None): paths = self.files_table.get_selected_row_items(1) if len(paths) > 0: proc = rabbitvcs.util.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) rabbitvcs.util.helper.launch_diff_tool(*paths) def on_files_table_key_event(self, treeview, data=None): if gtk.gdk.keyval_name(data.keyval) == "Delete": self.delete_items(treeview, data) def on_files_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_files_table_popup_menu(treeview, data) 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() 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.start() 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.start() 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: def __init__(self, paths): self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.action = rabbitvcs.ui.action.SVNAction( self.svn, run_in_thread=False ) self.action.append(self.svn.add, paths) self.action.run() 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.16/rabbitvcs/ui/annotate.py000066400000000000000000000221441230007774300202040ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.log import log_dialog_factory from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget from rabbitvcs.ui.dialog import MessageBox import rabbitvcs.util.helper import rabbitvcs.vcs from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs import gettext _ = gettext.gettext DATETIME_FORMAT = rabbitvcs.util.helper.LOCAL_DATETIME_FORMAT 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() def on_close_clicked(self, widget): self.close() def on_save_clicked(self, widget): self.save() def on_refresh_clicked(self, widget): self.load() def on_from_show_log_clicked(self, widget, data=None): log_dialog_factory(self.path, ok_callback=self.on_from_log_closed) def on_from_log_closed(self, data): if data is not None: self.get_widget("from").set_text(data) def on_to_show_log_clicked(self, widget, data=None): log_dialog_factory(self.path, ok_callback=self.on_to_log_closed) def on_to_log_closed(self, data): if data is not None: self.get_widget("to").set_text(data) @gtk_unsafe 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() class SVNAnnotate(Annotate): def __init__(self, path, revision=None): Annotate.__init__(self, path, revision) self.svn = self.vcs.svn() if revision is None: revision = "HEAD" self.path = path self.get_widget("from").set_text(str(1)) self.get_widget("to").set_text(str(revision)) self.table = rabbitvcs.ui.widget.Table( self.get_widget("table"), [gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING], [_("Line"), _("Revision"), _("Author"), _("Date"), _("Text")] ) self.table.allow_multiple() self.load() # # Helper methods # def load(self): from_rev_num = self.get_widget("from").get_text().lower() to_rev_num = self.get_widget("to").get_text().lower() if not from_rev_num.isdigit(): MessageBox(_("The from revision field must be an integer")) return from_rev = self.svn.revision("number", number=int(from_rev_num)) to_rev = self.svn.revision("head") if to_rev_num.isdigit(): to_rev = self.svn.revision("number", number=int(to_rev_num)) self.action = SVNAction( self.svn, notification=False ) self.action.append( self.svn.annotate, self.path, from_rev, to_rev ) self.action.append(self.populate_table) self.action.append(self.enable_saveas) self.action.start() @gtk_unsafe def populate_table(self): blamedict = self.action.get_result(0) self.table.clear() for item in blamedict: # 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] date = datetime(*time.strptime(datestr,"%Y-%m-%dT%H:%M:%S")[:-2]) self.table.append([ item["number"], item["revision"].number, item["author"], rabbitvcs.util.helper.format_datetime(date), item["line"] ]) def generate_string_from_result(self): blamedict = self.action.get_result(0) text = "" for item in blamedict: datestr = item["date"][0:-8] date = datetime(*time.strptime(datestr,"%Y-%m-%dT%H:%M:%S")[:-2]) text += "%s\t%s\t%s\t%s\t%s\n" % ( item["number"], item["revision"].number, item["author"], rabbitvcs.util.helper.format_datetime(date), item["line"] ) return text class GitAnnotate(Annotate): def __init__(self, path, revision=None): Annotate.__init__(self, path, revision) self.git = self.vcs.git(path) if revision is None: revision = "HEAD" self.path = path self.get_widget("from_revision_container").hide() self.get_widget("to_show_log").hide() self.get_widget("to").set_text(str(revision)) self.table = rabbitvcs.ui.widget.Table( self.get_widget("table"), [gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING], [_("Line"), _("Revision"), _("Author"), _("Date"), _("Text")] ) self.table.allow_multiple() self.load() # # Helper methods # def load(self): to_rev = self.git.revision(self.get_widget("to").get_text()) self.action = GitAction( self.git, notification=False ) self.action.append( self.git.annotate, self.path, to_rev ) self.action.append(self.populate_table) self.action.append(self.enable_saveas) self.action.start() @gtk_unsafe def populate_table(self): blamedict = self.action.get_result(0) self.table.clear() for item in blamedict: self.table.append([ item["number"], item["revision"][:7], item["author"], rabbitvcs.util.helper.format_datetime(item["date"]), item["line"] ]) 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" % ( item["number"], item["revision"][:7], item["author"], rabbitvcs.util.helper.format_datetime(item["date"]), item["line"] ) return text 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.16/rabbitvcs/ui/applypatch.py000066400000000000000000000122731230007774300205420ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import os import commands 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 = rabbitvcs.util.helper.get_common_directory(paths) def choose_patch_path(self): path = None dialog = gtk.FileChooserDialog( _("Apply Patch"), None, gtk.FILE_CHOOSER_ACTION_OPEN,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) response = dialog.run() if response == gtk.RESPONSE_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( _("Apply Patch To Directory..."), None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) response = dialog.run() if response == gtk.RESPONSE_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.start() 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.start() 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.16/rabbitvcs/ui/branch.py000066400000000000000000000115601230007774300176300ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.helper 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 = rabbitvcs.util.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"), rabbitvcs.util.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( rabbitvcs.util.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.start() 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(message) def on_repo_browser_clicked(self, widget, data=None): from rabbitvcs.ui.browser import BrowserDialog BrowserDialog(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.16/rabbitvcs/ui/branches.py000066400000000000000000000305171230007774300201630ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango 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 import rabbitvcs.util.helper import rabbitvcs.vcs import xml.sax.saxutils as 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) self.show_edit(revision_branches[0].name) else: self.show_add() def initialize_detail(self): self.detail_container = self.get_widget("detail_container") vbox = gtk.VBox(False, 6) # Set up the Branch line label = gtk.Label(_("Name:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=.5) self.branch_entry = gtk.Entry() self.branch_name_container = gtk.HBox(False, 0) self.branch_name_container.pack_start(label, False, False, 0) self.branch_name_container.pack_start(self.branch_entry, False, False, 0) vbox.pack_start(self.branch_name_container, False, False, 0) # Set up the Commit-sha line label = gtk.Label(_("Start Point:")) label.set_size_request(90, -1) 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_container = gtk.HBox(False, 0) 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", 2) self.log_dialog_button.set_image(image) self.start_point_container.pack_start(label, False, False, 0) self.start_point_container.pack_start(self.start_point_entry, False, False, 0) self.start_point_container.pack_start(self.log_dialog_button, False, False, 0) vbox.pack_start(self.start_point_container, False, False, 0) # Set up the Track line label = gtk.Label("") label.set_size_request(90, -1) self.track_checkbox = gtk.CheckButton(_("Keep old branch's history")) self.track_container = gtk.HBox(False, 0) self.track_container.pack_start(label, False, False, 0) self.track_container.pack_start(self.track_checkbox, False, False, 0) vbox.pack_start(self.track_container, False, False, 0) # Set up the checkout line label = gtk.Label("") label.set_size_request(90, -1) self.checkout_checkbox = gtk.CheckButton(_("Set as active branch")) self.checkout_container = gtk.HBox(False, 0) self.checkout_container.pack_start(label, False, False, 0) self.checkout_container.pack_start(self.checkout_checkbox, False, False, 0) vbox.pack_start(self.checkout_container, False, False, 0) # Set up Save button label = gtk.Label("") label.set_size_request(90, -1) self.save_button = gtk.Button(label=_("Save")) self.save_button.connect("clicked", self.on_save_clicked) self.save_container = gtk.HBox(False, 0) self.save_container.pack_start(label, False, False, 0) self.save_container.pack_start(self.save_button, False, False, 0) vbox.pack_start(self.save_container, False, False, 0) # Set up the Revision line label = gtk.Label(_("Revision:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.revision_label = gtk.Label("") self.revision_label.set_properties(xalign=0,selectable=True) self.revision_label.set_line_wrap(True) self.revision_container = gtk.HBox(False, 0) self.revision_container.pack_start(label, False, False, 0) self.revision_container.pack_start(self.revision_label, False, False, 0) vbox.pack_start(self.revision_container, False, False, 0) # Set up the Log Message line label = gtk.Label(_("Message:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.message_label = gtk.Label("") self.message_label.set_properties(xalign=0,yalign=0,selectable=True) self.message_label.set_line_wrap(True) self.message_label.set_size_request(250, -1) self.message_container = gtk.HBox(False, 0) self.message_container.pack_start(label, False, False, 0) self.message_container.pack_start(self.message_label, False, False, 0) vbox.pack_start(self.message_container, False, False, 0) self.add_containers = [self.branch_name_container, self.track_container, self.save_container, self.start_point_container, self.checkout_container] self.view_containers = [self.branch_name_container, self.revision_container, self.message_container, self.save_container, self.checkout_container] self.all_containers = [self.branch_name_container, self.track_container, self.revision_container, self.message_container, self.save_container, self.start_point_container, self.checkout_container] vbox.show() self.detail_container.add(vbox) 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.RESPONSE_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, data=None): if gtk.gdk.keyval_name(data.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, data) def on_treeview_mouse_event(self, treeview, data=None): self.on_treeview_event(treeview, data) def on_treeview_event(self, treeview, data): 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_containers(self, containers): for container in self.all_containers: container.hide() for container in containers: container.show_all() def show_add(self): self.state = STATE_ADD revision = "HEAD" if self.revision: revision = unicode(self.git.get_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(revision) self.track_checkbox.set_active(True) self.checkout_checkbox.set_sensitive(True) self.checkout_checkbox.set_active(False) self.show_containers(self.add_containers) 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(self.selected_branch.name) self.revision_label.set_text(unicode(self.selected_branch.revision)) self.message_label.set_text(self.selected_branch.message.rstrip("\n")) 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_containers(self.view_containers) 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(data) 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.16/rabbitvcs/ui/browser.py000066400000000000000000000523631230007774300200640ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk from datetime import datetime 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.util.helper import rabbitvcs.vcs from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import gtk_unsafe log = Log("rabbitvcs.ui.browser") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.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() 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 = action.run_single(self.svn.get_repo_url, url) elif self.svn.is_path_repository_url(url): self.url = url self.urls = rabbitvcs.ui.widget.ComboBox( self.get_widget("urls"), rabbitvcs.util.helper.get_repository_paths() ) if self.url: self.urls.set_child_text(rabbitvcs.util.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 ) self.items = [] self.list_table = rabbitvcs.ui.widget.Table( self.get_widget("list"), [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": 0 } },{ "callback": self.revision_filter, "user_data": { "column": 1 } },{ "callback": self.size_filter, "user_data": { "column": 2 } },{ "callback": self.date_filter, "user_data": { "column": 4 } }], filter_types=[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.clipboard = None self.url_clipboard = gtk.Clipboard() self.repo_root_url = None if self.url: rabbitvcs.util.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, rabbitvcs.util.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.start() @gtk_unsafe def populate_table(self, item_index=0): self.list_table.clear() self.items = self.action.get_result(item_index) self.items.sort(self.sort_files) self.list_table.append(["..", 0, 0, "", 0]) for item,locked in self.items[1:]: self.list_table.append([ 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): rabbitvcs.util.helper.save_repository_path(self.urls.get_active_text()) self.load() 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(rabbitvcs.util.helper.unquote_url(self.url)) self.load() else: self._open([self.url]) def on_urls_key_released(self, widget, data, userdata): if gtk.gdk.keyval_name(data.keyval) == "Return": rabbitvcs.util.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 """ if filename == "..": return "dir" for item,locked in self.items: if item.path == filename: return self.svn.NODE_KINDS_REVERSE[item.kind] return None def sort_files(self, x, y): """ Sort the browser listing so that folders are on top and then sort alphabetically. """ xkind = self.svn.NODE_KINDS_REVERSE[x[0].kind] ykind = self.svn.NODE_KINDS_REVERSE[y[0].kind] if xkind == "dir" and ykind == "dir": return cmp(x[0].repos_path, y[0].repos_path) elif xkind == "dir" and ykind == "file": return -1 else: return 1 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 rabbitvcs.util.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 rabbitvcs.util.helper.format_datetime(change_time) return str(row[column]) def on_list_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_list_table_popup_menu(treeview, data) def show_list_table_popup_menu(self, treeview, data): paths = self.list_table.get_selected_row_items(0) if len(paths) == 0: paths.append(self.url) BrowserContextMenu(self, data, None, self.vcs, paths).show() def update_clipboard(self, action, urls): self.clipboard = { "action": action, "urls": urls } def clipboard_has_cut(self): return (self.clipboard is not None and self.clipboard["action"] == "cut") def clipboard_has_copy(self): return (self.clipboard is not None and self.clipboard["action"] == "cut") def empty_clipboard(self): self.clipboard = None def set_url_clipboard(self, url): self.url_clipboard.set_text(url) 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 = rabbitvcs.util.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(rabbitvcs.util.helper.open_item, path) self.action.start() 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 gtk.stock_add([(gtk.STOCK_CLOSE, _("Select"), 0, 0, "")]) SVNBrowser.__init__(self, path) 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 = gtk.STOCK_NEW class MenuBrowserCopyTo(MenuItem): identifier = "RabbitVCS::Browser_Copy_To" label = _("Copy to...") icon = gtk.STOCK_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 = gtk.STOCK_SAVE_AS class BrowserContextMenuConditions(GtkFilesContextMenuConditions): def __init__(self, vcs, paths, caller): GtkFilesContextMenuConditions.__init__(self, vcs, paths) self.caller = caller 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): 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") def create_repository_folder(self, data1=None): if self.path_dict["length"] == 1: 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 True 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") class BrowserContextMenuCallbacks: 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): rabbitvcs.util.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 rabbitvcs.util.helper.launch_ui_window("annotate", [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 rabbitvcs.util.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 rabbitvcs.util.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.RESPONSE_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.start() 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.start() def create_repository_folder(self, data=None, user_data=None): from rabbitvcs.ui.dialog import NewFolder dialog = NewFolder() result = dialog.run() if result is None: return (folder_name, log_message) = result new_url = self.paths[0].rstrip("/") + "/" + folder_name self.caller.action = rabbitvcs.ui.action.SVNAction( self.svn, notification=False ) self.caller.action.append(self.svn.mkdir, new_url, log_message) self.caller.action.append(self.svn.list, self.paths[0], recurse=False) self.caller.action.append(self.caller.populate_table, 1) self.caller.action.start() 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.RESPONSE_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.start() 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.RESPONSE_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.start() class BrowserContextMenu: 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.16/rabbitvcs/ui/changes.py000066400000000000000000000460421230007774300200060ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.util.helper from rabbitvcs.util.contextmenu import GtkContextMenu from rabbitvcs.util.contextmenuitems import * 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 = rabbitvcs.util.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, data=None): self.on_changes_table_event(treeview, data) def on_changes_table_event(self, treeview, data=None): selection = treeview.get_selection() (liststore, indexes) = selection.get_selected_rows() self.selected_rows = [] for tup in indexes: self.selected_rows.append(tup[0]) if data is not None and data.button == 3: self.show_changes_table_popup_menu(treeview, data) 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, data): ChangesContextMenu(self, data).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 = rabbitvcs.util.helper.url_join(self.first_urls.get_active_text(), url1) url2 = rabbitvcs.util.helper.url_join(self.second_urls.get_active_text(), url2) rev1 = self.get_first_revision() rev2 = self.get_second_revision() rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (url1, unicode(rev1)), "%s@%s" % (url2, unicode(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() rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (url1, unicode(rev1)), "%s@%s" % (url2, unicode(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 ) self.second_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("second_revision_container"), self.svn, revision=revision2, url_combobox=self.second_urls ) 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(rabbitvcs.util.helper.save_repository_path, first_url) self.action.append(rabbitvcs.util.helper.save_repository_path, second_url) self.action.append(self.populate_table) self.action.append(self.enable_more_actions) self.action.start() 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, 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 ) self.second_revision_selector = rabbitvcs.ui.widget.RevisionSelector( self.get_widget("second_revision_container"), self.git, revision=revision2, url_combobox=self.second_urls ) 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(rabbitvcs.util.helper.save_repository_path, first_url) self.action.append(rabbitvcs.util.helper.save_repository_path, second_url) self.action.append(self.populate_table) self.action.append(self.enable_more_actions) self.action.start() 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 = gtk.STOCK_OPEN class MenuOpenSecond(MenuItem): identifier = "RabbitVCS::Open_Second" label = _("Open from second revision") icon = gtk.STOCK_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: 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: 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 = rabbitvcs.util.helper.url_join(self.caller.first_urls.get_active_text(), path) rev = self.caller.get_first_revision() rabbitvcs.util.helper.launch_ui_window("open", [ "--vcs=%s" % self.caller.get_vcs_name(), url, "-r%s" % unicode(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 = rabbitvcs.util.helper.url_join(self.caller.second_urls.get_active_text(), path) rev = self.caller.get_second_revision() rabbitvcs.util.helper.launch_ui_window("open", [ "--vcs=%s" % self.caller.get_vcs_name(), url, "-r%s" % unicode(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 = rabbitvcs.util.helper.url_join(self.caller.first_urls.get_active_text(), url1) url2 = rabbitvcs.util.helper.url_join(self.caller.second_urls.get_active_text(), url2) rev1 = self.caller.get_first_revision() rev2 = self.caller.get_second_revision() rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (url1, unicode(rev1)), "%s@%s" % (url2, unicode(rev2)), "-s", "--vcs=%s" % self.caller.get_vcs_name() ]) class ChangesContextMenu: """ 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 = rabbitvcs.util.helper.parse_path_revision_string(args.pop(0)) pathrev2 = (None, None) if len(args) > 0: pathrev2 = rabbitvcs.util.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.16/rabbitvcs/ui/checkmods.py000066400000000000000000000264731230007774300203440ustar00rootroot00000000000000# # 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 thread import threading import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log from rabbitvcs.util.decorators import gtk_unsafe log = Log("rabbitvcs.ui.checkmods") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.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, data=None): if data is not None and data.button == 3: paths = self.files_table.get_selected_row_items(0) GtkFilesContextMenu(self, data, 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.start() @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(), rabbitvcs.util.helper.get_file_extension(item.path) ]) def diff_local(self, path): rabbitvcs.util.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, data=None): if data is not None and data.button == 3: paths = self.files_table.get_selected_row_items(0) CheckRemoteModsContextMenu(self, data, 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.start() @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, rabbitvcs.util.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.start() 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: 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 = rabbitvcs.util.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.start() class CheckRemoteModsContextMenu: 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.16/rabbitvcs/ui/checkout.py000066400000000000000000000213671230007774300202060ustar00rootroot00000000000000# # 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 urllib import pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.helper 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"), rabbitvcs.util.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 = rabbitvcs.util.helper.get_user_path() if path is not None: self.destination = path self.get_widget("destination").set_text(path) 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 = urllib.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(path) def on_repositories_key_released(self, widget, data, userdata=None): if gtk.gdk.keyval_name(data.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, data): if gtk.gdk.keyval_name(data.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(rabbitvcs.util.helper.save_repository_path, url) self.action.append( self.svn.checkout, rabbitvcs.util.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.start() 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( os.path.join(self.destination, append) ) 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: 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.run() 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.16/rabbitvcs/ui/clean.py000066400000000000000000000065541230007774300174640ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget import rabbitvcs.util.helper 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.start() 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.16/rabbitvcs/ui/cleanup.py000066400000000000000000000045271230007774300200270ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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.start() 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.16/rabbitvcs/ui/clone.py000066400000000000000000000106661230007774300175010ustar00rootroot00000000000000# # 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 urllib import pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.checkout import Checkout import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.helper 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.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(rabbitvcs.util.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.start() def on_repositories_changed(self, widget, data=None): url = self.repositories.get_active_text() tmp = url.replace("//", "/").split("/")[1:] append = "" prev = "" while len(tmp): prev = append append = tmp.pop() if append in ("http:", "https:", "file:", "git:"): append = "" break if append.endswith(".git"): append = append[:-4] break self.get_widget("destination").set_text( os.path.join(self.destination, append) ) 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) 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.16/rabbitvcs/ui/commit.py000066400000000000000000000370141230007774300176650ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk from time import sleep 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 import rabbitvcs.util.helper 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 gtk.gdk.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_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": 1 } }], 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": 1 } ) self.files_table.allow_multiple() self.get_widget("toggle_show_unversioned").set_active(not self.SHOW_UNVERSIONED) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message"), (message and message or "") ) self.paths = [] for path in paths: if self.vcs.is_in_a_or_a_working_copy(path): self.paths.append(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 """ gtk.gdk.threads_enter() self.get_widget("status").set_text(_("Loading...")) gtk.gdk.threads_leave() self.items = self.vcs.get_items(self.paths, self.vcs.statuses_for_commit(self.paths)) gtk.gdk.threads_enter() self.populate_files_table() gtk.gdk.threads_leave() # 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 (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 """ try: thread.start_new_thread(self.load, ()) except Exception, e: log.exception(e) 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, data=None): paths = self.files_table.get_selected_row_items(1) if len(paths) > 0: proc = rabbitvcs.util.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, data): if InterfaceView.on_key_pressed(self, widget, data): return True if (data.state & (gtk.gdk.CONTROL_MASK) and gtk.gdk.keyval_name(data.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, data=None): self.SHOW_UNVERSIONED = not self.SHOW_UNVERSIONED 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 = rabbitvcs.util.helper.create_path_revision_string(paths[0], "base") pathrev2 = rabbitvcs.util.helper.create_path_revision_string(paths[0], "working") proc = rabbitvcs.util.helper.launch_ui_window("diff", ["-s", pathrev1, pathrev2]) self.rescan_after_process_exit(proc, paths) def on_files_table_key_event(self, treeview, data=None): if gtk.gdk.keyval_name(data.keyval) == "Delete": self.delete_items(treeview, data) def on_files_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_files_table_popup_menu(treeview, data) 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(message) 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 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 not self.should_item_be_visible(item): continue n += 1 self.files_table.append([ checked, item.path, rabbitvcs.util.helper.get_file_extension(item.path), item.simple_content_status(), item.simple_metadata_status() ]) self.get_widget("status").set_text(_("Found %d item(s)") % n) 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( self.vcs.svn().get_repo_url(self.base_dir) ) 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, 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( rabbitvcs.util.helper.save_log_message, self.message.get_text() ), self.action.append(self.do_commit, items, recurse) self.action.append(self.action.finish) self.action.start() 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.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, 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( rabbitvcs.util.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.start() def on_files_table_toggle_event(self, row, col): # Adds path: True/False to the dict self.changes[row[1]] = row[col] class MercurialCommit(Commit): def __init__(self, paths, base_dir=None, message=None): Commit.__init__(self, paths, base_dir, message) self.mercurial = self.vcs.mercurial(paths[0]) options_box = self.get_widget("options_box") self.close_branch = gtk.CheckButton(_("Close Branch")) options_box.pack_start(self.close_branch, False, False, 0) self.close_branch.show() 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.mercurial.revert([item]) self.mercurial.remove(item) else: self.mercurial.add(item) staged += 1 except Exception, e: log.exception(e) ticks = staged + len(items)*2 self.action = rabbitvcs.ui.action.MercurialAction( self.mercurial, 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( rabbitvcs.util.helper.save_log_message, self.message.get_text() ) self.action.append( self.mercurial.commit, self.message.get_text() ) self.action.append(self.action.set_status, _("Completed Commit")) self.action.append(self.action.finish) self.action.start() 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, rabbitvcs.vcs.VCS_MERCURIAL: MercurialCommit } 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.16/rabbitvcs/ui/create.py000066400000000000000000000057341230007774300176440ustar00rootroot00000000000000# # 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 import pygtk import gobject import gtk import rabbitvcs.ui.dialog from rabbitvcs.ui.action import GitAction from rabbitvcs import gettext _ = gettext.gettext class SVNCreate: """ 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: # 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.start() 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.16/rabbitvcs/ui/createpatch.py000066400000000000000000000222561230007774300206620ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk import os import tempfile import shutil from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util import rabbitvcs.util.helper from rabbitvcs.util.helper import get_common_directory from rabbitvcs.util.log import Log from rabbitvcs.ui.commit import SVNCommit, GitCommit log = Log("rabbitvcs.ui.createpatch") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.threads_init() class CreatePatch: """ 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 = rabbitvcs.util.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_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": 1 } }], 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": 1 } ) self.files_table.allow_multiple() self.items = None self.initialize_items() # # Helper functions # def choose_patch_path(self): path = "" dialog = gtk.FileChooserDialog( _("Create Patch"), None, gtk.FILE_CHOOSER_ACTION_SAVE,(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) dialog.set_do_overwrite_confirmation(True) dialog.set_default_response(gtk.RESPONSE_OK) dialog.set_current_folder_uri( get_common_directory(self.paths).replace("file://", "") ) response = dialog.run() if response == gtk.RESPONSE_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 = rabbitvcs.util.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.start() # TODO: Open the diff file (meld is going to add support in a future version :() # rabbitvcs.util.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 = rabbitvcs.util.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.start() 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.16/rabbitvcs/ui/delete.py000066400000000000000000000071771230007774300176460ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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.RESPONSE_OK or result == True: if versioned: try: self.vcs_remove(versioned, force=True) except Exception, e: log.exception() return if unversioned: for path in unversioned: rabbitvcs.util.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.16/rabbitvcs/ui/dialog.py000066400000000000000000000430041230007774300176300ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.wraplabel import rabbitvcs.util.helper 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(self.entries[0][1]) 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.RESPONSE_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.RESPONSE_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(selected_message) class FolderChooser: def __init__(self): self.dialog = gtk.FileChooserDialog(_("Select a Folder"), None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,gtk.RESPONSE_OK)) self.dialog.set_default_response(gtk.RESPONSE_OK) def run(self): returner = None result = self.dialog.run() if result == gtk.RESPONSE_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.RESPONSE_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.RESPONSE_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(cert) 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.RESPONSE_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.RESPONSE_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: def __init__(self, title=_("Select a File"), folder=None): self.dialog = gtk.FileChooserDialog(title, None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN,gtk.RESPONSE_OK)) if folder is not None: self.dialog.set_current_folder(folder) self.dialog.set_default_response(gtk.RESPONSE_OK) def run(self): returner = None result = self.dialog.run() if result == gtk.RESPONSE_OK: returner = self.dialog.get_file().get_path() self.dialog.destroy() return returner class FileSaveAs: def __init__(self, title=_("Save As..."), folder=None): self.dialog = gtk.FileChooserDialog(title, None, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,gtk.RESPONSE_OK)) if folder is not None: self.dialog.set_current_folder(folder) self.dialog.set_default_response(gtk.RESPONSE_OK) def run(self): returner = None result = self.dialog.run() if result == gtk.RESPONSE_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(message) 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(message) 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(label) if current_text: self.new_text.set_text(current_text) self.dialog = self.get_widget("OneLineTextChange") def on_key_release_event(self, widget, data): # 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 gtk.gdk.keyval_name(data.keyval) == "Return": self.dialog.response(gtk.RESPONSE_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") ) 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.RESPONSE_OK) result = dialog.run() fields_text = (self.folder_name.get_text(), self.textview.get_text()) dialog.destroy() if result == gtk.RESPONSE_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) self.get_widget("notice_box").pack_start(notice) self.get_widget("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, data): # 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 gtk.gdk.keyval_name(data.keyval) == "Return": self.dialog.response(gtk.RESPONSE_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.RESPONSE_OK: return (name, email) else: return (None, None) class ConflictDecision(InterfaceView): """ Provides a dialog to make conflict decisions with. User can accept mine, accept theirs, or merge manually. """ def __init__(self, filename=""): InterfaceView.__init__(self, "dialogs/conflict_decision", "ConflictDecision") self.get_widget("filename").set_text(filename) def run(self): """ Returns a tuple with two elements. The first has three possible values about how to resolve the conflict. - -1 Cancel - 0 Accept Mine - 1 Accept Theirs - 2 Merge Manually The second is whether to mark the conflict as resolved after the action """ self.dialog = self.get_widget("ConflictDecision") result = self.dialog.run() mark_resolved = self.get_widget("mark_resolved").get_active() self.dialog.destroy() return (result, mark_resolved) 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.16/rabbitvcs/ui/diff.py000066400000000000000000000235561230007774300173130ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk import os from shutil import rmtree import tempfile from rabbitvcs import TEMP_DIR_PREFIX from rabbitvcs.ui import InterfaceNonView import rabbitvcs.vcs from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.util.helper from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.diff") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.threads_init() 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): if self.sidebyside: self.launch_sidebyside_diff() else: self.launch_unified_diff() self.stop_loading() def _build_export_path(self, index, revision, path): dest = rabbitvcs.util.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") try: thread.start_new_thread(self.launch, ()) except Exception, e: log.exception(e) 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], diff_text) os.close(fh[0]) rabbitvcs.util.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() rabbitvcs.util.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") try: thread.start_new_thread(self.launch, ()) except Exception, e: log.exception(e) 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: file.write(data) except Exception, 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], diff_text) os.close(fh[0]) rabbitvcs.util.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 rabbitvcs.util.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 = rabbitvcs.util.helper.parse_path_revision_string(args.pop(0)) pathrev2 = (None, None) if len(args) > 0: pathrev2 = rabbitvcs.util.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.16/rabbitvcs/ui/editconflicts.py000066400000000000000000000111101230007774300212140ustar00rootroot00000000000000# # 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 thread import shutil import pygtk import gobject import gtk from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.helper 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) 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, mark_resolved) = dialog.run() dialog.destroy() if action == -1: #Cancel pass elif action == 0: #Accept Mine working = self.get_working_path(path) shutil.copyfile(working, path) if mark_resolved: self.svn.resolve(path) elif action == 1: #Accept Theirs head = self.get_head_path(path) shutil.copyfile(head, path) if mark_resolved: self.svn.resolve(path) elif action == 2: #Merge Manually head = self.get_head_path(path) working = self.get_working_path(path) shutil.copyfile(working, path) rabbitvcs.util.helper.launch_merge_tool(path, head) if mark_resolved: 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_head_path(self, path): # There might be a merge-right file if merging from a different branch paths = os.listdir(os.path.dirname(path)) for head in paths: if head.find(os.path.basename(path)) != -1 and head.find("merge-right") != -1: return os.path.join(os.path.dirname(path), head) # If no merge-right file exists, merging is coming from head # so export the file from head tmppath = rabbitvcs.util.helper.get_tmp_path("%s.head" % os.path.basename(path)) self.svn.export(path, tmppath) return tmppath class GitEditConflicts(InterfaceNonView): def __init__(self, path): InterfaceNonView.__init__(self) self.path = path self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(path) rabbitvcs.util.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.16/rabbitvcs/ui/export.py000066400000000000000000000166061230007774300177220ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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 import rabbitvcs.util.helper 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(path) def on_ok_clicked(self, widget): url = self.repositories.get_active_text() path = self._get_path() omit_externals = self.get_widget("omit_externals").get_active() recursive = self.get_widget("recursive").get_active() if not url or not path: MessageBox(_("The repository URL and destination path are both required fields.")) return if url.startswith("file://"): url = self._parse_path(url) # Cannot do: # url = os.path.normpath(url) # ...in general, since it might be eg. an http URL. Doesn't seem to # affect pySvn though. path = os.path.normpath(path) revision = self.revision_selector.get_revision_object() self.hide() self.action = SVNAction( self.svn, register_gtk_quit=self.gtk_quit_is_set() ) self.action.append(self.action.set_header, _("Export")) self.action.append(self.action.set_status, _("Running Export Command...")) self.action.append(rabbitvcs.util.helper.save_repository_path, url) self.action.append( self.svn.export, url, path, force=True, recurse=recursive, revision=revision, ignore_externals=omit_externals ) self.action.append(self.action.set_status, _("Completed Export")) self.action.append(self.action.finish) self.action.start() 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(rabbitvcs.util.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.start() 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( os.path.join(self.destination, append) ) 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.16/rabbitvcs/ui/ignore.py000066400000000000000000000076161230007774300176650ustar00rootroot00000000000000# # 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 import pygtk import gobject import gtk 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.16/rabbitvcs/ui/import.py000077500000000000000000000067001230007774300177100ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util.helper 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(self.svn.get_repo_url(path)) self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("repositories"), rabbitvcs.util.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.start() 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(message) 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.16/rabbitvcs/ui/lock.py000077500000000000000000000142461230007774300173320ustar00rootroot00000000000000# # 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 thread import os import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.lock") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.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_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": 1 } }], 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: thread.start_new_thread(self.load, ()) except Exception, e: log.exception(e) def load(self): gtk.gdk.threads_enter() 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)) gtk.gdk.threads_leave() 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, item.path, rabbitvcs.util.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(rabbitvcs.util.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.start() def on_files_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_files_table_popup_menu(treeview, data) 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(message) 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.16/rabbitvcs/ui/log.py000077500000000000000000001517431230007774300171670ustar00rootroot00000000000000# # 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 import threading from datetime import datetime import os.path import pygtk import gobject import gtk import cgi from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction, GitAction, vcs_action_factory from rabbitvcs.ui.dialog import MessageBox from rabbitvcs.util.contextmenu import GtkContextMenu from rabbitvcs.util.contextmenuitems import * import rabbitvcs.ui.widget import rabbitvcs.util.helper import rabbitvcs.vcs from rabbitvcs.util.decorators import gtk_unsafe from rabbitvcs import gettext _ = gettext.gettext DATETIME_FORMAT = rabbitvcs.util.helper.LOCAL_DATETIME_FORMAT 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 = unicode(item.revision) parents = [] for parent in item.parents: parents.append(unicode(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() 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(str(self.limit)) self.message = rabbitvcs.ui.widget.TextView( self.get_widget("message") ) self.stop_on_copy = False self.revision_clipboard = gtk.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, data): InterfaceView.on_key_pressed(self, widget, data) if (data.state & gtk.gdk.CONTROL_MASK and gtk.gdk.keyval_name(data.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) rabbitvcs.util.helper.launch_diff_tool(*paths) def on_revisions_table_mouse_event(self, treeview, data=None): if len(self.revisions_table.get_selected_rows()) == 0: self.message.set_text("") self.paths_table.clear() return if data is not None and data.button == 3: self.show_revisions_table_popup_menu(treeview, data) 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 = unicode(self.display_items[self.revisions_table.get_selected_rows()[0]].revision) revision2 = unicode(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, unicode(revision1), unicode(revision2), sidebyside=True) except IndexError: pass def on_paths_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_paths_table_popup_menu(treeview, data) def show_paths_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 } 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,e: pass try: line["previous_revision"] = self.display_items[row-1].revision except IndexError,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, data, 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() return rabbitvcs.util.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 "" def set_start_revision(self, rev): self.get_widget("start").set_text(str(rev)) def set_end_revision(self, rev): self.get_widget("end").set_text(str(rev)) 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,e: pass try: line["previous_revision"] = self.display_items[row-1].revision except IndexError,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"] rabbitvcs.util.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_cell_renderers()[0] column.add_attribute(cell, 'foreground', 4) self.paths_table = rabbitvcs.ui.widget.Table( self.get_widget("paths_table"), [gobject.TYPE_STRING, 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": 1 } ) 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 = unicode(self.revision_items[0].revision) self.rev_end = unicode(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 = cgi.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 = cgi.escape(rabbitvcs.util.helper.format_long_text(item.message, 80)) 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([ unicode(revision), author, rabbitvcs.util.helper.format_datetime(date), 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.start() def edit_revprop(self, prop_name, prop_value, callback=None): failure = False url = 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 ) callback(row, prop_value) self.action.start() 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(val) 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, unicode(item.revision)) text += "%s: %s\n" % (AUTHOR_LABEL, unicode(item.author)) text += "%s: %s\n" % (DATE_LABEL, unicode(item.date)) text += "%s\n\n" % item.message if item.changed_paths is not None: for subitem in item.changed_paths: text += "%s\t%s" % (subitem.action, subitem.path) if subitem.copy_from_path or subitem.copy_from_revision: text += " (Copied from %s %s)" % (subitem.copy_from_path, subitem.copy_from_revision) text += "\n" text += "\n\n\n" self.revision_clipboard.set_text(text) def update_revision_message(self): combined_paths = [] subitems = [] for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] if len(self.revisions_table.get_selected_rows()) == 1: self.message.set_text(item.message) else: indented_message = item.message.replace("\n","\n\t") self.message.append_text( "%s %s:\n\t%s\n" % (REVISION_LABEL, unicode(item.revision), 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, subitem.copy_from_revision ]) subitems.sort(lambda x, y: cmp(x[1],y[1])) for subitem in subitems: self.paths_table.append([ subitem[0], subitem[1], subitem[2], 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, gobject.TYPE_STRING], [_("Action"), _("Path")], callbacks={ "mouse-event": self.on_paths_table_mouse_event, "row-activated": self.on_paths_table_row_activated }, flags={ "sortable": True, "sort_on": 1 } ) 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() 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 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 = cgi.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 unicode(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) if not self.filter_text: graph_column = self.revisions_table.get_column(0) cell = graph_column.get_cell_renderers()[0] self.revisions_table.set_column_width(0, 16*max_columns) index = 0 for (item, node, in_lines, out_lines) in grapher: revision = unicode(item.revision) msg = cgi.escape(rabbitvcs.util.helper.format_long_text(item.message, 80)) author = item.author date = rabbitvcs.util.helper.format_datetime(item.date) 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, in_lines, out_lines) 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) 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.start() 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, unicode(item.revision.short())) text += "%s: %s\n" % (AUTHOR_LABEL, unicode(item.author)) text += "%s: %s\n" % (DATE_LABEL, unicode(item.date)) text += "%s\n\n" % item.message self.revision_clipboard.set_text(text) def update_revision_message(self): combined_paths = [] subitems = [] for selected_row in self.revisions_table.get_selected_rows(): item = self.display_items[selected_row] if len(self.revisions_table.get_selected_rows()) == 1: self.message.set_text(item.message) else: indented_message = item.message.replace("\n","\n\t") self.message.append_text( "%s %s:\n\t%s\n" % (REVISION_LABEL, item.revision.short(), indented_message)) 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(lambda x, y: cmp(x[1],y[1])) for subitem in subitems: self.paths_table.append([ subitem[0], 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 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: 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") class MenuEditAuthor(MenuItem): identifier = "RabbitVCS::Edit_Author" label = _("Edit author...") class MenuEditAuthor(MenuItem): identifier = "RabbitVCS::Edit_Author" label = _("Edit author...") class MenuEditLogMessage(MenuItem): identifier = "RabbitVCS::Edit_Log_Message" label = _("Edit log message...") class MenuEditRevisionProperties(MenuItem): identifier = "RabbitVCS::Edit_Revision_Properties" label = _("Edit revision properties...") icon = gtk.STOCK_EDIT class MenuSeparatorLast(MenuSeparator): identifier = "RabbitVCS::Separator_Last" class LogTopContextMenuConditions: 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: 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 = unicode(revision["parents"][0]) elif ("next_revision" in revision): parent = unicode(revision["next_revision"]) else: parent = unicode(int(unicode(revision["revision"])) - 1) return parent def view_diff_working_copy(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (self.path, unicode(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]) rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (self.path, parent), "%s@%s" % (self.path, unicode(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) rabbitvcs.util.helper.launch_ui_window("diff", [ "%s@%s" % (path_older, self.revisions[1]["revision"].value), "%s@%s" % (self.path, unicode(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) rabbitvcs.util.helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, unicode(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]) rabbitvcs.util.helper.launch_ui_window("diff", [ "-s", "%s@%s" % (self.path, parent), "%s@%s" % (self.path, unicode(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) rabbitvcs.util.helper.launch_ui_window("diff", [ "-s", "%s@%s" % (path_older, self.revisions[1]["revision"].value), "%s@%s" % (self.path, unicode(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_previous_revision(self, widget, data=None): rev_first = unicode(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) rabbitvcs.util.helper.launch_ui_window("changes", [ "%s@%s" % (path, parent), "%s@%s" % (path, unicode(rev_first)), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_revisions(self, widget, data=None): rev_first = unicode(self.revisions[0]["revision"]) rev_last = unicode(self.revisions[0]["next_revision"]) path = self.path if self.vcs_name == rabbitvcs.vcs.VCS_SVN: path = self.vcs.svn().get_repo_url(self.path) rabbitvcs.util.helper.launch_ui_window("changes", [ "%s@%s" % (path, unicode(rev_first)), "%s@%s" % (path, unicode(rev_last)), "--vcs=%s" % self.caller.get_vcs_name() ]) def update_to_this_revision(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("updateto", [ self.path, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def revert_changes_from_this_revision(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("merge", [ self.path, unicode(self.revisions[0]["revision"]) + "-" + str(int(unicode(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) rabbitvcs.util.helper.launch_ui_window("checkout", [ self.path, url, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def branch_tag(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("branch", [ self.path, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def branches(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("branches", [ self.path, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def tags(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("tags", [ self.path, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def export(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("export", [ self.path, "-r", unicode(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(unicode(self.revisions[0]["revision"])) try: fromrev = unicode(self.revisions[1]["revision"]) extra.append(fromrev) except IndexError, e: pass extra += ["--vcs=%s" % self.caller.get_vcs_name()] rabbitvcs.util.helper.launch_ui_window("merge", [self.path] + extra) def reset(self, widget, data=None): rabbitvcs.util.helper.launch_ui_window("reset", [ self.path, "-r", unicode(self.revisions[0]["revision"]), "--vcs=%s" % self.caller.get_vcs_name() ]) def edit_author(self, widget, data=None): message = "" if len(self.revisions) == 1: author = self.revisions[0]["author"] from rabbitvcs.ui.dialog import TextChange dialog = TextChange(_("Edit author"), author) (result, new_author) = dialog.run() if result == gtk.RESPONSE_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.RESPONSE_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) rabbitvcs.util.helper.launch_ui_window("revprops", [ "%s@%s" % (url, unicode(self.revisions[0]["revision"])), "--vcs=%s" % self.caller.get_vcs_name() ]) class LogTopContextMenu: """ 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: 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: 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 = unicode(revision["parents"][0]) elif ("next_revision" in revision): parent = unicode(revision["next_revision"]) else: parent = unicode(int(unicode(revision["revision"])) - 1) return parent def view_diff_previous_revision(self, widget, data=None): rev = unicode(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) path_item = self.paths[0] 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 = unicode(self.revisions[0]["revision"]) rev_last = unicode(self.revisions[-1]["revision"]) path_item = self.paths[0] 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 = unicode(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) path_item = self.paths[0] 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 = unicode(self.revisions[0]["revision"]) latest_rev = unicode(self.revisions[-1]["revision"]) path_item = self.paths[0] 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 = unicode(self.revisions[0]["revision"]) parent = self.find_parent(self.revisions[0]) url = self.paths[0] if self.vcs_name == rabbitvcs.vcs.VCS_SVN: url = self.caller.root_url + self.paths[0] rabbitvcs.util.helper.launch_ui_window("changes", [ "%s@%s" % (url, parent), "%s@%s" % (url, rev_last), "--vcs=%s" % self.caller.get_vcs_name() ]) def show_changes_revisions(self, widget, data=None): rev_first = unicode(self.revisions[0]["revision"]) rev_last = unicode(self.revisions[-1]["revision"]) url = self.paths[0] if self.vcs_name == rabbitvcs.vcs.VCS_SVN: url = self.caller.root_url + self.paths[0] rabbitvcs.util.helper.launch_ui_window("changes", [ "%s@%s" % (url, rev_first), "%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 + path rabbitvcs.util.helper.launch_ui_window("open", [ path, "--vcs=%s" % self.vcs_name, "-r", unicode(self.revisions[0]["revision"]) ]) def annotate(self, widget, data=None): url = self.paths[0] if self.vcs_name == rabbitvcs.vcs.VCS_SVN: url = self.caller.root_url + self.paths[0] rabbitvcs.util.helper.launch_ui_window("annotate", [ url, "--vcs=%s" % self.vcs_name, "-r", unicode(self.revisions[0]["revision"]) ]) class LogBottomContextMenu: """ 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): if not vcs: guess = rabbitvcs.vcs.guess(path) vcs = guess["vcs"] 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.16/rabbitvcs/ui/markresolved.py000077500000000000000000000104211230007774300210670ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.markresolved") from rabbitvcs import gettext _ = gettext.gettext class SVNMarkResolved(Add): def __init__(self, paths, base_dir): InterfaceView.__init__(self, "add", "Add") self.window = self.get_widget("Add") self.window.set_title(_("Mark as Resolved")) self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.items = None self.statuses = self.svn.STATUSES_FOR_RESOLVE self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [gobject.TYPE_BOOLEAN, 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": 1 } }], 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 populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.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.start() 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.16/rabbitvcs/ui/merge.py000066400000000000000000000525461230007774300175030ustar00rootroot00000000000000# # 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 cgi import pygtk import gobject import gtk 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.helper 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 = rabbitvcs.util.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.get_widget("mergerange_from_urls").get_active_text() head_revision = self.svn.get_head(self.path) revisions = self.get_widget("mergerange_revisions").get_text() if revisions == "": revisions = "head" revisions = revisions.lower().replace("head", str(head_revision)) ranges = [] for r in revisions.split(","): if r.find("-") != -1: (low, high) = [ int(i) for i in r.split("-") ] if low < high: low -= 1 elif r.find(":") != -1: (low, high) = [ int(i) for i in r.split(":") ] if low < high: low -= 1 else: high = int(r) low = high - 1 # Before pysvn v1.6.3, there was a bug that required the ranges # tuple to have three elements, even though only two were used # Fixed in Pysvn Revision 1114 if (self.svn.interface == "pysvn" and self.svn.is_version_less_than((1,6,3,0))): ranges.append(( self.svn.revision("number", number=low).primitive(), self.svn.revision("number", number=high).primitive(), None )) else: ranges.append(( self.svn.revision("number", number=low).primitive(), self.svn.revision("number", number=high).primitive(), )) action.append(rabbitvcs.util.helper.save_repository_path, url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_ranges, url, ranges, self.svn.revision("head"), self.path ) kwargs = { "notice_ancestry": (not ignore_ancestry), "dry_run": test } if record_only: kwargs["record_only"] = record_only elif self.type == "reintegrate": url = self.merge_reintegrate_repos.get_active_text() revision = self.merge_reintegrate_revision.get_revision_object() action.append(rabbitvcs.util.helper.save_repository_path, url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_reintegrate, url, revision, self.path ) kwargs = { "dry_run": test } elif self.type == "tree": from_url = self.get_widget("mergetree_from_urls").get_active_text() from_revision = self.svn.revision("head") if self.get_widget("mergetree_from_revision_number_opt").get_active(): from_revision = self.svn.revision( "number", number=int(self.get_widget("mergetree_from_revision_number").get_text()) ) to_url = self.get_widget("mergetree_to_urls").get_active_text() to_revision = self.svn.revision("head") if self.get_widget("mergetree_to_revision_number_opt").get_active(): to_revision = self.svn.revision( "number", number=int(self.get_widget("mergetree_to_revision_number").get_text()) ) action.append(rabbitvcs.util.helper.save_repository_path, from_url) action.append(rabbitvcs.util.helper.save_repository_path, to_url) # Build up args and kwargs because some args are not supported # with older versions of pysvn/svn args = ( self.svn.merge_trees, from_url, from_revision, to_url, to_revision, self.path ) kwargs = { "recurse": recursive, "dry_run": test } if len(args) > 0: action.append(*args, **kwargs) action.append(action.set_status, endcmd) action.append(action.finish) action.start() def 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_merge_reintegrate_prepare() elif current == 3: self.on_mergetree_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(self.revision_range) elif self.get_widget("mergetype_reintegrate_opt").get_active(): next = 2 self.type = "reintegrate" elif self.get_widget("mergetype_tree_opt").get_active(): next = 3 self.type = "tree" 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(self.path) self.mergerange_check_ready() def on_mergerange_show_log1_clicked(self, widget): merge_candidate_revisions = self.svn.find_merge_candidate_revisions( self.get_widget("mergerange_from_urls").get_active_text(), self.path ) SVNLogDialog( self.get_widget("mergerange_from_urls").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): self.get_widget("mergerange_revisions").set_text(data) 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.get_widget("mergerange_from_urls").get_active_text() == "": ready = False self.assistant.set_page_complete(self.page, ready) allow_log = False if self.get_widget("mergerange_from_urls").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(self.path) 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.get_widget("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(self.path) 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(data) 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(data) 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.get_widget("mergetree_from_urls").get_active_text() == "": ready = False if self.get_widget("mergetree_to_urls").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 == 2: 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() 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(self.active_branch.name + " (" + self.active_branch.revision[0:7] + ")") 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 = self.get_widget("from_branch_info") # Set up the Author line author = gtk.Label(_("Author:")) author.set_size_request(90, -1) author.set_properties(xalign=0,yalign=0) self.info['from']['author'] = gtk.Label("") self.info['from']['author'].set_properties(xalign=0,yalign=0,selectable=True) self.info['from']['author'].set_line_wrap(True) author_container = gtk.HBox(False, 0) 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(_("Date:")) date.set_size_request(90, -1) date.set_properties(xalign=0,yalign=0) self.info['from']['date'] = gtk.Label("") self.info['from']['date'].set_properties(xalign=0,yalign=0,selectable=True) date_container = gtk.HBox(False, 0) 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(_("Revision:")) revision.set_size_request(90, -1) revision.set_properties(xalign=0,yalign=0) self.info['from']['revision'] = gtk.Label("") self.info['from']['revision'].set_properties(xalign=0,selectable=True) self.info['from']['revision'].set_line_wrap(True) revision_container = gtk.HBox(False, 0) 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(_("Message:")) message.set_size_request(90, -1) message.set_properties(xalign=0,yalign=0) self.info['from']['message'] = gtk.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 = gtk.HBox(False, 0) 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(from_info.author) self.info['from']['date'].set_text(rabbitvcs.util.helper.format_datetime(from_info.date)) self.info['from']['revision'].set_text(unicode(from_info.revision)[0:7]) self.info['from']['message'].set_text(cgi.escape(rabbitvcs.util.helper.format_long_text(from_info.message, 500))) 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.start() 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.16/rabbitvcs/ui/open.py000066400000000000000000000077751230007774300173510ustar00rootroot00000000000000# # 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 import pygtk import gobject import gtk from rabbitvcs.ui import InterfaceNonView from rabbitvcs.ui.action import SVNAction, GitAction import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext 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 type(revision) in (str, unicode): 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 = rabbitvcs.util.helper.get_tmp_path("rabbitvcs-" + revision + "-" + os.path.basename(path)) self.svn.export( url, dest, revision=revision_obj ) rabbitvcs.util.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 = rabbitvcs.util.helper.get_tmp_path("rabbitvcs-" + unicode(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) rabbitvcs.util.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.16/rabbitvcs/ui/properties.py000077500000000000000000000133031230007774300205670ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.vcs 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(path) 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, e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) self.proplist = [] if self.proplist: for key,val in 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.16/rabbitvcs/ui/property_editor.py000066400000000000000000000227341230007774300216320ustar00rootroot00000000000000# # 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. """ import os.path import pygtk import gobject import gtk 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.helper import format_long_text 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_use_markup(True) self.get_widget("note_box").pack_start(note) self.get_widget("note_box").show_all() self.path = path self.get_widget("wc_text").set_text(self.get_local_path(os.path.realpath(path))) 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(self.svn.get_repo_url(path)) 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, e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) for propname, details in 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, data=None): if gtk.gdk.keyval_name(data.keyval) == "Delete": names = self.table.get_selected_row_items(0) self.delete_properties(names) def on_table_mouse_event(self, treeview, data=None): if data and data.button == 3: self.show_menu(data) def show_menu(self, data): # self.show_files_table_popup_menu(treeview, data) selected_propnames = self.table.get_selected_row_items(0) propdetails = self.svn.propdetails(self.path) filtered_details = {} for propname, detail in 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(data) class PropMenuCallbacks: 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 self.propdetails.keys(): propname = self.propdetails.keys()[0] self.caller.edit_property(propname) def property_delete(self, widget, *args): for propname in self.propdetails.keys(): self.svn.propdel(self.path, propname, recurse=False) self.caller.refresh() def property_delete_recursive(self, widget, *args): for propname in 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: def __init__(self, path, propdetails): self.path = path self.propdetails = propdetails def all_modified(self): return all([detail["status"] != "unchanged" for (propname, detail) in self.propdetails.items()]) def all_not_deleted(self): return all([detail["status"] != "deleted" for (propname, detail) in 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(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.16/rabbitvcs/ui/property_page.py000066400000000000000000000155501230007774300212560ustar00rootroot00000000000000# # 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.path import os if "NAUTILUS_PYTHON_REQUIRE_GTK3" in os.environ and os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"]: from gi.repository import Gtk as gtk GTK3 = True ICON_SIZE_BUTTON = gtk.IconSize.BUTTON ICON_SIZE_DIALOG = gtk.IconSize.DIALOG else: import gtk GTK3 = False ICON_SIZE_BUTTON = gtk.ICON_SIZE_BUTTON ICON_SIZE_DIALOG = gtk.ICON_SIZE_DIALOG 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.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 = self.get_widget("property_page") 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) self.info_pane.pack_start(expander.get_widget(), expand=False, fill=False, padding=0) except Exception, 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(os.path.basename(path)) self.status = self.checker.check_status(path, recurse = False, invalidate = False, summary = False) self.get_widget("vcs_type").set_text(self.status.vcs_type) self.get_widget("content_status").set_text(unicode(self.status.simple_content_status())) self.get_widget("prop_status").set_text(unicode(self.status.simple_metadata_status())) 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, ICON_SIZE_DIALOG) additional_props_table = rabbitvcs.ui.widget.KeyValueTable( self.get_additional_info()) additional_props_table.show() self.get_widget("file_info_table").pack_start(additional_props_table, expand=False, fill=False, padding=0) def set_icon_from_status(self, icon, status, size=ICON_SIZE_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() else: return [] def get_additional_info_svn(self): repo_url = self.vcs.svn().get_repo_url(self.path) 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): # 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() # 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.expander.add(self.file_info) class PropertyPageLabel(rabbitvcs.ui.GtkBuilderWidgetWrapper): gtkbuilder_filename = "property_page" gtkbuilder_id = "property_page_label" rabbitvcs-0.16/rabbitvcs/ui/push.py000066400000000000000000000133531230007774300173540ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk from datetime import datetime from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.ui.action import rabbitvcs.util.helper import rabbitvcs.vcs from rabbitvcs import gettext _ = gettext.gettext DATETIME_FORMAT = rabbitvcs.util.helper.DT_FORMAT_THISWEEK gtk.gdk.threads_init() class Push(InterfaceView): def __init__(self, path): InterfaceView.__init__(self, "push", "Push") self.path = path self.vcs = rabbitvcs.vcs.VCS() # # 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 } ) 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() 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) self.action.append(self.action.set_status, _("Completed Push")) self.action.append(self.action.finish) self.action.start() def initialize_logs(self): """ Initializes the git logs """ try: thread.start_new_thread(self.load_logs, ()) except Exception, e: log.exception(e) def load_logs(self): gtk.gdk.threads_enter() self.get_widget("status").set_text(_("Loading...")) gtk.gdk.threads_leave() self.load_local_log() self.load_remote_log() gtk.gdk.threads_enter() self.get_widget("status").set_text("") self.update_widgets() gtk.gdk.threads_leave() def load_local_log(self): branch = self.repository_selector.branch_opt.get_active_text() refspec = "refs/heads/%s" % branch self.local_log = self.git.log(revision=self.git.revision(refspec), limit=10, showtype="branch") def load_remote_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.remote_log = self.git.log(revision=self.git.revision(refspec), limit=10, showtype="branch") def on_branch_changed(self, repository, branch): self.load_local_log() self.load_remote_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.local_log: remote_log_item = None if self.remote_log: remote_log_item = self.remote_log[0] if (remote_log_item is None or unicode(remote_log_item.revision) != unicode(item.revision)): self.log_table.append([ rabbitvcs.util.helper.format_datetime(item.date), rabbitvcs.util.helper.format_long_text(item.message.rstrip("\n")) ]) has_commits = True else: break 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.16/rabbitvcs/ui/relocate.py000077500000000000000000000060461230007774300201770ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction from rabbitvcs.ui.dialog import MessageBox import rabbitvcs.vcs import rabbitvcs.util.helper 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 = self.svn.get_repo_url(self.path) 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"), rabbitvcs.util.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.start() 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.16/rabbitvcs/ui/remotes.py000066400000000000000000000121711230007774300200500ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango 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.util.helper 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("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": True, "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[int(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: print "Adding" 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.RESPONSE_OK or result == True: for remote in selected: self.git.remote_delete(remote) self.load() def on_treeview_key_event(self, treeview, data=None): if gtk.gdk.keyval_name(data.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, data) def on_treeview_mouse_event(self, treeview, data=None): self.on_treeview_event(treeview, data) 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, data): 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(1, 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.16/rabbitvcs/ui/rename.py000077500000000000000000000103001230007774300176340ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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.RESPONSE_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.start() 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.start() 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.16/rabbitvcs/ui/renderers/000077500000000000000000000000001230007774300200075ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/ui/renderers/__init__.py000066400000000000000000000000001230007774300221060ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/ui/renderers/graphcell.py000066400000000000000000000163231230007774300223270ustar00rootroot00000000000000"""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. """ __copyright__ = "Copyright 2005 Canonical Ltd." __author__ = "Scott James Remnant " import math import gtk import gobject import pango import cairo # Styles used when rendering revision graph edges style_SOLID = 0 style_DASHED = 1 class CellRendererGraph(gtk.GenericCellRenderer): """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 = 0 __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, self.in_lines, self.out_lines) = value 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. """ try: return self._box_size except AttributeError: pango_ctx = widget.get_pango_context() font_desc = widget.get_style().font_desc metrics = pango_ctx.get_metrics(font_desc) ascent = pango.PIXELS(metrics.get_ascent()) descent = pango.PIXELS(metrics.get_descent()) self._box_size = ascent + descent + 1 return self._box_size 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 on_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 on_render(self, window, widget, bg_area, cell_area, exp_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 = window.cairo_create() 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() 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.16/rabbitvcs/ui/reset.py000066400000000000000000000100641230007774300175130ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango from datetime import datetime import time from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import GitAction import rabbitvcs.ui.widget import rabbitvcs.util.helper 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(path) 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.start() 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(path) 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.16/rabbitvcs/ui/revert.py000077500000000000000000000201231230007774300177000ustar00rootroot00000000000000# # 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 thread from time import sleep import pygtk import gobject import gtk 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.util.helper import rabbitvcs.vcs from rabbitvcs.util.log import Log from rabbitvcs.vcs.status import Status log = Log("rabbitvcs.ui.revert") from rabbitvcs import gettext _ = gettext.gettext gtk.gdk.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_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": 1 } }], 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 populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.helper.get_file_extension(item.path), item.simple_content_status(), item.simple_metadata_status() ]) def on_ok_clicked(self, widget): return True def load(self): gtk.gdk.threads_enter() 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)) gtk.gdk.threads_leave() def populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.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: thread.start_new_thread(self.load, ()) except Exception, 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) rabbitvcs.util.helper.launch_diff_tool(*paths) def on_files_table_key_event(self, treeview, data=None): if gtk.gdk.keyval_name(data.keyval) == "Delete": self.delete_items(treeview, data) def on_files_table_mouse_event(self, treeview, data=None): if data is not None and data.button == 3: self.show_files_table_popup_menu(treeview, data) 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() 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.start() 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.start() class SVNRevertQuiet: 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.run() class GitRevertQuiet: 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.run() 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.16/rabbitvcs/ui/revprops.py000066400000000000000000000067211230007774300202560ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui.properties import PropertiesBase import rabbitvcs.ui.widget import rabbitvcs.ui.dialog 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(self.path) 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, e: log.exception(e) rabbitvcs.ui.dialog.MessageBox(_("Unable to retrieve properties list")) self.proplist = {} if self.proplist: for key,val in 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.run() self.close() if __name__ == "__main__": from rabbitvcs.ui import main, VCS_OPT (options, args) = main( [VCS_OPT], usage="Usage: rabbitvcs revprops [url1@rev1]" ) pathrev = rabbitvcs.util.helper.parse_path_revision_string(args.pop(0)) window = SVNRevisionProperties(pathrev[0], pathrev[1]) window.register_gtk_quit() gtk.main() rabbitvcs-0.16/rabbitvcs/ui/settings.py000066400000000000000000000312641230007774300202360ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango import dbus from rabbitvcs.ui import InterfaceView import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util.settings import rabbitvcs.util.helper 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 class Settings(InterfaceView): def __init__(self, base_dir=None): """ Provides an interface to the settings library. """ InterfaceView.__init__(self, "settings", "Settings") self.settings = rabbitvcs.util.settings.SettingsManager() langs = [] language = os.environ.get('LANGUAGE', None) if language: langs += language.split(":") self.language = rabbitvcs.ui.widget.ComboBox( self.get_widget("language"), langs ) self.language.set_active_from_value( self.settings.get("general", "language") ) 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("show_debug").set_active( int(self.settings.get("general","show_debug")) ) self.get_widget("diff_tool").set_text( self.settings.get("external", "diff_tool") ) self.get_widget("diff_tool_swap").set_active( int(self.settings.get("external", "diff_tool_swap")) ) self.get_widget("cache_number_repositories").set_text( str(self.settings.get("cache", "number_repositories")) ) self.get_widget("cache_number_messages").set_text( str(self.settings.get("cache", "number_messages")) ) 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): checker_service = None try: session_bus = dbus.SessionBus() checker_service = session_bus.get_object( rabbitvcs.services.checkerservice.SERVICE, rabbitvcs.services.checkerservice.OBJECT_PATH) except dbus.DBusException, ex: if report_failure: rabbitvcs.ui.dialog.MessageBox(CHECKER_SERVICE_ERROR) return checker_service def _populate_checker_tab(self, report_failure=True): # This is a limitation of GLADE, and can be removed when we migrate to # GTK2 Builder checker_service = self._get_checker_service(report_failure) self.get_widget("restart_checker").set_image( gtk.image_new_from_stock( gtk.STOCK_EXECUTE, gtk.ICON_SIZE_BUTTON)) self.get_widget("refresh_info").set_image( gtk.image_new_from_stock( gtk.STOCK_REFRESH, gtk.ICON_SIZE_BUTTON)) self.get_widget("stop_checker").set_image( gtk.image_new_from_stock( gtk.STOCK_STOP, gtk.ICON_SIZE_BUTTON)) self.get_widget("stop_checker").set_sensitive(bool(checker_service)) if(checker_service): self.get_widget("checker_type").set_text(checker_service.CheckerType()) self.get_widget("pid").set_text(str(checker_service.PID())) 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._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._clear_info_table() def _clear_info_table(self): info_table = self.get_widget("info_table_area").get_child() if info_table: 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): checker_service = self._get_checker_service(False) pid = None if(checker_service): try: pid = checker_service.Quit() except dbus.exceptions.DBusException: # Ignore it, it will necessarily happen when we kill the service pass 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) 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", "language", self.get_widget("language").get_active_text() ) 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", "show_debug", self.get_widget("show_debug").get_active() ) 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( "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() path = path.replace("file://", "") if path is not None: self.get_widget("diff_tool").set_text(path) 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.RESPONSE_OK: path = rabbitvcs.util.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.RESPONSE_OK: path = rabbitvcs.util.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.RESPONSE_OK: home_dir = rabbitvcs.util.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.16/rabbitvcs/ui/stage.py000066400000000000000000000111351230007774300174740ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log import rabbitvcs.vcs log = Log("rabbitvcs.ui.stage") from rabbitvcs import gettext _ = gettext.gettext class GitStage(Add): def __init__(self, paths, base_dir=None): InterfaceView.__init__(self, "add", "Add") self.window = self.get_widget("Add") self.window.set_title(_("Stage")) self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(self.paths[0]) self.items = None self.statuses = self.git.STATUSES_FOR_STAGE self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [gobject.TYPE_BOOLEAN, 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": 1 } }], 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 populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.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.start() class GitStageQuiet: 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.run() 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.16/rabbitvcs/ui/switch.py000077500000000000000000000067631230007774300177100ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk from rabbitvcs.ui import InterfaceView from rabbitvcs.ui.action import SVNAction import rabbitvcs.ui.widget import rabbitvcs.ui.dialog import rabbitvcs.util.helper 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(self.path) self.repositories = rabbitvcs.ui.widget.ComboBox( self.get_widget("repositories"), rabbitvcs.util.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(rabbitvcs.util.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(rabbitvcs.util.helper.save_repository_path, url) self.action.append( self.svn.switch, self.path, rabbitvcs.util.helper.quote_url(url), revision=revision ) self.action.append(self.action.set_status, _("Completed Switch")) self.action.append(self.action.finish) self.action.start() 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.16/rabbitvcs/ui/tags.py000066400000000000000000000275011230007774300173330ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk import pango 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 from rabbitvcs.ui.log import log_dialog_factory import rabbitvcs.util.helper 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 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") vbox = gtk.VBox(False, 6) # Set up the Tag line label = gtk.Label(_("Name:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=.5) self.tag_entry = gtk.Entry() self.tag_name_container = gtk.HBox(False, 0) self.tag_name_container.pack_start(label, False, False, 0) self.tag_name_container.pack_start(self.tag_entry, False, False, 0) vbox.pack_start(self.tag_name_container, False, False, 0) # Set up the Commit-sha line label = gtk.Label(_("Revision:")) label.set_size_request(90, -1) 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_container = gtk.HBox(False, 0) if self.revision_obj.value: self.start_point_entry.set_text(unicode(self.revision_obj)) 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", 2) self.log_dialog_button.set_image(image) self.start_point_container.pack_start(label, False, False, 0) self.start_point_container.pack_start(self.start_point_entry, False, False, 0) self.start_point_container.pack_start(self.log_dialog_button, False, False, 0) vbox.pack_start(self.start_point_container, False, False, 0) # Set up the Log Message Entry line label = gtk.Label(_("Message:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.message_entry = rabbitvcs.ui.widget.TextView() self.message_entry.view.set_size_request(300, 75) swin = gtk.ScrolledWindow() swin.set_shadow_type(gtk.SHADOW_ETCHED_IN) swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) swin.add(self.message_entry.view) self.message_entry_container = gtk.HBox(False, 0) self.message_entry_container.pack_start(label, False, False, 0) self.message_entry_container.pack_start(swin, False, False, 0) vbox.pack_start(self.message_entry_container, False, False, 0) # Set up Save button label = gtk.Label("") label.set_size_request(90, -1) self.save_button = gtk.Button(label=_("Save")) self.save_button.connect("clicked", self.on_save_clicked) self.save_container = gtk.HBox(False, 0) self.save_container.pack_start(label, False, False, 0) self.save_container.pack_start(self.save_button, False, False, 0) vbox.pack_start(self.save_container, False, False, 0) # Set up the tagger line label = gtk.Label(_("Tagger:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.tagger_label = gtk.Label("") self.tagger_label.set_properties(xalign=0,yalign=0,selectable=True) self.tagger_label.set_line_wrap(True) self.tagger_container = gtk.HBox(False, 0) self.tagger_container.pack_start(label, False, False, 0) self.tagger_container.pack_start(self.tagger_label, False, False, 0) vbox.pack_start(self.tagger_container, False, False, 0) # Set up the Date line label = gtk.Label(_("Date:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.date_label = gtk.Label("") self.date_label.set_properties(xalign=0,yalign=0,selectable=True) self.date_container = gtk.HBox(False, 0) self.date_container.pack_start(label, False, False, 0) self.date_container.pack_start(self.date_label, False, False, 0) vbox.pack_start(self.date_container, False, False, 0) # Set up the Revision line label = gtk.Label(_("Revision:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.revision_label = gtk.Label("") self.revision_label.set_properties(xalign=0,selectable=True) self.revision_label.set_line_wrap(True) self.revision_container = gtk.HBox(False, 0) self.revision_container.pack_start(label, False, False, 0) self.revision_container.pack_start(self.revision_label, False, False, 0) vbox.pack_start(self.revision_container, False, False, 0) # Set up the Log Message line label = gtk.Label(_("Message:")) label.set_size_request(90, -1) label.set_properties(xalign=0,yalign=0) self.message_label = gtk.Label("") self.message_label.set_properties(xalign=0,yalign=0,selectable=True) self.message_label.set_line_wrap(True) self.message_label.set_size_request(250, -1) self.message_container = gtk.HBox(False, 0) self.message_container.pack_start(label, False, False, 0) self.message_container.pack_start(self.message_label, False, False, 0) vbox.pack_start(self.message_container, False, False, 0) self.add_containers = [self.tag_name_container, self.message_entry_container, self.start_point_container, self.save_container] self.view_containers = [self.tag_name_container, self.tagger_container, self.date_container, self.revision_container, self.message_container] self.all_containers = [self.tag_name_container, self.tagger_container, self.date_container, self.revision_container, self.message_container, self.message_entry_container, self.save_container, self.start_point_container] vbox.show() self.detail_container.add(vbox) 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.RESPONSE_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, data=None): if gtk.gdk.keyval_name(data.keyval) in ("Up", "Down", "Return"): self.on_treeview_event(treeview, data) def on_treeview_mouse_event(self, treeview, data=None): self.on_treeview_event(treeview, data) def on_treeview_event(self, treeview, data): 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_containers(self, containers): for container in self.all_containers: container.hide() for container in containers: container.show_all() 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_containers(self.add_containers) 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 item.name == tag_name: self.selected_tag = item break self.save_button.set_label(_("Save")) if self.selected_tag: self.tag_entry.set_text(self.selected_tag.name) self.revision_label.set_text(self.selected_tag.sha) self.message_label.set_text(self.selected_tag.message.rstrip("\n")) self.tagger_label.set_text(self.selected_tag.tagger) self.date_label.set_text(rabbitvcs.util.helper.format_datetime(datetime.fromtimestamp(self.selected_tag.tag_time))) self.show_containers(self.view_containers) 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(data) 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.16/rabbitvcs/ui/unlock.py000077500000000000000000000123621230007774300176720ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log log = Log("rabbitvcs.ui.unlock") from rabbitvcs import gettext _ = gettext.gettext class SVNUnlock(Add): def __init__(self, paths, base_dir): InterfaceView.__init__(self, "add", "Add") self.window = self.get_widget("Add") self.window.set_title(_("Unlock")) self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.svn = self.vcs.svn() self.items = None self.statuses = None self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [gobject.TYPE_BOOLEAN, 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": 1 } }], 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() # # Helpers # def load(self): gtk.gdk.threads_enter() self.get_widget("status").set_text(_("Loading...")) self.items = self.vcs.get_items(self.paths, self.statuses) self.populate_files_table() gtk.gdk.threads_leave() 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, item.path, rabbitvcs.util.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.start() class SVNUnlockQuiet: """ 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.16/rabbitvcs/ui/unstage.py000066400000000000000000000111751230007774300200430ustar00rootroot00000000000000# # 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 thread import pygtk import gobject import gtk 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log import rabbitvcs.vcs log = Log("rabbitvcs.ui.unstage") from rabbitvcs import gettext _ = gettext.gettext class GitUnstage(Add): def __init__(self, paths, base_dir=None): InterfaceView.__init__(self, "add", "Add") self.window = self.get_widget("Add") self.window.set_title(_("Unstage")) self.paths = paths self.base_dir = base_dir self.last_row_clicked = None self.vcs = rabbitvcs.vcs.VCS() self.git = self.vcs.git(self.paths[0]) self.items = None self.statuses = self.git.STATUSES_FOR_UNSTAGE self.files_table = rabbitvcs.ui.widget.Table( self.get_widget("files_table"), [gobject.TYPE_BOOLEAN, 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": 1 } }], 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 populate_files_table(self): self.files_table.clear() for item in self.items: self.files_table.append([ True, item.path, rabbitvcs.util.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.start() class GitUnstageQuiet: 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.run() 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.16/rabbitvcs/ui/update.py000077500000000000000000000112301230007774300176520ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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() ) 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.start() 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() ) self.action.append(self.action.set_header, _("Update")) self.action.append(self.action.set_status, _("Updating...")) if not apply_changes: if fetch_all: self.action.append(self.git.fetch, "--all") else: self.action.append(self.git.fetch, repository, branch) else: 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) self.action.append(self.action.set_status, _("Completed Update")) self.action.append(self.action.finish) self.action.start() 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.16/rabbitvcs/ui/updateto.py000066400000000000000000000135161230007774300202230ustar00rootroot00000000000000# # 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 pygtk import gobject import gtk 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.start() 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.start() 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.16/rabbitvcs/ui/widget.py000066400000000000000000001306601230007774300176610ustar00rootroot00000000000000# # 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 . # try: from gi.repository import GObject as gobject except ImportError: import gobject import os if "NAUTILUS_PYTHON_REQUIRE_GTK3" in os.environ and os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"]: from gi.repository import Gtk as gtk GTK_FILL = gtk.AttachOptions.FILL GTK_EXPAND = gtk.AttachOptions.EXPAND GTK3 = True else: import gtk GTK_FILL = gtk.FILL GTK_EXPAND = gtk.EXPAND GTK3 = False # GI Pango is broken in some versions of pygobject 2.28.x, if that is the case # set HAS_PANGO to false and do without ellipsizing for now HAS_PANGO = True try: from gi.repository import Pango as pango PANGO_ELLIPSIZE_MIDDLE = pango.EllipsizeMode.MIDDLE PANGO_ELLIPSIZE_END = pango.EllipsizeMode.END except ImportError: import pango PANGO_ELLIPSIZE_MIDDLE = pango.ELLIPSIZE_MIDDLE PANGO_ELLIPSIZE_END = pango.ELLIPSIZE_END except AttributeError: HAS_PANGO = False pass import os.path HAS_GTKSPELL = False if not GTK3: try: import gtkspell HAS_GTKSPELL = True except ImportError: pass HAS_GTKSOURCEVIEW = False if not GTK3: try: import gtksourceview HAS_GTKSOURCEVIEW = True except ImportError: pass import rabbitvcs.util.helper 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' 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 = rabbitvcs.util.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 = rabbitvcs.util.helper.format_long_text(text, cols) return text def git_revision_filter(row, column, user_data=None): """ Only show the first six 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 value1 == value2: return 0 elif value1 < value2: return -1 else: return 1 class TableBase: 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 not flags.has_key("sortable"): flags["sortable"] = False if not flags.has_key("sort_on"): flags["sort_on"] = -1 if not flags.has_key("editable"): flags["editable"] = () self.treeview = treeview self.selected_rows = [] 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 callbacks.has_key("file-column-callback"): data = { "callback": callbacks["file-column-callback"], "column": i } else: data = { "callback": rabbitvcs.util.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, cell) 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) if HAS_PANGO: cell.set_property('ellipsize', PANGO_ELLIPSIZE_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.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.SORT_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) self.callbacks = callbacks if self.callbacks: self.allow_multiple() 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(path) model[realpath][column] = not model[realpath][column] if "row-toggled" in self.callbacks: self.callbacks["row-toggled"](model[realpath], column) def append(self, row): self.data.append(row) 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 def clear(self): self.data.clear() self.reset_selection() def get_row(self, index): model = self.data return model[index] def set_row(self, index, row): model = self.data model[index] = row 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.SELECTION_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.TREE_VIEW_COLUMN_FIXED) col.set_fixed_width(width) else: col.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) def update_selection(self): selection = self.treeview.get_selection() (liststore, indexes) = selection.get_selected_rows() self.reset_selection() for tup in indexes: self.selected_rows.append(self._realpath(tup)[0]) 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(unicode(cell)) lines.append("\t".join(line)) return "\n".join(lines) 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, data): info = treeview.get_path_at_pos(int(data.x), int(data.y)) selection = treeview.get_selection() # 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() return # this allows us to retain multiple selections with a right-click if data.button == 3: (liststore, indexes) = selection.get_selected_rows() # If the mouse click is one of the currently selected rows # keep the selection, otherwise, use the new selection for index in indexes: if index[0] == info[0][0]: return True return False 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) def __key_press_event(self, treeview, data): self.update_selection() if "key-event" in self.callbacks: self.callbacks["key-event"](treeview, data) def __cursor_changed_event(self, treeview): self.update_selection() if "cursor-changed" in self.callbacks: self.callbacks["cursor-changed"](treeview) if "mouse-event" in self.callbacks: self.callbacks["mouse-event"](treeview) def __button_release_event(self, treeview, data): self.update_selection() if "mouse-event" in self.callbacks: self.callbacks["mouse-event"](treeview, data) 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 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): stock_id = 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) stock_id = gtk.STOCK_FILE if kind == "dir": stock_id = gtk.STOCK_DIRECTORY if stock_id is not None: cell.set_property("stock_id", stock_id) 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.data.append(row) 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 = node[0] new_root = self.data.append(parent, root) if len(node) > 1 and node[1] is not None: self.populate(node[1], new_root) class ComboBox: def __init__(self, cb, items=None): self.cb = cb self.model = gtk.ListStore(str) if items is not None: for i in items: self.append(i) self.cb.set_model(self.model) if type(self.cb) == gtk.ComboBoxEntry: self.cb.set_text_column(0) elif type(self.cb) == gtk.ComboBox: cell = gtk.CellRendererText() self.cb.pack_start(cell, True) self.cb.add_attribute(cell, 'text', 0) def append(self, 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): return self.cb.get_active_text() 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.child.set_text(text) def set_sensitive(self, val): self.cb.set_sensitive(val) def set_child_signal(self, signal, callback, userdata=None): self.cb.child.connect(signal, callback, userdata) class TextView: 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(value) if HAS_GTKSPELL and spellcheck: try: gtkspell.Spell(self.view) except Exception, e: log.exception(e) def get_text(self): return self.buffer.get_text( self.buffer.get_start_iter(), self.buffer.get_end_iter() ) def set_text(self, text): self.buffer.set_text(text) def append_text(self, text): self.buffer.set_text(self.get_text() + text) class SourceView(TextView): def __init__(self, widget=None, value=""): if HAS_GTKSOURCEVIEW: if widget is None: self.view = gtksourceview.SourceView(self.buffer) else: self.view = widget self.buffer = gtksourceview.SourceBuffer() self.buffer.set_text(value) if HAS_GTKSPELL: gtkspell.Spell(self.view) self.view.show() else: TextView.__init__(self, widget, value) class ProgressBar: 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 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 def set_text(self, text): self.view.set_text(text) class RevisionSelector: """ 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 = gtk.HBox(0, 4) 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_stock(gtk.STOCK_FIND, 1) 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) 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(data) 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: return self.url_combobox.get_active_text() 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(str(number)) 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.Table): """ Simple extension of a GTK table 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 """ if not stuff or len(stuff) == 0: super(KeyValueTable, self).__init__() else: super(KeyValueTable, self).__init__(len(stuff), 2) row = 0 for key, value in stuff: label_key = gtk.Label("%s:" % key) label_key.set_properties(xalign=0, use_markup=True) label_value = gtk.Label("%s" % value) if HAS_PANGO: label_value.set_properties(xalign=0, \ ellipsize=PANGO_ELLIPSIZE_MIDDLE, \ selectable=True) else: label_value.set_properties(xalign=0,selectable=True) self.attach(label_key, 0,1, row, row+1, xoptions=GTK_FILL) self.attach(label_value, 1,2, row, row+1, xoptions=GTK_FILL|GTK_EXPAND) label_key.show() label_value.show() row += 1 self.set_col_spacings(self.default_col_spacing) self.set_row_spacings(self.default_row_spacing) class GitRepositorySelector: def __init__(self, container, git, changed_callback=None): self.git = git self.changed_callback = changed_callback vbox = gtk.VBox(False, 4) # Set up the Repository Line label = gtk.Label(_("Repository:")) label.set_size_request(90, -1) label.set_justify(gtk.JUSTIFY_LEFT) tmp_repos = [] for item in self.git.remote_list(): tmp_repos.append(item["name"]) self.repository_opt = ComboBox(gtk.ComboBoxEntry(), 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) hbox = gtk.HBox(False, 0) hbox.pack_start(label, False, False, 0) hbox.pack_start(self.repository_opt.cb, False, False, 0) vbox.pack_start(hbox, False, False, 0) # Set up the Branch line label = gtk.Label(_("Branch:")) label.set_size_request(90, -1) label.set_justify(gtk.JUSTIFY_LEFT) 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.ComboBoxEntry(), 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) hbox = gtk.HBox(False, 0) hbox.pack_start(label, False, False, 0) hbox.pack_start(self.branch_opt.cb, False, False, 0) vbox.pack_start(hbox, False, False, 0) # Set up the Host line label = gtk.Label(_("Host:")) label.set_justify(gtk.JUSTIFY_LEFT) label.set_size_request(90, -1) self.host = gtk.Label() self.host.set_justify(gtk.JUSTIFY_LEFT) hbox = gtk.HBox(False, 0) hbox.pack_start(label, False, False, 0) hbox.pack_start(self.host, False, False, 0) vbox.pack_start(hbox, False, False, 4) vbox.show_all() container.add(vbox) self.__update_host() def __update_host(self): repo = "origin" self.host.set_text(self.git.config.get('remote "%s"' % repo, "url")) def __repository_changed(self, repository_opt): if self.changed_callback: self.changed_callback(repository_opt.get_active_text(), self.branch_opt.get_active_text()) 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: def __init__(self, container, git, changed_callback=None): self.git = git self.changed_callback = changed_callback self.vbox = gtk.VBox(False, 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.ComboBoxEntry(), 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 = gtk.HBox(False, 0) hbox.pack_start(self.branch_opt.cb, False, False, 0) self.vbox.pack_start(hbox, False, False, 0) self.vbox.show_all() container.add(self.vbox) 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: """ 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()) scrolled_window = gtk.ScrolledWindow() scrolled_window.set_shadow_type(gtk.SHADOW_ETCHED_IN) scrolled_window.add(self.textview.view) scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) scrolled_window.set_size_request(320, 150) vbox = gtk.VBox(False, 6) hbox = gtk.HBox(False, 3) combo_label = gtk.Label(label) combo_label.set_alignment(0, 0.5) combo_label.set_size_request(130, -1) hbox.pack_start(combo_label, False, False, 0) hbox.pack_start(self.combobox.cb, True, True, 0) vbox.pack_start(hbox, False, False, 0) if show_add_line: hbox = gtk.HBox(False, 3) add_label = gtk.Label(_("Add line:")) add_label.set_alignment(0, 0.5) add_label.set_size_request(130, -1) self.add_entry = gtk.Entry() self.add_entry.set_text(line_content) add_button = gtk.Button(_("Add")) add_button.connect("clicked", self.__add_button_clicked) hbox.pack_start(add_label, False, False, 0) hbox.pack_start(self.add_entry, True, True, 0) hbox.pack_start(add_button, False, False, 0) vbox.pack_start(hbox, False, False, 0) vbox.pack_start(scrolled_window, True, True, 0) vbox.show_all() self.combobox.set_active(0) container.add(vbox) 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(current_text) def load_file(self, path): if os.path.exists(path): fh = open(path, "r") self.textview.set_text(fh.read()) 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.16/rabbitvcs/ui/wraplabel.py000066400000000000000000000047421230007774300203500ustar00rootroot00000000000000# 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 gtk import gobject import pango 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.WRAP_WORD_CHAR) if str != None: self.set_text(str) 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, str) 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.16/rabbitvcs/ui/xml/000077500000000000000000000000001230007774300166165ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/ui/xml/about.xml000066400000000000000000000257151230007774300204640ustar00rootroot00000000000000 775 575 True About GTK_WIN_POS_CENTER rabbitvcs-small GDK_GRAVITY_CENTER vertical True 12 18 True 12 True <span size="xx-large"><b>RabbitVCS</b></span> True False False True 12 vertical True 6 True 100 True 0 0 Authors: False False 600 True 0 True True False False 1 False False True 100 True 0 0 Thanks: False False 175 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN True True False GTK_WRAP_WORD 5 5 1 1 False False 1 vertical True 6 True 0 <b>Version Information</b> True False False True 12 True 0 True False False 1 False False 2 vertical True True 0 <b>Links</b> True False False True 12 True 0 http://code.googlecode.com/p/rabbitvcs http://subversion.tigris.org http://pysvn.tigris.org/ http://voidspace.org.uk/python/configobj.html True False False 1 False False 3 True 6 GTK_BUTTONBOX_END True True True gtk-close True False False GTK_PACK_END 4 rabbitvcs-0.16/rabbitvcs/ui/xml/add.xml000066400000000000000000000141651230007774300200770ustar00rootroot00000000000000 450 True Add center 400 300 rabbitvcs-small center True 12 vertical 6 200 True True automatic automatic etched-in True True 0 Select / Deselect all True True False True True False False 1 Show ignored files True True False False True False False 2 True True 0 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 False False end 2 rabbitvcs-0.16/rabbitvcs/ui/xml/annotate.xml000066400000000000000000000327161230007774300211620ustar00rootroot00000000000000 750 550 True Annotate center rabbitvcs-small True 12 vertical 18 True True automatic automatic True True True 0 True True vertical 6 True 12 True vertical 6 True 0 <b>From Revision</b> True 0 True 6 100 True True 0 True True True True rabbitvcs-show_log False False 1 1 0 True vertical 6 True 0 <b>To Revision</b> True 0 True 6 100 True True 0 True True True True rabbitvcs-show_log False False 1 True True True True gtk-refresh False False 6 2 1 1 False False 0 0 True vertical True 1 True 6 end gtk-save-as True False True True True False False 0 gtk-close True True True True False False 1 False False end 1 end 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/branch-merge.xml000066400000000000000000000166321230007774300217020ustar00rootroot00000000000000 True Merge rabbitvcs True 12 18 True 6 True 6 True 0 <b>From</b> True False False 0 True 12 True 6 True False False 0 True 6 False False 1 1 0 0 True 6 True 0 <b>Will be merged into</b> True False False 0 True 12 True 0 False False 1 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False 2 rabbitvcs-0.16/rabbitvcs/ui/xml/branch.xml000066400000000000000000000343131230007774300206010ustar00rootroot00000000000000 550 True Branch/tag center rabbitvcs-small True 12 vertical 18 True vertical 6 True 0 <b>Repository</b> True False False 0 True 12 True vertical 6 True 6 90 True 0 From: False False 0 True 1 True True True True gtk-find 1 False False 2 0 True 6 90 True 0 To: False False 0 True 1 1 False False 1 False False 0 True vertical 6 True 0 <b>Create copy from</b> True False False 0 True 12 False False 1 False False 1 True vertical 6 True 0 <b>Add Message</b> True False False 0 True 12 True vertical 6 True start Previous Messages True True True False False 0 False False 0 True True automatic automatic etched-in 100 True True word -1 1 2 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False 3 rabbitvcs-0.16/rabbitvcs/ui/xml/browser.xml000066400000000000000000000232621230007774300210300ustar00rootroot00000000000000 640 480 True Repository Browser center rabbitvcs True 12 vertical 18 True vertical 6 True vertical 6 True 6 90 True 0 URL: False False 0 True 1 False False 0 True 6 90 True 0 Revision: False False 0 True 1 False False 1 False False 0 True True automatic automatic etched-in True True 1 0 True True True 0 False False 0 0 True 6 end True True True True True gtk-refresh 0 True Load/Refresh 1 False False 0 gtk-close True True True True False False 1 False False 1 False False 1 rabbitvcs-0.16/rabbitvcs/ui/xml/changes.xml000066400000000000000000000713311230007774300207550ustar00rootroot00000000000000 640 500 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Changes center rabbitvcs-small True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 vertical 18 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>First:</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 URL False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-zoom-fit 1 False False 1 1 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Revision False False 0 True 1 False False 1 False False 1 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Second:</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 URL False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-zoom-fit 1 False False 1 1 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 100 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 Revision False False 0 True 1 False False 1 False False 1 False False 1 True vertical 6 True True 0 <b>Differences</b> (double-click to compare with base) True False False 0 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 1 2 0 True True False False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 end True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-refresh 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Load/Refresh 1 False False 0 gtk-close True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False False end 1 False False 1 rabbitvcs-0.16/rabbitvcs/ui/xml/checkmods.xml000066400000000000000000000130731230007774300213040ustar00rootroot00000000000000 550 300 True Check for Modifications center 400 300 rabbitvcs-small center True 12 18 True True True True automatic automatic etched-in True True True Local False True True automatic automatic True True True Remote 1 False 0 True 6 end gtk-refresh True True True True False False 0 gtk-close True True True True False False 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/checkout.xml000066400000000000000000000357111230007774300211540ustar00rootroot00000000000000 550 True Checkout center 450 rabbitvcs-small True 12 vertical 18 True vertical 6 True 0 <b>Repository</b> True False False 0 True 12 True vertical 6 True 6 90 True 0 URL: False False 0 True 1 True True True True Browse... True gtk-find 1 False False 2 False False 0 True 6 90 True 0 Destination: False False 0 True True 1 True True True Browse... True gtk-harddisk 2 False False 2 1 False False 1 0 vertical 6 True 0 <b>Options</b> True 0 True 12 True vertical 6 Recursive True True False True True 0 Omit Externals True True False True 1 False False 1 False False 1 vertical 6 True 0 <b>Revision</b> True False False 0 True 12 False False 1 False False 2 True 6 end gtk-cancel True True True True False False 0 gtk-ok True False True True True False False 1 False False 3 rabbitvcs-0.16/rabbitvcs/ui/xml/clean.xml000066400000000000000000000204471230007774300204310ustar00rootroot00000000000000 400 True Clean center-always True 12 vertical 18 True vertical 6 True 0 <b>Clean your Repository</b> True 0 True 0.10000000149011612 Remove untracked files from the working tree 1 True 12 True vertical 3 Remove directories True True False True True 0 Remove ignored files, too True True False True 1 Remove only ignored files True True False True 2 Dry run True True False True 3 Force True True False True True 4 False False 2 False False 0 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/cleanup.xml000066400000000000000000000072141230007774300207730ustar00rootroot00000000000000 400 True Cleaning Up... center rabbitvcs-small vertical True 12 True 0.10000000149011612 5 gtk-directory 6 False False True 0.10000000149011612 5 Cleanup Requested.... Begin working copy cleanup? False False 1 True 6 GTK_BUTTONBOX_END True True True gtk-cancel True False False True False True True gtk-ok True False False 1 False False 2 rabbitvcs-0.16/rabbitvcs/ui/xml/commit.xml000066400000000000000000000415321230007774300206350ustar00rootroot00000000000000 True Commit center 640 640 rabbitvcs-small True 12 18 vertical 12 100 True 0 0 <b>Commit to:</b> True char False False 0 500 True 0 True char True 1 False False 0 True True 6 True 6 vertical True 0 <b>Add Message</b> True False False 0 True 12 True 6 vertical 0 True start Previous Messages True True True False False 0 False False 0 True True automatic automatic etched-in True True True 7 word False -1 1 False True True 6 vertical True 0 <b>Changed Files</b> (double-click to compare with base) True False False 0 True 12 True 6 vertical True True automatic automatic etched-in True True 0 True vertical Select / Deselect all True True False True False False 0 Show unversioned files True True False True True False False 1 False False 1 1 False True 6 True True 0 True False False 0 True True True Refresh True gtk-refresh False False 0 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 False False 3 rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/000077500000000000000000000000001230007774300202405ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/authentication.xml000066400000000000000000000261331230007774300240060ustar00rootroot00000000000000 450 5 Authentication center rabbitvcs-small dialog False True 12 True 6 6 True 0 <b>Please add your authentication details</b> True False False 0 True 12 True 6 True 100 True 0 0 Realm: False False 0 300 True 0 0 True char True 1 0 True 100 True 0 Login: False False 0 True True True 1 1 True 100 True 0 Password: False False 0 True True False True 1 2 True 100 True False False 0 Save Authentication True True False True 1 3 1 False False 1 True end gtk-cancel True True False True False False 0 gtk-ok True True True True True True False False 1 False end 0 auth_cancel auth_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/cert_authentication.xml000066400000000000000000000227611230007774300250260ustar00rootroot00000000000000 400 5 center rabbitvcs-small dialog False True 12 True 6 6 True 0 <b>Please add your authentication details</b> True False False 0 True 12 True 6 True 100 True 0 0 Realm: False False 0 True 0 0 True True False False 1 0 True 100 True 0 Password: False False 0 True True False True 1 1 True 100 True False False 0 Save Authentication True True False True 1 2 False False 1 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True True True False False 1 False end 0 certauth_cancel certauth_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/certificate.xml000066400000000000000000000346061230007774300232550ustar00rootroot00000000000000 550 5 Check Certificate center rabbitvcs-small dialog False 400 True 12 True 6 6 True 0 <b>Certificate Details</b> True False False 0 True 12 True 6 True 100 True 0 0 Realm: start False False 0 True 0 0 True 1 False False 0 True 100 True 0 0 Host: start False False 0 True 0 0 True 1 False False 1 True 100 True 0 0 Issuer: start False False 0 True 0 0 True 1 False False 2 True 100 True 0 0 Valid: start False False 0 True 0 0 True 1 False False 3 True 100 True 0 0 Fingerprint: start False False 0 True 0 0 True 1 False False 4 False False 1 False False 1 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 cert_accept_once cert_accept_forever rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/confirmation.xml000066400000000000000000000104041230007774300234510ustar00rootroot00000000000000 5 Confirmation center rabbitvcs-small dialog False True 12 True 75 True gtk-dialog-warning 6 False False 0 True 0 6 6 Are you sure you want to continue? False False 1 False False 1 True end gtk-no True True True True False False 0 gtk-yes True True True True True True False False 1 False end 0 confirm_cancel confirm_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/conflict_decision.xml000066400000000000000000000172111230007774300244420ustar00rootroot00000000000000 5 Edit Conflicts normal False True 12 True 6 True True 25 25 gtk-dialog-warning 6 False False 0 False False 0 True 12 18 True 0 0.10000000149011612 <b>A conflict was found in the following file:</b> True False False 0 True 0 0 False False 1 False False 1 1 True 12 After the editing conflict, mark the file as resolved. True True False True False False 2 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 Merge Manually True True True False False 3 False end 0 cancel accept_theirs merge_manually rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/create_folder.xml000066400000000000000000000157031230007774300235660ustar00rootroot00000000000000 320 240 5 Create Folder... normal False True 12 True 6 True 6 True 0 <b>Folder Name</b> True 0 True 12 True True 1 False False 0 True 6 True 0 <b>Add Message</b> True False False 0 True 12 True True automatic automatic etched-in True True 1 1 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True True True True False False 1 False end 0 cancel ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/delete_confirmation.xml000066400000000000000000000123011230007774300247710ustar00rootroot00000000000000 5 Delete Confirmation center rabbitvcs-small dialog False True 12 True 75 True gtk-dialog-warning 6 False False 0 True 12 18 True 0 <span size="large"><b>Are you sure you want to delete %item%?</b></span> True False False 0 True 0 The item(s) will be sent to the trash can. False False 1 1 1 True end gtk-cancel True True True True False False 0 gtk-delete True True True True True True False False 1 False end 0 cancel delete rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/error_notification.xml000066400000000000000000000105201230007774300246570ustar00rootroot00000000000000 500 300 5 RabbitVCS Error rabbitvcs-small normal False True 6 True 6 True gtk-dialog-warning 6 False 0 True <span weight="bold" size="xx-large">RabbitVCS Error</span> True 1 False 1 True False 2 True True automatic automatic etched-in True True False False 3 True end gtk-close True True True True False False 0 False end 0 rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/loading.xml000066400000000000000000000061531230007774300224040ustar00rootroot00000000000000 300 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Loading... center-on-parent rabbitvcs-small dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 False end 0 rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/message_box.xml000066400000000000000000000046141230007774300232630ustar00rootroot00000000000000 True 5 Message center rabbitvcs-small dialog False True 12 True 0 6 6 True 1 True end gtk-ok True True True True False False 0 False end 0 messagebox_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/name_email_prompt.xml000066400000000000000000000157531230007774300244650ustar00rootroot00000000000000 400 12 Name and Email center-on-parent normal False True 12 True 0 <b>Enter Name and Email Details</b> True False False 1 True 12 True 6 True 90 True 0 Name: False False 0 True True True 1 False False 0 True 90 True 0 Email: False False 0 True True True 1 False False 1 2 True end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False end 0 cancel ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/one_line_text_change.xml000066400000000000000000000103411230007774300251220ustar00rootroot00000000000000 500 5 Text Change rabbitvcs-small normal False True 12 True 100 True 0 New Name: False False 0 True True 1 False False 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True True True True True False False 1 False False end 0 cancel ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/previous_messages.xml000066400000000000000000000157521230007774300245370ustar00rootroot00000000000000 500 5 Previous Messages center 450 rabbitvcs-small dialog False True 12 True 6 6 True 0 <b>Previous Messages</b> True False False 0 True 12 200 True True automatic automatic etched-in True True 1 1 True 6 6 True 0 <b>Message</b> True False False 0 True 12 True True automatic automatic etched-in 100 True True word 1 2 True end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False end 0 prevmes_cancel prevmes_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/property.xml000066400000000000000000000243221230007774300226510ustar00rootroot00000000000000 600 400 5 Property center rabbitvcs-small dialog False True 12 True 6 6 True 0 <b>Edit Property Details</b> True False False 0 True 12 True 6 True 100 True 0 Property: False False 0 True True 1 False False 0 True 100 True 0 0.05000000074505806 Value: False False 0 True True automatic automatic etched-in 100 True True word 1 1 True 100 True False False 0 Apply property recursively True True False True True False False 1 False False 2 1 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True True True False False 1 False end 0 property_cancel property_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/ssl_client_cert_prompt.xml000066400000000000000000000224611230007774300255440ustar00rootroot00000000000000 400 5 SSL Client Certification center rabbitvcs-small dialog False True 12 True 6 True 0 <b>Please provide your ssl certification file</b> True False False 0 True 12 True 6 True 100 True 0 Realm: False False 0 True 0 1 0 True 2 100 True 0 Path: False False 0 True True 1 True True True True gtk-harddisk False False 2 1 Save Authentication True True False 0.4699999988079071 True 2 False False 1 1 True end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False end 0 sslclientcert_cancel sslclientcert_ok rabbitvcs-0.16/rabbitvcs/ui/xml/dialogs/text_change.xml000066400000000000000000000146121230007774300232570ustar00rootroot00000000000000 350 200 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 center-on-parent rabbitvcs-small dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <b>Message</b> True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 12 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK automatic automatic etched-in True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK word 1 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-ok True True True True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 textchange_cancel textchange_ok rabbitvcs-0.16/rabbitvcs/ui/xml/git-update.xml000066400000000000000000000233261230007774300214110ustar00rootroot00000000000000 True Update Local Repository center-always True 12 18 True 6 True 0 <b>Options</b> True False False 0 True 12 False 1 False False 0 True 5 Apply remote changes True True False True True False False 0 True 5 True 30 True False 0 merge into local branch True True False none True True 1 0 True 30 True False 0 apply remote changes prior to local changes (rebase) True True False none True True merge 1 1 1 False False 2 True Fetch all True True False True False False 0 False False 3 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/ignore.xml000066400000000000000000000100751230007774300206260ustar00rootroot00000000000000 True Ignore center-always rabbitvcs True 12 vertical 18 True vertical 6 True 0 0 <b>Ignore and exclude files from being tracked</b> True False False 0 True 12 1 0 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False 1 rabbitvcs-0.16/rabbitvcs/ui/xml/import.xml000066400000000000000000000220441230007774300206540ustar00rootroot00000000000000 550 True Import center rabbitvcs-small vertical True 12 18 vertical True 6 True 0 <b>Repository</b> True False False True 12 vertical True 6 True True True False False 1 vertical True 6 True 0 <b>Import Message</b> True False False True 12 vertical True 6 True GTK_BUTTONBOX_START True True True Previous Messages False False 150 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN True True GTK_WRAP_WORD 1 True True Include ignored files True False False 2 False False 1 1 True 6 GTK_BUTTONBOX_END True True True gtk-cancel True True True True gtk-ok True 1 False False GTK_PACK_END 2 rabbitvcs-0.16/rabbitvcs/ui/xml/lock.xml000066400000000000000000000324741230007774300203020ustar00rootroot00000000000000 600 True Lock Files center rabbitvcs-small True 12 vertical 18 True vertical 6 True 0 <b>Please describe why you are locking these files</b> True False False 0 True 12 True vertical 6 True start Previous Messages True True True False False 0 False False 0 100 True True automatic automatic etched-in True True word False False 1 False False 1 False False 0 True vertical 6 True 0 <b>Files to lock</b> True False False 0 True 12 True vertical 6 250 True True automatic automatic etched-in True True 0 True vertical Select / Deselect all True True False True True False False 0 Steal the locks True True False True False False 1 1 False False 1 False False 1 True True 0 0 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 False False end 2 rabbitvcs-0.16/rabbitvcs/ui/xml/log.xml000066400000000000000000000552201230007774300201250ustar00rootroot00000000000000 775 560 True Log center rabbitvcs-small True 12 vertical 18 True True vertical True vertical 6 True 12 True 0 <b>Revisions Table</b> True False False 0 True False 1 3 True 1 3 4 3 4 search_buffer True True 0 True True 1 Stop on copy True True False False True False False end 1 True 3 True Showing Revisions: 0 True N/A 1 True to 2 True N/A 3 False False end 2 False False 0 True True vertical 6 180 True True automatic automatic etched-in True True True 0 1 False True True True 6 True vertical 6 True 0 <b>Affected File(s)</b> (double-click to compare with base) True False False 0 True 80 True True automatic automatic etched-in True True 1 False True True vertical 6 True 0 <b>Message</b> True False False 0 True 80 True True automatic automatic etched-in True True False word 1 True True False True 2 True 12 True 6 True 6 start gtk-go-back True False True True True False False 0 gtk-go-forward True False True True True False False 1 False False 0 True 6 True Limit: False False 0 75 True True 100 False False 1 True True True Refresh True gtk-refresh False False 2 False False 1 False False 1 True 6 end gtk-close True True True True False False 0 False False end 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/manager.xml000066400000000000000000000236031230007774300207560ustar00rootroot00000000000000 450 True center-always rabbitvcs-small True 12 vertical 18 True True vertical 6 True 0 True False False 0 True 0 12 True 6 200 150 True True automatic automatic etched-in True True 0 True vertical 6 True True True True gtk-add False False 0 True False True True True gtk-delete False False 1 False False 1 False False 1 0 25 True vertical True 0 label False False 0 True 1 False False 1 False False 0 True 6 end gtk-close True True True True False False 0 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/merge.xml000066400000000000000000001366401230007774300204510ustar00rootroot00000000000000 600 True 12 Merge Assistant center rabbitvcs-small center True 12 vertical 18 True vertical Merge a range of revisions True True False True True False False 0 475 True 0 30 Choose this method if you have made some changes to a branch and wish to merge your changes with another branch. True 1 False False 0 True vertical Merge two different trees True True False True True mergetype_range_opt False False 0 475 True 0 30 Choose this method if you wish to merge two different branches into your working copy. True 1 False False 1 True vertical Reintegrate a branch True True False True mergetype_range_opt False False 0 475 True 0 30 Choose this method if you wish to reintegrate a branch into the trunk. True 1 False False 2 intro Step 1: Merge Type True 12 vertical 18 True vertical 6 True 0 <b>URL to merge from</b> True False False 0 True 12 True False False 1 False False 0 True vertical 6 True 0 <b>Revision Range</b> True False False 0 True 12 True vertical 6 True 6 True True 0 True True True Show log True 24 rabbitvcs-show_log False False 1 False False 0 500 True 0 30 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 False False 1 False False 1 False False 1 True vertical 6 True 0 <b>Working Copy</b> True False False 0 True 12 True 12 True 0 0 False False 1 False False 2 Step 2: Merge a Range of Revisions True 12 vertical 18 True vertical 6 True 0 <b>From URL</b> True False False 0 True 12 True vertical 6 True 6 True True 0 True True True True Show log True gtk-harddisk 24 False False end 1 0 True 1 False False 1 False False 0 True vertical True 0 <b>Working Copy</b> True False False 0 True 12 True 12 True 0 True 0 False False 1 False False 1 Step 2: Reintegrate a Branch True 12 vertical 18 True vertical 6 True 0 <b>From: (URL and revision to merge)</b> True False False 0 True 12 True vertical 6 True False False 0 True vertical HEAD True True False True True False False 0 True 6 Revision 140 True True False True mergetree_from_revision_head_opt 0 75 True True False False 1 True True True Show log True 24 rabbitvcs-show_log False False 2 False False 1 False False 1 False False 1 False False 0 True vertical 6 True 0 <b>To: (URL and revision to merge)</b> True False False 0 True 12 True vertical 6 True False False 0 True vertical HEAD True True False True True False False 0 True 6 Revision 140 True True False True mergetree_to_revision_head_opt 0 75 True True False False 1 True True True Show log True 24 rabbitvcs-show_log False False 2 False False 1 False False 1 False False 1 False False 1 True vertical 6 True 0 <b>Working Copy</b> True False False 0 True 12 True 12 True 0 0 False False 1 False False 2 Step 2: Merge two different trees True 12 vertical 18 True vertical 6 True 0 <b>Options</b> True False False 0 True 12 True vertical Recursive True True False True True 0 Ignore ancestry True True False True False False 1 Only record the merge True True False True 2 False False 1 False False 0 True end True True True True True gtk-execute 0 True Test Merge 1 False False 0 False False 1 confirm Step 3: Final Options rabbitvcs-0.16/rabbitvcs/ui/xml/notification.xml000066400000000000000000000173641230007774300220410ustar00rootroot00000000000000 740 True Notification Messages center rabbitvcs-small center True 12 vertical 18 True vertical 6 True 0 True False False 0 True 0 True False False 1 False False 1 225 True True automatic automatic etched-in True True 2 True vertical 6 True False False 0 False False 3 True 6 True start gtk-save-as True False True True True False False 0 0 True 6 end gtk-cancel True True True True False False 0 gtk-ok True False True True True True True False False 1 False False end 1 False False end 3 rabbitvcs-0.16/rabbitvcs/ui/xml/properties.xml000066400000000000000000000300731230007774300215370ustar00rootroot00000000000000 600 True Properties GTK_WIN_POS_CENTER rabbitvcs-small vertical True 12 18 vertical True 6 True 0 <b>Properties for:</b> True False False True 12 vertical True 6 True 6 True True URL/Path 1 True True True True gtk-refresh False False 2 False False 150 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN True True True 1 True <i>Selected properties will be applied recursively.</i> True False False 2 True True Delete properties recursively True False False 3 True 3 GTK_BUTTONBOX_START True True True New... False False True False True True Edit... False False 1 True False True True Delete False False 2 False False 4 1 True 6 GTK_BUTTONBOX_END True True True gtk-cancel True False False True True True gtk-save True False False 1 False False GTK_PACK_END 1 rabbitvcs-0.16/rabbitvcs/ui/xml/property_editor.xml000066400000000000000000000230611230007774300225740ustar00rootroot00000000000000 600 400 True Property Editor rabbitvcs-small True 12 vertical 18 True 2 2 20 6 True True <b>Working Copy:</b> True True False False 0 GTK_SHRINK | GTK_FILL GTK_SHRINK | GTK_FILL True True <b>Remote URI:</b> True True False False 0 1 2 GTK_SHRINK | GTK_FILL GTK_SHRINK | GTK_FILL True True 0 middle 0 1 2 1 2 True True 0 middle 0 1 2 False 0 True True automatic automatic etched-in True True 1 True 6 True center gtk-refresh True True True Refresh the list of properties. True False False 0 gtk-new True True True Add a new property. True False False 1 False False 2 True True 3 True 6 True end gtk-close True True True Close this dialog. True False False 0 False False 4 rabbitvcs-0.16/rabbitvcs/ui/xml/property_page.xml000066400000000000000000000234641230007774300222310ustar00rootroot00000000000000 True True rabbitvcs False False 0 True RabbitVCS 1 True True True 0 True 12 vertical 12 12 True 0 True True 0 8 gtk-file 6 False False 0 True 4 2 16 8 True 0 Name: GTK_FILL GTK_FILL True 0 Content status: 2 3 GTK_FILL GTK_FILL True 0 Property status: 3 4 GTK_FILL GTK_FILL True 0 VCS: 1 2 GTK_FILL GTK_FILL True 0 True 1 2 True 0 True 1 2 1 2 True True False 0 True 0 True 1 1 2 3 4 True True False 0 True 0 True 1 1 2 2 3 1 1 12 True 2 True True never automatic True queue True vertical rabbitvcs-0.16/rabbitvcs/ui/xml/pull.xml000066400000000000000000000127351230007774300203240ustar00rootroot00000000000000 True Pull center-always True 12 18 True 6 True 0 <b>Pull Information</b> True False False 0 True 12 False 1 False False 0 True 90 True False False 0 Merge changes into local branch True True False True True False False 1 False False 2 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/push.xml000066400000000000000000000163621230007774300203270ustar00rootroot00000000000000 True Push center-always rabbitvcs True 12 vertical 18 True 6 True 0 <b>Push Information</b> True False False 0 True 12 False 1 False False 0 True 6 True 0 <b>Commits to Push</b> True False False 0 True 12 True True automatic automatic etched-in 450 200 True True 1 2 True True 0 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 0 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/relocate.xml000066400000000000000000000170741230007774300211470ustar00rootroot00000000000000 640 True Relocate center rabbitvcs-small vertical True 12 18 vertical True 6 True 0 <b>Change the repository of your working copy</b> True False False True 12 vertical True 6 True 6 100 True 0 From: False False True True 1 False False True 6 100 True 0 To: False False True True True 1 False False 1 False False 1 False False True 6 GTK_BUTTONBOX_END True True True gtk-cancel True True True True gtk-ok True 1 False False GTK_PACK_END 1 rabbitvcs-0.16/rabbitvcs/ui/xml/reset.xml000066400000000000000000000373471230007774300205000ustar00rootroot00000000000000 True Reset center-always True 12 vertical 18 True vertical 6 True 0 <b>Reset your Repository</b> True False False 0 True 0 Reset current HEAD to specified state. False False 1 0 True vertical 6 True 0 <b>Path</b> True 0 True 12 True 6 True True 0 True True True True gtk-harddisk False False 1 1 False False 1 True vertical 6 True 0 <b>Revision</b> True 0 True 12 1 2 True vertical 6 True vertical 6 True 0 <b>Options</b> True 0 True 12 True vertical 6 True True False True True <i>Mixed</i> - Reset the index but not the working tree True 0 True True False True mixed_opt True <i>Soft</i> - Does not touch the index file or working tree at all, but requires them to be in good working order True 1 True True False True mixed_opt True <i>Hard</i> - Matches the working tree and index to that of the tree being switched to True 2 True True False True mixed_opt True <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 3 None True True False True True mixed_opt 4 1 0 3 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False 4 rabbitvcs-0.16/rabbitvcs/ui/xml/revert.xml000066400000000000000000000126071230007774300206550ustar00rootroot00000000000000 450 True Revert center 400 300 rabbitvcs-small center True 12 vertical 6 200 True True automatic automatic etched-in True True 0 Select / Deselect all True True False True True False False 1 True True 0 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 1 False False end 2 rabbitvcs-0.16/rabbitvcs/ui/xml/settings.xml000066400000000000000000001656531230007774300212200ustar00rootroot00000000000000 550 425 True False Settings center rabbitvcs-small True False 12 18 True True True False True False 12 6 True False 0 <b>RabbitVCS</b> True False False 0 True False 12 True False 6 True False Enable file attributes False True True False True True False False 0 Enable recursive status checks False True False True True False False 2 Enable emblems False True True False True True False False 2 Show RabbitVCS debugging tools False True True False The debug menu is used to diagnose problems with RabbitVCS itself True False False 3 False False 1 False False 1 False False 0 True False 12 6 True False 0 <b>Language</b> True False False 0 True False 12 True False 6 True False False False end 0 False False 1 False False 1 False General False True False 12 18 True False 6 True False 0 <b>Program used to compare files</b> True False False 0 True False 12 True False 6 True False 6 True True False False True True True True 0 False True True True Browse... True False gtk-harddisk False False 1 False False 0 Show new version on the left side False True True False True False False 1 False False 1 False False 0 1 True False External Programs 1 False True False 12 18 True False 6 True False 0 <b>URL History</b> True False False 0 True False 12 True False 6 True False 0 Number of URLs to remember True True 0 60 True True False False True True False False 1 gtk-clear False True True True True False False 2 False False 1 False False 0 True False 6 True False 0 <b>Log Messages</b> True False False 0 True False 12 True False 6 True False 0 Number of messages to remember word-char True True 0 gtk-clear False True True True True False False end 1 60 True True False False True True False False 2 False False 1 False False 1 True False 6 True False 0 <b>Authentication</b> True False False 0 True False 12 True False 6 True False 0.0099999997764825821 Clear your authentication information True True 0 gtk-clear False True True True True False False end 1 False False 1 False False 2 2 True False Saved Data 2 False True False 12 6 True False 0 0 <b>Logging Options</b> True False False 0 True False 12 True False 6 True False True False 0 Type: False False 0 True False False False end 1 False False 0 True False True False 0 Minimum level to log False False 0 True False False False end 1 False False 1 True True 1 3 True False Logging 3 False True False 12 6 True False 0 6 6 True False 3 2 12 6 True False 0 <b>Checker type:</b> True GTK_FILL True False 0 <b>Memory usage:</b> True 2 3 GTK_FILL True False 0 Unknown 1 2 GTK_FILL True False 0 Unknown 1 2 2 3 GTK_FILL True False 0 <b>Process ID:</b> True 1 2 GTK_FILL True False 0 Unknown 1 2 1 2 GTK_FILL False True 6 0 True False False True 1 True False 0 none True False 0 0 12 12 12 12 True False <b>Other Information</b> True True True 2 True False center Refresh Information False True True True False False 0 Restart Checker False True True True False False 1 Stop Checker False True True True 0.54000002145767212 False False 2 False False 3 4 True False Status Checker 4 False True False 12 6 True False 0 <b>Configuration Editor</b> True False False 0 True False 12 True True 1 5 True False Git 5 False True True 0 True False 6 end gtk-cancel False True True True True False False 0 gtk-ok False True True True True False False 1 False False end 1 rabbitvcs-0.16/rabbitvcs/ui/xml/switch.xml000066400000000000000000000220421230007774300206410ustar00rootroot00000000000000 550 True Switch center rabbitvcs-small True 12 vertical 18 True vertical 6 True 0 <b>Switch Details</b> True 0 True 12 True vertical 6 True 100 True 0 5 From: False False 0 True True 1 0 True 100 True 0 5 To: False False 0 True 1 False False 1 False False 1 False False 0 True vertical 6 True 0 <b>Revision</b> True 0 True 12 False False 1 False False 1 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 2 rabbitvcs-0.16/rabbitvcs/ui/xml/update.xml000066400000000000000000000201301230007774300206160ustar00rootroot00000000000000 400 True Update center-always rabbitvcs-small True 12 18 True 6 True 0 <b>Revision</b> True False False 0 True 12 False False 1 False False 1 6 True 0 <b>Options</b> True False False 0 True 12 True Recursive True True False True True False False 0 Omit Externals True True False True False False 1 Rollback to specified revision number True False True False True 2 False False 1 False False 2 True 6 end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False False end 0 rabbitvcs-0.16/rabbitvcs/util/000077500000000000000000000000001230007774300163565ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/util/__init__.py000066400000000000000000000075271230007774300205020ustar00rootroot00000000000000# # 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: """ 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: """ 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, 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.16/rabbitvcs/util/_locale.py000066400000000000000000000026311230007774300203300ustar00rootroot00000000000000import locale import os from rabbitvcs.util.log import Log import rabbitvcs.util.settings import rabbitvcs.util.helper log = Log("rabbitvcs.util.locale") def initialize_locale(): try: settings = rabbitvcs.util.settings.SettingsManager() sane_default = locale.getdefaultlocale(['LANG', 'LANGUAGE']) # Just try to set the default locale for the user locale.setlocale(locale.LC_ALL, sane_default) # Now, if the user has set a default, try to apply that user_default = settings.get("general", "language") if user_default: locale.setlocale(locale.LC_ALL, (user_default, sane_default[1])) 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 default locale (LANG: %s)" % os.environ.get("LANG")) (loc, enc) = sane_default # We should only try this if we have a region to set as well. if loc and enc != "UTF8": try: locale.setlocale(locale.LC_ALL, (loc, "UTF8")) log.warning("Manually set encoding to UTF-8") except locale.Error: # Nope, no UTF8 either. log.warning("Could not set user's locale to UTF-8") rabbitvcs-0.16/rabbitvcs/util/configspec/000077500000000000000000000000001230007774300204765ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/util/configspec/configspec.ini000066400000000000000000000011221230007774300233130ustar00rootroot00000000000000[general] language = string(default="English") enable_attributes = boolean(default=True) enable_emblems = boolean(default=True) enable_recursive = boolean(default=True) show_debug = boolean(default=False) show_unversioned_files = boolean(default=True) [external] diff_tool = string(default="/usr/bin/meld") diff_tool_swap = boolean(default=False) [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") rabbitvcs-0.16/rabbitvcs/util/contextmenu.py000066400000000000000000001602361230007774300213110ustar00rootroot00000000000000# # 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.path from time import sleep from collections import deque try: from gi.repository import GObject as gobject except ImportError: import gobject import os if "NAUTILUS_PYTHON_REQUIRE_GTK3" in os.environ and os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"]: from gi.repository import Gtk as gtk else: import gtk 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.util.helper # Yes, * imports are bad. You write it out then. from contextmenuitems import * 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 = rabbitvcs.util.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_gtk_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): self.menu.show_all() self.menu.popup(None, None, None, event.button, event.time) def get_widget(self): return self.menu class GtkContextMenuCaller: """ 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 gobject.timeout_add_seconds(1, is_process_still_alive) class ContextMenuCallbacks: """ The base class for context menu callbacks. This is inheritied 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 debug_shell(self, widget, data1=None, data2=None): """ Open up an IPython shell which shares the context of the extension. See: http://ipython.scipy.org/moin/Cookbook/EmbeddingInGTK """ import gtk from rabbitvcs.debug.ipython_view import IPythonView window = gtk.Window() window.set_size_request(750,550) window.set_resizable(True) window.set_position(gtk.WIN_POS_CENTER) scrolled_window = gtk.ScrolledWindow() scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) ipython_view = IPythonView() ipython_view.updateNamespace(locals()) ipython_view.set_wrap_mode(gtk.WRAP_CHAR) ipython_view.show() scrolled_window.add(ipython_view) scrolled_window.show() window.add(scrolled_window) window.show() 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 nautilusVFSFile_table = rabbitvcs_extension.nautilusVFSFile_table for path in self.paths: log.debug("callback_debug_invalidate() called for %s" % path) if path in nautilusVFSFile_table: nautilusVFSFile_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 = Popen(command, stdout=PIPE).communicate()[0].replace("\n", "") rabbitvcs_extension = self.caller nautilusVFSFile_table = rabbitvcs_extension.nautilusVFSFile_table for path in self.paths: if path in nautilusVFSFile_table: nautilusVFSFile_table[path].add_emblem(emblem) return False gobject.idle_add(add_emblem_dialog) # End debugging callbacks def checkout(self, widget, data1=None, data2=None): proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.helper.create_path_revision_string(self.vcs_client.svn().get_repo_url(self.paths[0]), previous_revision_number) pathrev2 = rabbitvcs.util.helper.create_path_revision_string(self.paths[0], "working") proc = rabbitvcs.util.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 = rabbitvcs.util.helper.create_path_revision_string(self.paths[0], "base") pathrev2 = rabbitvcs.util.helper.create_path_revision_string(self.paths[0], "working") proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.helper.create_path_revision_string(self.vcs_client.svn().get_repo_url(self.paths[0]), previous_revision_number) pathrev2 = rabbitvcs.util.helper.create_path_revision_string(self.paths[0], "working") proc = rabbitvcs.util.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 = rabbitvcs.util.helper.create_path_revision_string(self.paths[0]) pathrev2 = pathrev1 if len(self.paths) == 2: pathrev2 = rabbitvcs.util.helper.create_path_revision_string(self.paths[1]) proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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): rabbitvcs.util.helper.launch_ui_window("about") def settings(self, widget, data1=None, data2=None): proc = rabbitvcs.util.helper.launch_ui_window("settings", [self.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 = rabbitvcs.util.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" % rabbitvcs.util.helper.get_file_extension(path) base_dir = os.path.join(self.base_dir, os.path.dirname(path)) proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.helper.launch_ui_window("update", self.paths) elif guess["vcs"] == rabbitvcs.vcs.VCS_GIT: proc = rabbitvcs.util.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 = rabbitvcs.util.helper.launch_ui_window("browser", [self.paths[0]]) def initialize_repository(self, widget, data1=None, data2=None): proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.helper.launch_ui_window("editconflicts", [self.paths[0]]) self.caller.rescan_after_process_exit(proc, [self.paths[0]]) class ContextMenuConditions: """ 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 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 checks.items(): try: self.path_dict[key] = func(path) except KeyError, 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 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: rabbitvcs.util.helper.open_item(path) def add(self, widget, data1=None, data2=None): proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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): rabbitvcs.util.helper.browse_to_item(self.paths[0]) def delete(self, widget, data1=None, data2=None): if len(self.paths) > 0: proc = rabbitvcs.util.helper.launch_ui_window("delete", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def update(self, data1=None, data2=None): proc = rabbitvcs.util.helper.launch_ui_window("update", self.paths) self.caller.rescan_after_process_exit(proc, self.paths) def unlock(self, data1=None, data2=None): proc = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 = rabbitvcs.util.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 self.statuses.keys()] self.prop_statuses = [self.statuses[key].simple_metadata_status() for key in self.statuses.keys()] class GtkFilesContextMenu: """ 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 self.statuses.keys()] self.prop_statuses = [self.statuses[key].simple_metadata_status() for key in self.statuses.keys()] class MainContextMenu: """ 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), (MenuDebugShell, None), (MenuRefreshStatus, None), (MenuDebugRevert, None), (MenuDebugInvalidate, None), (MenuDebugAddEmblem, None) ]), (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), (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) ]), (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) ]), (MenuRabbitVCSMercurial, [ (MenuSettings, None), (MenuAbout, None) ]) ] 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 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) == types.ClassType: 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.16/rabbitvcs/util/contextmenuitems.py000066400000000000000000000627061230007774300223560ustar00rootroot00000000000000# # 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 if "NAUTILUS_PYTHON_REQUIRE_GTK3" in os.environ and os.environ["NAUTILUS_PYTHON_REQUIRE_GTK3"]: from gi.repository import Gtk as gtk else: import gtk import rabbitvcs.util.helper 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: identifier = "RabbitVCS::Perform_Magic" label = _("Perform Magic") tooltip = _("Put on your robe and wizard hat") icon = "rabbitvcs-wand" # or, say, gtk.STOCK_OPEN 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" or gtk.STOCK_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 GTK 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 gtk.Action(identifier, self.make_label(), None, None) 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.ICON_SIZE_MENU)) else: menuitem = action.create_menu_item() return menuitem def make_gtk3_menu_item(self, id_magic = None): action = self.make_action(id_magic) if self.icon: 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_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: import nautilus menuitem = nautilus.MenuItem( identifier, self.make_label(), self.tooltip, self.icon ) except ImportError: from gi.repository import Nautilus menuitem = Nautilus.MenuItem( name=identifier, label=self.make_label(), tip=self.tooltip, icon=self.icon ) return menuitem def make_label(self): label = self.label.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 GtkAction. #~ 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_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 MenuDebugShell(MenuItem): identifier = "RabbitVCS::Debug_Shell" label = _("Open Shell") 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 = gtk.STOCK_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 = gtk.STOCK_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 = gtk.STOCK_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 = gtk.STOCK_EDIT 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 = rabbitvcs.util.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 RabbitVCSAction(gtk.Action): """ Sub-classes gtk.Action so that we can have submenus """ __gtype_name__ = "RabbitVCSAction" def __init__(self, name, label, tooltip, stock_id): gtk.Action.__init__(self, name, label, tooltip, stock_id) self.sub_actions = None self.stock_id = stock_id def __repr__(self): return self.get_name() def set_sub_actions(self, sub_actions): self.sub_actions = sub_actions def do_create_menu_item(self): menu_item = gtk.ImageMenuItem() if self.stock_id: try: self.set_icon_name(self.stock_id) except AttributeError, e: menu_item.set_image(gtk.image_new_from_icon_name(self.stock_id, gtk.ICON_SIZE_MENU)) 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 do_create_menu_item(self): return gtk.SeparatorMenuItem() rabbitvcs-0.16/rabbitvcs/util/decorators.py000066400000000000000000000112051230007774300210740ustar00rootroot00000000000000# # 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 """ 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 gtk.gdk.threads_enter() and gtk.gdk.threads_leave(). """ import gtk def newfunc(*args, **kwargs): gtk.gdk.threads_enter() result = func(*args, **kwargs) gtk.gdk.threads_leave() return result 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 rabbitvcs-0.16/rabbitvcs/util/helper.py000066400000000000000000000712211230007774300202120ustar00rootroot00000000000000# # 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 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 urllib import urlparse try: from gi.repository import GObject as gobject except ImportError: import gobject import rabbitvcs.util.settings from rabbitvcs.util.log import Log log = Log("rabbitvcs.util.helper") from rabbitvcs import gettext ngettext = gettext.ngettext DATETIME_FORMAT = "%Y-%m-%d %H:%M" # for log files LOCAL_DATETIME_FORMAT = locale.nl_langinfo(locale.D_T_FMT) # for UIs DT_FORMAT_THISWEEK = "%a %I:%M%p" DT_FORMAT_THISYEAR = "%b %d %Y" DT_FORMAT_ALL = "%b %d %Y" LINE_BREAK_CHAR = u'\u23CE' from rabbitvcs import gettext _ = gettext.gettext def get_tmp_path(filename): day = datetime.datetime.now().day m = hashlib.md5(str(day) + str(os.geteuid())).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): """ Nicely formats text containing linebreaks to display in a single line by replacing newlines with U+23CE. If the param "cols" is given, the text beyond cols is replaced by "...". """ text = text.strip().replace(u"\n", LINE_BREAK_CHAR) if cols and len(text) > cols: text = u"%s..." % text[0:cols] return text def format_datetime(dt, format=None): if format: enc = locale.getpreferredencoding(False) if enc is None or len(enc) == 0: enc = "UTF8" return dt.strftime(format).decode(enc) now = datetime.datetime.now() delta = now - dt returner = "" 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("%I:%M%P") 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) enc = locale.getpreferredencoding(False) if enc is None or len(enc) == 0: enc = "UTF8" return returner.decode(enc) 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, 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, 0700) 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 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(path1, path2=""): diff = get_diff_tool() if diff["path"] == "": return if not os.path.exists(diff["path"]): return os.popen("%s '%s' '%s'" % (diff["path"], path1, path2)) 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 import platform if platform.system() == 'Darwin': subprocess.Popen(["open", os.path.abspath(path)]) else: subprocess.Popen(["gnome-open", os.path.abspath(path)]) 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(["gvfs-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(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.encode("utf-8")) 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("\n".join(paths).encode("utf-8")) 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__))) env = os.environ if "NAUTILUS_PYTHON_REQUIRE_GTK3" in env: del env["NAUTILUS_PYTHON_REQUIRE_GTK3"] 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 os.environ.keys(): executable = os.environ["PYTHON"] proc = subprocess.Popen([executable, path] + args, env=env) 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 _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_url(url_text): (scheme, netloc, path, params, query, fragment) = urlparse.urlparse(url_text) # netloc_quoted = urllib.quote(netloc) path_quoted = urllib.quote(path) params_quoted = urllib.quote(query) query_quoted = urllib.quote_plus(query) fragment_quoted = urllib.quote(fragment) url_quoted = urlparse.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) = urlparse.urlparse(url_text) # netloc_unquoted = urllib.unquote(netloc) path_unquoted = urllib.unquote(path).decode('utf-8') params_unquoted = urllib.unquote(query) query_unquoted = urllib.unquote_plus(query) fragment_unquoted = urllib.unquote(fragment) url_unquoted = urlparse.urlunparse( (scheme, netloc, path_unquoted, params_unquoted, query_unquoted, fragment_unquoted)) return url_unquoted def pretty_filesize(bytes): if bytes >= 1073741824: return str(bytes / 1073741824) + ' GB' elif bytes >= 1048576: return str(bytes / 1048576) + ' MB' elif bytes >= 1024: return str(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.PIPE, env = env) # Intialise things... line = patch_proc.stdout.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 + patch_proc.stdout.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 = patch_proc.stdout.readline() while not line and patch_proc.poll() is None: line = patch_proc.stdout.readline() # 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 rabbitvcs-0.16/rabbitvcs/util/log.py000066400000000000000000000225761230007774300175250ustar00rootroot00000000000000# # 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") """ import os from os.path import expanduser import logging import logging.handlers from rabbitvcs.util.settings import SettingsManager, get_home_folder 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: """ 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, "utf-8"), 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, "utf-8"), 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.16/rabbitvcs/util/settings.py000066400000000000000000000224131230007774300205720ustar00rootroot00000000000000# # 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. """ import os from os.path import dirname import shutil import configobj import validate from rabbitvcs import package_prefix 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, 0700) 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: """ 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 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.16/rabbitvcs/vcs/000077500000000000000000000000001230007774300161745ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/__init__.py000066400000000000000000000213321230007774300203060ustar00rootroot00000000000000# # 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 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' def guess(path): # Determine the VCS instance based on the path if path: path_to_check = path folders = { ".svn": VCS_SVN, ".git": VCS_GIT, ".hg": VCS_MERCURIAL, ".bzr": VCS_DUMMY, ".CVS": VCS_DUMMY } while path_to_check != "/" and path_to_check != "": for folder, client in 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] # Attempt 2 - assume it's a path like "local.txt@1" path_to_check = "./" + path.split("@")[0] while path_to_check != "/" and path_to_check != "": for folder, client in 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 } class VCS: 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 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, 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 VCS_GIT in self.clients: git = self.clients[VCS_GIT] 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, 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 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, 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.16/rabbitvcs/vcs/branch.py000066400000000000000000000025561230007774300200130ustar00rootroot00000000000000# # 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: 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.16/rabbitvcs/vcs/dummy/000077500000000000000000000000001230007774300173275ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/dummy/__init__.py000066400000000000000000000032541230007774300214440ustar00rootroot00000000000000# # 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. """ import rabbitvcs.vcs import rabbitvcs.vcs.status class Dummy: 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.16/rabbitvcs/vcs/git/000077500000000000000000000000001230007774300167575ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/README000066400000000000000000000003271230007774300176410ustar00rootroot00000000000000Hopefully 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.6.1 * python >= 2.4 rabbitvcs-0.16/rabbitvcs/vcs/git/__init__.py000066400000000000000000000704231230007774300210760ustar00rootroot00000000000000# # 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. """ import os.path from datetime import datetime from gittyup.client import GittyupClient import gittyup.objects import rabbitvcs.util.helper 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: """ 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 __unicode__(self): if self.value: return unicode(self.value) else: return self.kind def short(self): if self.value: return unicode(self.value)[0:7] else: return self.kind def __str__(self): return self.__unicode__() def __repr__(self): return self.__unicode__() def primitive(self): return self.value class Git: 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 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) 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, 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, 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"): """ 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 """ return self.client.push(repository, refspec) def fetch(self, host): """ Fetch objects from a remote repository. This will not merge the files into the local working copy, use pull for that. @type host: string @param host: The git url from which to fetch """ return self.client.fetch(host) 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") author = _("(no author)") if "committer" in item: author = item["committer"] pos = author.find("<") if pos != -1: author = author[0:pos-1] 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 rabbitvcs.util.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.16/rabbitvcs/vcs/git/gittyup/000077500000000000000000000000001230007774300204645ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/__init__.py000066400000000000000000000000001230007774300225630ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/_configobj/000077500000000000000000000000001230007774300225635ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/_configobj/__init__.py000066400000000000000000000000001230007774300246620ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/_configobj/configobj.py000066400000000000000000002543431230007774300251100ustar00rootroot00000000000000# configobj.py # A config file reader/writer that supports nested sections in config files. # Copyright (C) 2005-2010 Michael Foord, Nicola Larosa # E-mail: fuzzyman AT voidspace DOT org DOT uk # nico AT tekNico DOT net # ConfigObj 4 # http://www.voidspace.org.uk/python/configobj.html # Released subject to the BSD License # Please see http://www.voidspace.org.uk/python/license.shtml # Scripts maintained at http://www.voidspace.org.uk/python/index.shtml # For information about bugfixes, updates and support, please join the # ConfigObj mailing list: # http://lists.sourceforge.net/lists/listinfo/configobj-develop # Comments, suggestions and bug reports welcome. from __future__ import generators import os import re import sys from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF16_BE, BOM_UTF16_LE # imported lazily to avoid startup performance hit if it isn't used compiler = None # A dictionary mapping BOM to # the encoding to decode with, and what to set the # encoding attribute to. BOMS = { BOM_UTF8: ('utf_8', None), BOM_UTF16_BE: ('utf16_be', 'utf_16'), BOM_UTF16_LE: ('utf16_le', 'utf_16'), BOM_UTF16: ('utf_16', 'utf_16'), } # All legal variants of the BOM codecs. # TODO: the list of aliases is not meant to be exhaustive, is there a # better way ? BOM_LIST = { 'utf_16': 'utf_16', 'u16': 'utf_16', 'utf16': 'utf_16', 'utf-16': 'utf_16', 'utf16_be': 'utf16_be', 'utf_16_be': 'utf16_be', 'utf-16be': 'utf16_be', 'utf16_le': 'utf16_le', 'utf_16_le': 'utf16_le', 'utf-16le': 'utf16_le', 'utf_8': 'utf_8', 'u8': 'utf_8', 'utf': 'utf_8', 'utf8': 'utf_8', 'utf-8': 'utf_8', } # Map of encodings to the BOM to write. BOM_SET = { 'utf_8': BOM_UTF8, 'utf_16': BOM_UTF16, 'utf16_be': BOM_UTF16_BE, 'utf16_le': BOM_UTF16_LE, None: BOM_UTF8 } def match_utf8(encoding): return BOM_LIST.get(encoding.lower()) == 'utf_8' # Quote strings used for writing values squot = "'%s'" dquot = '"%s"' noquot = "%s" wspace_plus = ' \r\n\v\t\'"' tsquot = '"""%s"""' tdquot = "'''%s'''" # Sentinel for use in getattr calls to replace hasattr MISSING = object() __version__ = '4.7.0' try: any except NameError: def any(iterable): for entry in iterable: if entry: return True return False __all__ = ( '__version__', 'DEFAULT_INDENT_TYPE', 'DEFAULT_INTERPOLATION', 'ConfigObjError', 'NestingError', 'ParseError', 'DuplicateError', 'ConfigspecError', 'ConfigObj', 'SimpleVal', 'InterpolationError', 'InterpolationLoopError', 'MissingInterpolationOption', 'RepeatSectionError', 'ReloadError', 'UnreprError', 'UnknownType', 'flatten_errors', 'get_extra_values' ) DEFAULT_INTERPOLATION = 'configparser' DEFAULT_INDENT_TYPE = ' ' MAX_INTERPOL_DEPTH = 10 OPTION_DEFAULTS = { 'interpolation': True, 'raise_errors': False, 'list_values': True, 'create_empty': False, 'file_error': False, 'configspec': None, 'stringify': True, # option may be set to one of ('', ' ', '\t') 'indent_type': None, 'encoding': None, 'default_encoding': None, 'unrepr': False, 'write_empty_values': False, } def getObj(s): global compiler if compiler is None: import compiler s = "a=" + s p = compiler.parse(s) return p.getChildren()[1].getChildren()[0].getChildren()[1] class UnknownType(Exception): pass class Builder(object): def build(self, o): m = getattr(self, 'build_' + o.__class__.__name__, None) if m is None: raise UnknownType(o.__class__.__name__) return m(o) def build_List(self, o): return map(self.build, o.getChildren()) def build_Const(self, o): return o.value def build_Dict(self, o): d = {} i = iter(map(self.build, o.getChildren())) for el in i: d[el] = i.next() return d def build_Tuple(self, o): return tuple(self.build_List(o)) def build_Name(self, o): if o.name == 'None': return None if o.name == 'True': return True if o.name == 'False': return False # An undefined Name raise UnknownType('Undefined Name') def build_Add(self, o): real, imag = map(self.build_Const, o.getChildren()) try: real = float(real) except TypeError: raise UnknownType('Add') if not isinstance(imag, complex) or imag.real != 0.0: raise UnknownType('Add') return real+imag def build_Getattr(self, o): parent = self.build(o.expr) return getattr(parent, o.attrname) def build_UnarySub(self, o): return -self.build_Const(o.getChildren()[0]) def build_UnaryAdd(self, o): return self.build_Const(o.getChildren()[0]) _builder = Builder() def unrepr(s): if not s: return s return _builder.build(getObj(s)) class ConfigObjError(SyntaxError): """ This is the base class for all errors that ConfigObj raises. It is a subclass of SyntaxError. """ def __init__(self, message='', line_number=None, line=''): self.line = line self.line_number = line_number SyntaxError.__init__(self, message) class NestingError(ConfigObjError): """ This error indicates a level of nesting that doesn't match. """ class ParseError(ConfigObjError): """ This error indicates that a line is badly written. It is neither a valid ``key = value`` line, nor a valid section marker line. """ class ReloadError(IOError): """ A 'reload' operation failed. This exception is a subclass of ``IOError``. """ def __init__(self): IOError.__init__(self, 'reload failed, filename is not set.') class DuplicateError(ConfigObjError): """ The keyword or section specified already exists. """ class ConfigspecError(ConfigObjError): """ An error occured whilst parsing a configspec. """ class InterpolationError(ConfigObjError): """Base class for the two interpolation errors.""" class InterpolationLoopError(InterpolationError): """Maximum interpolation depth exceeded in string interpolation.""" def __init__(self, option): InterpolationError.__init__( self, 'interpolation loop detected in value "%s".' % option) class RepeatSectionError(ConfigObjError): """ This error indicates additional sections in a section with a ``__many__`` (repeated) section. """ class MissingInterpolationOption(InterpolationError): """A value specified for interpolation was missing.""" def __init__(self, option): msg = 'missing option "%s" in interpolation.' % option InterpolationError.__init__(self, msg) class UnreprError(ConfigObjError): """An error parsing in unrepr mode.""" class InterpolationEngine(object): """ A helper class to help perform string interpolation. This class is an abstract base class; its descendants perform the actual work. """ # compiled regexp to use in self.interpolate() _KEYCRE = re.compile(r"%\(([^)]*)\)s") _cookie = '%' def __init__(self, section): # the Section instance that "owns" this engine self.section = section def interpolate(self, key, value): # short-cut if not self._cookie in value: return value def recursive_interpolate(key, value, section, backtrail): """The function that does the actual work. ``value``: the string we're trying to interpolate. ``section``: the section in which that string was found ``backtrail``: a dict to keep track of where we've been, to detect and prevent infinite recursion loops This is similar to a depth-first-search algorithm. """ # Have we been here already? if (key, section.name) in backtrail: # Yes - infinite loop detected raise InterpolationLoopError(key) # Place a marker on our backtrail so we won't come back here again backtrail[(key, section.name)] = 1 # Now start the actual work match = self._KEYCRE.search(value) while match: # The actual parsing of the match is implementation-dependent, # so delegate to our helper function k, v, s = self._parse_match(match) if k is None: # That's the signal that no further interpolation is needed replacement = v else: # Further interpolation may be needed to obtain final value replacement = recursive_interpolate(k, v, s, backtrail) # Replace the matched string with its final value start, end = match.span() value = ''.join((value[:start], replacement, value[end:])) new_search_start = start + len(replacement) # Pick up the next interpolation key, if any, for next time # through the while loop match = self._KEYCRE.search(value, new_search_start) # Now safe to come back here again; remove marker from backtrail del backtrail[(key, section.name)] return value # Back in interpolate(), all we have to do is kick off the recursive # function with appropriate starting values value = recursive_interpolate(key, value, self.section, {}) return value def _fetch(self, key): """Helper function to fetch values from owning section. Returns a 2-tuple: the value, and the section where it was found. """ # switch off interpolation before we try and fetch anything ! save_interp = self.section.main.interpolation self.section.main.interpolation = False # Start at section that "owns" this InterpolationEngine current_section = self.section while True: # try the current section first val = current_section.get(key) if val is not None: break # try "DEFAULT" next val = current_section.get('DEFAULT', {}).get(key) if val is not None: break # move up to parent and try again # top-level's parent is itself if current_section.parent is current_section: # reached top level, time to give up break current_section = current_section.parent # restore interpolation to previous value before returning self.section.main.interpolation = save_interp if val is None: raise MissingInterpolationOption(key) return val, current_section def _parse_match(self, match): """Implementation-dependent helper function. Will be passed a match object corresponding to the interpolation key we just found (e.g., "%(foo)s" or "$foo"). Should look up that key in the appropriate config file section (using the ``_fetch()`` helper function) and return a 3-tuple: (key, value, section) ``key`` is the name of the key we're looking for ``value`` is the value found for that key ``section`` is a reference to the section where it was found ``key`` and ``section`` should be None if no further interpolation should be performed on the resulting value (e.g., if we interpolated "$$" and returned "$"). """ raise NotImplementedError() class ConfigParserInterpolation(InterpolationEngine): """Behaves like ConfigParser.""" _cookie = '%' _KEYCRE = re.compile(r"%\(([^)]*)\)s") def _parse_match(self, match): key = match.group(1) value, section = self._fetch(key) return key, value, section class TemplateInterpolation(InterpolationEngine): """Behaves like string.Template.""" _cookie = '$' _delimiter = '$' _KEYCRE = re.compile(r""" \$(?: (?P\$) | # Two $ signs (?P[_a-z][_a-z0-9]*) | # $name format {(?P[^}]*)} # ${name} format ) """, re.IGNORECASE | re.VERBOSE) def _parse_match(self, match): # Valid name (in or out of braces): fetch value from section key = match.group('named') or match.group('braced') if key is not None: value, section = self._fetch(key) return key, value, section # Escaped delimiter (e.g., $$): return single delimiter if match.group('escaped') is not None: # Return None for key and section to indicate it's time to stop return None, self._delimiter, None # Anything else: ignore completely, just return it unchanged return None, match.group(), None interpolation_engines = { 'configparser': ConfigParserInterpolation, 'template': TemplateInterpolation, } def __newobj__(cls, *args): # Hack for pickle return cls.__new__(cls, *args) class Section(dict): """ A dictionary-like object that represents a section in a config file. It does string interpolation if the 'interpolation' attribute of the 'main' object is set to True. Interpolation is tried first from this object, then from the 'DEFAULT' section of this object, next from the parent and its 'DEFAULT' section, and so on until the main object is reached. A Section will behave like an ordered dictionary - following the order of the ``scalars`` and ``sections`` attributes. You can use this to change the order of members. Iteration follows the order: scalars, then sections. """ def __setstate__(self, state): dict.update(self, state[0]) self.__dict__.update(state[1]) def __reduce__(self): state = (dict(self), self.__dict__) return (__newobj__, (self.__class__,), state) def __init__(self, parent, depth, main, indict=None, name=None): """ * parent is the section above * depth is the depth level of this section * main is the main ConfigObj * indict is a dictionary to initialise the section with """ if indict is None: indict = {} dict.__init__(self) # used for nesting level *and* interpolation self.parent = parent # used for the interpolation attribute self.main = main # level of nesting depth of this Section self.depth = depth # purely for information self.name = name # self._initialise() # we do this explicitly so that __setitem__ is used properly # (rather than just passing to ``dict.__init__``) for entry, value in indict.iteritems(): self[entry] = value def _initialise(self): # the sequence of scalar values in this Section self.scalars = [] # the sequence of sections in this Section self.sections = [] # for comments :-) self.comments = {} self.inline_comments = {} # the configspec self.configspec = None # for defaults self.defaults = [] self.default_values = {} self.extra_values = [] self._created = False def _interpolate(self, key, value): try: # do we already have an interpolation engine? engine = self._interpolation_engine except AttributeError: # not yet: first time running _interpolate(), so pick the engine name = self.main.interpolation if name == True: # note that "if name:" would be incorrect here # backwards-compatibility: interpolation=True means use default name = DEFAULT_INTERPOLATION name = name.lower() # so that "Template", "template", etc. all work class_ = interpolation_engines.get(name, None) if class_ is None: # invalid value for self.main.interpolation self.main.interpolation = False return value else: # save reference to engine so we don't have to do this again engine = self._interpolation_engine = class_(self) # let the engine do the actual work return engine.interpolate(key, value) def __getitem__(self, key): """Fetch the item and do string interpolation.""" val = dict.__getitem__(self, key) if self.main.interpolation: if isinstance(val, basestring): return self._interpolate(key, val) if isinstance(val, list): def _check(entry): if isinstance(entry, basestring): return self._interpolate(key, entry) return entry return [_check(entry) for entry in val] return val def __setitem__(self, key, value, unrepr=False): """ Correctly set a value. Making dictionary values Section instances. (We have to special case 'Section' instances - which are also dicts) Keys must be strings. Values need only be strings (or lists of strings) if ``main.stringify`` is set. ``unrepr`` must be set when setting a value to a dictionary, without creating a new sub-section. """ if not isinstance(key, basestring): raise ValueError('The key "%s" is not a string.' % key) # add the comment if key not in self.comments: self.comments[key] = [] self.inline_comments[key] = '' # remove the entry from defaults if key in self.defaults: self.defaults.remove(key) # if isinstance(value, Section): if key not in self: self.sections.append(key) dict.__setitem__(self, key, value) elif isinstance(value, dict) and not unrepr: # First create the new depth level, # then create the section if key not in self: self.sections.append(key) new_depth = self.depth + 1 dict.__setitem__( self, key, Section( self, new_depth, self.main, indict=value, name=key)) else: if key not in self: self.scalars.append(key) if not self.main.stringify: if isinstance(value, basestring): pass elif isinstance(value, (list, tuple)): for entry in value: if not isinstance(entry, basestring): raise TypeError('Value is not a string "%s".' % entry) else: raise TypeError('Value is not a string "%s".' % value) dict.__setitem__(self, key, value) def __delitem__(self, key): """Remove items from the sequence when deleting.""" dict. __delitem__(self, key) if key in self.scalars: self.scalars.remove(key) else: self.sections.remove(key) del self.comments[key] del self.inline_comments[key] def get(self, key, default=None): """A version of ``get`` that doesn't bypass string interpolation.""" try: return self[key] except KeyError: return default def update(self, indict): """ A version of update that uses our ``__setitem__``. """ for entry in indict: self[entry] = indict[entry] def pop(self, key, *args): """ 'D.pop(k[,d]) -> v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised' """ val = dict.pop(self, key, *args) if key in self.scalars: del self.comments[key] del self.inline_comments[key] self.scalars.remove(key) elif key in self.sections: del self.comments[key] del self.inline_comments[key] self.sections.remove(key) if self.main.interpolation and isinstance(val, basestring): return self._interpolate(key, val) return val def popitem(self): """Pops the first (key,val)""" sequence = (self.scalars + self.sections) if not sequence: raise KeyError(": 'popitem(): dictionary is empty'") key = sequence[0] val = self[key] del self[key] return key, val def clear(self): """ A version of clear that also affects scalars/sections Also clears comments and configspec. Leaves other attributes alone : depth/main/parent are not affected """ dict.clear(self) self.scalars = [] self.sections = [] self.comments = {} self.inline_comments = {} self.configspec = None self.defaults = [] self.extra_values = [] def setdefault(self, key, default=None): """A version of setdefault that sets sequence if appropriate.""" try: return self[key] except KeyError: self[key] = default return self[key] def items(self): """D.items() -> list of D's (key, value) pairs, as 2-tuples""" return zip((self.scalars + self.sections), self.values()) def keys(self): """D.keys() -> list of D's keys""" return (self.scalars + self.sections) def values(self): """D.values() -> list of D's values""" return [self[key] for key in (self.scalars + self.sections)] def iteritems(self): """D.iteritems() -> an iterator over the (key, value) items of D""" return iter(self.items()) def iterkeys(self): """D.iterkeys() -> an iterator over the keys of D""" return iter((self.scalars + self.sections)) __iter__ = iterkeys def itervalues(self): """D.itervalues() -> an iterator over the values of D""" return iter(self.values()) def __repr__(self): """x.__repr__() <==> repr(x)""" return '{%s}' % ', '.join([('%s: %s' % (repr(key), repr(self[key]))) for key in (self.scalars + self.sections)]) __str__ = __repr__ __str__.__doc__ = "x.__str__() <==> str(x)" # Extra methods - not in a normal dictionary def dict(self): """ Return a deepcopy of self as a dictionary. All members that are ``Section`` instances are recursively turned to ordinary dictionaries - by calling their ``dict`` method. >>> n = a.dict() >>> n == a 1 >>> n is a 0 """ newdict = {} for entry in self: this_entry = self[entry] if isinstance(this_entry, Section): this_entry = this_entry.dict() elif isinstance(this_entry, list): # create a copy rather than a reference this_entry = list(this_entry) elif isinstance(this_entry, tuple): # create a copy rather than a reference this_entry = tuple(this_entry) newdict[entry] = this_entry return newdict def merge(self, indict): """ A recursive update - useful for merging config files. >>> a = '''[section1] ... option1 = True ... [[subsection]] ... more_options = False ... # end of file'''.splitlines() >>> b = '''# File is user.ini ... [section1] ... option1 = False ... # end of file'''.splitlines() >>> c1 = ConfigObj(b) >>> c2 = ConfigObj(a) >>> c2.merge(c1) >>> c2 ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}}) """ for key, val in indict.items(): if (key in self and isinstance(self[key], dict) and isinstance(val, dict)): self[key].merge(val) else: self[key] = val def rename(self, oldkey, newkey): """ Change a keyname to another, without changing position in sequence. Implemented so that transformations can be made on keys, as well as on values. (used by encode and decode) Also renames comments. """ if oldkey in self.scalars: the_list = self.scalars elif oldkey in self.sections: the_list = self.sections else: raise KeyError('Key "%s" not found.' % oldkey) pos = the_list.index(oldkey) # val = self[oldkey] dict.__delitem__(self, oldkey) dict.__setitem__(self, newkey, val) the_list.remove(oldkey) the_list.insert(pos, newkey) comm = self.comments[oldkey] inline_comment = self.inline_comments[oldkey] del self.comments[oldkey] del self.inline_comments[oldkey] self.comments[newkey] = comm self.inline_comments[newkey] = inline_comment def walk(self, function, raise_errors=True, call_on_sections=False, **keywargs): """ Walk every member and call a function on the keyword and value. Return a dictionary of the return values If the function raises an exception, raise the errror unless ``raise_errors=False``, in which case set the return value to ``False``. Any unrecognised keyword arguments you pass to walk, will be pased on to the function you pass in. Note: if ``call_on_sections`` is ``True`` then - on encountering a subsection, *first* the function is called for the *whole* subsection, and then recurses into it's members. This means your function must be able to handle strings, dictionaries and lists. This allows you to change the key of subsections as well as for ordinary members. The return value when called on the whole subsection has to be discarded. See the encode and decode methods for examples, including functions. .. admonition:: caution You can use ``walk`` to transform the names of members of a section but you mustn't add or delete members. >>> config = '''[XXXXsection] ... XXXXkey = XXXXvalue'''.splitlines() >>> cfg = ConfigObj(config) >>> cfg ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}}) >>> def transform(section, key): ... val = section[key] ... newkey = key.replace('XXXX', 'CLIENT1') ... section.rename(key, newkey) ... if isinstance(val, (tuple, list, dict)): ... pass ... else: ... val = val.replace('XXXX', 'CLIENT1') ... section[newkey] = val >>> cfg.walk(transform, call_on_sections=True) {'CLIENT1section': {'CLIENT1key': None}} >>> cfg ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}}) """ out = {} # scalars first for i in range(len(self.scalars)): entry = self.scalars[i] try: val = function(self, entry, **keywargs) # bound again in case name has changed entry = self.scalars[i] out[entry] = val except Exception: if raise_errors: raise else: entry = self.scalars[i] out[entry] = False # then sections for i in range(len(self.sections)): entry = self.sections[i] if call_on_sections: try: function(self, entry, **keywargs) except Exception: if raise_errors: raise else: entry = self.sections[i] out[entry] = False # bound again in case name has changed entry = self.sections[i] # previous result is discarded out[entry] = self[entry].walk( function, raise_errors=raise_errors, call_on_sections=call_on_sections, **keywargs) return out def as_bool(self, key): """ Accepts a key as input. The corresponding value must be a string or the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to retain compatibility with Python 2.2. If the string is one of ``True``, ``On``, ``Yes``, or ``1`` it returns ``True``. If the string is one of ``False``, ``Off``, ``No``, or ``0`` it returns ``False``. ``as_bool`` is not case sensitive. Any other input will raise a ``ValueError``. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_bool('a') Traceback (most recent call last): ValueError: Value "fish" is neither True nor False >>> a['b'] = 'True' >>> a.as_bool('b') 1 >>> a['b'] = 'off' >>> a.as_bool('b') 0 """ val = self[key] if val == True: return True elif val == False: return False else: try: if not isinstance(val, basestring): # TODO: Why do we raise a KeyError here? raise KeyError() else: return self.main._bools[val.lower()] except KeyError: raise ValueError('Value "%s" is neither True nor False' % val) def as_int(self, key): """ A convenience method which coerces the specified value to an integer. If the value is an invalid literal for ``int``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_int('a') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: 'fish' >>> a['b'] = '1' >>> a.as_int('b') 1 >>> a['b'] = '3.2' >>> a.as_int('b') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: '3.2' """ return int(self[key]) def as_float(self, key): """ A convenience method which coerces the specified value to a float. If the value is an invalid literal for ``float``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_float('a') Traceback (most recent call last): ValueError: invalid literal for float(): fish >>> a['b'] = '1' >>> a.as_float('b') 1.0 >>> a['b'] = '3.2' >>> a.as_float('b') 3.2000000000000002 """ return float(self[key]) def as_list(self, key): """ A convenience method which fetches the specified value, guaranteeing that it is a list. >>> a = ConfigObj() >>> a['a'] = 1 >>> a.as_list('a') [1] >>> a['a'] = (1,) >>> a.as_list('a') [1] >>> a['a'] = [1] >>> a.as_list('a') [1] """ result = self[key] if isinstance(result, (tuple, list)): return list(result) return [result] def restore_default(self, key): """ Restore (and return) default value for the specified key. This method will only work for a ConfigObj that was created with a configspec and has been validated. If there is no default value for this key, ``KeyError`` is raised. """ default = self.default_values[key] dict.__setitem__(self, key, default) if key not in self.defaults: self.defaults.append(key) return default def restore_defaults(self): """ Recursively restore default values to all members that have them. This method will only work for a ConfigObj that was created with a configspec and has been validated. It doesn't delete or modify entries without default values. """ for key in self.default_values: self.restore_default(key) for section in self.sections: self[section].restore_defaults() class ConfigObj(Section): """An object to read, create, and write config files.""" _keyword = re.compile(r'''^ # line start (\s*) # indentation ( # keyword (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'"=].*?) # no quotes ) \s*=\s* # divider (.*) # value (including list values and comments) $ # line end ''', re.VERBOSE) _sectionmarker = re.compile(r'''^ (\s*) # 1: indentation ((?:\[\s*)+) # 2: section marker open ( # 3: section name open (?:"\s*\S.*?\s*")| # at least one non-space with double quotes (?:'\s*\S.*?\s*')| # at least one non-space with single quotes (?:[^'"\s].*?) # at least one non-space unquoted ) # section name close ((?:\s*\])+) # 4: section marker close \s*([\#\;].*)? # 5: optional comment $''', re.VERBOSE) # this regexp pulls list values out as a single string # or single values and comments # FIXME: this regex adds a '' to the end of comma terminated lists # workaround in ``_handle_value`` _valueexp = re.compile(r'''^ (?: (?: ( (?: (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#\;][^,\#\;]*?) # unquoted ) \s*,\s* # comma )* # match all list items ending in a comma (if any) ) ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#\;\s][^,]*?)| # unquoted (?:(? 1: msg = "Parsing failed with several errors.\nFirst error %s" % info error = ConfigObjError(msg) else: error = self._errors[0] # set the errors attribute; it's a list of tuples: # (error_type, message, line_number) error.errors = self._errors # set the config attribute error.config = self raise error # delete private attributes del self._errors if configspec is None: self.configspec = None else: self._handle_configspec(configspec) def _initialise(self, options=None): if options is None: options = OPTION_DEFAULTS # initialise a few variables self.filename = None self._errors = [] self.raise_errors = options['raise_errors'] self.interpolation = options['interpolation'] self.list_values = options['list_values'] self.create_empty = options['create_empty'] self.file_error = options['file_error'] self.stringify = options['stringify'] self.indent_type = options['indent_type'] self.encoding = options['encoding'] self.default_encoding = options['default_encoding'] self.BOM = False self.newlines = None self.write_empty_values = options['write_empty_values'] self.unrepr = options['unrepr'] self.initial_comment = [] self.final_comment = [] self.configspec = None if self._inspec: self.list_values = False # Clear section attributes as well Section._initialise(self) def __repr__(self): return ('ConfigObj({%s})' % ', '.join([('%s: %s' % (repr(key), repr(self[key]))) for key in (self.scalars + self.sections)])) def _handle_bom(self, infile): """ Handle any BOM, and decode if necessary. If an encoding is specified, that *must* be used - but the BOM should still be removed (and the BOM attribute set). (If the encoding is wrongly specified, then a BOM for an alternative encoding won't be discovered or removed.) If an encoding is not specified, UTF8 or UTF16 BOM will be detected and removed. The BOM attribute will be set. UTF16 will be decoded to unicode. NOTE: This method must not be called with an empty ``infile``. Specifying the *wrong* encoding is likely to cause a ``UnicodeDecodeError``. ``infile`` must always be returned as a list of lines, but may be passed in as a single string. """ if ((self.encoding is not None) and (self.encoding.lower() not in BOM_LIST)): # No need to check for a BOM # the encoding specified doesn't have one # just decode return self._decode(infile, self.encoding) if isinstance(infile, (list, tuple)): line = infile[0] else: line = infile if self.encoding is not None: # encoding explicitly supplied # And it could have an associated BOM # TODO: if encoding is just UTF16 - we ought to check for both # TODO: big endian and little endian versions. enc = BOM_LIST[self.encoding.lower()] if enc == 'utf_16': # For UTF16 we try big endian and little endian for BOM, (encoding, final_encoding) in BOMS.items(): if not final_encoding: # skip UTF8 continue if infile.startswith(BOM): ### BOM discovered ##self.BOM = True # Don't need to remove BOM return self._decode(infile, encoding) # If we get this far, will *probably* raise a DecodeError # As it doesn't appear to start with a BOM return self._decode(infile, self.encoding) # Must be UTF8 BOM = BOM_SET[enc] if not line.startswith(BOM): return self._decode(infile, self.encoding) newline = line[len(BOM):] # BOM removed if isinstance(infile, (list, tuple)): infile[0] = newline else: infile = newline self.BOM = True return self._decode(infile, self.encoding) # No encoding specified - so we need to check for UTF8/UTF16 for BOM, (encoding, final_encoding) in BOMS.items(): if not line.startswith(BOM): continue else: # BOM discovered self.encoding = final_encoding if not final_encoding: self.BOM = True # UTF8 # remove BOM newline = line[len(BOM):] if isinstance(infile, (list, tuple)): infile[0] = newline else: infile = newline # UTF8 - don't decode if isinstance(infile, basestring): return infile.splitlines(True) else: return infile # UTF16 - have to decode return self._decode(infile, encoding) # No BOM discovered and no encoding specified, just return if isinstance(infile, basestring): # infile read from a file will be a single string return infile.splitlines(True) return infile def _a_to_u(self, aString): """Decode ASCII strings to unicode if a self.encoding is specified.""" if self.encoding: return aString.decode('ascii') else: return aString def _decode(self, infile, encoding): """ Decode infile to unicode. Using the specified encoding. if is a string, it also needs converting to a list. """ if isinstance(infile, basestring): # can't be unicode # NOTE: Could raise a ``UnicodeDecodeError`` return infile.decode(encoding).splitlines(True) for i, line in enumerate(infile): if not isinstance(line, unicode): # NOTE: The isinstance test here handles mixed lists of unicode/string # NOTE: But the decode will break on any non-string values # NOTE: Or could raise a ``UnicodeDecodeError`` infile[i] = line.decode(encoding) return infile def _decode_element(self, line): """Decode element to unicode if necessary.""" if not self.encoding: return line if isinstance(line, str) and self.default_encoding: return line.decode(self.default_encoding) return line def _str(self, value): """ Used by ``stringify`` within validate, to turn non-string values into strings. """ if not isinstance(value, basestring): return str(value) else: return value def _parse(self, infile): """Actually parse the config file.""" temp_list_values = self.list_values if self.unrepr: self.list_values = False comment_list = [] done_start = False this_section = self maxline = len(infile) - 1 cur_index = -1 reset_comment = False while cur_index < maxline: if reset_comment: comment_list = [] cur_index += 1 line = infile[cur_index] sline = line.strip() # do we have anything on the line ? if not sline or sline.startswith('#') or sline.startswith(';'): reset_comment = False comment_list.append(line) continue if not done_start: # preserve initial comment self.initial_comment = comment_list comment_list = [] done_start = True reset_comment = True # first we check if it's a section marker mat = self._sectionmarker.match(line) if mat is not None: # is a section line (indent, sect_open, sect_name, sect_close, comment) = mat.groups() if indent and (self.indent_type is None): self.indent_type = indent cur_depth = sect_open.count('[') if cur_depth != sect_close.count(']'): self._handle_error("Cannot compute the section depth at line %s.", NestingError, infile, cur_index) continue if cur_depth < this_section.depth: # the new section is dropping back to a previous level try: parent = self._match_depth(this_section, cur_depth).parent except SyntaxError: self._handle_error("Cannot compute nesting level at line %s.", NestingError, infile, cur_index) continue elif cur_depth == this_section.depth: # the new section is a sibling of the current section parent = this_section.parent elif cur_depth == this_section.depth + 1: # the new section is a child the current section parent = this_section else: self._handle_error("Section too nested at line %s.", NestingError, infile, cur_index) sect_name = self._unquote(sect_name) # XXX: Commented out by Adam Plumb, Feb 5, 2010 #if sect_name in parent: # self._handle_error('Duplicate section name at line %s.', # DuplicateError, infile, cur_index) # continue ## create the new section #this_section = Section( # parent, # cur_depth, # self, # name=sect_name) #parent[sect_name] = this_section #parent.inline_comments[sect_name] = comment #parent.comments[sect_name] = comment_list if sect_name in parent: this_section = parent[sect_name] else: # create the new section this_section = Section( parent, cur_depth, self, name=sect_name) parent[sect_name] = this_section parent.inline_comments[sect_name] = comment parent.comments[sect_name] = comment_list continue # # it's not a section marker, # so it should be a valid ``key = value`` line mat = self._keyword.match(line) if mat is None: # it neither matched as a keyword # or a section marker self._handle_error( 'Invalid line at line "%s".', ParseError, infile, cur_index) else: # is a keyword value # value will include any inline comment (indent, key, value) = mat.groups() if indent and (self.indent_type is None): self.indent_type = indent # check for a multiline value if value[:3] in ['"""', "'''"]: try: value, comment, cur_index = self._multiline( value, infile, cur_index, maxline) except SyntaxError: self._handle_error( 'Parse error in value at line %s.', ParseError, infile, cur_index) continue else: if self.unrepr: comment = '' try: value = unrepr(value) except Exception, e: if type(e) == UnknownType: msg = 'Unknown name or type in value at line %s.' else: msg = 'Parse error in value at line %s.' self._handle_error(msg, UnreprError, infile, cur_index) continue else: if self.unrepr: comment = '' try: value = unrepr(value) except Exception, e: if isinstance(e, UnknownType): msg = 'Unknown name or type in value at line %s.' else: msg = 'Parse error in value at line %s.' self._handle_error(msg, UnreprError, infile, cur_index) continue else: # extract comment and lists try: (value, comment) = self._handle_value(value) except SyntaxError: self._handle_error( 'Parse error in value at line %s.', ParseError, infile, cur_index) continue # key = self._unquote(key) # XXX: Commented out by Adam Plumb, Feb 5, 2010 #if key in this_section: # self._handle_error( # 'Duplicate keyword name at line %s.', # DuplicateError, infile, cur_index) # continue # add the key. # we set unrepr because if we have got this far we will never # be creating a new section this_section.__setitem__(key, value, unrepr=True) this_section.inline_comments[key] = comment this_section.comments[key] = comment_list continue # if self.indent_type is None: # no indentation used, set the type accordingly self.indent_type = '' # preserve the final comment if not self and not self.initial_comment: self.initial_comment = comment_list elif not reset_comment: self.final_comment = comment_list self.list_values = temp_list_values def _match_depth(self, sect, depth): """ Given a section and a depth level, walk back through the sections parents to see if the depth level matches a previous section. Return a reference to the right section, or raise a SyntaxError. """ while depth < sect.depth: if sect is sect.parent: # we've reached the top level already raise SyntaxError() sect = sect.parent if sect.depth == depth: return sect # shouldn't get here raise SyntaxError() def _handle_error(self, text, ErrorClass, infile, cur_index): """ Handle an error according to the error settings. Either raise the error or store it. The error will have occured at ``cur_index`` """ line = infile[cur_index] cur_index += 1 message = text % cur_index error = ErrorClass(message, cur_index, line) if self.raise_errors: # raise the error - parsing stops here raise error # store the error # reraise when parsing has finished self._errors.append(error) def _unquote(self, value): """Return an unquoted version of a value""" if not value: # should only happen during parsing of lists raise SyntaxError if (value[0] == value[-1]) and (value[0] in ('"', "'")): value = value[1:-1] return value def _quote(self, value, multiline=True): """ Return a safely quoted version of a value. Raise a ConfigObjError if the value cannot be safely quoted. If multiline is ``True`` (default) then use triple quotes if necessary. * Don't quote values that don't need it. * Recursively quote members of a list and return a comma joined list. * Multiline is ``False`` for lists. * Obey list syntax for empty and single member lists. If ``list_values=False`` then the value is only quoted if it contains a ``\\n`` (is multiline) or '#'. If ``write_empty_values`` is set, and the value is an empty string, it won't be quoted. """ if multiline and self.write_empty_values and value == '': # Only if multiline is set, so that it is used for values not # keys, and not values that are part of a list return '' if multiline and isinstance(value, (list, tuple)): if not value: return ',' elif len(value) == 1: return self._quote(value[0], multiline=False) + ',' return ', '.join([self._quote(val, multiline=False) for val in value]) if not isinstance(value, basestring): if self.stringify: value = str(value) else: raise TypeError('Value "%s" is not a string.' % value) if not value: return '""' no_lists_no_quotes = not self.list_values and '\n' not in value and '#' not in value need_triple = multiline and ((("'" in value) and ('"' in value)) or ('\n' in value )) hash_triple_quote = multiline and not need_triple and ("'" in value) and ('"' in value) and ('#' in value) check_for_single = (no_lists_no_quotes or not need_triple) and not hash_triple_quote if check_for_single: if not self.list_values: # we don't quote if ``list_values=False`` quot = noquot # for normal values either single or double quotes will do elif '\n' in value: # will only happen if multiline is off - e.g. '\n' in key raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) elif ((value[0] not in wspace_plus) and (value[-1] not in wspace_plus) and (',' not in value)): quot = noquot else: quot = self._get_single_quote(value) else: # if value has '\n' or "'" *and* '"', it will need triple quotes quot = self._get_triple_quote(value) if quot == noquot and '#' in value and self.list_values: quot = self._get_single_quote(value) return quot % value def _get_single_quote(self, value): if ("'" in value) and ('"' in value): raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) elif '"' in value: quot = "%s" #XXX: Changed from squot by Adam Plumb Feb 8 2010 else: quot = dquot return quot def _get_triple_quote(self, value): if (value.find('"""') != -1) and (value.find("'''") != -1): raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) if value.find('"""') == -1: quot = tdquot else: quot = tsquot return quot def _handle_value(self, value): """ Given a value string, unquote, remove comment, handle lists. (including empty and single member lists) """ if self._inspec: # Parsing a configspec so don't handle comments return (value, '') # do we look for lists in values ? if not self.list_values: mat = self._nolistvalue.match(value) if mat is None: raise SyntaxError() # NOTE: we don't unquote here return mat.groups() # mat = self._valueexp.match(value) if mat is None: # the value is badly constructed, probably badly quoted, # or an invalid list raise SyntaxError() (list_values, single, empty_list, comment) = mat.groups() if (list_values == '') and (single is None): # change this if you want to accept empty values raise SyntaxError() # NOTE: note there is no error handling from here if the regex # is wrong: then incorrect values will slip through if empty_list is not None: # the single comma - meaning an empty list return ([], comment) if single is not None: # handle empty values if list_values and not single: # FIXME: the '' is a workaround because our regex now matches # '' at the end of a list if it has a trailing comma single = None else: single = single or '""' single = self._unquote(single) if list_values == '': # not a list value return (single, comment) the_list = self._listvalueexp.findall(list_values) the_list = [self._unquote(val) for val in the_list] if single is not None: the_list += [single] return (the_list, comment) def _multiline(self, value, infile, cur_index, maxline): """Extract the value, where we are in a multiline situation.""" quot = value[:3] newvalue = value[3:] single_line = self._triple_quote[quot][0] multi_line = self._triple_quote[quot][1] mat = single_line.match(value) if mat is not None: retval = list(mat.groups()) retval.append(cur_index) return retval elif newvalue.find(quot) != -1: # somehow the triple quote is missing raise SyntaxError() # while cur_index < maxline: cur_index += 1 newvalue += '\n' line = infile[cur_index] if line.find(quot) == -1: newvalue += line else: # end of multiline, process it break else: # we've got to the end of the config, oops... raise SyntaxError() mat = multi_line.match(line) if mat is None: # a badly formed line raise SyntaxError() (value, comment) = mat.groups() return (newvalue + value, comment, cur_index) def _handle_configspec(self, configspec): """Parse the configspec.""" # FIXME: Should we check that the configspec was created with the # correct settings ? (i.e. ``list_values=False``) if not isinstance(configspec, ConfigObj): try: configspec = ConfigObj(configspec, raise_errors=True, file_error=True, _inspec=True) except ConfigObjError, e: # FIXME: Should these errors have a reference # to the already parsed ConfigObj ? raise ConfigspecError('Parsing configspec failed: %s' % e) except IOError, e: raise IOError('Reading configspec failed: %s' % e) self.configspec = configspec def _set_configspec(self, section, copy): """ Called by validate. Handles setting the configspec on subsections including sections to be validated by __many__ """ configspec = section.configspec many = configspec.get('__many__') if isinstance(many, dict): for entry in section.sections: if entry not in configspec: section[entry].configspec = many for entry in configspec.sections: if entry == '__many__': continue if entry not in section: section[entry] = {} section[entry]._created = True if copy: # copy comments section.comments[entry] = configspec.comments.get(entry, []) section.inline_comments[entry] = configspec.inline_comments.get(entry, '') # Could be a scalar when we expect a section if isinstance(section[entry], Section): section[entry].configspec = configspec[entry] def _write_line(self, indent_string, entry, this_entry, comment): """Write an individual line, for the write method""" # NOTE: the calls to self._quote here handles non-StringType values. if not self.unrepr: val = self._decode_element(self._quote(this_entry)) else: val = repr(this_entry) return '%s%s%s%s%s' % (indent_string, self._decode_element(self._quote(entry, multiline=False)), self._a_to_u(' = '), val, self._decode_element(comment)) def _write_marker(self, indent_string, depth, entry, comment): """Write a section marker line""" return '%s%s%s%s%s' % (indent_string, self._a_to_u('[' * depth), self._quote(self._decode_element(entry), multiline=False), self._a_to_u(']' * depth), self._decode_element(comment)) def _handle_comment(self, comment): """Deal with a comment.""" if not comment: return '' start = self.indent_type if not comment.startswith('#'): start += self._a_to_u(' # ') return (start + comment) # Public methods def write(self, outfile=None, section=None): """ Write the current ConfigObj as a file tekNico: FIXME: use StringIO instead of real files >>> filename = a.filename >>> a.filename = 'test.ini' >>> a.write() >>> a.filename = filename >>> a == ConfigObj('test.ini', raise_errors=True) 1 """ if self.indent_type is None: # this can be true if initialised from a dictionary self.indent_type = DEFAULT_INDENT_TYPE out = [] cs = self._a_to_u('#') csp = self._a_to_u('# ') if section is None: int_val = self.interpolation self.interpolation = False section = self for line in self.initial_comment: line = self._decode_element(line) stripped_line = line.strip() if stripped_line and not stripped_line.startswith(cs): line = csp + line out.append(line) indent_string = self.indent_type * section.depth for entry in (section.scalars + section.sections): if entry in section.defaults: # don't write out default values continue for comment_line in section.comments[entry]: comment_line = self._decode_element(comment_line.lstrip()) if comment_line and not comment_line.startswith(cs): comment_line = csp + comment_line out.append(indent_string + comment_line) this_entry = section[entry] comment = self._handle_comment(section.inline_comments[entry]) if isinstance(this_entry, dict): # a section out.append(self._write_marker( indent_string, this_entry.depth, entry, comment)) out.extend(self.write(section=this_entry)) else: out.append(self._write_line( indent_string, entry, this_entry, comment)) if section is self: for line in self.final_comment: line = self._decode_element(line) stripped_line = line.strip() if stripped_line and not stripped_line.startswith(cs): line = csp + line out.append(line) self.interpolation = int_val if section is not self: return out if (self.filename is None) and (outfile is None): # output a list of lines # might need to encode # NOTE: This will *screw* UTF16, each line will start with the BOM if self.encoding: out = [l.encode(self.encoding) for l in out] if (self.BOM and ((self.encoding is None) or (BOM_LIST.get(self.encoding.lower()) == 'utf_8'))): # Add the UTF8 BOM if not out: out.append('') out[0] = BOM_UTF8 + out[0] return out # Turn the list to a string, joined with correct newlines newline = self.newlines or os.linesep output = self._a_to_u(newline).join(out) if self.encoding: output = output.encode(self.encoding) if self.BOM and ((self.encoding is None) or match_utf8(self.encoding)): # Add the UTF8 BOM output = BOM_UTF8 + output if not output.endswith(newline): output += newline if outfile is not None: outfile.write(output) else: h = open(self.filename, 'wb') h.write(output) h.close() def validate(self, validator, preserve_errors=False, copy=False, section=None): """ Test the ConfigObj against a configspec. It uses the ``validator`` object from *validate.py*. To run ``validate`` on the current ConfigObj, call: :: test = config.validate(validator) (Normally having previously passed in the configspec when the ConfigObj was created - you can dynamically assign a dictionary of checks to the ``configspec`` attribute of a section though). It returns ``True`` if everything passes, or a dictionary of pass/fails (True/False). If every member of a subsection passes, it will just have the value ``True``. (It also returns ``False`` if all members fail). In addition, it converts the values from strings to their native types if their checks pass (and ``stringify`` is set). If ``preserve_errors`` is ``True`` (``False`` is default) then instead of a marking a fail with a ``False``, it will preserve the actual exception object. This can contain info about the reason for failure. For example the ``VdtValueTooSmallError`` indicates that the value supplied was too small. If a value (or section) is missing it will still be marked as ``False``. You must have the validate module to use ``preserve_errors=True``. You can then use the ``flatten_errors`` function to turn your nested results dictionary into a flattened list of failures - useful for displaying meaningful error messages. """ if section is None: if self.configspec is None: raise ValueError('No configspec supplied.') if preserve_errors: # We do this once to remove a top level dependency on the validate module # Which makes importing configobj faster from validate import VdtMissingValue self._vdtMissingValue = VdtMissingValue section = self if copy: section.initial_comment = section.configspec.initial_comment section.final_comment = section.configspec.final_comment section.encoding = section.configspec.encoding section.BOM = section.configspec.BOM section.newlines = section.configspec.newlines section.indent_type = section.configspec.indent_type # # section.default_values.clear() #?? configspec = section.configspec self._set_configspec(section, copy) def validate_entry(entry, spec, val, missing, ret_true, ret_false): section.default_values.pop(entry, None) try: section.default_values[entry] = validator.get_default_value(configspec[entry]) except (KeyError, AttributeError, validator.baseErrorClass): # No default, bad default or validator has no 'get_default_value' # (e.g. SimpleVal) pass try: check = validator.check(spec, val, missing=missing ) except validator.baseErrorClass, e: if not preserve_errors or isinstance(e, self._vdtMissingValue): out[entry] = False else: # preserve the error out[entry] = e ret_false = False ret_true = False else: ret_false = False out[entry] = True if self.stringify or missing: # if we are doing type conversion # or the value is a supplied default if not self.stringify: if isinstance(check, (list, tuple)): # preserve lists check = [self._str(item) for item in check] elif missing and check is None: # convert the None from a default to a '' check = '' else: check = self._str(check) if (check != val) or missing: section[entry] = check if not copy and missing and entry not in section.defaults: section.defaults.append(entry) return ret_true, ret_false # out = {} ret_true = True ret_false = True unvalidated = [k for k in section.scalars if k not in configspec] incorrect_sections = [k for k in configspec.sections if k in section.scalars] incorrect_scalars = [k for k in configspec.scalars if k in section.sections] for entry in configspec.scalars: if entry in ('__many__', '___many___'): # reserved names continue if (not entry in section.scalars) or (entry in section.defaults): # missing entries # or entries from defaults missing = True val = None if copy and entry not in section.scalars: # copy comments section.comments[entry] = ( configspec.comments.get(entry, [])) section.inline_comments[entry] = ( configspec.inline_comments.get(entry, '')) # else: missing = False val = section[entry] ret_true, ret_false = validate_entry(entry, configspec[entry], val, missing, ret_true, ret_false) many = None if '__many__' in configspec.scalars: many = configspec['__many__'] elif '___many___' in configspec.scalars: many = configspec['___many___'] if many is not None: for entry in unvalidated: val = section[entry] ret_true, ret_false = validate_entry(entry, many, val, False, ret_true, ret_false) unvalidated = [] for entry in incorrect_scalars: ret_true = False if not preserve_errors: out[entry] = False else: ret_false = False msg = 'Value %r was provided as a section' % entry out[entry] = validator.baseErrorClass(msg) for entry in incorrect_sections: ret_true = False if not preserve_errors: out[entry] = False else: ret_false = False msg = 'Section %r was provided as a single value' % entry out[entry] = validator.baseErrorClass(msg) # Missing sections will have been created as empty ones when the # configspec was read. for entry in section.sections: # FIXME: this means DEFAULT is not copied in copy mode if section is self and entry == 'DEFAULT': continue if section[entry].configspec is None: unvalidated.append(entry) continue if copy: section.comments[entry] = configspec.comments.get(entry, []) section.inline_comments[entry] = configspec.inline_comments.get(entry, '') check = self.validate(validator, preserve_errors=preserve_errors, copy=copy, section=section[entry]) out[entry] = check if check == False: ret_true = False elif check == True: ret_false = False else: ret_true = False section.extra_values = unvalidated if preserve_errors and not section._created: # If the section wasn't created (i.e. it wasn't missing) # then we can't return False, we need to preserve errors ret_false = False # if ret_false and preserve_errors and out: # If we are preserving errors, but all # the failures are from missing sections / values # then we can return False. Otherwise there is a # real failure that we need to preserve. ret_false = not any(out.values()) if ret_true: return True elif ret_false: return False return out def reset(self): """Clear ConfigObj instance and restore to 'freshly created' state.""" self.clear() self._initialise() # FIXME: Should be done by '_initialise', but ConfigObj constructor (and reload) # requires an empty dictionary self.configspec = None # Just to be sure ;-) self._original_configspec = None def reload(self): """ Reload a ConfigObj from file. This method raises a ``ReloadError`` if the ConfigObj doesn't have a filename attribute pointing to a file. """ if not isinstance(self.filename, basestring): raise ReloadError() filename = self.filename current_options = {} for entry in OPTION_DEFAULTS: if entry == 'configspec': continue current_options[entry] = getattr(self, entry) configspec = self._original_configspec current_options['configspec'] = configspec self.clear() self._initialise(current_options) self._load(filename, configspec) class SimpleVal(object): """ A simple validator. Can be used to check that all members expected are present. To use it, provide a configspec with all your members in (the value given will be ignored). Pass an instance of ``SimpleVal`` to the ``validate`` method of your ``ConfigObj``. ``validate`` will return ``True`` if all members are present, or a dictionary with True/False meaning present/missing. (Whole missing sections will be replaced with ``False``) """ def __init__(self): self.baseErrorClass = ConfigObjError def check(self, check, member, missing=False): """A dummy check method, always returns the value unchanged.""" if missing: raise self.baseErrorClass() return member def flatten_errors(cfg, res, levels=None, results=None): """ An example function that will turn a nested dictionary of results (as returned by ``ConfigObj.validate``) into a flat list. ``cfg`` is the ConfigObj instance being checked, ``res`` is the results dictionary returned by ``validate``. (This is a recursive function, so you shouldn't use the ``levels`` or ``results`` arguments - they are used by the function.) Returns a list of keys that failed. Each member of the list is a tuple:: ([list of sections...], key, result) If ``validate`` was called with ``preserve_errors=False`` (the default) then ``result`` will always be ``False``. *list of sections* is a flattened list of sections that the key was found in. If the section was missing (or a section was expected and a scalar provided - or vice-versa) then key will be ``None``. If the value (or section) was missing then ``result`` will be ``False``. If ``validate`` was called with ``preserve_errors=True`` and a value was present, but failed the check, then ``result`` will be the exception object returned. You can use this as a string that describes the failure. For example *The value "3" is of the wrong type*. """ if levels is None: # first time called levels = [] results = [] if res == True: return results if res == False or isinstance(res, Exception): results.append((levels[:], None, res)) if levels: levels.pop() return results for (key, val) in res.items(): if val == True: continue if isinstance(cfg.get(key), dict): # Go down one level levels.append(key) flatten_errors(cfg[key], val, levels, results) continue results.append((levels[:], key, val)) # # Go up one level if levels: levels.pop() # return results def get_extra_values(conf, _prepend=()): """ Find all the values and sections not in the configspec from a validated ConfigObj. ``get_extra_values`` returns a list of tuples where each tuple represents either an extra section, or an extra value. The tuples contain two values, a tuple representing the section the value is in and the name of the extra values. For extra values in the top level section the first member will be an empty tuple. For values in the 'foo' section the first member will be ``('foo',)``. For members in the 'bar' subsection of the 'foo' section the first member will be ``('foo', 'bar')``. NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't been validated it will return an empty list. """ out = [] out.extend((_prepend, name) for name in conf.extra_values) for name in conf.sections: if name not in conf.extra_values: out.extend(get_extra_values(conf[name], _prepend + (name,))) return out """*A programming language is a medium of expression.* - Paul Graham""" rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/client.py000066400000000000000000001735251230007774300223310ustar00rootroot00000000000000# # client.py # import os import os.path import re import shutil import fnmatch import time from string import ascii_letters, digits from datetime import datetime from mimetypes import guess_type import subprocess import dulwich.errors import dulwich.repo import dulwich.objects from dulwich.pack import Pack from dulwich.index import commit_index, write_index_dict, SHA1Writer #from dulwich.patch import write_tree_diff from exceptions import * import util from objects import * from config import GittyupLocalFallbackConfig from command import GittyupCommand TZ = -1 * time.timezone ENCODING = "UTF-8" 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 get_tmp_path(filename): tmpdir = "/tmp/rabbitvcs" if not os.path.isdir(tmpdir): os.mkdir(tmpdir) class GittyupClient: 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, {}) finally: f.close() def _get_index(self): if self.repo.has_index() == False: 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, e: tree = dulwich.objects.Tree() return tree def _get_working_tree(self): return self.repo[commit_index(self.repo.object_store, self._get_index())] 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]] = (item[1], item[2]) 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) response = proc.communicate()[0].split() version = response[2].split(".") self.git_version = version return self.git_version except Exception, e: return None def _version_greater_than(self, version1, version2): len1 = len(version1) len2 = len(version2) max = 5 # Pad the version lists so they are the same length if max > len1: version1 += [0] * (max-len1) if max > len2: version2 += [0] * (max-len2) if version1[0] > version2[0]: return True if (version1[0] == version2[0] and version1[1] > version2[1]): return True if (version1[0] == version2[0] and version1[1] == version2[1] and version1[2] > version2[2]): return True if (version1[0] == version2[0] and version1[1] == version2[1] and version1[2] == version2[2] and version1[3] > version2[3]): return True if (version1[0] == version2[0] and version1[1] == version2[1] and version1[2] == version2[2] and version1[3] == version2[3] and version1[4] > version2[4]): return True return False 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")) finally: 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 = GittyupLocalFallbackConfig(self.repo.path) def _get_config_user(self): try: config_user_name = self.config.get("user", "name") config_user_email = 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() return "%s <%s>" % (config_user_name, config_user_email) def _write_packed_refs(self, refs): packed_refs_str = "" for ref,sha in refs.items(): packed_refs_str = "%s %s\n" % (sha, ref) fd = open(os.path.join(self.repo.controldir(), "packed-refs"), "wb") fd.write(packed_refs_str) fd.close() def _remove_from_index(self, index, key): del index._byname[key] # # Start Public Methods # def initialize_repository(self, path, bare=False): if not os.path.isdir(path): os.mkdir(path) cmd = ["git", "init"] if bare: cmd.append("--bare") cmd.append(path) try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=path, notify=self.notify, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) 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 = 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): if path == self.repo.path: return "" return util.relativepath(self.repo.path, path) def get_absolute_path(self, path): return os.path.join(self.repo.path, path).rstrip("/") def track(self, name): self.repo.refs.set_symbolic_ref("HEAD", name) def is_tracking(self, name): return (self.repo.refs.read_ref("HEAD")[5:] == name) def tracking(self): return self.repo.refs.read_ref("HEAD")[5:] def head(self): return self.repo.refs["HEAD"] def get_sha1_from_refspec(self, refspec): if refspec in self.repo.refs: return self.repo.refs[refspec] else: return None def stage(self, paths): """ Stage files to be committed or tracked @type paths: list @param paths: A list of files """ index = self._get_index() if type(paths) in (str, unicode): paths = [paths] for path in paths: relative_path = self.get_relative_path(path) absolute_path = self.get_absolute_path(path) blob = self._get_blob_from_file(absolute_path) if relative_path in index: (ctime, mtime, dev, ino, mode, uid, gid, size, blob_id, flags) = index[relative_path] else: flags = 0 # make sure mtime and ctime is updated every time a file is staged (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(path) index[relative_path] = (ctime, mtime, dev, ino, mode, uid, gid, size, blob.id, flags) index.write() self.notify({ "action": "Staged", "path": absolute_path, "mime_type": guess_type(absolute_path)[0] }) self.repo.object_store.add_object(blob) 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) if os.path.isfile(abs_path): self.stage(abs_path) if status == MissingStatus: self._remove_from_index(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 type(paths) in (str, unicode): paths = [paths] for path in paths: relative_path = self.get_relative_path(path) 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: self._remove_from_index(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") cmd += [name, commit_sha] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel).execute() except GittyupCommandError, 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"] 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, 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) 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, 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 try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=base_dir, notify=self.notify_and_parse_progress, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) 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 """ if not committer: committer = self._get_config_user() if not committer: raise GittyupCommandError("A committer was not specified") if not author: author = self._get_config_user() if not author: raise GittyupCommandError("An author was not specified") if commit_all: self.stage_all() commit = dulwich.objects.Commit() commit.message = message commit.tree = commit_index(self.repo.object_store, self._get_index()) initial_commit = False try: commit.parents = (parents and parents or [self.repo.head()]) except KeyError: # The initial commit has no parent initial_commit = True pass commit.committer = committer commit.commit_time = (commit_time and commit_time or int(time.time())) commit.commit_timezone = (commit_timezone and commit_timezone or TZ) commit.author = author commit.author_time = (author_time and author_time or int(time.time())) commit.author_timezone = (author_timezone and author_timezone or TZ) commit.encoding = (encoding and encoding or ENCODING) self.repo.object_store.add_object(commit) self.repo.refs["HEAD"] = commit.id if initial_commit: self.track("refs/heads/master") # Get the branch for this repository. branch_full = self.repo.refs.read_ref("HEAD") if (branch_full != None): branch_components = re.search("refs/heads/(.+)", branch_full) if (branch_components != None): branch = branch_components.group(1) self.notify("[" + commit.id + "] -> " + branch) self.notify("To branch: " + 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 type(paths) in (str, unicode): paths = [paths] index = self._get_index() for path in paths: relative_path = self.get_relative_path(path) if relative_path in index: self._remove_from_index(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: if name.startswith(relative_source): source_files.append(name) else: source_files.append(self.get_relative_path(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)) index[new_path] = index[source_file] self._remove_from_index(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) try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_pull, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) def push(self, repository="origin", refspec="master"): """ 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 """ self.numberOfCommandStages = 2 cmd = ["git", "push", "--progress", repository, refspec] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify_and_parse_git_push, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) def fetch(self, host): """ Fetch objects from a remote repository. This will not merge the files into the local working copy, use pull for that. @type host: string @param host: The git url from which to fetch """ client, host_path = util.get_transport_and_path(host) graphwalker = self.repo.get_graph_walker() f, commit = self.repo.object_store.add_pack() refs = client.fetch_pack(host_path, self.repo.object_store.determine_wants_all, graphwalker, f.write, self.callback_notify) commit() return refs 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, 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, 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, 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, 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, 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, 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 """ self._get_config_user() cmd = ["git", "tag", "-m", message, name, revision] try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) return def tag_delete(self, name): """ Delete a tag @type name: string @param name: The name of the tag to delete """ ref_name = "refs/tags/%s" % name 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 refs.items(): if 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, e: self.callback_notify(e) statuses = [] modified_files = [] for line in stdout: components = re.match("^([\sA-Z\?]+)\s(.*?)$", line) if components: status = components.group(1) strip_status = status.strip() path = components.group(2) if status == " D": statuses.append(MissingStatus(path)) elif strip_status 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, 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, 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, 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, e: pass for file,data in files_hash.items(): ignore_file=False untracked_file=False for ignored_path in ignored_directories: if ignored_path in file: ignore_file=True break for untracked_path in untracked_directories: if 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 # Check if directory includes modified files for file in modified_files: if file.startswith(d): 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, 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, e: pass # Calculate statuses for untracked files for name,data in files_hash.items(): try: inTreeIndex = tree[name] except Exception, e: inTreeIndex = False try: inIndex = index[name] except Exception, 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 = [] version = self._get_git_version() if version and self._version_greater_than(version, [1,7,-1]): return self.status_porcelain(path) else: return self.status_dulwich(path) def log(self, path="", skip=0, limit=None, revision="", showtype="all"): cmd = ["git", "--no-pager", "log", "--numstat", "--parents", "--pretty=fuller", "--date-order"] if showtype == "all": cmd.append("--all") if limit: cmd.append("-%s" % limit) if skip: cmd.append("--skip=%s" % skip) if revision: 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, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) return [] revisions = [] revision = {} changed_file = {} for line in stdout: if line == "": continue if line[0:6] == "commit": if revision: if "changed_paths" not in revision: revision["changed_paths"] = {} revisions.append(revision) revision = {} changed_file = {} commit_line = line.split(" ") revision["commit"] = commit_line[1] 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 not changed_file: revision["changed_paths"] = [] if len(file_line) == 3: changed_file = { "additions": file_line[0], "removals": file_line[1], "path": file_line[2] } 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, 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, 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 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] if summarize: cmd.append("--name-status") try: (status, stdout, stderr) = GittyupCommand(cmd, cwd=self.repo.path, notify=self.notify, cancel=self.get_cancel).execute() except GittyupCommandError, e: self.callback_notify(e) stdout = [] return "\n".join(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.split("\t") 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] if not os.path.isdir(dest_path): os.mkdir(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, 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, 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, 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 rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/command.py000066400000000000000000000032311230007774300224530ustar00rootroot00000000000000# # command.py # import subprocess import fcntl import select import os from exceptions import GittyupCommandError def notify_func(data): pass def cancel_func(): return False class GittyupCommand: def __init__(self, command, cwd=None, notify=None, cancel=None): self.command = command self.notify = notify_func if notify: self.notify = notify self.get_cancel = cancel_func if cancel: self.get_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"; 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, universal_newlines=True) stdout = [] while True: line = proc.stdout.readline() if line == '': break line = line.rstrip('\n') # Strip trailing newline. self.notify(line) stdout.append(line) if self.get_cancel(): proc.kill() return (0, stdout, None) rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/config.py000066400000000000000000000211061230007774300223030ustar00rootroot00000000000000# # config.py # import os import warnings from _configobj.configobj import ConfigObj def get_local_config_path(repository_path): return repository_path + "/.git/config" def get_global_config_path(): return os.path.expanduser("~/.gitconfig") def get_system_config_path(): return "/etc/gitconfig" class GittyupConfig: def __init__(self, path): """ Provides direct access to any arbitrary git config file @type path string @param path The git config file path """ self.path = path self._config = ConfigObj(path, indent_type="\t") def set(self, section, key, value): if section not in self._config: self._config[section] = {} self._config[section][key] = value def get(self, section, key): try: return self._config[section][key] except KeyError: return u"" def has(self, section, key=None): if section in self._config: if key is None: return True else: return (key in self._config[section]) def rename(self, section, old_key, new_key): self._config[section][new_key] = self._config[section][old_key] del self._config[section][old_key] def get_all(self): return self._config.items() def set_section(self, section, items): self._config[section] = items def get_section(self, section): return self._config[section] def rename_section(self, old_section, new_section): self._config[new_section] = self._config[old_section] del self._config[old_section] def remove_section(self, section): del self._config[section] def get_inline_comment(self, section, key): if key is not None: return self._config[section].inline_comments[key] else: return self._config.inline_comments[section] def set_inline_comment(self, section, key, value): if section not in self._config.inline_comments: self._config.inline_comments[section] = {} if key is not None: self._config[section].inline_comments[key] = value else: self._config.inline_comments[section] = value def remove_inline_comment(self, section, key): if key is not None: del self._config[section].inline_comments[key] else: self._config.inline_comments[section] def get_comment(self, section, key): if key is not None: return self._config[section].comments[key] else: return self._config.comments[section] def set_comment(self, section, key, value): if section not in self._config.comments: self._config[section].comments = {} if key is not None: self._config[section].comments[key] = value else: self._config.comments[section] = value def remove_comment(self, section, key): if key is not None: del self._config[section].comments[key] else: del self._config.comments[section] def write(self): self._config.write() class GittyupLocalConfig(GittyupConfig): def __init__(self, repository_path): """ Provides direct access to a local repository's git config file @type repository_path string @param repository_path The root folder of a git repository """ GittyupConfig.__init__(self, get_local_config_path(repository_path)) class GittyupGlobalConfig(GittyupConfig): def __init__(self): """ Provides direct access to the global-level git config file """ GittyupConfig.__init__(self, get_global_config_path()) class GittyupSystemConfig(GittyupConfig): def __init__(self): """ Provides direct access to the system-level git config file """ GittyupConfig.__init__(self, get_system_config_path()) def write(self): try: self._config.write() except IOError, e: warnings.warn("Can't write to system git config file, %s" % str(e), UserWarning) class GittyupFallbackConfig: """ An abstract class to provide transparent support for accessing local, global, and system-level git config files. Must be sub-classed. """ def set(self, section, key, value): self._config(section, key).set(section, key, value) def get(self, section, key): return self._config(section, key).get(section, key) def has(self, section, key=None): return self._config(section, key).has(section, key) def rename(self, section, old_key, new_key): self._config(section, old_key).rename(section, old_key, new_key) def get_all(self): raise NotImplementedError() def set_section(self, section, items): self._config(section).set_section(section, items) def get_section(self, section): return self._config(section).get_section(section) def rename_section(self, old_section, new_section): self._config(old_section).rename_section(old_section, new_section) def remove_section(self, section): self._config(section).remove_section(section) def get_inline_comment(self, section, key): return self._config(section, key).get_inline_comment(section, key) def set_inline_comment(self, section, key, value): self._config(section, key).set_inline_comment(section, key, value) def remove_inline_comment(self, section, key): self._config(section, key).remove_inline_comment(section, key) def get_comment(self, section, key): return self._config(section, key).get_comment(section, key) def set_comment(self, section, key, value): self._config(section, key).set_comment(section, key, value) def remove_comment(self, section, key): self._config(section, key).remove_comment(section, key) def _config(self, section, key=None): raise NotImplementedError() def _write(self): raise NotImplementedError() class GittyupLocalFallbackConfig(GittyupFallbackConfig): def __init__(self, repository_path): """ Provides transparent access to the local, global, and system-level git config files. @type repository_path string @param repository_path The root folder of a git repository """ self._local = GittyupLocalConfig(repository_path) self._global = GittyupGlobalConfig() self._system = GittyupSystemConfig() self._must_write_to_system = False def _config(self, section, key=None): if self._local.has(section, key): return self._local elif self._system.has(section, key): self._must_write_to_system = True return self._system elif self._global.has(section, key): return self._global else: return self._local def write(self): self._local.write() self._global.write() if self._must_write_to_system: # Only root can write to the system config file, so only do it # if we must self._system.write() def get_all(self): ret = self._local._config ret.update(self._global._config) ret.update(self._system._config) return ret.items() class GittyupGlobalFallbackConfig(GittyupFallbackConfig): def __init__(self): """ Provides transparent access to the global and system-level git config files. It is useful for when you want to set global or system level config parameters, but don't need to access a local repository. """ self._global = GittyupGlobalConfig() self._system = GittyupSystemConfig() self._must_write_to_system = False def _config(self, section, key=None): if self._global.has(section, key): return self._global elif self._system.has(section, key): self._must_write_to_system = True return self._system else: return self._global def write(self): self._global.write() if self._must_write_to_system: # Only root can write to the system config file, so only do it # if we must self._system.write() def get_all(self): ret = self._global._config ret.update(self._system._config) return ret.items() rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/exceptions.py000066400000000000000000000022201230007774300232130ustar00rootroot00000000000000# # exceptions.py # class NotRepositoryError(Exception): """Indicates that no Git repository was found.""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) class NotTreeError(Exception): """Indicates the given sha1 hash does not point to a valid Tree""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) class NotCommitError(Exception): """Indicates the given sha1 hash does not point to a valid Commit""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) class NotBlobError(Exception): """Indicates the given sha1 hash does not point to a valid Blob""" def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) class NotTagError(Exception): """Indicates the given sha1 hash does not point to a valid Commit""" 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.16/rabbitvcs/vcs/git/gittyup/objects.py000066400000000000000000000072541230007774300224770ustar00rootroot00000000000000# # objects.py # class GittyupStatus: 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: 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.obj.name def __eq__(self, other): return (self.name == other) rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/tests/000077500000000000000000000000001230007774300216265ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/tests/branch.py000066400000000000000000000030241230007774300234340ustar00rootroot00000000000000# # 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 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 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.16/rabbitvcs/vcs/git/gittyup/tests/clone.py000066400000000000000000000012531230007774300233010ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/commit.py000066400000000000000000000020031230007774300234630ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/config.py000066400000000000000000000034441230007774300234520ustar00rootroot00000000000000# # 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 from gittyup.config import GittyupLocalFallbackConfig, GittyupConfig, GittyupSystemConfig parser = OptionParser() parser.add_option("-c", "--cleanup", action="store_true", default=False) (options, args) = parser.parse_args(argv) DIR = "config" if options.cleanup: rmtree(DIR, ignore_errors=True) print "config.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) c = GittyupLocalFallbackConfig(DIR) # Create config items c.set("core", "filemode", True) c.set("core", "repositoryformatversion", 0) # Add comments c.set_comment("core", "filemode", ["Regular comment"]) c.set_inline_comment("core", "repositoryformatversion", "inline repo format comment") # Create new section/items and then rename them c.set("newsection", "newitem", "Val A") c.rename_section("newsection", "newsection_RE") c.rename("newsection_RE", "newitem", "newitem_RE") c.write() del c c = GittyupLocalFallbackConfig(DIR) assert (c.has("newsection_RE", "newitem_RE")) assert (c.get_comment("core", "filemode")[0].find("Regular comment") != -1) assert (c.get_inline_comment("core", "repositoryformatversion").find("inline repo format comment") != -1) del c c = GittyupConfig("./data/config/config.example") assert (c.has("diff", "renames")) del c c = GittyupSystemConfig() c.set("section", "key", "value") c.write() print "config.py pass" rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/tests/data/000077500000000000000000000000001230007774300225375ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/tests/data/config/000077500000000000000000000000001230007774300240045ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/tests/data/config/config.example000066400000000000000000000005641230007774300266330ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/move.py000066400000000000000000000034011230007774300231440ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/pull.py000066400000000000000000000013401230007774300231520ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/remote.py000066400000000000000000000016521230007774300234770ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/remove.py000066400000000000000000000026001230007774300234730ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/run_all.py000077500000000000000000000010561230007774300236410ustar00rootroot00000000000000#!/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", "config.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.16/rabbitvcs/vcs/git/gittyup/tests/stage.py000066400000000000000000000037131230007774300233070ustar00rootroot00000000000000# # 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() assert (st[0] == AddedStatus) assert (st[1] == AddedStatus) assert (st[0].is_staged) # Unstage both files g.unstage([DIR+"/test1.txt", DIR+"/test2.txt"]) st = g.status() 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() 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() assert (st[0] == ModifiedStatus) g.stage_all() st = g.status() 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() 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.16/rabbitvcs/vcs/git/gittyup/tests/tag.py000066400000000000000000000020161230007774300227520ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/git/gittyup/tests/util.py000066400000000000000000000002761230007774300231620ustar00rootroot00000000000000# # util.py # import os def touch(fname, times = None): with file(fname, 'a'): os.utime(fname, times) def change(path): f = open(path, "a") f.write("1") f.close() rabbitvcs-0.16/rabbitvcs/vcs/git/gittyup/util.py000066400000000000000000000037101230007774300220140ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/log.py000066400000000000000000000037711230007774300173370ustar00rootroot00000000000000# # 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 DATETIME_FORMAT = rabbitvcs.util.helper.LOCAL_DATETIME_FORMAT class LogChangedPath: 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: 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.16/rabbitvcs/vcs/mercurial/000077500000000000000000000000001230007774300201575ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/mercurial/__init__.py000066400000000000000000000176011230007774300222750ustar00rootroot00000000000000# # 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. """ import os.path from datetime import datetime from mercurial import commands, ui, hg import rabbitvcs.util.helper 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: """ 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 __unicode__(self): if self.value: return unicode(self.value) else: return self.kind def short(self): if self.value: return unicode(self.value)[0:7] else: return self.kind def __str__(self): return self.__unicode__() def __repr__(self): return self.__unicode__() def primitive(self): return self.value class Mercurial: 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, 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.16/rabbitvcs/vcs/mercurial/util.py000066400000000000000000000047201230007774300215110ustar00rootroot00000000000000# # 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.16/rabbitvcs/vcs/status.py000066400000000000000000000365431230007774300201040ustar00rootroot00000000000000# # 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 from datetime import datetime import rabbitvcs.vcs from rabbitvcs.util.log import Log 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, e: self.authors.append(status.author) author_index = len(self.authors) -1 try: revision_index = self.revisions.index(status.revision) except ValueError, e: self.revisions.append(status.revision) revision_index = len(self.revisions) -1 self.cache[path] = ( content_index, metadata_index, revision_index, author_index, status.date ) except Exception, e: log.debug(e) def __getitem__(self, path): try: (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] return Status(path, content, metadata, revision=revision, author=author, date=date) except Exception, e: log.debug(e) def __delitem__(self, path): try: del self.cache[path] except KeyError, 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 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) 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() 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__'] 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): base = "/path/to/test" children = [ os.path.join(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) if __name__ == "__main__": unittest.main() rabbitvcs-0.16/rabbitvcs/vcs/svn/000077500000000000000000000000001230007774300170025ustar00rootroot00000000000000rabbitvcs-0.16/rabbitvcs/vcs/svn/__init__.py000066400000000000000000001577301230007774300211300ustar00rootroot00000000000000# # 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. """ 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 import rabbitvcs.util.helper from rabbitvcs.util.log import Log log = Log("rabbitvcs.vcs.svn") from rabbitvcs import gettext _ = gettext.gettext # Extra "action" for "commit completed" commit_completed = "commit_completed" class Revision: """ 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 = unicode(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, e: log.exception(e) def __unicode__(self): if self.value: return unicode(self.value) else: return self.kind def short(self): return self.__unicode__() def __str__(self): return self.__unicode__() def __repr__(self): return self.__unicode__() def primitive(self): return self.__revision class SVN: """ """ 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 = 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 = 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 = map(str, [ pysvn.wc_status_kind.unversioned, pysvn.wc_status_kind.obstructed ]) STATUSES_FOR_RESOLVE = map(str, [ pysvn.wc_status_kind.conflicted ]) STATUSES_FOR_CHECK = 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_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. """ if path in self.cache: if invalidate: del self.cache[path] else: return self.cache.find_path_statuses(path) on_error = rabbitvcs.vcs.status.Status.status_unknown(path) if not self.is_in_a_or_a_working_copy(path): return [on_error] depth = pysvn.depth.infinity if recurse else pysvn.depth.empty try: pysvn_statuses = self.client.status(path, depth=depth, 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: rabbitvcs_status = rabbitvcs.vcs.status.SVNStatus(st) self.cache[st.path] = rabbitvcs_status statuslist.append(rabbitvcs_status) return statuslist except pysvn.ClientError, ex: # TODO: uncommenting these might not be a good idea #~ traceback.print_exc() log.debug("Exception occured 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(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, ".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): 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, recurse=summarize) if summarize: path_status = None for st in all_statuses: if st.path == path: 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, 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 return (self.find_repository_path(os.path.split(path)[0]) != "") 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, 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, 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 try: is_locked = self.client.info2(path, recurse=False)[0][1].lock is not None except pysvn.ClientError, 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, 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 "" info = self.client_info(path) returner = "" try: returner = info["url"].encode('latin1') except Exception, 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. """ info = self.client.info2(path, recurse=False) returner = "" try: returner = info[0][1]["repos_root_URL"] except Exception, 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, e: log.exception("KeyError exception in svn.py get_revision() for %s" % path) except AttributeError, 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, e: log.exception("KeyError exception in svn.py get_head() for %s" % path) except AttributeError, 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 += 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( prop_name, props, path, recurse=recurse ) return True except pysvn.ClientError, e: log.exception("pysvn.ClientError exception in svn.py propset() for %s" % path) except TypeError, e: log.exception("TypeError exception in svn.py propset() %s" % path) 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. """ 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(path) 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, e: log.exception("pysvn.ClientError exception in svn.py propget() for %s" % path) return "" try: returner = returner[path] except KeyError, 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( prop_name, path, recurse=recurse ) returner = True except pysvn.ClientError, e: log.exception("pysvn.ClientError exception in svn.py propdel() for %s" % path) except TypeError, e: log.exception("TypeError exception in svn.py propdel() %s" % path) 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(prop_name, prop_value, 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(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( prop_name, 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( prop_name, 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(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 = 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.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 = rabbitvcs.util.helper.urlize(src) dest = rabbitvcs.util.helper.urlize(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(sources, 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 = rabbitvcs.util.helper.urlize(url) return self.client.checkout(url, 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(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(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(paths, 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(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) 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. """ if os.path.exists(dest_path): if os.path.isdir(dest_path): shutil.rmtree(dest_path) else: os.remove(dest_path) return self.client.export(src_url_or_path, 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 = rabbitvcs.util.helper.urlize(url) return self.client.import_(path, url, 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(url_or_path, 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 = rabbitvcs.util.helper.urlize(from_url) to_url = rabbitvcs.util.helper.urlize(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 """ 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(sources, 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(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(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(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 = rabbitvcs.util.helper.urlize(url) return self.client.switch(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(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(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(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(source, ranges_to_merge, peg_revision.primitive(), 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, 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 record_only: boolean @param record_only: unsure TODO: Will firm up the parameter documentation later """ url_or_path1 = rabbitvcs.util.helper.urlize(url_or_path1) url_or_path2 = rabbitvcs.util.helper.urlize(url_or_path2) return self.client.merge(url_or_path1, revision1.primitive(), url_or_path2, revision2.primitive(), local_path, force, recurse, 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(url_or_path, revision.primitive(), local_path, 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(tmp_path, url_or_path, revision1.primitive(), 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(url_or_path1, revision1.primitive(), url_or_path2, revision2.primitive(), recurse, ignore_ancestry) def list(self, url_or_path, revision=Revision("HEAD"), recurse=True): url_or_path = rabbitvcs.util.helper.urlize(url_or_path) return self.client.list(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(url_or_path, 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 rabbitvcs.util.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 def is_version_greater_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.16/scripts/000077500000000000000000000000001230007774300151115ustar00rootroot00000000000000rabbitvcs-0.16/scripts/README000066400000000000000000000013201230007774300157650ustar00rootroot00000000000000Scripts 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.16/scripts/import_launchpad_translations.sh000077500000000000000000000011511230007774300236000ustar00rootroot00000000000000#!/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.16/scripts/initialize_new_translation.sh000077500000000000000000000005311230007774300230770ustar00rootroot00000000000000#!/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.16/scripts/install_po_files.sh000077500000000000000000000003671230007774300210040ustar00rootroot00000000000000#!/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.16/scripts/install_translation.sh000077500000000000000000000005151230007774300215350ustar00rootroot00000000000000#!/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.16/scripts/sync_strings.sh000077500000000000000000000013631230007774300202000ustar00rootroot00000000000000#!/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.16/setup.cfg000066400000000000000000000000461230007774300152430ustar00rootroot00000000000000[bdist_rpm] group = Development/Tools rabbitvcs-0.16/setup.py000066400000000000000000000131421230007774300151350ustar00rootroot00000000000000#!/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].lstrip().rstrip() #============================================================================== # 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.16.0" 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 = "Bruce van der Kooij" author_email = "brucevdkooij@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", icon_theme_directory], stdout=subprocess.PIPE ).communicate()[0]