summaryrefslogtreecommitdiffstats
path: root/kioslave
diff options
context:
space:
mode:
Diffstat (limited to 'kioslave')
-rw-r--r--kioslave/Makefile.am6
-rw-r--r--kioslave/svn/AUTHORS1
-rw-r--r--kioslave/svn/COPYING481
-rw-r--r--kioslave/svn/Makefile.am15
-rw-r--r--kioslave/svn/README40
-rw-r--r--kioslave/svn/TODO74
-rw-r--r--kioslave/svn/configure.in.bot9
-rw-r--r--kioslave/svn/configure.in.in157
-rw-r--r--kioslave/svn/icons/Makefile.am1
-rw-r--r--kioslave/svn/icons/cr128-action-svn_add.pngbin0 -> 12287 bytes
-rw-r--r--kioslave/svn/icons/cr128-action-svn_branch.pngbin0 -> 12256 bytes
-rw-r--r--kioslave/svn/icons/cr128-action-svn_merge.pngbin0 -> 5183 bytes
-rw-r--r--kioslave/svn/icons/cr128-action-svn_remove.pngbin0 -> 12607 bytes
-rw-r--r--kioslave/svn/icons/cr128-action-svn_status.pngbin0 -> 14500 bytes
-rw-r--r--kioslave/svn/icons/cr128-action-svn_switch.pngbin0 -> 12428 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_add.pngbin0 -> 801 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_branch.pngbin0 -> 858 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_merge.pngbin0 -> 565 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_remove.pngbin0 -> 660 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_status.pngbin0 -> 926 bytes
-rw-r--r--kioslave/svn/icons/cr16-action-svn_switch.pngbin0 -> 752 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_add.pngbin0 -> 1232 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_branch.pngbin0 -> 1261 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_merge.pngbin0 -> 924 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_remove.pngbin0 -> 1041 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_status.pngbin0 -> 1392 bytes
-rw-r--r--kioslave/svn/icons/cr22-action-svn_switch.pngbin0 -> 1257 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_add.pngbin0 -> 1888 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_branch.pngbin0 -> 2093 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_merge.pngbin0 -> 1347 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_remove.pngbin0 -> 1694 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_status.pngbin0 -> 2326 bytes
-rw-r--r--kioslave/svn/icons/cr32-action-svn_switch.pngbin0 -> 2048 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_add.pngbin0 -> 3318 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_branch.pngbin0 -> 3527 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_merge.pngbin0 -> 2004 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_remove.pngbin0 -> 3064 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_status.pngbin0 -> 4072 bytes
-rw-r--r--kioslave/svn/icons/cr48-action-svn_switch.pngbin0 -> 3524 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_add.pngbin0 -> 4653 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_branch.pngbin0 -> 5140 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_merge.pngbin0 -> 2624 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_remove.pngbin0 -> 4472 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_status.pngbin0 -> 6036 bytes
-rw-r--r--kioslave/svn/icons/cr64-action-svn_switch.pngbin0 -> 5161 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_add.svgzbin0 -> 81728 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_branch.svgzbin0 -> 7200 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_merge.svgzbin0 -> 9170 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_remove.svgzbin0 -> 82210 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_status.svgzbin0 -> 3590 bytes
-rw-r--r--kioslave/svn/icons/crsc-action-svn_switch.svgzbin0 -> 8258 bytes
-rw-r--r--kioslave/svn/ksvnd/Makefile.am13
-rw-r--r--kioslave/svn/ksvnd/commitdlg.ui116
-rw-r--r--kioslave/svn/ksvnd/commitdlg.ui.h30
-rw-r--r--kioslave/svn/ksvnd/ksvnd.cpp351
-rw-r--r--kioslave/svn/ksvnd/ksvnd.desktop50
-rw-r--r--kioslave/svn/ksvnd/ksvnd.h69
-rw-r--r--kioslave/svn/svn+file.protocol43
-rw-r--r--kioslave/svn/svn+http.protocol43
-rw-r--r--kioslave/svn/svn+https.protocol43
-rw-r--r--kioslave/svn/svn+ssh.protocol43
-rw-r--r--kioslave/svn/svn.cpp1593
-rw-r--r--kioslave/svn/svn.h140
-rw-r--r--kioslave/svn/svn.protocol43
-rw-r--r--kioslave/svn/svnhelper/Makefile.am18
-rw-r--r--kioslave/svn/svnhelper/apply_patch.desktop94
-rw-r--r--kioslave/svn/svnhelper/kio_svn_helper.cpp292
-rw-r--r--kioslave/svn/svnhelper/kio_svn_helper.h41
-rw-r--r--kioslave/svn/svnhelper/subversion.desktop919
-rw-r--r--kioslave/svn/svnhelper/subversion_toplevel.desktop97
-rw-r--r--kioslave/svn/svnhelper/subversioncheckout.ui204
-rw-r--r--kioslave/svn/svnhelper/subversiondiff.ui100
-rw-r--r--kioslave/svn/svnhelper/subversionlog.ui100
-rw-r--r--kioslave/svn/svnhelper/subversionswitch.ui204
74 files changed, 5430 insertions, 0 deletions
diff --git a/kioslave/Makefile.am b/kioslave/Makefile.am
new file mode 100644
index 00000000..93c6570c
--- /dev/null
+++ b/kioslave/Makefile.am
@@ -0,0 +1,6 @@
+if include_kioslave_svn
+SVN_SUBDIR = svn
+endif
+
+SUBDIRS= $(SVN_SUBDIR)
+
diff --git a/kioslave/svn/AUTHORS b/kioslave/svn/AUTHORS
new file mode 100644
index 00000000..75a6fbc9
--- /dev/null
+++ b/kioslave/svn/AUTHORS
@@ -0,0 +1 @@
+Mickael Marchand <marchand@kde.org>
diff --git a/kioslave/svn/COPYING b/kioslave/svn/COPYING
new file mode 100644
index 00000000..f5030495
--- /dev/null
+++ b/kioslave/svn/COPYING
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, 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 library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, 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 companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/kioslave/svn/Makefile.am b/kioslave/svn/Makefile.am
new file mode 100644
index 00000000..1253820d
--- /dev/null
+++ b/kioslave/svn/Makefile.am
@@ -0,0 +1,15 @@
+SUBDIRS = ksvnd svnhelper icons
+
+INCLUDES = $(SVN_INCLUDE) $(all_includes)
+
+kde_module_LTLIBRARIES = kio_svn.la
+
+kio_svn_la_SOURCES = svn.cpp
+kio_svn_la_LIBADD = -lkio
+kio_svn_la_LDFLAGS = -avoid-version -module $(all_libraries) $(KDE_PLUGIN) $(SVNLD) $(SVN_LIB)
+
+protocol_DATA = svn+http.protocol svn+https.protocol svn+file.protocol svn+ssh.protocol svn.protocol
+protocoldir = $(kde_servicesdir)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kio_svn.pot
diff --git a/kioslave/svn/README b/kioslave/svn/README
new file mode 100644
index 00000000..6d851afa
--- /dev/null
+++ b/kioslave/svn/README
@@ -0,0 +1,40 @@
+This is a kio_subversion. It allows you to browse a (remote) Subversion repository.
+The expected URLs are something like : svn+http://svn.collab.net/repos/svn
+This will show you the current HEAD version of the repository (just like the one you would get
+with http://svn.collab.net/repos/svn).
+You can also try : svn+http://svn.collab.net/repos/svn?rev=500 so that it displays the revision 500.
+
+REQUIREMENTS:
+------------
+Subversion libraries >= 0.37.0 (http://subversion.tigris.org)
+
+FEATURES:
+---------
+Supported protocols :
+svn+http://hostname/path?rev=revision_number
+svn+https://hostname/path?rev=revision_number
+svn+ssh://hostname/path?rev=revision_number
+svn://hostname/path?rev=revision_number
+svn+file://repository/path?rev=revision_number
+
+INSTALL:
+--------
+you need the svn client library which is distributed by subversion.
+on Debian : apt-get install libsvn0-dev will do everything you need.
+
+you can pass the following arguments to configure to help it find your
+subversion/apr installations :
+
+--with-apr-config=FILE Use the given path to apr-config when determining APR configuration; defaults to "apr-config"
+--with-apu-config=FILE Use the given path to apu-config when determining APR util configuration; defaults to "apu-config"
+--with-subversion-dir=DIR where Subversion is installed
+--with-svn-include=DIR Use the given path to the subversion headers.
+--with-svn-lib=DIR Use the given path to the subversion libraries.
+
+BUGS:
+-----
+- file modifications time are wrong in konqui
+- kio_svn crashes often with subversion 1.2-rc2, needs investigation
+any other ?
+please report
+
diff --git a/kioslave/svn/TODO b/kioslave/svn/TODO
new file mode 100644
index 00000000..b5bbe683
--- /dev/null
+++ b/kioslave/svn/TODO
@@ -0,0 +1,74 @@
+For the menu options, tortoise SVN has something like below.
+We can follow this to some extent:
+
+Folder not in SVN at all:
+
+SVN Checkout
+Svn:
+ Export
+ Create Repository here
+ Import
+ ----
+ Settings...
+ Help
+
+A folder and a file in an SVN folder and in the SVN repository
+
+SVN Update
+SVN Commit....
+Svn:
+ Show Log
+ Check for modifications
+ Revision Graph
+ ----
+ Update to revision...
+ Rename...
+ Delete
+ Revert
+ Cleanup
+ ----
+ Branch/tag...
+ Switch...
+ Merge...
+ Export...
+ Relocate...
+ ----
+ Add (?)
+ ----
+ Create Patch...
+ Apply Patch...
+ ----
+ Settings...
+ Help
+
+A file in an SVN folder and in SVN repository
+
+SVN Update
+SVN Commit....
+Svn:
+ Show Log
+ Check for modifications
+ Revision Graph
+ ----
+ Update to revision...
+ Rename...
+ Delete
+ Revert
+ Cleanup
+ ----
+ Branch/tag...
+ Switch...
+ Merge...
+ Blame...
+ ----
+ Settings...
+ Help
+
+
+A file in SVN folder, but not in repos
+
+Svn:
+ Add
+ Add to ignore list
+
+
diff --git a/kioslave/svn/configure.in.bot b/kioslave/svn/configure.in.bot
new file mode 100644
index 00000000..ccab94db
--- /dev/null
+++ b/kioslave/svn/configure.in.bot
@@ -0,0 +1,9 @@
+if test "x$with_subversion" = xcheck && test -z "$SVN_SUBDIR"; then
+ echo ""
+ echo "You're missing Subversion libraries (1.x)"
+ echo "KDE will not be able to browse Subversion repositories without it,"
+ echo "consider installing it."
+ echo "Look at kioslave/svn/README for more information"
+ echo ""
+ all_tests=bad
+fi
diff --git a/kioslave/svn/configure.in.in b/kioslave/svn/configure.in.in
new file mode 100644
index 00000000..9e962c08
--- /dev/null
+++ b/kioslave/svn/configure.in.in
@@ -0,0 +1,157 @@
+AC_ARG_WITH(subversion,
+ [AC_HELP_STRING(--with-subversion,
+ [enable support for subversion @<:@default=check@:>@])],
+ [], with_subversion=check)
+
+SVN_SUBDIR=""
+if test "x$with_subversion" != xno; then
+
+APR_CONFIGS="apr-config apr-1-config /usr/local/apr/bin/apr-config"
+SVN_SUBDIR="svn"
+AC_ARG_WITH(apr-config,
+[[ --with-apr-config=FILE Use the given path to apr-config when determining
+ APR configuration; defaults to "apr-config"]],
+[
+ if test "$withval" != "yes" -a "$withval" != ""; then
+ APR_CONFIGS=$withval
+ fi
+])
+AC_MSG_CHECKING([for APR])
+APR_CONFIG=""
+for VALUE in $APR_CONFIGS ; do
+ if $VALUE --cflags > /dev/null; then
+ APR_CONFIG=$VALUE
+ break
+ fi
+done
+test $VALUE && APR_CONFIG=$VALUE
+if test $APR_CONFIG ; then
+ AC_MSG_RESULT([found])
+else
+ AC_MSG_RESULT([not found])
+ SVN_SUBDIR=
+dnl AC_MSG_ERROR([APR is required. Try --with-apr-config.])
+fi
+
+APR_CPPFLAGS="`$APR_CONFIG --cppflags`"
+APR_INCLUDE="`$APR_CONFIG --includes`"
+APR_LIBS="`$APR_CONFIG --link-ld --libs`"
+
+dnl
+dnl APR util
+dnl
+
+APU_CONFIGS="apu-config apu-1-config /usr/local/apr/bin/apu-config"
+AC_ARG_WITH(apu-config,
+[[ --with-apu-config=FILE Use the given path to apu-config when determining
+ APR util configuration; defaults to "apu-config"]],
+[
+ if test "$withval" != "yes" -a "$withval" != ""; then
+ APU_CONFIGS=$withval
+ fi
+])
+AC_MSG_CHECKING([for APR util])
+APU_CONFIG=""
+for VALUE in $APU_CONFIGS ; do
+ if $VALUE --includes > /dev/null; then
+ APU_CONFIG=$VALUE
+ break
+ fi
+done
+if test $APU_CONFIG ; then
+ AC_MSG_RESULT([found])
+else
+ AC_MSG_RESULT([not found])
+ SVN_SUBDIR=
+dnl AC_MSG_ERROR([APR util is required. Try --with-apu-config.])
+fi
+dnl APR_CPPFLAGS="$APR_CPPFLAGS `$APU_CONFIG --includes`"
+APR_INCLUDE="$APR_INCLUDE `$APU_CONFIG --includes`"
+APR_LIBS="$APR_LIBS `$APU_CONFIG --link-ld --libs`"
+
+AC_MSG_CHECKING(for Subversion svn-config)
+AC_ARG_WITH(subversion-dir,
+ [ --with-subversion-dir=DIR where Subversion is installed ],
+ [
+ SVNCONFIG="$withval/bin/svn-config"
+ ])
+
+if test -z "$SVNCONFIG"; then
+ _SVNCONFIG="`svn-config --prefix 2> /dev/null`"
+ if test -n "$_SVNCONFIG"; then
+ SVNCONFIG="$_SVNCONFIG/bin/svn-config"
+ fi
+fi
+
+AC_SUBST(SVNCONFIG)
+if test -x "$SVNCONFIG"; then
+ SVNLD="`$SVNCONFIG --ldflags`"
+ SVN_LIB="`$SVNCONFIG --libs` -lsvn_client-1"
+ SVN_CPPFLAGS="`$SVNCONFIG --cppflags`"
+ dnl ugly hack for subversion svn-config problems in 0.14.x, to be removed when svn-config is fixed
+ SVN_INCLUDE="`$SVNCONFIG --includes` -I$_SVNCONFIG/include/subversion-1/"
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(not found)
+ SVNLD=""
+ dnl just a fallback to debian's config so that it works for me :)
+ SVN_INCLUDES="/usr/local/include /usr/include"
+ AC_ARG_WITH(svn-include,
+ [[ --with-svn-include=DIR Use the given path to the subversion headers.]],
+ [
+ if test "$withval" != "yes" -a "$withval" != ""; then
+ SVN_INCLUDES=$withval
+ fi
+ ])
+ AC_MSG_CHECKING([for Subversion headers])
+ SVN_INCLUDE=""
+ for VALUE in $SVN_INCLUDES ; do
+ if test -f $VALUE/subversion-1/svn_types.h ; then
+ SVN_INCLUDE="-I$VALUE"
+ break
+ fi
+ done
+ if test $SVN_INCLUDE ; then
+ AC_MSG_RESULT([found])
+ else
+ AC_MSG_RESULT([not found])
+ SVN_SUBDIR=
+dnl AC_MSG_ERROR([Subversion headers are required. Try --with-svn-include.])
+ fi
+ SVN_LIBS="/usr/local/lib /usr/lib /usr/lib64"
+ AC_ARG_WITH(svn-lib,
+ [[ --with-svn-lib=DIR Use the given path to the subversion libraries.]],
+ [
+ if test "$withval" != "yes" -a "$withval" != ""; then
+ SVN_LIBS=$withval
+ fi
+ ])
+ AC_MSG_CHECKING([for Subversion libraries])
+ SVN_LIB=""
+ for VALUE in $SVN_LIBS ; do
+ if ls $VALUE/libsvn_client-1.* 1>/dev/null 2>&1; then
+ SVN_LIB="-L$VALUE"
+ break
+ fi
+ done
+ if test $SVN_LIB ; then
+ AC_MSG_RESULT([found])
+ else
+ AC_MSG_RESULT([not found])
+ SVN_SUBDIR=
+ fi
+fi
+SVN_LIB="$SVN_LIB $APR_LIBS -lsvn_client-1"
+SVN_INCLUDE="$SVN_INCLUDE $APR_INCLUDE"
+SVN_CPPFLAGS="$APR_CPPFLAGS $SVN_CPPFLAGS"
+
+if test "x$with_subversion" != xcheck && test -z "$SVN_SUBDIR"; then
+ AC_MSG_ERROR([--with-subversion was given, but test for subversion failed])
+fi
+fi
+
+AC_SUBST(SVN_INCLUDE)
+AC_SUBST(SVN_LIB)
+AC_SUBST(SVN_CPPFLAGS)
+AC_SUBST(SVNLD)
+AM_CONDITIONAL(include_kioslave_svn, test -n "$SVN_SUBDIR")
diff --git a/kioslave/svn/icons/Makefile.am b/kioslave/svn/icons/Makefile.am
new file mode 100644
index 00000000..a4b97f06
--- /dev/null
+++ b/kioslave/svn/icons/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON=AUTO
diff --git a/kioslave/svn/icons/cr128-action-svn_add.png b/kioslave/svn/icons/cr128-action-svn_add.png
new file mode 100644
index 00000000..0b26fdbc
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr128-action-svn_branch.png b/kioslave/svn/icons/cr128-action-svn_branch.png
new file mode 100644
index 00000000..9fafce71
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr128-action-svn_merge.png b/kioslave/svn/icons/cr128-action-svn_merge.png
new file mode 100644
index 00000000..8d534b3a
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr128-action-svn_remove.png b/kioslave/svn/icons/cr128-action-svn_remove.png
new file mode 100644
index 00000000..2af59d2f
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr128-action-svn_status.png b/kioslave/svn/icons/cr128-action-svn_status.png
new file mode 100644
index 00000000..bcbfaaa3
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr128-action-svn_switch.png b/kioslave/svn/icons/cr128-action-svn_switch.png
new file mode 100644
index 00000000..74fbded1
--- /dev/null
+++ b/kioslave/svn/icons/cr128-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_add.png b/kioslave/svn/icons/cr16-action-svn_add.png
new file mode 100644
index 00000000..70769a36
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_branch.png b/kioslave/svn/icons/cr16-action-svn_branch.png
new file mode 100644
index 00000000..f8c701f0
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_merge.png b/kioslave/svn/icons/cr16-action-svn_merge.png
new file mode 100644
index 00000000..1321a5fd
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_remove.png b/kioslave/svn/icons/cr16-action-svn_remove.png
new file mode 100644
index 00000000..8f6f3040
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_status.png b/kioslave/svn/icons/cr16-action-svn_status.png
new file mode 100644
index 00000000..8ad00fd7
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr16-action-svn_switch.png b/kioslave/svn/icons/cr16-action-svn_switch.png
new file mode 100644
index 00000000..c28b3b98
--- /dev/null
+++ b/kioslave/svn/icons/cr16-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_add.png b/kioslave/svn/icons/cr22-action-svn_add.png
new file mode 100644
index 00000000..249005eb
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_branch.png b/kioslave/svn/icons/cr22-action-svn_branch.png
new file mode 100644
index 00000000..db729c2a
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_merge.png b/kioslave/svn/icons/cr22-action-svn_merge.png
new file mode 100644
index 00000000..08b1a53f
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_remove.png b/kioslave/svn/icons/cr22-action-svn_remove.png
new file mode 100644
index 00000000..3005c2ac
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_status.png b/kioslave/svn/icons/cr22-action-svn_status.png
new file mode 100644
index 00000000..5561af4b
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr22-action-svn_switch.png b/kioslave/svn/icons/cr22-action-svn_switch.png
new file mode 100644
index 00000000..e6a92dcc
--- /dev/null
+++ b/kioslave/svn/icons/cr22-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_add.png b/kioslave/svn/icons/cr32-action-svn_add.png
new file mode 100644
index 00000000..63b987bd
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_branch.png b/kioslave/svn/icons/cr32-action-svn_branch.png
new file mode 100644
index 00000000..4fbd9c3f
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_merge.png b/kioslave/svn/icons/cr32-action-svn_merge.png
new file mode 100644
index 00000000..0b2b42e2
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_remove.png b/kioslave/svn/icons/cr32-action-svn_remove.png
new file mode 100644
index 00000000..5a213d57
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_status.png b/kioslave/svn/icons/cr32-action-svn_status.png
new file mode 100644
index 00000000..5fb3df96
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr32-action-svn_switch.png b/kioslave/svn/icons/cr32-action-svn_switch.png
new file mode 100644
index 00000000..28724155
--- /dev/null
+++ b/kioslave/svn/icons/cr32-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_add.png b/kioslave/svn/icons/cr48-action-svn_add.png
new file mode 100644
index 00000000..4f4f7f34
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_branch.png b/kioslave/svn/icons/cr48-action-svn_branch.png
new file mode 100644
index 00000000..d7fe093e
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_merge.png b/kioslave/svn/icons/cr48-action-svn_merge.png
new file mode 100644
index 00000000..a052acb1
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_remove.png b/kioslave/svn/icons/cr48-action-svn_remove.png
new file mode 100644
index 00000000..df562606
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_status.png b/kioslave/svn/icons/cr48-action-svn_status.png
new file mode 100644
index 00000000..f98d11eb
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr48-action-svn_switch.png b/kioslave/svn/icons/cr48-action-svn_switch.png
new file mode 100644
index 00000000..131d897d
--- /dev/null
+++ b/kioslave/svn/icons/cr48-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_add.png b/kioslave/svn/icons/cr64-action-svn_add.png
new file mode 100644
index 00000000..54091c32
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_add.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_branch.png b/kioslave/svn/icons/cr64-action-svn_branch.png
new file mode 100644
index 00000000..74deadc6
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_branch.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_merge.png b/kioslave/svn/icons/cr64-action-svn_merge.png
new file mode 100644
index 00000000..b73ec742
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_merge.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_remove.png b/kioslave/svn/icons/cr64-action-svn_remove.png
new file mode 100644
index 00000000..db521dc3
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_remove.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_status.png b/kioslave/svn/icons/cr64-action-svn_status.png
new file mode 100644
index 00000000..fba134bc
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_status.png
Binary files differ
diff --git a/kioslave/svn/icons/cr64-action-svn_switch.png b/kioslave/svn/icons/cr64-action-svn_switch.png
new file mode 100644
index 00000000..84fd6ee5
--- /dev/null
+++ b/kioslave/svn/icons/cr64-action-svn_switch.png
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_add.svgz b/kioslave/svn/icons/crsc-action-svn_add.svgz
new file mode 100644
index 00000000..8092028e
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_add.svgz
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_branch.svgz b/kioslave/svn/icons/crsc-action-svn_branch.svgz
new file mode 100644
index 00000000..1622c9f6
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_branch.svgz
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_merge.svgz b/kioslave/svn/icons/crsc-action-svn_merge.svgz
new file mode 100644
index 00000000..56f18c44
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_merge.svgz
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_remove.svgz b/kioslave/svn/icons/crsc-action-svn_remove.svgz
new file mode 100644
index 00000000..cf0db832
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_remove.svgz
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_status.svgz b/kioslave/svn/icons/crsc-action-svn_status.svgz
new file mode 100644
index 00000000..1a6ba518
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_status.svgz
Binary files differ
diff --git a/kioslave/svn/icons/crsc-action-svn_switch.svgz b/kioslave/svn/icons/crsc-action-svn_switch.svgz
new file mode 100644
index 00000000..4717aac2
--- /dev/null
+++ b/kioslave/svn/icons/crsc-action-svn_switch.svgz
Binary files differ
diff --git a/kioslave/svn/ksvnd/Makefile.am b/kioslave/svn/ksvnd/Makefile.am
new file mode 100644
index 00000000..a466be08
--- /dev/null
+++ b/kioslave/svn/ksvnd/Makefile.am
@@ -0,0 +1,13 @@
+#INCLUDES= -I$(top_srcdir)/kwallet/client $(all_includes)
+INCLUDES= $(all_includes)
+
+kde_module_LTLIBRARIES = kded_ksvnd.la
+
+kded_ksvnd_la_SOURCES = commitdlg.ui ksvnd.cpp ksvnd.skel
+kded_ksvnd_la_METASOURCES = AUTO
+kded_ksvnd_la_LDFLAGS = $(all_libraries) -module -avoid-version
+#kded_ksvnd_la_LIBADD = $(top_builddir)/kwallet/client/libkwalletclient.la $(LIB_KIO)
+kded_ksvnd_la_LIBADD = $(LIB_KIO)
+
+kded_DATA = ksvnd.desktop
+kdeddir = $(kde_servicesdir)/kded
diff --git a/kioslave/svn/ksvnd/commitdlg.ui b/kioslave/svn/ksvnd/commitdlg.ui
new file mode 100644
index 00000000..7425e5c9
--- /dev/null
+++ b/kioslave/svn/ksvnd/commitdlg.ui
@@ -0,0 +1,116 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>CommitDlg</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CommitDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>451</width>
+ <height>337</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Log Message</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>textMessage</cstring>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>listMessage</cstring>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>220</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pushButton1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>pushButton2</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>pushButton1</sender>
+ <signal>clicked()</signal>
+ <receiver>CommitDlg</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>pushButton2</sender>
+ <signal>clicked()</signal>
+ <receiver>CommitDlg</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">commitdlg.ui.h</include>
+</includes>
+<functions>
+ <function>setLog( const QString &amp; comment )</function>
+ <function returnType="QString">logMessage() const</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/kioslave/svn/ksvnd/commitdlg.ui.h b/kioslave/svn/ksvnd/commitdlg.ui.h
new file mode 100644
index 00000000..296d55c0
--- /dev/null
+++ b/kioslave/svn/ksvnd/commitdlg.ui.h
@@ -0,0 +1,30 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+
+void CommitDlg::setLog( const QString & comment )
+{
+listMessage->setText(comment);
+}
+
+
+QString CommitDlg::logMessage() const
+{
+return textMessage->text();
+}
diff --git a/kioslave/svn/ksvnd/ksvnd.cpp b/kioslave/svn/ksvnd/ksvnd.cpp
new file mode 100644
index 00000000..c9701647
--- /dev/null
+++ b/kioslave/svn/ksvnd/ksvnd.cpp
@@ -0,0 +1,351 @@
+/*
+ This file is part of the KDE Project
+
+ Copyright (C) 2003, 2004 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 library; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <qdir.h>
+#include <qfile.h>
+
+#include "config.h"
+
+#include "ksvnd.h"
+#include "commitdlg.h"
+
+extern "C" {
+ KDE_EXPORT KDEDModule *create_ksvnd(const QCString &name) {
+ return new KSvnd(name);
+ }
+}
+
+KSvnd::KSvnd(const QCString &name)
+ : KDEDModule(name) {
+}
+
+KSvnd::~KSvnd() {
+}
+
+QString KSvnd::commitDialog(QString modifiedFiles) {
+ CommitDlg commitDlg;
+ commitDlg.setLog( modifiedFiles );
+ int result = commitDlg.exec();
+ if ( result == QDialog::Accepted ) {
+ return commitDlg.logMessage();
+ } else
+ return QString::null;
+}
+
+bool KSvnd::AreAnyFilesInSvn( const KURL::List& wclist ) {
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ kdDebug( 7128 ) << "Checking file " << ( *it ) << endl;
+ QDir bdir ( ( *it ).path() );
+ if ( bdir.exists() && QFile::exists( ( *it ).path() + "/.svn/entries" ) ) {
+ return true;
+ } else if ( !bdir.exists() ) {
+ if ( isFileInSvnEntries( ( *it ).fileName(), ( *it ).directory() + "/.svn/entries" ) || isFileInExternals ( ( *it ).fileName(), ( *it ).directory()+"/.svn/dir-props" ) )
+ return true;
+ }
+ }
+ return false;
+}
+
+bool KSvnd::AreAnyFilesNotInSvn( const KURL::List& wclist ) {
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ kdDebug( 7128 ) << "Checking file " << ( *it ) << endl;
+ QDir bdir ( ( *it ).path() );
+ if ( bdir.exists() && !QFile::exists( ( *it ).path() + "/.svn/entries" ) ) {
+ return true;
+ } else if ( !bdir.exists() ) {
+ if ( !isFileInSvnEntries( ( *it ).fileName(),( *it ).directory() + "/.svn/entries" ) && !isFileInExternals ( ( *it ).fileName(), ( *it ).directory()+"/.svn/dir-props" ) )
+ return true;
+ }
+ }
+ return false;
+}
+
+bool KSvnd::AreAllFilesInSvn( const KURL::List& wclist ) {
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ kdDebug( 7128 ) << "Checking file " << ( *it ) << endl;
+ QDir bdir ( ( *it ).path() );
+ if ( bdir.exists() && !QFile::exists( ( *it ).path() + "/.svn/entries" ) ) {
+ return false;
+ } else if ( !bdir.exists() ) {
+ if ( !isFileInSvnEntries( ( *it ).fileName(),( *it ).directory() + "/.svn/entries" ) && !isFileInExternals ( ( *it ).fileName(), ( *it ).directory()+"/.svn/dir-props" ) )
+ return false;
+ }
+ }
+ return true;
+}
+
+bool KSvnd::AreAllFilesNotInSvn( const KURL::List& wclist ) {
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ kdDebug( 7128 ) << "Checking file " << ( *it ) << endl;
+ QDir bdir ( ( *it ).path() );
+ if ( bdir.exists() && QFile::exists( ( *it ).path() + "/.svn/entries" ) ) {
+ return false;
+ } else if ( !bdir.exists() ) {
+ if ( isFileInSvnEntries( ( *it ).fileName(),( *it ).directory() + "/.svn/entries" ) || isFileInExternals ( ( *it ).fileName(), ( *it ).directory()+"/.svn/dir-props" ) )
+ return false;
+ }
+ }
+ return true;
+}
+
+bool KSvnd::isFileInSvnEntries ( const QString filename, const QString entfile ) {
+ QFile file( entfile );
+ if ( file.open( IO_ReadOnly ) ) {
+ QTextStream stream( &file );
+ QString line;
+ while ( !stream.atEnd() ) {
+ line = stream.readLine().simplifyWhiteSpace();
+ if ( line == "name=\""+ filename + "\"" ) {
+ file.close();
+ return true;
+ }
+ }
+ file.close();
+ }
+ return false;
+}
+
+bool KSvnd::isFileInExternals ( const QString filename, const QString propfile ) {
+ QFile file( propfile );
+ if ( file.open( IO_ReadOnly ) ) {
+ QTextStream stream( &file );
+ QStringList line;
+ while ( !stream.atEnd() )
+ line << stream.readLine().simplifyWhiteSpace();
+ for ( uint i = 0 ; i < line.count(); i++ ) {
+ if ( line[ i ] == "K 13" && line[ i+1 ] == "svn:externals" ) { //Key 13 : svn:externals
+ //next line should be "V xx"
+ if ( line [ i+2 ].startsWith( "V " ) ) {
+ //ok browse the values now
+ i+=2;
+ while ( i < line.count() ) {
+ if ( line[ i ].startsWith( filename+" " ) ) { //found it !
+ file.close( );
+ return true;
+ } else if ( line[ i ].isEmpty() ) {
+ file.close( );
+ return false; //we are out of svn:externals now...
+ }
+ i++;
+ }
+ }
+ }
+ }
+ file.close();
+ }
+ return false;
+}
+
+bool KSvnd::anyNotValidWorkingCopy( const KURL::List& wclist ) {
+ bool result = true; //one negative match is enough
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ //exception for .svn dirs
+ if ( ( *it ).path(-1).endsWith( "/.svn" ) )
+ return true;
+ //if is a directory check whether it contains a .svn/entries file
+ QDir dir( ( *it ).path() );
+ if ( dir.exists() ) { //it's a dir
+ if ( !QFile::exists( ( *it ).path() + "/.svn/entries" ) )
+ result = false;
+ }
+
+ //else check if ./.svn/entries exists
+ if ( !QFile::exists( ( *it ).directory() + "/.svn/entries" ) )
+ result = false;
+ }
+ return result;
+}
+
+bool KSvnd::anyValidWorkingCopy( const KURL::List& wclist ) {
+ for ( QValueListConstIterator<KURL> it = wclist.begin(); it != wclist.end() ; ++it ) {
+ //skip .svn dirs
+ if ( ( *it ).path(-1).endsWith( "/.svn" ) )
+ continue;
+ //if is a directory check whether it contains a .svn/entries file
+ QDir dir( ( *it ).path() );
+ if ( dir.exists() ) { //it's a dir
+ if ( QFile::exists( ( *it ).path() + "/.svn/entries" ) )
+ return true;
+ }
+
+ //else check if ./.svn/entries exists
+ if ( QFile::exists( ( *it ).directory() + "/.svn/entries" ) )
+ return true;
+ }
+ return false;
+}
+
+int KSvnd::getStatus( const KURL::List& list ) {
+ int result = 0;
+ uint files = 0, folders = 0, parentsentries = 0, parentshavesvn = 0, subdirhavesvn = 0, external = 0;
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ if ( isFolder ( ( *it ) ) ) {
+ folders++;
+ } else {
+ files++;
+ }
+ if ( isFileInSvnEntries ( (*it).filename(),( *it ).directory() + "/.svn/entries" ) ) { // normal subdir known in the working copy
+ parentsentries++;
+ } else if ( isFolder( *it ) ) { // other subfolders (either another module checkouted or an external, or something not known at all)
+ if ( QFile::exists( ( *it ).path() + "/.svn/entries" ) )
+ subdirhavesvn++;
+ if ( isFileInExternals( (*it).filename(), ( *it ).directory() + "/.svn/dir-props" ) ) {
+ external++;
+ }
+ }
+ if ( ( isFolder( ( *it ) ) && QFile::exists( ( *it ).directory() + "../.svn/entries" ) ) || QFile::exists( ( *it ).directory() + "/.svn/entries" ) ) //parent has a .svn ?
+ parentshavesvn++;
+ }
+ if ( files > 0 )
+ result |= SomeAreFiles;
+ if ( folders == list.count() ) {
+ result |= AllAreFolders;
+ result |= SomeAreFolders;
+ }
+ if ( folders > 0 )
+ result |= SomeAreFolders;
+ if ( parentsentries == list.count() ) {
+ result |= AllAreInParentsEntries;
+ result |= SomeAreInParentsEntries;
+ } else if ( parentsentries != 0 )
+ result |= SomeAreInParentsEntries;
+ if ( parentshavesvn == list.count() ) {
+ result |= AllParentsHaveSvn;
+ result |= SomeParentsHaveSvn;
+ } else if ( parentshavesvn > 0 )
+ result |= SomeParentsHaveSvn;
+ if ( subdirhavesvn == list.count() ) {
+ result |= AllHaveSvn;
+ result |= SomeHaveSvn;
+ } else if ( subdirhavesvn > 0 )
+ result |= SomeHaveSvn;
+ if ( external == list.count() ) {
+ result |= AllAreExternalToParent;
+ result |= SomeAreExternalToParent;
+ } else if ( external > 0 )
+ result |= SomeAreExternalToParent;
+
+ return result;
+}
+
+bool KSvnd::isFolder( const KURL& url ) {
+ QDir d( url.path() );
+ return d.exists();
+}
+
+QStringList KSvnd::getActionMenu ( const KURL::List &list ) {
+ QStringList result;
+ int listStatus = getStatus( list );
+
+ if ( !(listStatus & SomeAreInParentsEntries) &&
+ !(listStatus & SomeAreExternalToParent) &&
+ !(listStatus & SomeHaveSvn)) {
+ if( list.size() == 1 && listStatus & SomeAreFolders) {
+ result << "Checkout";
+ result << "Export";
+// result << "CreateRepository";
+ result << "Import";
+ }
+ } else if ( (listStatus & AllAreInParentsEntries) ) {
+ result << "Diff";
+ //In SVN
+// result << "ShowLog";
+// result << "CheckForModifications";
+// result << "RevisionGraph";
+// result << "_SEPARATOR_";
+// result << "Update to revision..."
+ result << "Rename";
+ result << "Delete";
+ if( listStatus & SomeAreFolders && !(listStatus & SomeAreFiles)) {
+ result << "Revert";
+// result << "Cleanup";
+ }
+ result << "_SEPARATOR_";
+// result << "BranchTag";
+ result << "Switch";
+ result << "Merge";
+ if( listStatus & SomeAreFolders && !(listStatus & SomeAreFiles)) {
+// result << "Export";
+// result << "Relocate";
+ result << "_SEPARATOR_";
+ result << "Add";
+ }
+ result << "_SEPARATOR_";
+ if( listStatus & SomeAreFiles && !(listStatus & SomeAreFolders)) {
+ result << "Blame";
+ }
+ result << "CreatePatch";
+
+ if( list.size() == 1 && listStatus & SomeAreFolders) {
+// result << "ApplyPatchToFolder";
+ }
+ }
+ return result;
+}
+
+QStringList KSvnd::getTopLevelActionMenu ( const KURL::List &list ) {
+ QStringList result;
+ int listStatus = getStatus( list );
+
+
+ if ( ( listStatus & AllParentsHaveSvn &&
+ ( ( listStatus & SomeAreExternalToParent ) || ( listStatus & SomeAreInParentsEntries ) )
+ || ( listStatus & SomeHaveSvn ) )
+ ) {
+ result << "Update";
+ result << "Commit";
+ }
+
+ return result;
+}
+
+#if 0
+void KSvnd::notify(const QString& path, int action, int kind, const QString& mime_type, int content_state, int prop_state, long int revision, const QString& userstring) {
+ kdDebug(7128) << "KDED/Subversion : notify " << path << " action : " << action << " mime_type : " << mime_type << " content_state : " << content_state << " prop_state : " << prop_state << " revision : " << revision << " userstring : " << userstring << endl;
+ QByteArray params;
+
+ QDataStream stream(params, IO_WriteOnly);
+ stream << path << action << kind << mime_type << content_state << prop_state << revision << userstring;
+
+ emitDCOPSignal( "subversionNotify(QString,int,int,QString,int,int,long int,QString)", params );
+}
+
+void KSvnd::status(const QString& path, int text_status, int prop_status, int repos_text_status, int repos_prop_status, long int rev ) {
+ kdDebug(7128) << "KDED/Subversion : status " << path << " " << text_status << " " << prop_status << " "
+ << repos_text_status << " " << repos_prop_status << " " << rev << endl;
+ QByteArray params;
+
+ QDataStream stream(params, IO_WriteOnly);
+ stream << path << text_status << prop_status << repos_text_status << repos_prop_status << rev;
+
+ emitDCOPSignal( "subversionStatus(QString,int,int,int,int,long int)", params );
+}
+
+void KSvnd::popupMessage( const QString& message ) {
+ kdDebug(7128) << "KDED/Subversion : popupMessage" << message << endl;
+ KMessageBox::information(0, message, i18n( "Subversion" ) );
+}
+#endif
+
+#include "ksvnd.moc"
diff --git a/kioslave/svn/ksvnd/ksvnd.desktop b/kioslave/svn/ksvnd/ksvnd.desktop
new file mode 100644
index 00000000..d2c942d4
--- /dev/null
+++ b/kioslave/svn/ksvnd/ksvnd.desktop
@@ -0,0 +1,50 @@
+[Desktop Entry]
+Type=Service
+Name=KDED Subversion Module
+Name[bg]=Модул KDED Subversion
+Name[br]=Mollad Subversion KDED
+Name[ca]=Mòdul KDED de Subversion
+Name[cs]=KDED Subversion modul
+Name[da]=KDED Subversion modul
+Name[de]=Subversion-Unterstützung
+Name[el]=Άρθρωμα KDED Subversion
+Name[es]=Módulo de Subversion de KDED
+Name[et]=KDED Subversioni moodul
+Name[eu]=KDED Subversion modulua
+Name[fa]=پیمانۀ زیرنسخۀ KDED
+Name[fi]=KDED Subversion -moduuli
+Name[fr]=Module KDED Subversion
+Name[ga]=Modúl Subversion KDED
+Name[gl]=Módulo KDED Subversion
+Name[hu]=KDED Subversion modul
+Name[is]=KDED Subversion eining
+Name[it]=Modulo Subversion di KDED
+Name[ja]=KDED Subversion モジュール
+Name[ka]=KDED Subversion მოდული
+Name[kk]=KDED Subversion қызмет модулі
+Name[lt]=KDED Subversion modulis
+Name[nb]=KDED Subversion-modul
+Name[nds]=KDED Subversion-Moduul
+Name[ne]=केडीईडी उप संस्करण मोड्युल
+Name[nl]=KDED Subversion-module
+Name[nn]=KDED Subversion-modul
+Name[pa]=KDED ਸਬ-ਵਰਜਨ ਮੈਡੀਊਲ
+Name[pl]=Moduł Subversion dla KDED
+Name[pt]=Módulo KDED Subversion
+Name[pt_BR]=Módulo de Sub-versão KDED
+Name[ru]=Служба Subversion
+Name[sk]=KDED Subversion modul
+Name[sl]=Modul Subversion za KDED
+Name[sr]=KDED модул за Subversion
+Name[sr@Latn]=KDED modul za Subversion
+Name[sv]=KDED Subversion-modul
+Name[tr]=KDED Alt Versiyon Modülü
+Name[uk]=Модуль KDED Subversion
+Name[zh_CN]=KDED Subversion 模块
+Name[zh_TW]=KDED Subversion 模組
+ServiceTypes=KDEDModule
+X-KDE-ModuleType=Library
+X-KDE-Library=ksvnd
+X-KDE-FactoryName=ksvnd
+X-KDE-Kded-autoload=true
+X-KDE-Kded-load-on-demand=true
diff --git a/kioslave/svn/ksvnd/ksvnd.h b/kioslave/svn/ksvnd/ksvnd.h
new file mode 100644
index 00000000..20bb7e9a
--- /dev/null
+++ b/kioslave/svn/ksvnd/ksvnd.h
@@ -0,0 +1,69 @@
+/*
+ This file is part of the KDE Project
+
+ Copyright (C) 2003-2005 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ version 2 as published by the Free Software Foundation.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 library; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef KSVND_H
+#define KSVND_H
+
+#include <dcopclient.h>
+#include <kdedmodule.h>
+#include <kurl.h>
+#include <qstringlist.h>
+
+class KSvnd : public KDEDModule
+{
+ Q_OBJECT
+ K_DCOP
+
+ //note: InSVN means parent is added. InRepos means itself is added
+ enum { SomeAreFiles = 1, SomeAreFolders = 2, SomeAreInParentsEntries = 4, SomeParentsHaveSvn = 8, SomeHaveSvn = 16, SomeAreExternalToParent = 32, AllAreInParentsEntries = 64, AllParentsHaveSvn = 128, AllHaveSvn = 256, AllAreExternalToParent = 512, AllAreFolders = 1024 };
+public:
+ KSvnd(const QCString &);
+ ~KSvnd();
+
+k_dcop:
+// void addAuthInfo(KIO::AuthInfo, long);
+ QString commitDialog(QString);
+ bool anyNotValidWorkingCopy( const KURL::List& wclist );
+ bool anyValidWorkingCopy( const KURL::List& wclist );
+ bool AreAnyFilesNotInSvn( const KURL::List& wclist );
+ bool AreAnyFilesInSvn( const KURL::List& wclist );
+ bool AreAllFilesNotInSvn( const KURL::List& wclist );
+ bool AreAllFilesInSvn( const KURL::List& wclist );
+ QStringList getActionMenu ( const KURL::List& list );
+ QStringList getTopLevelActionMenu ( const KURL::List &list );
+// void notify(const QString&, int ,int, const QString& , int , int, long int, const QString&);
+// void status(const QString& path, int text_status, int prop_status, int repos_text_status, int repos_prop_status ,long int rev);
+// void popupMessage( const QString& message );
+
+k_dcop_signals:
+ //emitted whenever something happens using subversion ;)
+// void subversionNotify(const QString&, int ,int, const QString& , int , int, long int, const QString&);
+// void subversionStatus(const QString&,int,int,int,int,long int);
+
+public slots:
+
+protected:
+ bool isFileInSvnEntries ( const QString filename, const QString entfile );
+ bool isFileInExternals ( const QString filename, const QString propfile );
+ bool isFolder( const KURL& url );
+ int getStatus( const KURL::List& list );
+};
+
+#endif
diff --git a/kioslave/svn/svn+file.protocol b/kioslave/svn/svn+file.protocol
new file mode 100644
index 00000000..ff8edc5e
--- /dev/null
+++ b/kioslave/svn/svn+file.protocol
@@ -0,0 +1,43 @@
+[Protocol]
+exec=kio_svn
+protocol=svn+file
+input=none
+output=filesystem
+reading=true
+writing=true
+deleting=true
+makedir=true
+linking=false
+moving=true
+listing=Name,Size,Date,Owner
+defaultMimetype=application/octet-stream
+Icon=remote
+Description=Subversion ioslave
+Description[br]=Sklav E/D Subversion
+Description[ca]=Ioslave de Subversion
+Description[cs]=Subversion protokol
+Description[de]=Ein-/Ausgabemodul für Subversion
+Description[es]=El ioslave de Subversion
+Description[et]=Subversioni IO-moodul
+Description[fr]=ioslave subversion
+Description[ga]=ioslave Subversion
+Description[gl]=Ioslave para Subversíon
+Description[hu]=Subversion KDE-protokoll
+Description[it]=Slave I/O di Subversion
+Description[lt]=Subversion įvesties-išvesties priedas
+Description[nb]=Subversion-iu-slave
+Description[nds]=In-/Utgaavmoduul för Subversion
+Description[ne]=उप संस्करण ioslave
+Description[nn]=Subversion-iu-slave
+Description[pl]=Wtyczka protokołu Subversion
+Description[pt]='Ioslave' para Subversion
+Description[pt_BR]=ioslave de Subversão
+Description[ru]=Доступ к хранилищу Subversion
+Description[sl]=ioslave za Subversion
+Description[sr]=IOSlave за Subversion
+Description[sr@Latn]=IOSlave za Subversion
+Description[sv]=Subversion I/O-slav
+Description[tr]=Alt Version ioslave
+Description[uk]=Підлеглий В/В Subversion
+maxInstances=5
+class=:internet
diff --git a/kioslave/svn/svn+http.protocol b/kioslave/svn/svn+http.protocol
new file mode 100644
index 00000000..656fa217
--- /dev/null
+++ b/kioslave/svn/svn+http.protocol
@@ -0,0 +1,43 @@
+[Protocol]
+exec=kio_svn
+protocol=svn+http
+input=none
+output=filesystem
+reading=true
+writing=true
+deleting=true
+makedir=true
+linking=false
+moving=true
+listing=Name,Size,Date,Owner
+defaultMimetype=application/octet-stream
+Icon=remote
+Description=Subversion ioslave
+Description[br]=Sklav E/D Subversion
+Description[ca]=Ioslave de Subversion
+Description[cs]=Subversion protokol
+Description[de]=Ein-/Ausgabemodul für Subversion
+Description[es]=El ioslave de Subversion
+Description[et]=Subversioni IO-moodul
+Description[fr]=ioslave subversion
+Description[ga]=ioslave Subversion
+Description[gl]=Ioslave para Subversíon
+Description[hu]=Subversion KDE-protokoll
+Description[it]=Slave I/O di Subversion
+Description[lt]=Subversion įvesties-išvesties priedas
+Description[nb]=Subversion-iu-slave
+Description[nds]=In-/Utgaavmoduul för Subversion
+Description[ne]=उप संस्करण ioslave
+Description[nn]=Subversion-iu-slave
+Description[pl]=Wtyczka protokołu Subversion
+Description[pt]='Ioslave' para Subversion
+Description[pt_BR]=ioslave de Subversão
+Description[ru]=Доступ к хранилищу Subversion
+Description[sl]=ioslave za Subversion
+Description[sr]=IOSlave за Subversion
+Description[sr@Latn]=IOSlave za Subversion
+Description[sv]=Subversion I/O-slav
+Description[tr]=Alt Version ioslave
+Description[uk]=Підлеглий В/В Subversion
+maxInstances=5
+class=:internet
diff --git a/kioslave/svn/svn+https.protocol b/kioslave/svn/svn+https.protocol
new file mode 100644
index 00000000..e299958c
--- /dev/null
+++ b/kioslave/svn/svn+https.protocol
@@ -0,0 +1,43 @@
+[Protocol]
+exec=kio_svn
+protocol=svn+https
+input=none
+output=filesystem
+reading=true
+writing=true
+deleting=true
+makedir=true
+linking=false
+moving=true
+listing=Name,Size,Date,Owner
+defaultMimetype=application/octet-stream
+Icon=remote
+Description=Subversion ioslave
+Description[br]=Sklav E/D Subversion
+Description[ca]=Ioslave de Subversion
+Description[cs]=Subversion protokol
+Description[de]=Ein-/Ausgabemodul für Subversion
+Description[es]=El ioslave de Subversion
+Description[et]=Subversioni IO-moodul
+Description[fr]=ioslave subversion
+Description[ga]=ioslave Subversion
+Description[gl]=Ioslave para Subversíon
+Description[hu]=Subversion KDE-protokoll
+Description[it]=Slave I/O di Subversion
+Description[lt]=Subversion įvesties-išvesties priedas
+Description[nb]=Subversion-iu-slave
+Description[nds]=In-/Utgaavmoduul för Subversion
+Description[ne]=उप संस्करण ioslave
+Description[nn]=Subversion-iu-slave
+Description[pl]=Wtyczka protokołu Subversion
+Description[pt]='Ioslave' para Subversion
+Description[pt_BR]=ioslave de Subversão
+Description[ru]=Доступ к хранилищу Subversion
+Description[sl]=ioslave za Subversion
+Description[sr]=IOSlave за Subversion
+Description[sr@Latn]=IOSlave za Subversion
+Description[sv]=Subversion I/O-slav
+Description[tr]=Alt Version ioslave
+Description[uk]=Підлеглий В/В Subversion
+maxInstances=5
+class=:internet
diff --git a/kioslave/svn/svn+ssh.protocol b/kioslave/svn/svn+ssh.protocol
new file mode 100644
index 00000000..7c985da9
--- /dev/null
+++ b/kioslave/svn/svn+ssh.protocol
@@ -0,0 +1,43 @@
+[Protocol]
+exec=kio_svn
+protocol=svn+ssh
+input=none
+output=filesystem
+reading=true
+writing=true
+deleting=true
+makedir=true
+linking=false
+moving=true
+listing=Name,Size,Date,Owner
+defaultMimetype=application/octet-stream
+Icon=remote
+Description=Subversion ioslave
+Description[br]=Sklav E/D Subversion
+Description[ca]=Ioslave de Subversion
+Description[cs]=Subversion protokol
+Description[de]=Ein-/Ausgabemodul für Subversion
+Description[es]=El ioslave de Subversion
+Description[et]=Subversioni IO-moodul
+Description[fr]=ioslave subversion
+Description[ga]=ioslave Subversion
+Description[gl]=Ioslave para Subversíon
+Description[hu]=Subversion KDE-protokoll
+Description[it]=Slave I/O di Subversion
+Description[lt]=Subversion įvesties-išvesties priedas
+Description[nb]=Subversion-iu-slave
+Description[nds]=In-/Utgaavmoduul för Subversion
+Description[ne]=उप संस्करण ioslave
+Description[nn]=Subversion-iu-slave
+Description[pl]=Wtyczka protokołu Subversion
+Description[pt]='Ioslave' para Subversion
+Description[pt_BR]=ioslave de Subversão
+Description[ru]=Доступ к хранилищу Subversion
+Description[sl]=ioslave za Subversion
+Description[sr]=IOSlave за Subversion
+Description[sr@Latn]=IOSlave za Subversion
+Description[sv]=Subversion I/O-slav
+Description[tr]=Alt Version ioslave
+Description[uk]=Підлеглий В/В Subversion
+maxInstances=5
+class=:internet
diff --git a/kioslave/svn/svn.cpp b/kioslave/svn/svn.cpp
new file mode 100644
index 00000000..8ff9496e
--- /dev/null
+++ b/kioslave/svn/svn.cpp
@@ -0,0 +1,1593 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <qcstring.h>
+#include <qsocket.h>
+#include <qdatetime.h>
+#include <qbitarray.h>
+
+#include <stdlib.h>
+#include <math.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kinstance.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <ksock.h>
+#include <dcopclient.h>
+#include <qcstring.h>
+
+#include <subversion-1/svn_sorts.h>
+#include <subversion-1/svn_path.h>
+#include <subversion-1/svn_utf.h>
+#include <subversion-1/svn_ra.h>
+#include <subversion-1/svn_time.h>
+
+#include <kmimetype.h>
+#include <qfile.h>
+
+#include "svn.h"
+#include <apr_portable.h>
+
+using namespace KIO;
+
+typedef struct
+{
+ /* Holds the directory that corresponds to the REPOS_URL at RA->open()
+ * time. When callbacks specify a relative path, they are joined with
+ * this base directory. */
+ const char *base_dir;
+ svn_wc_adm_access_t *base_access;
+
+ /* An array of svn_client_commit_item_t * structures, present only
+ * during working copy commits. */
+ apr_array_header_t *commit_items;
+
+ /* A hash of svn_config_t's, keyed off file name (i.e. the contents of
+ * ~/.subversion/config end up keyed off of 'config'). */
+ apr_hash_t *config;
+
+ /* The pool to use for session-related items. */
+ apr_pool_t *pool;
+
+} svn_client__callback_baton_t;
+
+static svn_error_t *
+open_tmp_file (apr_file_t **fp,
+ void *callback_baton,
+ apr_pool_t *pool)
+{
+ svn_client__callback_baton_t *cb = (svn_client__callback_baton_t *) callback_baton;
+ const char *truepath;
+ const char *ignored_filename;
+
+ if (cb->base_dir)
+ truepath = apr_pstrdup (pool, cb->base_dir);
+ else
+ truepath = "";
+
+ /* Tack on a made-up filename. */
+ truepath = svn_path_join (truepath, "tempfile", pool);
+
+ /* Open a unique file; use APR_DELONCLOSE. */
+ SVN_ERR (svn_io_open_unique_file (fp, &ignored_filename,
+ truepath, ".tmp", TRUE, pool));
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *write_to_string(void *baton, const char *data, apr_size_t *len) {
+ kbaton *tb = ( kbaton* )baton;
+ svn_stringbuf_appendbytes(tb->target_string, data, *len);
+ return SVN_NO_ERROR;
+}
+
+static int
+compare_items_as_paths (const svn_sort__item_t*a, const svn_sort__item_t*b) {
+ return svn_path_compare_paths ((const char *)a->key, (const char *)b->key);
+}
+
+kio_svnProtocol::kio_svnProtocol(const QCString &pool_socket, const QCString &app_socket)
+ : SlaveBase("kio_svn", pool_socket, app_socket) {
+ kdDebug(7128) << "kio_svnProtocol::kio_svnProtocol()" << endl;
+
+ m_counter = 0;
+
+ apr_initialize();
+ // CleanUP ctx preventing crash in svn_client_update and other
+ memset(&ctx, 0, sizeof(ctx));
+ pool = svn_pool_create (NULL);
+
+ svn_error_t *err = svn_client_create_context(&ctx, pool);
+ if ( err ) {
+ kdDebug(7128) << "kio_svnProtocol::kio_svnProtocol() create_context ERROR" << endl;
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ return;
+ }
+
+ err = svn_config_ensure (NULL,pool);
+ if ( err ) {
+ kdDebug(7128) << "kio_svnProtocol::kio_svnProtocol() configensure ERROR" << endl;
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ return;
+ }
+ svn_config_get_config (&ctx->config, NULL, pool);
+
+ ctx->log_msg_func = kio_svnProtocol::commitLogPrompt;
+ ctx->log_msg_baton = this; //pass this so that we can get a dcopClient from it
+ //TODO
+ ctx->cancel_func = NULL;
+
+ apr_array_header_t *providers = apr_array_make(pool, 9, sizeof(svn_auth_provider_object_t *));
+
+ svn_auth_provider_object_t *provider;
+
+ //disk cache
+ svn_client_get_simple_provider(&provider,pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t*) = provider;
+ svn_client_get_username_provider(&provider,pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t*) = provider;
+
+ //interactive prompt
+ svn_client_get_simple_prompt_provider (&provider,kio_svnProtocol::checkAuth,this,2,pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t*) = provider;
+ //we always ask user+pass, no need for a user only question
+/* svn_client_get_username_prompt_provider
+ * (&provider,kio_svnProtocol::checkAuth,this,2,pool);
+ APR_ARRAY_PUSH(providers, svn_auth_provider_object_t*) = provider;*/
+
+ //SSL disk cache, keep that one, because it does nothing bad :)
+ svn_client_get_ssl_server_trust_file_provider (&provider, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+ svn_client_get_ssl_client_cert_file_provider (&provider, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+ svn_client_get_ssl_client_cert_pw_file_provider (&provider, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+ //SSL interactive prompt, where things get hard
+ svn_client_get_ssl_server_trust_prompt_provider (&provider, kio_svnProtocol::trustSSLPrompt, NULL, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+ svn_client_get_ssl_client_cert_prompt_provider (&provider, kio_svnProtocol::clientCertSSLPrompt, NULL, 2, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+ svn_client_get_ssl_client_cert_pw_prompt_provider (&provider, kio_svnProtocol::clientCertPasswdPrompt, NULL, 2, pool);
+ APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+ svn_auth_open(&ctx->auth_baton, providers, pool);
+}
+
+kio_svnProtocol::~kio_svnProtocol(){
+ kdDebug(7128) << "kio_svnProtocol::~kio_svnProtocol()" << endl;
+ svn_pool_destroy(pool);
+ apr_terminate();
+}
+
+void kio_svnProtocol::initNotifier(bool is_checkout, bool is_export, bool suppress_final_line, apr_pool_t *spool) {
+ m_counter=0;//reset counter
+ ctx->notify_func = kio_svnProtocol::notify;
+ struct notify_baton *nb = ( struct notify_baton* )apr_palloc(spool, sizeof( *nb ) );
+ nb->master = this;
+ nb->received_some_change = FALSE;
+ nb->sent_first_txdelta = FALSE;
+ nb->is_checkout = is_checkout;
+ nb->is_export = is_export;
+ nb->suppress_final_line = suppress_final_line;
+ nb->in_external = FALSE;
+ nb->had_print_error = FALSE;
+ nb->pool = svn_pool_create (spool);
+
+ ctx->notify_baton = nb;
+}
+
+svn_error_t* kio_svnProtocol::checkAuth(svn_auth_cred_simple_t **cred, void *baton, const char *realm, const char *username, svn_boolean_t /*may_save*/, apr_pool_t *pool) {
+ kdDebug(7128) << "kio_svnProtocol::checkAuth() for " << realm << endl;
+ kio_svnProtocol *p = ( kio_svnProtocol* )baton;
+ svn_auth_cred_simple_t *ret = (svn_auth_cred_simple_t*)apr_pcalloc (pool, sizeof (*ret));
+
+// p->info.keepPassword = true;
+ p->info.verifyPath=true;
+ kdDebug(7128 ) << "auth current URL : " << p->myURL.url() << endl;
+ p->info.url = p->myURL;
+ p->info.username = username; //( const char* )svn_auth_get_parameter( p->ctx->auth_baton, SVN_AUTH_PARAM_DEFAULT_USERNAME );
+// if ( !p->checkCachedAuthentication( p->info ) ){
+ p->openPassDlg( p->info );
+// }
+ ret->username = apr_pstrdup(pool, p->info.username.utf8());
+ ret->password = apr_pstrdup(pool, p->info.password.utf8());
+ ret->may_save = true;
+ *cred = ret;
+ return SVN_NO_ERROR;
+}
+
+void kio_svnProtocol::recordCurrentURL(const KURL& url) {
+ myURL = url;
+}
+
+//don't implement mimeType() until we don't need to download the whole file
+
+void kio_svnProtocol::get(const KURL& url ){
+ kdDebug(7128) << "kio_svn::get(const KURL& url)" << endl ;
+
+ QString remoteServer = url.host();
+ infoMessage(i18n("Looking for %1...").arg( remoteServer ) );
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ kbaton *bt = (kbaton*)apr_pcalloc(subpool, sizeof(*bt));
+ bt->target_string = svn_stringbuf_create("", subpool);
+ bt->string_stream = svn_stream_create(bt,subpool);
+ svn_stream_set_write(bt->string_stream,write_to_string);
+
+ QString target = makeSvnURL( url );
+ kdDebug(7128) << "SvnURL: " << target << endl;
+ recordCurrentURL( KURL( target ) );
+
+ //find the requested revision
+ svn_opt_revision_t rev;
+ svn_opt_revision_t endrev;
+ int idx = target.findRev( "?rev=" );
+ if ( idx != -1 ) {
+ QString revstr = target.mid( idx+5 );
+#if 0
+ kdDebug(7128) << "revision string found " << revstr << endl;
+ if ( revstr == "HEAD" ) {
+ rev.kind = svn_opt_revision_head;
+ kdDebug(7128) << "revision searched : HEAD" << endl;
+ } else {
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = revstr.toLong();
+ kdDebug(7128) << "revision searched : " << rev.value.number << endl;
+ }
+#endif
+ svn_opt_parse_revision( &rev, &endrev, revstr.utf8(), subpool );
+ target = target.left( idx );
+ kdDebug(7128) << "new target : " << target << endl;
+ } else {
+ kdDebug(7128) << "no revision given. searching HEAD " << endl;
+ rev.kind = svn_opt_revision_head;
+ }
+ initNotifier(false, false, false, subpool);
+
+ svn_error_t *err = svn_client_cat (bt->string_stream, svn_path_canonicalize( target.utf8(),subpool ),&rev,ctx, subpool);
+ if ( err ) {
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ svn_pool_destroy( subpool );
+ return;
+ }
+
+ // Send the mimeType as soon as it is known
+ QByteArray *cp = new QByteArray();
+ cp->setRawData( bt->target_string->data, bt->target_string->len );
+ KMimeType::Ptr mt = KMimeType::findByContent(*cp);
+ kdDebug(7128) << "KMimeType returned : " << mt->name() << endl;
+ mimeType( mt->name() );
+
+ totalSize(bt->target_string->len);
+
+ //send data
+ data(*cp);
+
+ data(QByteArray()); // empty array means we're done sending the data
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::stat(const KURL & url){
+ kdDebug(7128) << "kio_svn::stat(const KURL& url) : " << url.url() << endl ;
+
+ void *ra_baton, *session;
+ svn_ra_plugin_t *ra_lib;
+ svn_node_kind_t kind;
+ apr_pool_t *subpool = svn_pool_create (pool);
+
+ QString target = makeSvnURL( url);
+ kdDebug(7128) << "SvnURL: " << target << endl;
+ recordCurrentURL( KURL( target ) );
+
+ //find the requested revision
+ svn_opt_revision_t rev;
+ svn_opt_revision_t endrev;
+ int idx = target.findRev( "?rev=" );
+ if ( idx != -1 ) {
+ QString revstr = target.mid( idx+5 );
+#if 0
+ kdDebug(7128) << "revision string found " << revstr << endl;
+ if ( revstr == "HEAD" ) {
+ rev.kind = svn_opt_revision_head;
+ kdDebug(7128) << "revision searched : HEAD" << endl;
+ } else {
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = revstr.toLong();
+ kdDebug(7128) << "revision searched : " << rev.value.number << endl;
+ }
+#endif
+ svn_opt_parse_revision( &rev, &endrev, revstr.utf8( ), subpool );
+ target = target.left( idx );
+ kdDebug(7128) << "new target : " << target << endl;
+ } else {
+ kdDebug(7128) << "no revision given. searching HEAD " << endl;
+ rev.kind = svn_opt_revision_head;
+ }
+
+ //init
+ svn_error_t *err = svn_ra_init_ra_libs(&ra_baton,subpool);
+ if ( err ) {
+ kdDebug(7128) << "init RA libs failed : " << err->message << endl;
+ return;
+ }
+ //find RA libs
+ err = svn_ra_get_ra_library(&ra_lib,ra_baton,svn_path_canonicalize( target.utf8(), subpool ),subpool);
+ if ( err ) {
+ kdDebug(7128) << "RA get libs failed : " << err->message << endl;
+ return;
+ }
+ kdDebug(7128) << "RA init completed" << endl;
+
+ //start session
+ svn_ra_callbacks_t *cbtable = (svn_ra_callbacks_t*)apr_pcalloc(subpool, sizeof(*cbtable));
+ kio_svn_callback_baton_t *callbackbt = (kio_svn_callback_baton_t*)apr_pcalloc(subpool, sizeof( *callbackbt ));
+
+ cbtable->open_tmp_file = open_tmp_file;
+ cbtable->get_wc_prop = NULL;
+ cbtable->set_wc_prop = NULL;
+ cbtable->push_wc_prop = NULL;
+ cbtable->auth_baton = ctx->auth_baton;
+
+ callbackbt->base_dir = target.utf8();
+ callbackbt->pool = subpool;
+ callbackbt->config = ctx->config;
+
+ err = ra_lib->open(&session,svn_path_canonicalize( target.utf8(), subpool ),cbtable,callbackbt,ctx->config,subpool);
+ if ( err ) {
+ kdDebug(7128)<< "Open session " << err->message << endl;
+ return;
+ }
+ kdDebug(7128) << "Session opened to " << target << endl;
+ //find number for HEAD
+ if (rev.kind == svn_opt_revision_head) {
+ err = ra_lib->get_latest_revnum(session,&rev.value.number,subpool);
+ if ( err ) {
+ kdDebug(7128)<< "Latest RevNum " << err->message << endl;
+ return;
+ }
+ kdDebug(7128) << "Got rev " << rev.value.number << endl;
+ }
+
+ //get it
+ ra_lib->check_path(session,"",rev.value.number,&kind,subpool);
+ kdDebug(7128) << "Checked Path" << endl;
+ UDSEntry entry;
+ switch ( kind ) {
+ case svn_node_file:
+ kdDebug(7128) << "::stat result : file" << endl;
+ createUDSEntry(url.filename(),"",0,false,0,entry);
+ statEntry( entry );
+ break;
+ case svn_node_dir:
+ kdDebug(7128) << "::stat result : directory" << endl;
+ createUDSEntry(url.filename(),"",0,true,0,entry);
+ statEntry( entry );
+ break;
+ case svn_node_unknown:
+ case svn_node_none:
+ //error XXX
+ default:
+ kdDebug(7128) << "::stat result : UNKNOWN ==> WOW :)" << endl;
+ ;
+ }
+ finished();
+ svn_pool_destroy( subpool );
+}
+
+void kio_svnProtocol::listDir(const KURL& url){
+ kdDebug(7128) << "kio_svn::listDir(const KURL& url) : " << url.url() << endl ;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ apr_hash_t *dirents;
+
+ QString target = makeSvnURL( url);
+ kdDebug(7128) << "SvnURL: " << target << endl;
+ recordCurrentURL( KURL( target ) );
+
+ //find the requested revision
+ svn_opt_revision_t rev;
+ svn_opt_revision_t endrev;
+ int idx = target.findRev( "?rev=" );
+ if ( idx != -1 ) {
+ QString revstr = target.mid( idx+5 );
+ svn_opt_parse_revision( &rev, &endrev, revstr.utf8(), subpool );
+#if 0
+ kdDebug(7128) << "revision string found " << revstr << endl;
+ if ( revstr == "HEAD" ) {
+ rev.kind = svn_opt_revision_head;
+ kdDebug(7128) << "revision searched : HEAD" << endl;
+ } else {
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = revstr.toLong();
+ kdDebug(7128) << "revision searched : " << rev.value.number << endl;
+ }
+#endif
+ target = target.left( idx );
+ kdDebug(7128) << "new target : " << target << endl;
+ } else {
+ kdDebug(7128) << "no revision given. searching HEAD " << endl;
+ rev.kind = svn_opt_revision_head;
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_ls (&dirents, svn_path_canonicalize( target.utf8(), subpool ), &rev, false, ctx, subpool);
+ if ( err ) {
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ svn_pool_destroy( subpool );
+ return;
+ }
+
+ apr_array_header_t *array;
+ int i;
+
+ array = svn_sort__hash (dirents, compare_items_as_paths, subpool);
+
+ UDSEntry entry;
+ for (i = 0; i < array->nelts; ++i) {
+ entry.clear();
+ const char *utf8_entryname, *native_entryname;
+ svn_dirent_t *dirent;
+ svn_sort__item_t *item;
+
+ item = &APR_ARRAY_IDX (array, i, svn_sort__item_t);
+
+ utf8_entryname = (const char*)item->key;
+
+ dirent = (svn_dirent_t*)apr_hash_get (dirents, utf8_entryname, item->klen);
+
+ svn_utf_cstring_from_utf8 (&native_entryname, utf8_entryname, subpool);
+ const char *native_author = NULL;
+
+ //XXX BUGGY
+/* apr_time_exp_t timexp;
+ apr_time_exp_lt(&timexp, dirent->time);
+ apr_os_exp_time_t *ostime;
+ apr_os_exp_time_get( &ostime, &timexp);
+
+ time_t mtime = mktime( ostime );*/
+
+ if (dirent->last_author)
+ svn_utf_cstring_from_utf8 (&native_author, dirent->last_author, subpool);
+
+ if ( createUDSEntry(QString( native_entryname ), QString( native_author ), dirent->size,
+ dirent->kind==svn_node_dir ? true : false, 0, entry) )
+ listEntry( entry, false );
+ }
+ listEntry( entry, true );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+bool kio_svnProtocol::createUDSEntry( const QString& filename, const QString& user, long long int size, bool isdir, time_t mtime, UDSEntry& entry) {
+ kdDebug(7128) << "MTime : " << ( long )mtime << endl;
+ kdDebug(7128) << "UDS filename : " << filename << endl;
+ UDSAtom atom;
+ atom.m_uds = KIO::UDS_NAME;
+ atom.m_str = filename;
+ entry.append( atom );
+
+ atom.m_uds = KIO::UDS_FILE_TYPE;
+ atom.m_long = isdir ? S_IFDIR : S_IFREG;
+ entry.append( atom );
+
+ atom.m_uds = KIO::UDS_SIZE;
+ atom.m_long = size;
+ entry.append( atom );
+
+ atom.m_uds = KIO::UDS_MODIFICATION_TIME;
+ atom.m_long = mtime;
+ entry.append( atom );
+
+ atom.m_uds = KIO::UDS_USER;
+ atom.m_str = user;
+ entry.append( atom );
+
+ return true;
+}
+
+void kio_svnProtocol::copy(const KURL & src, const KURL& dest, int /*permissions*/, bool /*overwrite*/) {
+ kdDebug(7128) << "kio_svnProtocol::copy() Source : " << src.url() << " Dest : " << dest.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+
+ KURL nsrc = src;
+ KURL ndest = dest;
+ nsrc.setProtocol( chooseProtocol( src.protocol() ) );
+ ndest.setProtocol( chooseProtocol( dest.protocol() ) );
+ QString srcsvn = nsrc.url();
+ QString destsvn = ndest.url();
+
+ recordCurrentURL( nsrc );
+
+ //find the requested revision
+ svn_opt_revision_t rev;
+ int idx = srcsvn.findRev( "?rev=" );
+ if ( idx != -1 ) {
+ QString revstr = srcsvn.mid( idx+5 );
+ kdDebug(7128) << "revision string found " << revstr << endl;
+ if ( revstr == "HEAD" ) {
+ rev.kind = svn_opt_revision_head;
+ kdDebug(7128) << "revision searched : HEAD" << endl;
+ } else {
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = revstr.toLong();
+ kdDebug(7128) << "revision searched : " << rev.value.number << endl;
+ }
+ srcsvn = srcsvn.left( idx );
+ kdDebug(7128) << "new src : " << srcsvn << endl;
+ } else {
+ kdDebug(7128) << "no revision given. searching HEAD " << endl;
+ rev.kind = svn_opt_revision_head;
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_copy(&commit_info, srcsvn.utf8(), &rev, destsvn.utf8(), ctx, subpool);
+ if ( err ) {
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::mkdir( const KURL::List& list, int /*permissions*/ ) {
+ kdDebug(7128) << "kio_svnProtocol::mkdir(LIST) : " << list << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+
+ recordCurrentURL( list[ 0 ] );
+
+ apr_array_header_t *targets = apr_array_make(subpool, list.count()+1, sizeof(const char *));
+
+ KURL::List::const_iterator it = list.begin(), end = list.end();
+ for ( ; it != end; ++it ) {
+ QString cur = makeSvnURL( *it );
+ kdDebug( 7128 ) << "kio_svnProtocol::mkdir raw url for subversion : " << cur << endl;
+ const char *_target = apr_pstrdup( subpool, svn_path_canonicalize( apr_pstrdup( subpool, cur.utf8() ), subpool ) );
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = _target;
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_mkdir(&commit_info,targets,ctx,subpool);
+ if ( err ) {
+ error( KIO::ERR_COULD_NOT_MKDIR, err->message );
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::mkdir( const KURL& url, int /*permissions*/ ) {
+ kdDebug(7128) << "kio_svnProtocol::mkdir() : " << url.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+
+ QString target = makeSvnURL( url);
+ kdDebug(7128) << "SvnURL: " << target << endl;
+ recordCurrentURL( KURL( target ) );
+
+ apr_array_header_t *targets = apr_array_make(subpool, 2, sizeof(const char *));
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = apr_pstrdup( subpool, target.utf8() );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_mkdir(&commit_info,targets,ctx,subpool);
+ if ( err ) {
+ error( KIO::ERR_COULD_NOT_MKDIR, err->message );
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::del( const KURL& url, bool /*isfile*/ ) {
+ kdDebug(7128) << "kio_svnProtocol::del() : " << url.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+
+ QString target = makeSvnURL(url);
+ kdDebug(7128) << "SvnURL: " << target << endl;
+ recordCurrentURL( KURL( target ) );
+
+ apr_array_header_t *targets = apr_array_make(subpool, 2, sizeof(const char *));
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = apr_pstrdup( subpool, target.utf8() );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_delete(&commit_info,targets,false/*force remove locally modified files in wc*/,ctx,subpool);
+ if ( err ) {
+ error( KIO::ERR_CANNOT_DELETE, err->message );
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::rename(const KURL& src, const KURL& dest, bool /*overwrite*/) {
+ kdDebug(7128) << "kio_svnProtocol::rename() Source : " << src.url() << " Dest : " << dest.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+
+ KURL nsrc = src;
+ KURL ndest = dest;
+ nsrc.setProtocol( chooseProtocol( src.protocol() ) );
+ ndest.setProtocol( chooseProtocol( dest.protocol() ) );
+ QString srcsvn = nsrc.url();
+ QString destsvn = ndest.url();
+
+ recordCurrentURL( nsrc );
+
+ //find the requested revision
+ svn_opt_revision_t rev;
+ int idx = srcsvn.findRev( "?rev=" );
+ if ( idx != -1 ) {
+ QString revstr = srcsvn.mid( idx+5 );
+ kdDebug(7128) << "revision string found " << revstr << endl;
+ if ( revstr == "HEAD" ) {
+ rev.kind = svn_opt_revision_head;
+ kdDebug(7128) << "revision searched : HEAD" << endl;
+ } else {
+ rev.kind = svn_opt_revision_number;
+ rev.value.number = revstr.toLong();
+ kdDebug(7128) << "revision searched : " << rev.value.number << endl;
+ }
+ srcsvn = srcsvn.left( idx );
+ kdDebug(7128) << "new src : " << srcsvn << endl;
+ } else {
+ kdDebug(7128) << "no revision given. searching HEAD " << endl;
+ rev.kind = svn_opt_revision_head;
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_move(&commit_info, srcsvn.utf8(), &rev, destsvn.utf8(), false/*force remove locally modified files in wc*/, ctx, subpool);
+ if ( err ) {
+ error( KIO::ERR_CANNOT_RENAME, err->message );
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::special( const QByteArray& data ) {
+ kdDebug(7128) << "kio_svnProtocol::special" << endl;
+
+ QDataStream stream(data, IO_ReadOnly);
+ int tmp;
+
+ stream >> tmp;
+ kdDebug(7128) << "kio_svnProtocol::special " << tmp << endl;
+
+ switch ( tmp ) {
+ case SVN_CHECKOUT:
+ {
+ KURL repository, wc;
+ int revnumber;
+ QString revkind;
+ stream >> repository;
+ stream >> wc;
+ stream >> revnumber;
+ stream >> revkind;
+ kdDebug(7128) << "kio_svnProtocol CHECKOUT from " << repository.url() << " to " << wc.url() << " at " << revnumber << " or " << revkind << endl;
+ checkout( repository, wc, revnumber, revkind );
+ break;
+ }
+ case SVN_UPDATE:
+ {
+ KURL wc;
+ int revnumber;
+ QString revkind;
+ stream >> wc;
+ stream >> revnumber;
+ stream >> revkind;
+ kdDebug(7128) << "kio_svnProtocol UPDATE " << wc.url() << " at " << revnumber << " or " << revkind << endl;
+ update(wc, revnumber, revkind );
+ break;
+ }
+ case SVN_COMMIT:
+ {
+ KURL::List wclist;
+ while ( !stream.atEnd() ) {
+ KURL tmp;
+ stream >> tmp;
+ wclist << tmp;
+ }
+ kdDebug(7128) << "kio_svnProtocol COMMIT" << endl;
+ commit( wclist );
+ break;
+ }
+ case SVN_LOG:
+ {
+ kdDebug(7128) << "kio_svnProtocol LOG" << endl;
+ int revstart, revend;
+ QString revkindstart, revkindend;
+ KURL::List targets;
+ stream >> revstart;
+ stream >> revkindstart;
+ stream >> revend;
+ stream >> revkindend;
+ while ( !stream.atEnd() ) {
+ KURL tmp;
+ stream >> tmp;
+ targets << tmp;
+ }
+ svn_log( revstart, revkindstart, revend, revkindend, targets );
+ break;
+ }
+ case SVN_IMPORT:
+ {
+ KURL wc,repos;
+ stream >> repos;
+ stream >> wc;
+ kdDebug(7128) << "kio_svnProtocol IMPORT" << endl;
+ import(repos,wc);
+ break;
+ }
+ case SVN_ADD:
+ {
+ KURL wc;
+ stream >> wc;
+ kdDebug(7128) << "kio_svnProtocol ADD" << endl;
+ add(wc);
+ break;
+ }
+ case SVN_DEL:
+ {
+ KURL::List wclist;
+ while ( !stream.atEnd() ) {
+ KURL tmp;
+ stream >> tmp;
+ wclist << tmp;
+ }
+ kdDebug(7128) << "kio_svnProtocol DEL" << endl;
+ wc_delete(wclist);
+ break;
+ }
+ case SVN_REVERT:
+ {
+ KURL::List wclist;
+ while ( !stream.atEnd() ) {
+ KURL tmp;
+ stream >> tmp;
+ wclist << tmp;
+ }
+ kdDebug(7128) << "kio_svnProtocol REVERT" << endl;
+ wc_revert(wclist);
+ break;
+ }
+ case SVN_STATUS:
+ {
+ KURL wc;
+ int checkRepos=false;
+ int fullRecurse=false;
+ stream >> wc;
+ stream >> checkRepos;
+ stream >> fullRecurse;
+ kdDebug(7128) << "kio_svnProtocol STATUS" << endl;
+ wc_status(wc,checkRepos,fullRecurse);
+ break;
+ }
+ case SVN_MKDIR:
+ {
+ KURL::List list;
+ stream >> list;
+ kdDebug(7128) << "kio_svnProtocol MKDIR" << endl;
+ mkdir(list,0);
+ break;
+ }
+ case SVN_RESOLVE:
+ {
+ KURL url;
+ bool recurse;
+ stream >> url;
+ stream >> recurse;
+ kdDebug(7128) << "kio_svnProtocol RESOLVE" << endl;
+ wc_resolve(url,recurse);
+ break;
+ }
+ case SVN_SWITCH:
+ {
+ KURL wc,url;
+ bool recurse;
+ int revnumber;
+ QString revkind;
+ stream >> wc;
+ stream >> url;
+ stream >> recurse;
+ stream >> revnumber;
+ stream >> revkind;
+ kdDebug(7128) << "kio_svnProtocol SWITCH" << endl;
+ svn_switch(wc,url,revnumber,revkind,recurse);
+ break;
+ }
+ case SVN_DIFF:
+ {
+ KURL url1,url2;
+ int rev1, rev2;
+ bool recurse;
+ QString revkind1, revkind2;
+ stream >> url1;
+ stream >> url2;
+ stream >> rev1;
+ stream >> revkind1;
+ stream >> rev2;
+ stream >> revkind2;
+ stream >> recurse;
+ kdDebug(7128) << "kio_svnProtocol DIFF" << endl;
+ svn_diff(url1,url2,rev1,rev2,revkind1,revkind2,recurse);
+ break;
+ }
+ default:
+ {
+ kdDebug(7128) << "kio_svnProtocol DEFAULT" << endl;
+ break;
+ }
+ }
+}
+
+void kio_svnProtocol::popupMessage( const QString& message ) {
+ QByteArray params;
+ QDataStream stream(params, IO_WriteOnly);
+ stream << message;
+
+ if ( !dcopClient()->send( "kded","ksvnd","popupMessage(QString)", params ) )
+ kdWarning() << "Communication with KDED:KSvnd failed" << endl;
+}
+
+void kio_svnProtocol::svn_log( int revstart, const QString& revkindstart, int revend, const QString& revkindend, const KURL::List& targets ) {
+ kdDebug(7128) << "kio_svn::log : " << targets << " from revision " << revstart << " or " << revkindstart << " to "
+ " revision " << revend << " or " << revkindend
+ << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+
+ svn_opt_revision_t rev1 = createRevision( revstart, revkindstart, subpool );
+ svn_opt_revision_t rev2 = createRevision( revend, revkindend, subpool );
+
+ //TODO
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+svn_opt_revision_t kio_svnProtocol::createRevision( int revision, const QString& revkind, apr_pool_t *pool ) {
+ svn_opt_revision_t result,endrev;
+
+ if ( revision != -1 ) {
+ result.value.number = revision;
+ result.kind = svn_opt_revision_number;
+ } else if ( revkind == "WORKING" ) {
+ result.kind = svn_opt_revision_working;
+ } else if ( revkind == "BASE" ) {
+ result.kind = svn_opt_revision_base;
+ } else if ( !revkind.isNull() ) {
+ svn_opt_parse_revision(&result,&endrev,revkind.utf8(),pool);
+ }
+ return result;
+}
+
+void kio_svnProtocol::svn_diff(const KURL & url1, const KURL& url2,int rev1, int rev2,const QString& revkind1,const QString& revkind2,bool recurse) {
+ kdDebug(7128) << "kio_svn::diff : " << url1.path() << " at revision " << rev1 << " or " << revkind1 << " with "
+ << url2.path() << " at revision " << rev2 << " or " << revkind2
+ << endl ;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ apr_array_header_t *options = svn_cstring_split( "", "\t\r\n", TRUE, subpool );
+
+ KURL nurl1 = url1;
+ KURL nurl2 = url2;
+ nurl1.setProtocol( chooseProtocol( url1.protocol() ) ); //svn+https -> https for eg
+ nurl2.setProtocol( chooseProtocol( url2.protocol() ) );
+ recordCurrentURL( nurl1 );
+ QString source = makeSvnURL( nurl1 );
+ QString target = makeSvnURL( nurl2 );
+
+ const char *path1 = svn_path_canonicalize( apr_pstrdup( subpool, source.utf8() ), subpool );
+ const char *path2 = svn_path_canonicalize( apr_pstrdup( subpool, target.utf8() ), subpool );
+ //remove file:/// so we can diff for working copies, needs a better check (so we support URL for file:/// _repositories_ )
+ if ( nurl1.protocol() == "file" ) {
+ path1 = svn_path_canonicalize( apr_pstrdup( subpool, nurl1.path().utf8() ), subpool );
+ }
+ if ( nurl2.protocol() == "file" ) {
+ path2 = svn_path_canonicalize( apr_pstrdup( subpool, nurl2.path().utf8() ), subpool );
+ }
+ kdDebug( 7128 ) << "1 : " << path1 << " 2: " << path2 << endl;
+
+ svn_opt_revision_t revision1,revision2;
+ revision1 = createRevision(rev1, revkind1, subpool);
+ revision2 = createRevision(rev2, revkind2, subpool);
+
+ char *templ;
+ templ = apr_pstrdup ( subpool, "/tmp/tmpfile_XXXXXX" );
+ apr_file_t *outfile = NULL;
+ apr_file_mktemp( &outfile, templ , APR_READ|APR_WRITE|APR_CREATE|APR_TRUNCATE, subpool );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_diff (options, path1, &revision1, path2, &revision2, recurse, false, true, outfile, NULL, ctx, subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+ //read the content of the outfile now
+ QStringList tmp;
+ apr_file_close(outfile);
+ QFile file(templ);
+ if ( file.open( IO_ReadOnly ) ) {
+ QTextStream stream( &file );
+ QString line;
+ while ( !stream.atEnd() ) {
+ line = stream.readLine();
+ tmp << line;
+ }
+ file.close();
+ }
+ for ( QStringList::Iterator itt = tmp.begin(); itt != tmp.end(); itt++ ) {
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "diffresult", ( *itt ) );
+ m_counter++;
+ }
+ //delete temp file
+ file.remove();
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::svn_switch( const KURL& wc, const KURL& repos, int revnumber, const QString& revkind, bool recurse) {
+ kdDebug(7128) << "kio_svn::switch : " << wc.path() << " at revision " << revnumber << " or " << revkind << endl ;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+
+ KURL nurl = repos;
+ KURL dest = wc;
+ nurl.setProtocol( chooseProtocol( repos.protocol() ) );
+ dest.setProtocol( "file" );
+ recordCurrentURL( nurl );
+ QString source = dest.path();
+ QString target = makeSvnURL( repos );
+
+ const char *path = svn_path_canonicalize( apr_pstrdup( subpool, source.utf8() ), subpool );
+ const char *url = svn_path_canonicalize( apr_pstrdup( subpool, target.utf8() ), subpool );
+
+ svn_opt_revision_t rev = createRevision( revnumber, revkind, subpool );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_switch (NULL/*result revision*/, path, url, &rev, recurse, ctx, subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::update( const KURL& wc, int revnumber, const QString& revkind ) {
+ kdDebug(7128) << "kio_svn::update : " << wc.path() << " at revision " << revnumber << " or " << revkind << endl ;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ KURL dest = wc;
+ dest.setProtocol( "file" );
+ QString target = dest.path();
+ recordCurrentURL( dest );
+
+ svn_opt_revision_t rev = createRevision( revnumber, revkind, subpool );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_update (NULL, svn_path_canonicalize( target.utf8(), subpool ), &rev, true, ctx, subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::import( const KURL& repos, const KURL& wc ) {
+ kdDebug(7128) << "kio_svnProtocol::import() : " << wc.url() << " into " << repos.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+ bool nonrecursive = false;
+
+ KURL nurl = repos;
+ KURL dest = wc;
+ nurl.setProtocol( chooseProtocol( repos.protocol() ) );
+ dest.setProtocol( "file" );
+ recordCurrentURL( nurl );
+ dest.cleanPath( true ); // remove doubled '/'
+ QString source = dest.path(-1);
+ QString target = makeSvnURL( repos );
+
+ const char *path = svn_path_canonicalize( apr_pstrdup( subpool, source.utf8() ), subpool );
+ const char *url = svn_path_canonicalize( apr_pstrdup( subpool, target.utf8() ), subpool );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_import(&commit_info,path,url,nonrecursive,ctx,subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::checkout( const KURL& repos, const KURL& wc, int revnumber, const QString& revkind ) {
+ kdDebug(7128) << "kio_svn::checkout : " << repos.url() << " into " << wc.path() << " at revision " << revnumber << " or " << revkind << endl ;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ KURL nurl = repos;
+ KURL dest = wc;
+ nurl.setProtocol( chooseProtocol( repos.protocol() ) );
+ dest.setProtocol( "file" );
+ QString target = makeSvnURL( repos );
+ recordCurrentURL( nurl );
+ QString dpath = dest.path();
+
+ //find the requested revision
+ svn_opt_revision_t rev = createRevision( revnumber, revkind, subpool );
+
+ initNotifier(true, false, false, subpool);
+ svn_error_t *err = svn_client_checkout (NULL/* rev actually checkedout */, svn_path_canonicalize( target.utf8(), subpool ), svn_path_canonicalize ( dpath.utf8(), subpool ), &rev, true, ctx, subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::commit(const KURL::List& wc) {
+ kdDebug(7128) << "kio_svnProtocol::commit() : " << wc << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+ bool nonrecursive = false;
+
+ apr_array_header_t *targets = apr_array_make(subpool, 1+wc.count(), sizeof(const char *));
+
+ for ( QValueListConstIterator<KURL> it = wc.begin(); it != wc.end() ; ++it ) {
+ KURL nurl = *it;
+ nurl.setProtocol( "file" );
+ recordCurrentURL( nurl );
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = svn_path_canonicalize( nurl.path().utf8(), subpool );
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_commit(&commit_info,targets,nonrecursive,ctx,subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ if ( commit_info ) {
+ for ( QValueListConstIterator<KURL> it = wc.begin(); it != wc.end() ; ++it ) {
+ KURL nurl = *it;
+ nurl.setProtocol( "file" );
+
+ QString userstring = i18n ( "Nothing to commit." );
+ if ( SVN_IS_VALID_REVNUM( commit_info->revision ) )
+ userstring = i18n( "Committed revision %1." ).arg(commit_info->revision);
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "path", nurl.path() );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "action", "0" );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "kind", "0" );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "mime_t", "" );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "content", "0" );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "prop", "0" );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "rev" , QString::number( commit_info->revision ) );
+ setMetaData(QString::number( m_counter ).rightJustify( 10,'0' )+ "string", userstring );
+ m_counter++;
+ }
+ }
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::add(const KURL& wc) {
+ kdDebug(7128) << "kio_svnProtocol::add() : " << wc.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ bool nonrecursive = false;
+
+ KURL nurl = wc;
+ nurl.setProtocol( "file" );
+ QString target = nurl.url();
+ recordCurrentURL( nurl );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_add(svn_path_canonicalize( nurl.path().utf8(), subpool ),nonrecursive,ctx,subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::wc_delete(const KURL::List& wc) {
+ kdDebug(7128) << "kio_svnProtocol::wc_delete() : " << wc << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_client_commit_info_t *commit_info = NULL;
+ bool nonrecursive = false;
+
+ apr_array_header_t *targets = apr_array_make(subpool, 1+wc.count(), sizeof(const char *));
+
+ for ( QValueListConstIterator<KURL> it = wc.begin(); it != wc.end() ; ++it ) {
+ KURL nurl = *it;
+ nurl.setProtocol( "file" );
+ recordCurrentURL( nurl );
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = svn_path_canonicalize( nurl.path().utf8(), subpool );
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_delete(&commit_info,targets,nonrecursive,ctx,subpool);
+
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::wc_revert(const KURL::List& wc) {
+ kdDebug(7128) << "kio_svnProtocol::revert() : " << wc << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ bool nonrecursive = false;
+
+ apr_array_header_t *targets = apr_array_make(subpool, 1 + wc.count(), sizeof(const char *));
+
+ for ( QValueListConstIterator<KURL> it = wc.begin(); it != wc.end() ; ++it ) {
+ KURL nurl = *it;
+ nurl.setProtocol( "file" );
+ recordCurrentURL( nurl );
+ (*(( const char ** )apr_array_push(( apr_array_header_t* )targets)) ) = svn_path_canonicalize( nurl.path().utf8(), subpool );
+ }
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_revert(targets,nonrecursive,ctx,subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+void kio_svnProtocol::wc_status(const KURL& wc, bool checkRepos, bool fullRecurse, bool getAll, int revnumber, const QString& revkind) {
+ kdDebug(7128) << "kio_svnProtocol::status() : " << wc.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+ svn_revnum_t result_rev;
+ bool no_ignore = FALSE;
+
+ KURL nurl = wc;
+ nurl.setProtocol( "file" );
+ recordCurrentURL( nurl );
+
+ svn_opt_revision_t rev = createRevision( revnumber, revkind, subpool );
+
+ initNotifier(false, false, false, subpool);
+
+ svn_error_t *err = svn_client_status(&result_rev, svn_path_canonicalize( nurl.path().utf8(), subpool ), &rev, kio_svnProtocol::status, this, fullRecurse, getAll, checkRepos, no_ignore, ctx, subpool);
+
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+//change the proto and remove trailing /
+//remove double / also
+QString kio_svnProtocol::makeSvnURL ( const KURL& url ) const {
+ QString kproto = url.protocol();
+ KURL tpURL = url;
+ tpURL.cleanPath( true );
+ QString svnUrl;
+ if ( kproto == "svn+http" ) {
+ kdDebug(7128) << "http:/ " << url.url() << endl;
+ tpURL.setProtocol("http");
+ svnUrl = tpURL.url(-1);
+ return svnUrl;
+ }
+ else if ( kproto == "svn+https" ) {
+ kdDebug(7128) << "https:/ " << url.url() << endl;
+ tpURL.setProtocol("https");
+ svnUrl = tpURL.url(-1);
+ return svnUrl;
+ }
+ else if ( kproto == "svn+ssh" ) {
+ kdDebug(7128) << "svn+ssh:/ " << url.url() << endl;
+ tpURL.setProtocol("svn+ssh");
+ svnUrl = tpURL.url(-1);
+ return svnUrl;
+ }
+ else if ( kproto == "svn" ) {
+ kdDebug(7128) << "svn:/ " << url.url() << endl;
+ tpURL.setProtocol("svn");
+ svnUrl = tpURL.url(-1);
+ return svnUrl;
+ }
+ else if ( kproto == "svn+file" ) {
+ kdDebug(7128) << "file:/ " << url.url() << endl;
+ tpURL.setProtocol("file");
+ svnUrl = tpURL.url(-1);
+ //hack : add one more / after file:/
+ int idx = svnUrl.find("/");
+ svnUrl.insert( idx, "//" );
+ return svnUrl;
+ }
+ return tpURL.url(-1);
+}
+
+QString kio_svnProtocol::chooseProtocol ( const QString& kproto ) const {
+ if ( kproto == "svn+http" ) return QString( "http" );
+ else if ( kproto == "svn+https" ) return QString( "https" );
+ else if ( kproto == "svn+ssh" ) return QString( "svn+ssh" );
+ else if ( kproto == "svn" ) return QString( "svn" );
+ else if ( kproto == "svn+file" ) return QString( "file" );
+ return kproto;
+}
+
+svn_error_t *kio_svnProtocol::trustSSLPrompt(svn_auth_cred_ssl_server_trust_t **cred_p, void *, const char */*realm*/, apr_uint32_t /*failures*/, const svn_auth_ssl_server_cert_info_t */*cert_info*/, svn_boolean_t /*may_save*/, apr_pool_t *pool) {
+ //when ksvnd is ready make it prompt for the SSL certificate ... XXX
+ *cred_p = (svn_auth_cred_ssl_server_trust_t*)apr_pcalloc (pool, sizeof (**cred_p));
+ (*cred_p)->may_save = FALSE;
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *kio_svnProtocol::clientCertSSLPrompt(svn_auth_cred_ssl_client_cert_t **/*cred_p*/, void *, const char */*realm*/, svn_boolean_t /*may_save*/, apr_pool_t */*pool*/) {
+ //when ksvnd is ready make it prompt for the SSL certificate ... XXX
+/* *cred_p = apr_palloc (pool, sizeof(**cred_p));
+ (*cred_p)->cert_file = cert_file;*/
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *kio_svnProtocol::clientCertPasswdPrompt(svn_auth_cred_ssl_client_cert_pw_t **/*cred_p*/, void *, const char */*realm*/, svn_boolean_t /*may_save*/, apr_pool_t */*pool*/) {
+ //when ksvnd is ready make it prompt for the SSL certificate password ... XXX
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *kio_svnProtocol::commitLogPrompt( const char **log_msg, const char **/*file*/, apr_array_header_t *commit_items, void *baton, apr_pool_t *pool ) {
+ QCString replyType;
+ QByteArray params;
+ QByteArray reply;
+ QString result;
+ QStringList slist;
+ kio_svnProtocol *p = ( kio_svnProtocol* )baton;
+ svn_stringbuf_t *message = NULL;
+
+ for (int i = 0; i < commit_items->nelts; i++) {
+ QString list;
+ svn_client_commit_item_t *item = ((svn_client_commit_item_t **) commit_items->elts)[i];
+ const char *path = item->path;
+ char text_mod = '_', prop_mod = ' ';
+
+ if (! path)
+ path = item->url;
+ else if (! *path)
+ path = ".";
+
+ if (! path)
+ path = ".";
+
+ if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE) && (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD))
+ text_mod = 'R';
+ else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
+ text_mod = 'A';
+ else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_DELETE)
+ text_mod = 'D';
+ else if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_TEXT_MODS)
+ text_mod = 'M';
+ if (item->state_flags & SVN_CLIENT_COMMIT_ITEM_PROP_MODS)
+ prop_mod = 'M';
+
+ list += text_mod;
+ list += " ";
+ list += prop_mod;
+ list += " ";
+ list += path;
+ kdDebug(7128) << " Commiting items : " << list << endl;
+ slist << list;
+ }
+
+ QDataStream stream(params, IO_WriteOnly);
+ stream << slist.join("\n");
+
+ if ( !p->dcopClient()->call( "kded","ksvnd","commitDialog(QString)", params, replyType, reply ) ) {
+ kdWarning() << "Communication with KDED:KSvnd failed" << endl;
+ return SVN_NO_ERROR;
+ }
+
+ if ( replyType != "QString" ) {
+ kdWarning() << "Unexpected reply type" << endl;
+ return SVN_NO_ERROR;
+ }
+
+ QDataStream stream2 ( reply, IO_ReadOnly );
+ stream2 >> result;
+
+ if ( result.isNull() ) { //cancelled
+ *log_msg = NULL;
+ return SVN_NO_ERROR;
+ }
+
+ message = svn_stringbuf_create( result.utf8(), pool );
+ *log_msg = message->data;
+
+ return SVN_NO_ERROR;
+}
+
+void kio_svnProtocol::notify(void *baton, const char *path, svn_wc_notify_action_t action, svn_node_kind_t kind, const char *mime_type, svn_wc_notify_state_t content_state, svn_wc_notify_state_t prop_state, svn_revnum_t revision) {
+ kdDebug(7128) << "NOTIFY : " << path << " updated at revision " << revision << " action : " << action << ", kind : " << kind << " , content_state : " << content_state << ", prop_state : " << prop_state << endl;
+
+ QString userstring;
+ struct notify_baton *nb = ( struct notify_baton* ) baton;
+
+ //// Convert notification to a user readable string
+ switch ( action ) {
+ case svn_wc_notify_add : //add
+ if (mime_type && (svn_mime_type_is_binary (mime_type)))
+ userstring = i18n( "A (bin) %1" ).arg( path );
+ else
+ userstring = i18n( "A %1" ).arg( path );
+ break;
+ case svn_wc_notify_copy: //copy
+ break;
+ case svn_wc_notify_delete: //delete
+ nb->received_some_change = TRUE;
+ userstring = i18n( "D %1" ).arg( path );
+ break;
+ case svn_wc_notify_restore : //restore
+ userstring=i18n( "Restored %1." ).arg( path );
+ break;
+ case svn_wc_notify_revert : //revert
+ userstring=i18n( "Reverted %1." ).arg( path );
+ break;
+ case svn_wc_notify_failed_revert: //failed revert
+ userstring=i18n( "Failed to revert %1.\nTry updating instead." ).arg( path );
+ break;
+ case svn_wc_notify_resolved: //resolved
+ userstring=i18n( "Resolved conflicted state of %1." ).arg( path );
+ break;
+ case svn_wc_notify_skip: //skip
+ if ( content_state == svn_wc_notify_state_missing )
+ userstring=i18n("Skipped missing target %1.").arg( path );
+ else
+ userstring=i18n("Skipped %1.").arg( path );
+ break;
+ case svn_wc_notify_update_delete: //update_delete
+ nb->received_some_change = TRUE;
+ userstring=i18n( "D %1" ).arg( path );
+ break;
+ case svn_wc_notify_update_add: //update_add
+ nb->received_some_change = TRUE;
+ userstring=i18n( "A %1" ).arg( path );
+ break;
+ case svn_wc_notify_update_update: //update_update
+ {
+ /* If this is an inoperative dir change, do no notification.
+ An inoperative dir change is when a directory gets closed
+ without any props having been changed. */
+ if (! ((kind == svn_node_dir)
+ && ((prop_state == svn_wc_notify_state_inapplicable)
+ || (prop_state == svn_wc_notify_state_unknown)
+ || (prop_state == svn_wc_notify_state_unchanged)))) {
+ nb->received_some_change = TRUE;
+
+ if (kind == svn_node_file) {
+ if (content_state == svn_wc_notify_state_conflicted)
+ userstring = "C";
+ else if (content_state == svn_wc_notify_state_merged)
+ userstring = "G";
+ else if (content_state == svn_wc_notify_state_changed)
+ userstring = "U";
+ }
+
+ if (prop_state == svn_wc_notify_state_conflicted)
+ userstring += "C";
+ else if (prop_state == svn_wc_notify_state_merged)
+ userstring += "G";
+ else if (prop_state == svn_wc_notify_state_changed)
+ userstring += "U";
+ else
+ userstring += " ";
+
+ if (! ((content_state == svn_wc_notify_state_unchanged
+ || content_state == svn_wc_notify_state_unknown)
+ && (prop_state == svn_wc_notify_state_unchanged
+ || prop_state == svn_wc_notify_state_unknown)))
+ userstring += QString( " " ) + path;
+ }
+ break;
+ }
+ case svn_wc_notify_update_completed: //update_completed
+ {
+ if (! nb->suppress_final_line) {
+ if (SVN_IS_VALID_REVNUM (revision)) {
+ if (nb->is_export) {
+ if ( nb->in_external )
+ userstring = i18n("Exported external at revision %1.").arg( revision );
+ else
+ userstring = i18n("Exported revision %1.").arg( revision );
+ } else if (nb->is_checkout) {
+ if ( nb->in_external )
+ userstring = i18n("Checked out external at revision %1.").arg( revision );
+ else
+ userstring = i18n("Checked out revision %1.").arg( revision);
+ } else {
+ if (nb->received_some_change) {
+ if ( nb->in_external )
+ userstring=i18n("Updated external to revision %1.").arg( revision );
+ else
+ userstring = i18n("Updated to revision %1.").arg( revision);
+ } else {
+ if ( nb->in_external )
+ userstring = i18n("External at revision %1.").arg( revision );
+ else
+ userstring = i18n("At revision %1.").arg( revision);
+ }
+ }
+ } else /* no revision */ {
+ if (nb->is_export) {
+ if ( nb->in_external )
+ userstring = i18n("External export complete.");
+ else
+ userstring = i18n("Export complete.");
+ } else if (nb->is_checkout) {
+ if ( nb->in_external )
+ userstring = i18n("External checkout complete.");
+ else
+ userstring = i18n("Checkout complete.");
+ } else {
+ if ( nb->in_external )
+ userstring = i18n("External update complete.");
+ else
+ userstring = i18n("Update complete.");
+ }
+ }
+ }
+ }
+ if (nb->in_external)
+ nb->in_external = FALSE;
+ break;
+ case svn_wc_notify_update_external: //update_external
+ nb->in_external = TRUE;
+ userstring = i18n("Fetching external item into %1." ).arg( path );
+ break;
+ case svn_wc_notify_status_completed: //status_completed
+ if (SVN_IS_VALID_REVNUM (revision))
+ userstring = i18n( "Status against revision: %1.").arg( revision );
+ break;
+ case svn_wc_notify_status_external: //status_external
+ userstring = i18n("Performing status on external item at %1.").arg( path );
+ break;
+ case svn_wc_notify_commit_modified: //commit_modified
+ userstring = i18n( "Sending %1").arg( path );
+ break;
+ case svn_wc_notify_commit_added: //commit_added
+ if (mime_type && svn_mime_type_is_binary (mime_type)) {
+ userstring = i18n( "Adding (bin) %1.").arg( path );
+ } else {
+ userstring = i18n( "Adding %1.").arg( path );
+ }
+ break;
+ case svn_wc_notify_commit_deleted: //commit_deleted
+ userstring = i18n( "Deleting %1.").arg( path );
+ break;
+ case svn_wc_notify_commit_replaced: //commit_replaced
+ userstring = i18n( "Replacing %1.").arg( path );
+ break;
+ case svn_wc_notify_commit_postfix_txdelta: //commit_postfix_txdelta
+ if (! nb->sent_first_txdelta) {
+ nb->sent_first_txdelta = TRUE;
+ userstring=i18n("Transmitting file data ");
+ } else {
+ userstring=".";
+ }
+ break;
+
+ break;
+ case svn_wc_notify_blame_revision: //blame_revision
+ break;
+ default:
+ break;
+ }
+ //// End convert
+
+ kio_svnProtocol *p = ( kio_svnProtocol* )nb->master;
+
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "path" , QString::fromUtf8( path ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "action", QString::number( action ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "kind", QString::number( kind ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "mime_t", QString::fromUtf8( mime_type ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "content", QString::number( content_state ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "prop", QString::number( prop_state ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "rev", QString::number( revision ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "string", userstring );
+ p->incCounter();
+}
+
+void kio_svnProtocol::status(void *baton, const char *path, svn_wc_status_t *status) {
+ kdDebug(7128) << "STATUS : " << path << ", wc text status : " << status->text_status
+ << ", wc prop status : " << status->prop_status
+ << ", repos text status : " << status->repos_text_status
+ << ", repos prop status : " << status->repos_prop_status
+ << endl;
+
+ QByteArray params;
+ kio_svnProtocol *p = ( kio_svnProtocol* )baton;
+
+ QDataStream stream(params, IO_WriteOnly);
+ long int rev = status->entry ? status->entry->revision : 0;
+ stream << QString::fromUtf8( path ) << status->text_status << status->prop_status << status->repos_text_status << status->repos_prop_status << rev;
+
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "path", QString::fromUtf8( path ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "text", QString::number( status->text_status ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "prop", QString::number( status->prop_status ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "reptxt", QString::number( status->repos_text_status ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "repprop", QString::number( status->repos_prop_status ));
+ p->setMetaData(QString::number( p->counter() ).rightJustify( 10,'0' )+ "rev", QString::number( rev ));
+ p->incCounter();
+}
+
+
+void kio_svnProtocol::wc_resolve( const KURL& wc, bool recurse ) {
+ kdDebug(7128) << "kio_svnProtocol::wc_resolve() : " << wc.url() << endl;
+
+ apr_pool_t *subpool = svn_pool_create (pool);
+
+ KURL nurl = wc;
+ nurl.setProtocol( "file" );
+ recordCurrentURL( nurl );
+
+ initNotifier(false, false, false, subpool);
+ svn_error_t *err = svn_client_resolved(svn_path_canonicalize( nurl.path().utf8(), subpool ), recurse,ctx,subpool);
+ if ( err )
+ error( KIO::ERR_SLAVE_DEFINED, err->message );
+
+ finished();
+ svn_pool_destroy (subpool);
+}
+
+extern "C"
+{
+ KDE_EXPORT int kdemain(int argc, char **argv) {
+ KInstance instance( "kio_svn" );
+
+ kdDebug(7128) << "*** Starting kio_svn " << endl;
+
+ if (argc != 4) {
+ kdDebug(7128) << "Usage: kio_svn protocol domain-socket1 domain-socket2" << endl;
+ exit(-1);
+ }
+
+ kio_svnProtocol slave(argv[2], argv[3]);
+ slave.dispatchLoop();
+
+ kdDebug(7128) << "*** kio_svn Done" << endl;
+ return 0;
+ }
+}
+
diff --git a/kioslave/svn/svn.h b/kioslave/svn/svn.h
new file mode 100644
index 00000000..50c92d1c
--- /dev/null
+++ b/kioslave/svn/svn.h
@@ -0,0 +1,140 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef _svn_H_
+#define _svn_H_
+
+#include <qstring.h>
+#include <qcstring.h>
+
+#include <kurl.h>
+#include <kio/global.h>
+#include <kio/slavebase.h>
+#include <subversion-1/svn_pools.h>
+#include <subversion-1/svn_auth.h>
+#include <subversion-1/svn_client.h>
+#include <subversion-1/svn_config.h>
+#include <sys/stat.h>
+#include <qvaluelist.h>
+#include <subversion-1/svn_wc.h>
+
+class QCString;
+class kio_svnProtocol;
+
+typedef struct kbaton {
+ svn_stream_t *target_stream;
+ svn_stringbuf_t *target_string;
+ svn_stream_t *string_stream;
+} kbaton;
+
+typedef struct kio_svn_callback_baton_t {
+ const char* base_dir;
+ apr_hash_t *config;
+ apr_pool_t *pool;
+} kio_svn_callback_baton_t;
+
+typedef struct notify_baton {
+ svn_boolean_t received_some_change;
+ svn_boolean_t is_checkout;
+ svn_boolean_t is_export;
+ svn_boolean_t suppress_final_line;
+ svn_boolean_t sent_first_txdelta;
+ svn_boolean_t in_external;
+ svn_boolean_t had_print_error; /* Used to not keep printing error messages
+ when we've already had one print error. */
+ apr_pool_t *pool; /* this pool is cleared after every notification,
+ so don't keep anything here! */
+ kio_svnProtocol *master;
+} notify_baton;
+
+
+class kio_svnProtocol : public KIO::SlaveBase
+{
+ public:
+ kio_svnProtocol(const QCString &pool_socket, const QCString &app_socket);
+ virtual ~kio_svnProtocol();
+ virtual void special( const QByteArray& data );
+ virtual void get(const KURL& url);
+ virtual void listDir(const KURL& url);
+ virtual void stat(const KURL& url);
+ virtual void mkdir(const KURL& url, int permissions);
+ virtual void mkdir(const KURL::List& list, int permissions);
+ virtual void del( const KURL& url, bool isfile );
+ virtual void copy(const KURL & src, const KURL& dest, int permissions, bool overwrite);
+ virtual void rename(const KURL& src, const KURL& dest, bool overwrite);
+ void checkout( const KURL& repos, const KURL& wc, int revnumber, const QString& revkind );
+ void import( const KURL& repos, const KURL& wc );
+ void svn_switch( const KURL& wc, const KURL& url, int revnumber, const QString& revkind, bool recurse);
+ void svn_log( int revstart, const QString& revkindstart, int revend, const QString& revkindend, const KURL::List& targets );
+ void svn_diff( const KURL& url1, const KURL& url2, int rev1, int rev2, const QString& revkind1, const QString& revkind2, bool recurse);
+ //TODO fix with svn 1.2 : support a KURL::List -> svn_client_update2()
+ void update( const KURL& wc, int revnumber, const QString& revkind );
+ void commit( const KURL::List& wc );
+ void add( const KURL& wc );
+ //these work using the working copy
+ void wc_resolve( const KURL& wc, bool recurse = true );
+ void wc_delete( const KURL::List& wc );
+ void wc_revert( const KURL::List& wc );
+ void wc_status(const KURL& wc, bool checkRepos=false, bool fullRecurse=true, bool getAll=true, int revnumber=-1, const QString& revkind="HEAD");
+
+ static svn_error_t* checkAuth(svn_auth_cred_simple_t **cred, void *baton, const char *realm, const char *username, svn_boolean_t may_save, apr_pool_t *pool);
+ static svn_error_t *trustSSLPrompt(svn_auth_cred_ssl_server_trust_t **cred_p, void *, const char *realm, apr_uint32_t failures, const svn_auth_ssl_server_cert_info_t *cert_info, svn_boolean_t may_save, apr_pool_t *pool);
+ static svn_error_t *clientCertSSLPrompt(svn_auth_cred_ssl_client_cert_t **cred_p, void *, const char *realm, svn_boolean_t may_save, apr_pool_t *pool);
+ static svn_error_t *clientCertPasswdPrompt(svn_auth_cred_ssl_client_cert_pw_t **cred_p, void *, const char *realm, svn_boolean_t may_save, apr_pool_t *pool);
+ static svn_error_t *commitLogPrompt( const char **log_msg, const char **tmp_file, apr_array_header_t *commit_items, void *baton, apr_pool_t *pool );
+ static void notify(void *baton, const char *path, svn_wc_notify_action_t action, svn_node_kind_t kind, const char *mime_type, svn_wc_notify_state_t content_state, svn_wc_notify_state_t prop_state, svn_revnum_t revision);
+ static void status(void *baton, const char *path, svn_wc_status_t *status);
+
+ QString chooseProtocol ( const QString& kproto ) const;
+ QString makeSvnURL ( const KURL& url ) const;
+ void initNotifier(bool is_checkout, bool is_export, bool suppress_final_line, apr_pool_t *spool);
+
+ void recordCurrentURL(const KURL& url);
+ void popupMessage( const QString& message );
+ int counter() { return m_counter; }
+ void incCounter() { m_counter++; }
+ svn_opt_revision_t createRevision( int revision, const QString& revkind, apr_pool_t *pool );
+
+ KURL myURL;
+ svn_client_ctx_t *ctx;
+ KIO::AuthInfo info;
+
+ enum SVN_METHOD {
+ SVN_CHECKOUT=1, //KURL repository, KURL workingcopy, int revnumber=-1, QString revkind(HEAD, ...) //revnumber==-1 => use of revkind
+ SVN_UPDATE=2, // KURL wc (svn:///tmp/test, int revnumber=-1, QString revkind(HEAD, ...) // revnumber==-1 => use of revkind
+ SVN_COMMIT=3,
+ SVN_LOG=4,
+ SVN_IMPORT=5,
+ SVN_ADD=6,
+ SVN_DEL=7,
+ SVN_REVERT=8,
+ SVN_STATUS=9,
+ SVN_MKDIR=10,
+ SVN_RESOLVE=11,
+ SVN_SWITCH=12,
+ SVN_DIFF=13
+ };
+
+ private:
+ bool createUDSEntry( const QString& filename, const QString& user, long long int size, bool isdir, time_t mtime, KIO::UDSEntry& entry);
+ apr_pool_t *pool;
+ int m_counter;
+};
+
+#endif
diff --git a/kioslave/svn/svn.protocol b/kioslave/svn/svn.protocol
new file mode 100644
index 00000000..abd77fb3
--- /dev/null
+++ b/kioslave/svn/svn.protocol
@@ -0,0 +1,43 @@
+[Protocol]
+exec=kio_svn
+protocol=svn
+input=none
+output=filesystem
+reading=true
+writing=true
+deleting=true
+makedir=true
+linking=false
+moving=true
+listing=Name,Size,Date,Owner
+defaultMimetype=application/octet-stream
+Icon=remote
+Description=Subversion ioslave
+Description[br]=Sklav E/D Subversion
+Description[ca]=Ioslave de Subversion
+Description[cs]=Subversion protokol
+Description[de]=Ein-/Ausgabemodul für Subversion
+Description[es]=El ioslave de Subversion
+Description[et]=Subversioni IO-moodul
+Description[fr]=ioslave subversion
+Description[ga]=ioslave Subversion
+Description[gl]=Ioslave para Subversíon
+Description[hu]=Subversion KDE-protokoll
+Description[it]=Slave I/O di Subversion
+Description[lt]=Subversion įvesties-išvesties priedas
+Description[nb]=Subversion-iu-slave
+Description[nds]=In-/Utgaavmoduul för Subversion
+Description[ne]=उप संस्करण ioslave
+Description[nn]=Subversion-iu-slave
+Description[pl]=Wtyczka protokołu Subversion
+Description[pt]='Ioslave' para Subversion
+Description[pt_BR]=ioslave de Subversão
+Description[ru]=Доступ к хранилищу Subversion
+Description[sl]=ioslave za Subversion
+Description[sr]=IOSlave за Subversion
+Description[sr@Latn]=IOSlave za Subversion
+Description[sv]=Subversion I/O-slav
+Description[tr]=Alt Version ioslave
+Description[uk]=Підлеглий В/В Subversion
+maxInstances=5
+class=:internet
diff --git a/kioslave/svn/svnhelper/Makefile.am b/kioslave/svn/svnhelper/Makefile.am
new file mode 100644
index 00000000..bb5afe46
--- /dev/null
+++ b/kioslave/svn/svnhelper/Makefile.am
@@ -0,0 +1,18 @@
+bin_PROGRAMS = kio_svn_helper
+
+INCLUDES = $(all_includes)
+AM_LDFLAGS = $(all_libraries)
+
+kio_svn_helper_SOURCES = kio_svn_helper.cpp subversioncheckout.ui subversionswitch.ui subversionlog.ui subversiondiff.ui
+
+kio_svn_helper_LDFLAGS = $(KDE_RPATH) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KSYCOCA) $(LIB_KIO) $(all_libraries)
+
+servicemenudir = \
+ $(kde_datadir)/konqueror/servicemenus
+
+servicemenu_DATA = \
+ subversion.desktop subversion_toplevel.desktop
+
+
+METASOURCES = AUTO
+
diff --git a/kioslave/svn/svnhelper/apply_patch.desktop b/kioslave/svn/svnhelper/apply_patch.desktop
new file mode 100644
index 00000000..0c010a5d
--- /dev/null
+++ b/kioslave/svn/svnhelper/apply_patch.desktop
@@ -0,0 +1,94 @@
+[Desktop Entry]
+ServiceTypes=text/x-diff
+#uncomment when Exec is implemented
+#Actions=Apply
+X-KDE-Priority=TopLevel
+
+[Desktop Action Apply]
+Name=Apply Patch...
+Name[bg]=Прилагане на кръпка...
+Name[ca]=Aplica pedaç...
+Name[cs]=Aplikovat záplatu...
+Name[da]=Anvend rettelse...
+Name[de]=Patch einspielen ...
+Name[el]=Εφαρμογή επιδιόρθωσης...
+Name[eo]=Apliki Flikon...
+Name[es]=Aplicar parche...
+Name[et]=Paiga rakendamine...
+Name[eu]=Aplikatu adabakia...
+Name[fa]=اعمال کژنه...
+Name[fi]=Toteuta korjaus...
+Name[fr]=Appliquer le correctif...
+Name[ga]=Cuir Paiste i bhFeidhm...
+Name[gl]=Aplicar un parche...
+Name[he]=החל את הטלאי...
+Name[hu]=Folt alkalmazása...
+Name[is]=Virkja plástur...
+Name[it]=Applica correzione...
+Name[ja]=パッチを適用...
+Name[ka]=ბებკის გააქტიურება...
+Name[kk]=Жамауды қолдану...
+Name[lt]=Pritaikyti pataisymą...
+Name[nb]=Bruk lapp …
+Name[nds]=Kodeplaster inspelen...
+Name[ne]=लागू प्याच...
+Name[nl]=Patch toepassen...
+Name[nn]=Bruk lapp …
+Name[pa]=ਪੈਂਚ ਲਾਗੂ...
+Name[pl]=Nałóż łatę...
+Name[pt]=Aplicar um 'Patch'...
+Name[pt_BR]=Aplicar um 'Patch'...
+Name[ru]=Применить заплатку...
+Name[sk]=Aplikovať záplatu...
+Name[sl]=Uveljavi popravek ...
+Name[sr]=Примени закрпу...
+Name[sr@Latn]=Primeni zakrpu...
+Name[sv]=Utför programfix...
+Name[tr]=Yamayı Uygula...
+Name[uk]=Застосувати латку...
+Name[zh_CN]=应用补丁...
+Name[zh_TW]=套用修補...
+Icon=apply
+Exec=
+Comment=Apply the patch to another folder/file
+Comment[bg]=Прилагане на кръпка към друга директория/файл
+Comment[ca]=Aplica el pedaç a una altra carpeta o fitxer
+Comment[cs]=Aplikovat záplatu na jiný soubor/složku
+Comment[da]=Anvend rettelsen på en anden mappe/fil
+Comment[de]=Spielt den Patch in einen/eine andere(n) Ordner/Datei ein
+Comment[el]=Εφαρμογή της επιδιόρθωσης σε άλλο φάκελο/αρχείο
+Comment[es]=Aplicar el parche a otra carpeta o archivo
+Comment[et]=Paiga rakendamine teisele kataloogile/failile
+Comment[eu]=Aplikatu adabakia beste karpeta/fitxategi bati
+Comment[fa]=اعمال کژنه به پوشه/پروندۀ دیگر
+Comment[fi]=Toteuta korjaus toiseen kansioon/tiedostoon
+Comment[fr]=Appliquer le correctif sur un autre dossier / fichier
+Comment[ga]=Cuir an paiste i bhfeidhm ar fhillteán/chomhad eile
+Comment[gl]=Aplicar o parche noutro cartafol/ficheiro
+Comment[hu]=A folt alkalmazása másik könyvtárra vagy fájlra
+Comment[is]=Virkja plásturinn á aðra möppu/skrá
+Comment[it]=Applica la correzione a un'altra cartella o file
+Comment[ja]=他のフォルダやファイルへパッチを適用します。
+Comment[ka]=ბებკის სხვა საქაღალდეზე/ფაილზე გააქტიურება
+Comment[kk]=Басқа қапшық/файлға жамауды қолдану
+Comment[lt]=Pritaikyti pataisymą kitam aplankui/bylai
+Comment[nb]=Bruk lappen på en annen mappe/fil
+Comment[nds]=Kodeplaster op en anner Orner/Datei anwennen
+Comment[ne]=अन्य फोल्डर/फाइलमा प्याच लागू गर्नुहोस्
+Comment[nl]=Patch toepassen op een andere map of een ander bestand
+Comment[nn]=Bruk lappen på ei anna mappe/fil
+Comment[pa]=ਹੋਰ ਫੋਲਡਰ/ਫਾਇਲ ਲਈ ਪੈਂਚ ਲਾਗੂ
+Comment[pl]=Nałożenie łaty na inny plik/katalog
+Comment[pt]=Aplicar o 'patch' (actualização) noutra pasta/ficheiro
+Comment[pt_BR]=Aplicar o 'patch' (atualização) noutra pasta/arquivo
+Comment[ru]=Применить заплатку к другой папке или файлу
+Comment[sk]=Aplikovať záplatu na iný priečinok/súbor
+Comment[sl]=Uveljavi popravek za drugo mapo/datoteko
+Comment[sr]=Примени закрпу на другу фасциклу/фајл
+Comment[sr@Latn]=Primeni zakrpu na drugu fasciklu/fajl
+Comment[sv]=Utför en programfix för en annan katalog eller fil
+Comment[tr]=Yamayı diğer dizine/dosyaya uygula
+Comment[uk]=Застосувати латку до іншої теки файла
+Comment[zh_CN]=将补丁应用到其它文件夹/文件
+Comment[zh_TW]=套用修補到另一個資料夾/檔案
+
diff --git a/kioslave/svn/svnhelper/kio_svn_helper.cpp b/kioslave/svn/svnhelper/kio_svn_helper.cpp
new file mode 100644
index 00000000..1b66033b
--- /dev/null
+++ b/kioslave/svn/svnhelper/kio_svn_helper.cpp
@@ -0,0 +1,292 @@
+/* This file is part of the KDE project
+ Copyright (c) 2005 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <dcopclient.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <qtimer.h>
+#include <kio/job.h>
+#include <kio/jobclasses.h>
+#include <kio/netaccess.h>
+#include <qpixmap.h>
+#include <kmessagebox.h>
+
+#include "kio_svn_helper.h"
+#include "subversioncheckout.h"
+#include "subversionswitch.h"
+#include "subversiondiff.h"
+#include <kurlrequester.h>
+#include <qspinbox.h>
+#include <kprocess.h>
+#include <ktempfile.h>
+#include <qtextstream.h>
+#include <qtextedit.h>
+#include <kstandarddirs.h>
+#include <qtextbrowser.h>
+#include <qtextcodec.h>
+
+SvnHelper::SvnHelper():KApplication() {
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ KWinModule wm ( this );
+ m_id = wm.activeWindow();
+
+ KURL::List list;
+ for ( int i = 0 ; i < args->count() ; i++ )
+ list << args->url(i);
+
+ if (args->isSet("u")) {
+ kdDebug(7128) << "update " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ //FIXME when 1.2 is out (move the loop inside kio_svn's ::update)
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 2;
+ int rev = -1;
+ kdDebug(7128) << "updating : " << (*it).prettyURL() << endl;
+ s << cmd << *it << rev << QString( "HEAD" );
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ }
+ } else if (args->isSet("c")) {
+ kdDebug(7128) << "commit " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 3;
+ s<<cmd;
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ kdDebug(7128) << "commiting : " << (*it).prettyURL() << endl;
+ s << *it;
+ }
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ } else if (args->isSet("a")) {
+ kdDebug(7128) << "add " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 6;
+ kdDebug(7128) << "adding : " << (*it).prettyURL() << endl;
+ s << cmd << *it;
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ }
+ } else if (args->isSet("D")) {
+ kdDebug(7128) << "diff " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 13;
+ kdDebug(7128) << "diffing : " << (*it).prettyURL() << endl;
+ int rev1=-1;
+ int rev2=-1;
+ QString revkind1 = "BASE";
+ QString revkind2 = "WORKING";
+ s << cmd << *it << *it << rev1 << revkind1 << rev2 << revkind2 << true ;
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ if ( diffresult.count() > 0 ) {
+ //check kompare is available
+ if ( !KStandardDirs::findExe( "kompare" ).isNull() ) {
+ KTempFile *tmp = new KTempFile;
+ tmp->setAutoDelete(true);
+ QTextStream *stream = tmp->textStream();
+ stream->setCodec( QTextCodec::codecForName( "utf8" ) );
+ for ( QStringList::Iterator it2 = diffresult.begin();it2 != diffresult.end() ; ++it2 ) {
+ ( *stream ) << ( *it2 ) << "\n";
+ }
+ tmp->close();
+ KProcess *p = new KProcess;
+ *p << "kompare" << "-n" << "-o" << tmp->name();
+ p->start();
+ } else { //else do it with message box
+ Subversion_Diff df;
+ for ( QStringList::Iterator it2 = diffresult.begin();it2 != diffresult.end() ; ++it2 ) {
+ df.text->append( *it2 );
+ }
+ QFont f = df.font();
+ f.setFixedPitch( true );
+ df.text->setFont( f );
+ df.exec();
+ }
+ }
+ diffresult.clear();
+ }
+ } else if (args->isSet("d")) {
+ kdDebug(7128) << "delete " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 7;
+ s<<cmd;
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ kdDebug(7128) << "deleting : " << (*it).prettyURL() << endl;
+ s << *it;
+ }
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ } else if (args->isSet("s")) {
+ kdDebug(7128) << "switch " << list << endl;
+ SubversionSwitch d;
+ int result = d.exec();
+ if ( result == QDialog::Accepted ) {
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ kdDebug(7128) << "switching : " << (*it).prettyURL() << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int revnumber = -1;
+ QString revkind = "HEAD";
+ if ( d.revision->value() != 0 ) {
+ revnumber = d.revision->value();
+ revkind = "";
+ }
+ bool recurse=true;
+ int cmd = 12;
+ s << cmd;
+ s << *it;
+ s << KURL( d.url->url() );
+ s << recurse;
+ s << revnumber;
+ s << revkind;
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ }
+ }
+ } else if (args->isSet("r")) {
+ kdDebug(7128) << "revert " << list << endl;
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 8;
+ s<<cmd;
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ kdDebug(7128) << "reverting : " << (*it).prettyURL() << endl;
+ s << *it;
+ }
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ } else if (args->isSet("C")) {
+ kdDebug(7128) << "checkout " << list << endl;
+ SubversionCheckout d;
+ int result = d.exec();
+ if ( result == QDialog::Accepted ) {
+ for ( QValueListConstIterator<KURL> it = list.begin(); it != list.end() ; ++it ) {
+ KURL servURL = "svn+http://this_is_a_fake_URL_and_this_is_normal/";
+ QByteArray parms;
+ QDataStream s( parms, IO_WriteOnly );
+ int cmd = 1;
+ int rev = -1;
+ QString revkind = "HEAD";
+ if ( d.revision->value() != 0 ) {
+ rev = d.revision->value();
+ revkind = "";
+ }
+ s<<cmd;
+ s << KURL( d.url->url() );
+ s << ( *it );
+ s << rev;
+ s << revkind;
+ kdDebug(7128) << "checkouting : " << d.url->url() << " into " << (*it).prettyURL() << " at rev : " << rev << " or " << revkind << endl;
+ KIO::SimpleJob * job = KIO::special(servURL, parms, true);
+ connect( job, SIGNAL( result( KIO::Job * ) ), this, SLOT( slotResult( KIO::Job * ) ) );
+ KIO::NetAccess::synchronousRun( job, 0 );
+ }
+ }
+ } else {
+ KMessageBox::sorry(0, "Sorry, request not recognised. Perhaps not implemented yet?", "Feature Not Implemented");
+ }
+ QTimer::singleShot( 0, this, SLOT( finished() ) );
+}
+
+void SvnHelper::slotResult( KIO::Job* job ) {
+ if ( job->error() )
+ job->showErrorDialog( );
+
+ KIO::MetaData ma = job->metaData();
+ QValueList<QString> keys = ma.keys();
+ qHeapSort( keys );
+ QValueList<QString>::Iterator begin = keys.begin(), end = keys.end(), it;
+
+ QStringList message;
+ for ( it = begin; it != end; ++it ) {
+ // kdDebug(7128) << "METADATA helper : " << *it << ":" << ma[ *it ] << endl;
+ if ( ( *it ).endsWith( "string" ) ) {
+ if ( ma[ *it ].length() > 2 ) {
+ message << ma[ *it ];
+ }
+ }
+ //extra check to retrieve the diff output in case with run a diff command
+ if ( ( *it ).endsWith( "diffresult" ) ) {
+ diffresult << ma[ *it ];
+ }
+ }
+ if ( message.count() > 0 )
+ KMessageBox::informationListWId(m_id, "", message, "Subversion");
+}
+
+void SvnHelper::finished() {
+ kapp->quit();
+}
+
+static KCmdLineOptions options[] = {
+ { "u", I18N_NOOP("Update given URL"), 0 },
+ { "c", I18N_NOOP("Commit given URL"), 0 },
+ { "C", I18N_NOOP("Checkout in given directory"), 0 },
+ { "a", I18N_NOOP("Add given URL to the working copy"), 0 },
+ { "d", I18N_NOOP("Delete given URL from the working copy"), 0 },
+ { "s", I18N_NOOP("Switch given working copy to another branch"), 0 },
+ { "r", I18N_NOOP("Revert local changes"), 0 },
+ { "m", I18N_NOOP("Merge changes between two branches"), 0 },
+ { "D", I18N_NOOP("Show locally made changements with diff"), 0 },
+ {"!+URL", I18N_NOOP("URL to update/commit/add/delete from Subversion"), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv) {
+ KCmdLineArgs::init(argc, argv, "kio_svn_helper", I18N_NOOP("Subversion Helper"), "KDE frontend for SVN", "0.1");
+
+ KCmdLineArgs::addCmdLineOptions( options );
+ KGlobal::locale()->setMainCatalogue("kio_svn");
+ KApplication::addCmdLineOptions();
+
+ if ( KCmdLineArgs::parsedArgs()->count()==0 )
+ KCmdLineArgs::usage();
+ KApplication *app = new SvnHelper();
+
+// app->dcopClient()->attach();
+ app->exec();
+}
+
+#include "kio_svn_helper.moc"
diff --git a/kioslave/svn/svnhelper/kio_svn_helper.h b/kioslave/svn/svnhelper/kio_svn_helper.h
new file mode 100644
index 00000000..519577f2
--- /dev/null
+++ b/kioslave/svn/svnhelper/kio_svn_helper.h
@@ -0,0 +1,41 @@
+/* This file is part of the KDE project
+ Copyright (c) 2005 Mickael Marchand <marchand@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#ifndef _KIO_SVN_HELPER_H_
+#define _KIO_SVN_HELPER_H_
+
+#include <kapplication.h>
+#include <kio/job.h>
+#include <kwinmodule.h>
+#include <qstringlist.h>
+
+class SvnHelper:public KApplication {
+ Q_OBJECT
+
+public:
+ SvnHelper();
+private slots:
+ void finished();
+ void slotResult( KIO::Job *);
+private:
+ WId m_id;
+ QStringList diffresult; //for diff commands ;)
+};
+
+#endif
diff --git a/kioslave/svn/svnhelper/subversion.desktop b/kioslave/svn/svnhelper/subversion.desktop
new file mode 100644
index 00000000..00d206d0
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversion.desktop
@@ -0,0 +1,919 @@
+[Desktop Entry]
+ServiceTypes=inode/directory,all/all
+X-KDE-Submenu=Subversion
+X-KDE-Submenu[fa]=زیرنسخه
+X-KDE-Submenu[ne]=उप संस्करण
+X-KDE-Submenu[pa]=ਸਬ-ਵਰਜਨ
+X-KDE-Submenu[pt_BR]=Subversão
+#X-KDE-ShowIfDcopCall=kded ksvnd anyValidWorkingCopy(KURL::List)
+
+#Return type of below is a QStringList with a list of Actions which is appended to the Actions above
+X-KDE-GetActionMenu=kded ksvnd getActionMenu(KURL::List)
+
+[Desktop Action Add]
+Name=Add to Repository
+Name[bg]=Добавяне в хранилището
+Name[br]=Ouzhpennañ d'an daveiñ
+Name[ca]=Afegeix al repositori
+Name[cs]=Přidat do repository
+Name[da]=Tilføj til lager
+Name[de]=Zum SVN-Archiv hinzufügen
+Name[el]=Προσθήκη στο χώρο αποθήκευσης
+Name[es]=Añadir al repositorio
+Name[et]=Hoidlasse lisamine
+Name[eu]=Gehitu biltegira
+Name[fa]=افزودن به مخزن
+Name[fi]=Lisää versionhallintaan
+Name[fr]=Ajouter au référentiel
+Name[ga]=Cuir leis an Stór
+Name[gl]=Engadir ao repositorio
+Name[he]=הוסף למאגר
+Name[hu]=Hozzáadás az adattárhoz
+Name[is]=Bæta við geymslu
+Name[it]=Aggiungi al deposito
+Name[ja]=リポジトリへ追加
+Name[ka]=რეპოზიტორიისთვის დმატება
+Name[kk]=Қоймасына қосу
+Name[lt]=Įdėti į saugyklą
+Name[nb]=Legg til lager
+Name[nds]=Na't Archiv tofögen
+Name[ne]=भण्डारमा थप्नुहोस्
+Name[nl]=Toevoegen aan repository
+Name[nn]=Legg til lager
+Name[pa]=ਰਿਪੋਜ਼ਟਰੀ 'ਚ ਸ਼ਾਮਲ
+Name[pl]=Dodaj do repozytorium
+Name[pt]=Adicionar ao Repositório
+Name[pt_BR]=Adicionar ao Repositório
+Name[ru]=Добавить в хранилище
+Name[sk]=Pridať do archívu
+Name[sl]=Dodaj v skladišče
+Name[sr]=Додај у складиште
+Name[sr@Latn]=Dodaj u skladište
+Name[sv]=Lägg till i arkiv
+Name[tr]=Depoya Ekle
+Name[uk]=Додати до сховища
+Name[zh_CN]=添加到仓库
+Name[zh_TW]=新增到主目錄
+Icon=svn_add
+Exec=kio_svn_helper -a %U
+
+[Desktop Action Delete]
+Name=Delete From Repository
+Name[bg]=Изтриване от хранилището
+Name[br]=Lemel eus an daveiñ
+Name[ca]=Elimina del repositori
+Name[cs]=Smazat z repository
+Name[da]=Slet fra lager
+Name[de]=Aus dem SVN-Archiv löschen
+Name[el]=Διαγραφή από το χώρο αποθήκευσης
+Name[es]=Eliminar del repositorio
+Name[et]=Hoidlast kustutamine
+Name[eu]=Ezabatu biltegitik
+Name[fa]=حذف از مخزن
+Name[fi]=Poista versionhallinnasta
+Name[fr]=Supprimer du référentiel
+Name[ga]=Scrios ón Stór
+Name[gl]=Eliminar do repositorio
+Name[he]=מחק ממאגר
+Name[hu]=Törlés az adattárból
+Name[is]=Eyða frá geymslu
+Name[it]=Elimina dal deposito
+Name[ja]=リポジトリから削除
+Name[ka]=რეპოზირტორიიდან წაშლა
+Name[kk]=Қоймасынан өшіру
+Name[lt]=Pašalinti iš saugyklos
+Name[nb]=Slett fra lager
+Name[nds]=Ut Archiv wegdoon
+Name[ne]=भण्डारबाट मेट्नुहोस्
+Name[nl]=Verwijderen uit repository
+Name[nn]=Slett frå lager
+Name[pa]=ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਹਟਾਓ
+Name[pl]=Usuń z repozytorium
+Name[pt]=Remover do Repositório
+Name[pt_BR]=Remover do Repositório
+Name[ru]=Удалить из хранилища
+Name[sk]=Odstrániť z archívu
+Name[sl]=Izbriši iz skladišča
+Name[sr]=Обриши из складишта
+Name[sr@Latn]=Obriši iz skladišta
+Name[sv]=Ta bort från arkiv
+Name[tr]=Depodan Sil
+Name[uk]=Видалити зі сховища
+Name[zh_CN]=从仓库删除
+Name[zh_TW]=從主目錄刪除
+Icon=svn_remove
+Exec=kio_svn_helper -d %U
+
+[Desktop Action Revert]
+Name=Revert Local Changes
+Name[bg]=Връщане на локалните промени
+Name[ca]=Reverteix els canvis locals
+Name[cs]=Vrátit místní změny
+Name[da]=Vend lokale ændringer om
+Name[de]=Lokale Änderungen zurücknehmen
+Name[el]=Επαναφορά τοπικών αλλαγών
+Name[es]=Revertir cambios locales
+Name[et]=Kohalike muudatuste tühistamine
+Name[eu]=Leheneratu aldaketa lokalak
+Name[fa]=بازگشت تغییرات محلی
+Name[fi]=Palauta paikalliset muutokset
+Name[fr]=Annuler les modifications locales
+Name[gl]=Anular as modificacións locais
+Name[he]=נקה שינויים מקומיים
+Name[hu]=A helyi módosítások visszavonása
+Name[is]=Afturkalla staðbundnar breytingar
+Name[it]=Annulla i cambiamenti locali
+Name[ja]=ローカルでの変更を元に戻す
+Name[ka]=ლოკალური ცვლილებების შებრუნება
+Name[kk]=Жергілікті өзгерістерінен қайту
+Name[lt]=Atšaukti vietinius pakeitimus
+Name[nb]=Tilbakestill lokale endringer
+Name[nds]=Lokaal Ännern torüchnehmen
+Name[ne]=उल्टो स्थानीय परिवर्तन
+Name[nl]=Lokale wijzigingen ongedaan maken
+Name[nn]=Tilbakestill lokale endringar
+Name[pa]=ਉਲਟ ਸਥਾਨਕ ਤਬਦੀਲੀਆਂ
+Name[pl]=Cofnij lokalne zmiany
+Name[pt]=Reverter as Modificações Locais
+Name[pt_BR]=Reverter as Modificações Locais
+Name[ru]=Отменить локальные изменения
+Name[sk]=Vrátiť lokálne zmeny
+Name[sl]=Povrni krajevne spremembe
+Name[sr]=Одбаци локалне измене
+Name[sr@Latn]=Odbaci lokalne izmene
+Name[sv]=Återställ lokal ändring
+Name[tr]=Yerel Değişiklikleri Ters Çevir
+Name[uk]=Повернути локальні зміни
+Name[zh_CN]=恢复本地更改
+Name[zh_TW]=回復本地端變更
+Icon=undo
+Exec=kio_svn_helper -r %U
+Comment=Remove any changes made locally. Warning - this cannot be undone.
+Comment[bg]=Премахване на направените локални промени. Предупреждение - данните ще се загубят безвъзвратно.
+Comment[ca]=Elimina qualsevol canvi local. Avís: No es pot desfer.
+Comment[cs]=Odstraní změny provedené lokálně; nelze vrátit, pozor.
+Comment[da]=Fjern alle ændringer der er lavet lokalt. Advarsel - dette kan ikke fortrydes.
+Comment[de]=Nimmt alle lokal durchgeführten Änderungen zurück. Warnung: Dieser Vorgang kann nicht rückgängig gemacht werden.
+Comment[el]=Αφαίρεση κάθε τροποποίησης που έγινε τοπικά. Προειδοποίηση ότι αυτό δε μπορεί να αναιρεθεί.
+Comment[es]=Eliminar cualquier cambio local. Atención: esto no se puede deshacer.
+Comment[et]=Eemaldab kõik kohalikud muudatused. Hoiatus: seda ei saa tagasi võtta.
+Comment[eu]=Kendu lokalki egindako aldaketak. Abisua: ekintza hau ezin da desegin.
+Comment[fa]=حذف همۀ تغییرات ایجادشدۀ محلی. اخطار - این نمی‌تواند انجام نشود.
+Comment[fi]=Poista kaikki paikallisesti tehdyt muutokset. Varoitus - muutosta ei voi perua.
+Comment[fr]=Annuler toutes les modifications effectuées localement. Attention, cela ne peut pas être annulé.
+Comment[gl]=Borra as alteracións feitas a nível local. Atención - isto non pode ser anulado.
+Comment[hu]=A helyi módosítások visszavonása. Ez a művelet nem vonható vissza!
+Comment[is]=Fjarlægja allar breytingar sem voru gerðar hér. Athugið - það er ekki hægt að afturkalla þetta.
+Comment[it]=Rimuovi ogni cambiamento fatto localmente. Attenzione: non si può tornare indietro.
+Comment[ja]=ローカルで行われた変更を削除します。注意: この操作は元に戻せません。
+Comment[ka]=ნებისმიერი ლოკალურად გაკეთებული ცვლილებების წაშლა. გაფრთხილება - ამის უკუქცევა შეუძლებელია.
+Comment[kk]=Жергілікті (яғни тапсырылмаған) өзгерістерден айну. Абайлаңыз - бұл амалдан қайта алмайсыз.
+Comment[lt]=Panaikinti visus vietoje atliktus pakeitimus. Perspėjimas: to nebebus galima atšaukti.
+Comment[nb]=Fjern alle endringer som er gjort lokalt. MERK – dette kan ikke angres.
+Comment[nds]=All lokaal Ännern wegdoon. Wohrschoen - Dit lett sik nich torüchnehmen.
+Comment[ne]=कुनै पनि स्थानीय परिवर्तन हटाउनुहोस् । चेतावनी - यसलाई पूर्वावस्थामा फर्काउन सकिने छैन ।
+Comment[nl]=Lokale wijzigingen ongedaan maken. Let op: dit kan niet teruggedraaid worden.
+Comment[nn]=Fjern alle endringar som er gjorde lokalt. MERK – dette kan ikkje angrast.
+Comment[pl]=Usuwa wszystkie zmiany dokonane lokalnie. Uwaga - tej operacji nie można cofnąć.
+Comment[pt]=Remover as alterações que tenham sido feitas a nível local. Atenção - isto não pode ser anulado.
+Comment[pt_BR]=Remover as alterações que tenham sido feitas localmente. Atenção - isto não pode ser desfeito.
+Comment[ru]=Отменить все не опубликованные изменения. Эта операция не подлежит отмене.
+Comment[sk]=Odstráni lokálne zmeny. Upozornenie - toto sa nedá už vrátiť.
+Comment[sl]=Odstrani vse spremembe, opravljene krajevno. Opozorilo - tega ni mogoče razveljaviti.
+Comment[sr]=Уклони све локално направљене измене. Упозорење: ово се не може опозвати.
+Comment[sr@Latn]=Ukloni sve lokalno napravljene izmene. Upozorenje: ovo se ne može opozvati.
+Comment[sv]=Tar bort alla ändringar som gjorts lokalt. Varning: detta kan inte ångras.
+Comment[tr]=Yerel olarak yapılan değişiklikleri kaldır. Dikkat - bu işlem geri alınamaz.
+Comment[uk]=Вилучити всі зміни, які було зроблено локально. Попередження - зміни буде вилучено назавжди.
+Comment[zh_CN]=删除本地进行的任何更改。警告 - 此操作无法撤消。
+Comment[zh_TW]=移除任何已做的變更。警告:無法再復原。
+
+[Desktop Action Rename]
+Name=Rename...
+Name[bg]=Преименуване...
+Name[br]=Adenvel ...
+Name[ca]=Reanomena...
+Name[cs]=Přejmenovat...
+Name[cy]=Ail-enwi...
+Name[da]=Omdøb...
+Name[de]=Umbenennen ...
+Name[el]=Μετονομασία...
+Name[eo]=Alinomigi...
+Name[es]=Cambiar nombre...
+Name[et]=Ümbernimetamine...
+Name[eu]=Berrizendatu...
+Name[fa]=تغییر نام...
+Name[fi]=Nimeä uudelleen...
+Name[fr]=Renommer...
+Name[ga]=Athainmnigh...
+Name[gl]=Mudar o nome...
+Name[he]=שנה שם...
+Name[hu]=Átnevezés...
+Name[is]=Endurnefna...
+Name[it]=Rinomina...
+Name[ja]=名前変更...
+Name[ka]=სახელის გადარქმევა...
+Name[kk]=Қайта атау...
+Name[lt]=Pervadinti...
+Name[nb]=Endre navn …
+Name[nds]=Ümnömen...
+Name[ne]=पुन: नामकरण गर्नुहोस्...
+Name[nl]=Hernoemen...
+Name[nn]=Endra namn …
+Name[pa]=ਨਾਂ-ਤਬਦੀਲ...
+Name[pl]=Zmień nazwę...
+Name[pt]=Mudar o Nome...
+Name[pt_BR]=Renomear...
+Name[ru]=Переименовать...
+Name[sk]=Premenovať...
+Name[sl]=Preimenuj ...
+Name[sr]=Преименуј...
+Name[sr@Latn]=Preimenuj...
+Name[sv]=Byt namn...
+Name[tr]=Yeniden Adlandır...
+Name[uk]=Перейменувати...
+Name[zh_CN]=重命名...
+Name[zh_TW]=重新命名...
+Icon=pencil
+Exec=kio_svn_helper -r %U
+Comment=Rename a file locally and in the repository. Use this rather than adding and deleting to rename a file.
+Comment[bg]=Преименуване на файл локално и в хранилището. За предпочитане е да използвате този метод вместо изтриване и добавяне.
+Comment[ca]=Reanomena un fitxer localment i en el repositori. Use-ho en comptes d'afegir i eliminar per a reanomenar un fitxer.
+Comment[cs]=Přejmenovat soubor lokálně a v repository. Použijte raději než přidání a smazání souboru k docílení jeho přejmenování.
+Comment[da]=Omdøb en fil lokalt og i lageret. Brug dette i stedet for at tilføje og slette for at omdøbe en fil.
+Comment[de]=Benennt eine Datei lokal und im SVN-Archiv um. Verwenden Sie besser diese Funktion zum Umbenennen einer Datei als Hinzufügen und Löschen.
+Comment[el]=Μετονομασία ενός αρχείου τοπικά και στο χώρο αποθήκευσης. Χρησιμοποιήστε αυτό αντί της προσθήκης και αφαίρεσης για τη μετονομασία ενός αρχείου.
+Comment[es]=Cambiar el nombre de un archivo localmente y en el repositorio. Use esto en lugar de añadir y eliminar para cambiar el nombre de un archivo.
+Comment[et]=Faili ümbernimetamine nii kohalikult kui hoidlas. See on eelistatud viis faili ümbernimetamisel lisamise ja kustutamise asemel.
+Comment[eu]=Berrizendatu fitxategi bat lokalki eta biltegian. Erabili hau fitxategia ezabatu eta berriro gehitu ordez.
+Comment[fa]=تغییر نام پروندۀ محلی و در مخزن. به جای افزودن و حذف، برای تغییر نام پرونده از این استفاده کنید.
+Comment[fi]=Nimeä uudelleen paikallinen ja versionhallinnassa oleva tiedosto. Nimeä tiedosto uudelleen mieluummin näin kuin lisäämällä ja poistamalla.
+Comment[fr]=Renommer un fichier localement et dans le référentiel. Utilisez cette option pour renommer un fichier, au lieu de le supprimer puis l'ajouter sous le nouveau nom.
+Comment[gl]=Muda o nome dun ficheiro tanto localmente como no repositorio. Use isto en vez de engadir e eliminar o ficheiro para mudar o nome.
+Comment[hu]=Fájl átnevezése helyben és az adattárban. Ezt érdemes használni hozzáadás és törlés helyett.
+Comment[is]=Endurnefna skrá hér og í geymslunni. Notist heldur við þetta í stað þess að bæta við og eyða til að endurnefna skrá.
+Comment[it]=Rinomina un file localmente e nel deposito. Usa questo invece di aggiungere e rimuovere un file per rinominarlo.
+Comment[ja]=ローカルとリポジトリのファイルを改名します。名前の変更の際に追加と削除をしないで、この方法を使用してください。
+Comment[ka]=ფაილის სახელის გადარქმევა ლოკალურად და რეპოზიტორიასი. დამატების და წაშლის ნაცვლად ეს გამოიყენეთ.
+Comment[kk]=Файлдың жергілікті де, қоймасындағы да атауын өзгерту. Өшіріп қайта қосудан гөрі осыны қолданған дұрыс.
+Comment[lt]=Pervadinti bylą vietoje ir saugykloje. Naudokite šią parinktį užuot ištrindami ir įrašydami nauju vardu norimą pervadinti bylą.
+Comment[nb]=Gi en fil nytt navn lokalt og i arkivet. Bruk dette heller enn å slette og legge inn på nytt for å endre navn på en fil.
+Comment[nds]=En Datei lokaal un in't Archiv ümnömen. Bruuk beter dit, as "Tofögen" un "Wegdoon".
+Comment[ne]=फाइलालाई स्थानीय रुपमा र भण्डारमा पुन: नामकरण गर्नुहोस् । फाइललाई पुन: नामकरण गर्न थप्ने र मेट्ने भन्दा यसलाई प्रयोग गर्नुहोस् ।
+Comment[nl]=Hernoem een bestand lokaal en in de repository. Gebruik dit bij voorkeur boven het verwijderen van een bestand en het toevoegen onder een andere naam.
+Comment[nn]=Gi ei fil nytt namn lokalt og i arkivet. Bruk dette heller enn å sletta og leggja inn på nytt for å endra namn på ei fil.
+Comment[pl]=Zmienia nazwę pliku lokalnie i w repozytorium. Należy tego używać zamiast dodawania i usuwania pliku.
+Comment[pt]=Muda o nome de um ficheiro a nível local e no repositório. Use isto em vez de adicionar e remover o ficheiro para mudar o nome.
+Comment[pt_BR]=Muda o nome de um arquivo localmente e no repositório. Use isto em vez de adicionar e remover o arquivo para mudar o nome.
+Comment[ru]=Переименовать файл с отражением этого в хранилище.
+Comment[sk]=Premenuje súbor lokálne aj v archíve. Použite radšej toto ako pridanie a odstránenie súboru.
+Comment[sl]=Preimenuj datoteko krajevno in v skladišču. Uporabite to namesto brisanja in dodajanja datoteke.
+Comment[sr]=Преименуј фајл локално и у складишту. Користите ово уместо трика са додавањем и брисањем фајла.
+Comment[sr@Latn]=Preimenuj fajl lokalno i u skladištu. Koristite ovo umesto trika sa dodavanjem i brisanjem fajla.
+Comment[sv]=Byt namn på en fil lokalt och i arkivet. Använd detta istället för att lägga till och ta bort för att byta namn på en fil.
+Comment[uk]=Перейменувати файл локально і в сховищі. Вживайте замість додавання і видалення файла, щоб його перейменувати.
+Comment[zh_CN]=在本地和仓库中重命名文件。使用此功能来取代对文件的添加和删除。
+Comment[zh_TW]=在本地端與主目錄中重新命名檔案。不必先新增再刪除檔案。
+
+[Desktop Action Import]
+Name=Import Repository
+Name[bg]=Импортиране на директория
+Name[br]=Enporzh an daveiñ
+Name[ca]=Importa repositori
+Name[cs]=Importovat repository
+Name[da]=Importér lager
+Name[de]=SVN-Archiv importieren
+Name[el]=Εισαγωγή χώρου αποθήκευσης
+Name[eo]=Importi Deponejon
+Name[es]=Importar repositorio
+Name[et]=Hoidla import
+Name[eu]=Inportatu biltegia
+Name[fa]=مخزن واردات
+Name[fi]=Tuo versionhallinta
+Name[fr]=Importer dans un référentiel
+Name[ga]=Iompórtáil Stór
+Name[gl]=Importar un repositorio
+Name[hu]=Adattár importálása
+Name[is]=Flytja inn geymslu
+Name[it]=Importa deposito
+Name[ja]=リポジトリのインポート
+Name[ka]=რეპოზიტორიის იმპორტი
+Name[kk]=Қоймасына импорттау
+Name[lt]=Importuoti saugyklą
+Name[nb]=Importer lager
+Name[nds]=Archiv importeren
+Name[ne]=आयात भण्डार
+Name[nl]=Repository importeren
+Name[nn]=Importer lager
+Name[pa]=ਰਿਪੋਜ਼ਟਰੀ ਅਯਾਤ
+Name[pl]=Importuj repozytorium
+Name[pt]=Importar um Repositório
+Name[pt_BR]=Importar um Repositório
+Name[ru]=Импортировать в хранилище
+Name[sk]=Importovať archív
+Name[sl]=Uvozi skladišče
+Name[sr]=Увези складиште
+Name[sr@Latn]=Uvezi skladište
+Name[sv]=Importera arkiv
+Name[tr]=Depoyu İçe Aktar
+Name[uk]=Імпортувати сховище
+Name[zh_CN]=导入仓库
+Name[zh_TW]=匯入主目錄
+Icon=svn_import
+Exec=kio_svn_helper -i %U
+Comment=Put folder into an existing repository to put it under revision control.
+Comment[bg]=Поставяне на директория в съществуващо хранилище.
+Comment[ca]=Situa la carpeta en un repositori existent per a posar-la sota el control de revisions.
+Comment[cs]=Zařadit složku do repository a správy verzí
+Comment[da]=Put mappe ind i et eksisterende lager for at få den ind under revisionskontrol.
+Comment[de]=Schiebt den Ordner in ein existierendes SVN-Archiv, um ihn in die Versionsverwaltung aufzunehmen.
+Comment[el]=Εισαγωγή φακέλου σε έναν υπάρχον χώρο αποθήκευσης για τον έλεγχο εκδόσεων.
+Comment[es]=Situar la carpeta en un repositorio existente para ponerla bajo control de revisión.
+Comment[et]=Kataloogi lisamine olemasolevasse versioonikontrolli süsteemi hoidlasse.
+Comment[eu]=Jarri karpeta biltegi batean errebisio kontrolpean edukitzeko.
+Comment[fa]=گذاشتن پوشه در مخزن موجود جهت قراردادن آن تحت کنترل بازبینی.
+Comment[fi]=Laita kansio versionhallintaan viemällä se olemassa olevaan versionhallintavarastoon.
+Comment[fr]=Place le dossier dans un référentiel existant afin de le mettre sous contrôle de version.
+Comment[gl]=Pon o cartafol nun repositorio existente para pólo baixo control de versións.
+Comment[hu]=Könyvtár felvétele a verziókövető rendszer felügyelete alá.
+Comment[is]=Setja möppu í geymslu sem finnst fyrir til að setja hana undir breytingarstjórn.
+Comment[it]=Metti una cartella in un deposito esistente per metterla sotto controllo di revisione.
+Comment[ja]=既存のリポジトリにフォルダを置き、リビジョン管理の対象とします。
+Comment[ka]=რევიზიის კონტროლისთვის ჩადეთ საქაღალდე არსებულ რეპოზიტორიაში.
+Comment[kk]=Қапшықты қоймасына, нұсқалар есебін қадағалап, көшіру.
+Comment[lt]=Įdėti aplanką į egzistuojančią saugyklą ir įjungti jį į keitimų sekimo sistemą.
+Comment[nb]=Legg mappe inn i et eksisterende arkiv slik at det får revisjonskontroll.
+Comment[nds]=Verschufft en Orner na en vörhannen Archiv, so dat he ünner Verschoonkuntrull kummt
+Comment[ne]=फोल्डलाई पुनरावोलकन नियन्त्रण गर्न अवस्थित भण्डारमा राख्नुहोस् ।
+Comment[nl]=Plaats een map in een bestaande repository zodat het onder het versiebeheer system valt.
+Comment[nn]=Legg ei mappe inn i eit eksisterande lager slik at det får revisjonskontroll.
+Comment[pl]=Dodaje katalog do istniejącego repozytorium, aby umieścić go w systemie kontrolowania wersji.
+Comment[pt]=Coloca a pasta num repositório existente para a colocar sob controlo de versões.
+Comment[pt_BR]=Coloca a pasta num repositório existente para colocá-lo sob controle de versões.
+Comment[ru]=Поместить папку в существующее хранилище для добавления этой папки в систему контроля ревизий
+Comment[sk]=Vloží priečinok do existujúceho archívu ako novú revíziu.
+Comment[sl]=Uvozi mapo v obstoječe skladišče. Mapa tako postane del revizijskega nadzora.
+Comment[sr]=Стави фасциклу у постојеће складиште, ради стављања под контролу ревизија.
+Comment[sr@Latn]=Stavi fasciklu u postojeće skladište, radi stavljanja pod kontrolu revizija.
+Comment[sv]=Lägg till katalog i ett befintligt arkiv för att få den under versionskontroll
+Comment[tr]=Dizini başka bie alt düzeltme controlünde var olan bir depo içine koy.
+Comment[uk]=Вставити теку в існуюче сховище, щоб уможливити для неї керування версіями.
+Comment[zh_CN]=将文件夹放入现有仓库,以便让其受到版本控制。
+Comment[zh_TW]=將資料夾放進現存的主目錄,並開始做版本控制。
+
+[Desktop Action Checkout]
+Name=Checkout From Repository...
+Name[bg]=Изтегляне от хранилището...
+Name[ca]=Obtenir del repositori...
+Name[cs]=Získat z repository...
+Name[da]=Tjek ud fra lager...
+Name[de]=Aus SVN-Archiv herausholen ...
+Name[el]=Έλεγχος εξόδου από το χώρο αποθήκευσης...
+Name[eo]=Ekpreni el Deponejo...
+Name[es]=Obtener del repositorio...
+Name[et]=Hoidla väljavõte...
+Name[eu]=Deskargatu biltegitik...
+Name[fa]=وارسی از مخزن...
+Name[fi]=Nouda versionhallinnasta...
+Name[fr]=Extraire depuis un référentiel...
+Name[gl]=Obter do repositorio...
+Name[hu]=Kimásolás az adattárból...
+Name[is]=Ná í frá geymslu...
+Name[it]=Ritira dal deposito...
+Name[ja]=リポジトリからチェックアウト...
+Name[ka]=რეპოზიტორიიდან ამონიშვნა...
+Name[kk]=Қоймасынан көшіріп алу...
+Name[lt]=Atsisiųsti iš saugyklos...
+Name[nb]=Sjekk ut fra lager …
+Name[nds]=Ut Archiv daalladen...
+Name[ne]=भण्डारबाट जाँच...
+Name[nl]=Repository uitchecken...
+Name[nn]=Sjekk ut frå lager …
+Name[pa]=ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਚੈਕਆਉਟ...
+Name[pl]=Pobierz z repozytorium...
+Name[pt]=Obter do Repositório...
+Name[pt_BR]=Obter do Repositório...
+Name[ru]=Загрузить из хранилища...
+Name[sk]=Získať z archívu...
+Name[sl]=Prevzemi iz skladišča ...
+Name[sr]=Довуци из складишта...
+Name[sr@Latn]=Dovuci iz skladišta...
+Name[sv]=Checka ut från ett arkiv...
+Name[tr]=Depodan Kontrol Et...
+Name[uk]=Взяти зі сховища...
+Name[zh_CN]=从仓库中检出...
+Name[zh_TW]=從主目錄取出...
+Icon=svn_checkout
+Exec=kio_svn_helper -C %U
+Comment=Checkout out files from an existing repository into this folder.
+Comment[bg]=Изтегляне на файлове от хранилището в текущата директория.
+Comment[ca]=Obté fitxers des d'un repositori existent cap aquesta carpeta.
+Comment[cs]=Získat soubory z existující repository do této složky.
+Comment[da]=Tjek filer ud fra et eksisterende lager til denne mappe.
+Comment[de]=Legt Dateien aus einem existierenden SVN-Archiv in diesem Ordner ab.
+Comment[el]=΄Έλεγχος εξόδου των αρχείων από έναν υπάρχον χώρο αποθήκευσης σε αυτόν τον φάκελο.
+Comment[es]=Descargar archivos de un repositorio existente en esta carpeta.
+Comment[et]=Olemasoleva hoidla failide väljavõte sellesse kataloogi.
+Comment[eu]=Deskargatu fitxategiak biltegi batetik karpeta honetara.
+Comment[fa]=وارسی پرونده‌های بیرونی از مخزن موجود در این پوشه
+Comment[fi]=Nouda tiedostot olemassa olevasta versionhallinnasta tähän kansioon.
+Comment[fr]=Extraire dans ce dossier les fichiers d'un référentiel existant
+Comment[gl]=Obtén todos os ficheiros dun repositorio existente para este cartafol.
+Comment[hu]=Fájlok kimásolása az adattárból ebbe a könyvtárba.
+Comment[is]=Ná í skrár frá geymslu og setja í þessa möppu.
+Comment[it]=Ritira i file da un deposito esistente in questa cartella.
+Comment[ja]=既存のリポジトリから、このディレクトリへファイルをチェックアウトします。
+Comment[ka]=არსებული რეპოზიტორიიდან ფაილები ამ საქაღალდეში ამონიშნეთ.
+Comment[kk]=Файлдарды қоймасынан көрсетілген қапшыққа көшіріп алу.
+Comment[lt]=Atsisiųsti bylas iš egzistuojančios saugyklos į šį aplanką.
+Comment[nb]=Sjekk ut filer fra et arkiv inn i denne mappa
+Comment[nds]=Laadt Dateien ut en vörhannen Archiv na dissen Orner daal.
+Comment[ne]=यो फोल्डरमा अवस्थित भण्डार बाहिरका फाइललाई जाँच गर्नुहोस् ।
+Comment[nl]=Bestanden van een bestaande repository uitchecken in deze map.
+Comment[nn]=Sjekk ut filer frå eit arkiv inn i denne mappa.
+Comment[pl]=Pobranie plików z istniejącego repozytorium do tego katalogu.
+Comment[pt]=Obtém todos os ficheiros de um repositório existente para esta pasta.
+Comment[pt_BR]=Obtém todos os arquivos de um repositório existente para esta pasta.
+Comment[ru]=Загрузить файлы из существующего хранилища в указанную папку
+Comment[sk]=Získa súbory z existujúceho archívu do tohoto priečinku.
+Comment[sl]=Prevzemi datoteke iz obstoječega skladišča v to mapo.
+Comment[sr]=Довуци фајлове из постојећег складишта у ову фасциклу.
+Comment[sr@Latn]=Dovuci fajlove iz postojećeg skladišta u ovu fasciklu.
+Comment[sv]=Checka ut filer från ett befintligt arkiv till katalogen.
+Comment[tr]=Bu dizinde var olan bir depodan hatalı dosyaları kontrol et.
+Comment[uk]=Взяти файли з існуючого сховища і покласти в цю теку.
+Comment[zh_CN]=从已有仓库中检出文件并存放至此文件夹。
+Comment[zh_TW]=從現存的主目錄取出檔案到此資料夾。
+
+[Desktop Action Switch]
+Name=Switch...
+Name[bg]=Превключване...
+Name[br]=Gwintañ ...
+Name[ca]=Canvia...
+Name[cs]=Přepnout...
+Name[de]=Wechseln (switch)
+Name[el]=Εναλλαγή...
+Name[eo]=Ŝalti...
+Name[es]=Cambiar...
+Name[et]=Lülitumine...
+Name[eu]=Aldatu...
+Name[fa]=سودهی...
+Name[fi]=Vaihda...
+Name[fr]=Basculer...
+Name[gl]=Mudar...
+Name[he]=החלף...
+Name[hu]=Váltás...
+Name[is]=Skipta...
+Name[it]=Passa...
+Name[ja]=スイッチ...
+Name[ka]=გადრთვა...
+Name[kk]=Ауысу...
+Name[lt]=Perjungti...
+Name[nb]=Bytt …
+Name[nds]=Telg wesseln...
+Name[ne]=स्विच...
+Name[nl]=Omzetten (switch)...
+Name[nn]=Byt …
+Name[pa]=ਤਬਦੀਲ...
+Name[pl]=Przełącz...
+Name[pt]=Mudar...
+Name[pt_BR]=Mudar...
+Name[ru]=Сменить адрес хранилища...
+Name[sk]=Vymeniť...
+Name[sl]=Preklopi ...
+Name[sr]=Пребаци...
+Name[sr@Latn]=Prebaci...
+Name[sv]=Byt...
+Name[tr]=Değiştir...
+Name[uk]=Перемкнути...
+Name[zh_CN]=切换...
+Name[zh_TW]=切換...
+Icon=svn_switch
+Comment=Switch given working copy to another branch
+Comment[bg]=Превключване на работното копие към друго разклонение.
+Comment[ca]=Canvia una còpia de treball indicada a una altra branca
+Comment[cs]=Přepnout danou pracovní kopii na jinou větev
+Comment[da]=Skift given arbejdskopi til en anden gren.
+Comment[de]=Wechselt von der vorhandenen Arbeitskopie zu einer anderen Verzweigung (branch).
+Comment[el]=Εναλλαγή του δοσμένου αντιγράφου εργασίας σε άλλον κλάδο
+Comment[es]=Cambiar una determinada copia de trabajo a otra rama
+Comment[et]=Antud töökoopia lülitamine teise harru
+Comment[eu]=aldatu laneko kopia bat beste adar batekin
+Comment[fa]=سودهی رونوشت کار داده‌شده به شاخۀ دیگر
+Comment[fi]=Vaihda annettu työkopio toiseen haaraan
+Comment[fr]=Basculer la copie de travail vers une autre branche
+Comment[gl]=Muda a copia de traballo actual para outra ramificación
+Comment[hu]=A munkamásolat átváltása másik ágra
+Comment[is]=Skipta núverandi vinnuafriti yfir í aðra grein
+Comment[it]=Passa la copia di lavoro a un altro ramo
+Comment[ja]=作業中のコピーを他のブランチへ切り換えます。
+Comment[ka]=მიმდინარე სამუშაო ასლის სხვა ტოტზე გაკეთება
+Comment[kk]=Жұмыс көшірмені жобаның басқа саласына (яғни қоймасына) ауыстыру
+Comment[lt]=Perjungti esamą vietinį saugyklos aplanką į kitą atšaką
+Comment[nb]=Byt arbeidskopien til en annen gren
+Comment[nds]=Arbeitkopie na en annern Telg verschuven
+Comment[ne]=दिइएको कार्य प्रतिलाई अन्य शाखामा स्विच गर्नुहोस्
+Comment[nl]=Zet een bestaande copy om naar een andere branch
+Comment[nn]=Byt arbeidskopien til ei anna grein
+Comment[pl]=Przełącza katalog roboczy na inną gałąź
+Comment[pt]=Muda a cópia de trabalho actual para outra ramificação
+Comment[pt_BR]=Muda a cópia de trabalho atual para outra ramificação
+Comment[ru]=Сменить адрес хранилища, например перейти от стабильной ветки к ветке разработки
+Comment[sk]=Vymení danú pracovnú kópiu zo inú vetvu
+Comment[sl]=Preklopi dano delovno kopijo na drugo vejo
+Comment[sr]=Пребаци дату радну копију на другу грану
+Comment[sr@Latn]=Prebaci datu radnu kopiju na drugu granu
+Comment[sv]=Byt angiven arbetskopia till en annan gren
+Comment[tr]=Çalışan belirli bir kopyayı başka bölüme değiştir
+Comment[uk]=Перемкнути поточну робочу копію на іншу гілку
+Comment[zh_CN]=将工作副本切换到另外一个分支
+Comment[zh_TW]=將指定的工作複本切換到另一個分支
+Exec=kio_svn_helper -s %U
+
+[Desktop Action Merge]
+Name=Merge...
+Name[bg]=Смесване...
+Name[br]=D&astum ...
+Name[ca]=Fusiona...
+Name[cs]=Sloučit...
+Name[da]=Indflet...
+Name[de]=Zusammenführen ...
+Name[el]=Συγχώνευση...
+Name[eo]=Kunfandi...
+Name[es]=Mezclar...
+Name[et]=Ühendamine...
+Name[eu]=Bateratu...
+Name[fa]=ادغام...
+Name[fi]=Yhdistä...
+Name[fr]=Fusionner...
+Name[ga]=Cumaisc...
+Name[gl]=Fusionar...
+Name[he]=מזג...
+Name[hu]=Összeolvasztás...
+Name[is]=Bræða saman...
+Name[it]=Fondi...
+Name[ja]=マージ...
+Name[ka]=შერწყმა...
+Name[kk]=Біріктіру...
+Name[lt]=Sulieti...
+Name[nb]=Flett …
+Name[nds]=Tosamenföhren...
+Name[ne]=गाभिनु...
+Name[nl]=Samenvoegen...
+Name[nn]=Flett …
+Name[pa]=ਮਿਲਾਨ...
+Name[pl]=Połącz...
+Name[pt]=Reunir...
+Name[pt_BR]=Mesclar...
+Name[ru]=Объединить...
+Name[sk]=Spojiť...
+Name[sl]=Združi ...
+Name[sr]=Стопи...
+Name[sr@Latn]=Stopi...
+Name[sv]=Sammanfoga...
+Name[tr]=Birleştir...
+Name[uk]=Об'єднати...
+Name[zh_CN]=合并...
+Name[zh_TW]=合併...
+Icon=svn_merge
+Comment=Merge changes between this and another branch
+Comment[bg]=Смесване на промените от това разклонение с друго разклонение.
+Comment[ca]=Fusiona els canvis entre aquesta i una altra branca
+Comment[cs]=Sloučit změny mezi touto a jinou větví
+Comment[da]=Indflet ændringer mellem denne og en anden gren
+Comment[de]=Führt Änderungen aus dieser und einer anderen Verzweigung zusammen
+Comment[el]=Συγχώνευση αλλαγών μεταξύ του τρέχοντος και κάποιου άλλου κλάδου
+Comment[es]=Mezclar los cambios entre esta y otra rama
+Comment[et]=Selle ja teise haru muudatuste ühendamine
+Comment[eu]=Bateratu hau eta beste adar baten arteko aldaketak
+Comment[fa]=تغییرات بین این شاخه و شاخۀ دیگر را ادغام می‌کند
+Comment[fi]=Yhdistä tämän ja toisen haaran väliset muutokset
+Comment[fr]=Fusionner les modifications entre cette branche et une autre
+Comment[gl]=Fusiona as modificacións entre esta ramificación e outra
+Comment[hu]=A módosítások összefésülése egy másik ággal
+Comment[is]=Bræða saman breytingar milli þessarar og annarar greinar
+Comment[it]=Fondi i cambiamenti tra questo e un altro ramo
+Comment[ja]=このブランチと他のブランチの間で、変更をマージします。
+Comment[ka]=ამ და სხვა ტოტების ცვლილებების შერწყმა
+Comment[kk]=Осы және өзге салалардағы өзгерістерін біріктіру
+Comment[lt]=Sulieti pakeitimus tarp šios ir kitos atšakos
+Comment[nb]=Flett sammen endringer mellom denne og en annen gren
+Comment[nds]=Ännern twischen dissen un en annern Telg tosamenföhren
+Comment[ne]=यो र अन्य शाखा बीचका परिवर्तन गाभ्नुहोस्
+Comment[nl]=Deze en een andere tak samenvoegen
+Comment[nn]=Flett saman endringar mellom denne og ei anna grein
+Comment[pl]=Łączy zmiany między tą i inną gałęzią
+Comment[pt]=Junta as modificações entre esta ramificação e outra
+Comment[pt_BR]=Mescla as modificações entre esta ramificação e outra
+Comment[ru]=Объеденить изменения между этой и другой ветками
+Comment[sk]=Spojí zmeny medzi touto a inou vetvou
+Comment[sl]=Združi spremembe med to in drugo vejo
+Comment[sr]=Стопи измене између ове и друге гране
+Comment[sr@Latn]=Stopi izmene između ove i druge grane
+Comment[sv]=Sammanfoga ändringar mellan den här och en annan gren
+Comment[tr]=Bu ve başka bölüm arasındaki değişiklikleri birleştir
+Comment[uk]=Об'єднати зміни в цій та іншій гілках
+Comment[zh_CN]=合并本地和另外一个分支的更改
+Comment[zh_TW]=將這個與另一個分支合併
+Exec=kio_svn_helper -m %U
+
+[Desktop Action Blame]
+Name=Blame...
+Name[bg]=Информация...
+Name[ca]=Responsabilitza...
+Name[cs]=Obvinit...
+Name[de]=Blame ...
+Name[el]=Συσχέτιση...
+Name[eo]=Kulpigi...
+Name[es]=Responsabilizar...
+Name[et]=Autorsus...
+Name[eu]=Erruduna...
+Name[fa]=...سرزنش کردن
+Name[fr]=Blâmer...
+Name[gl]=Autorías...
+Name[he]=האשם...
+Name[hu]=Ki tette ezt...
+Name[is]=Kenna um...
+Name[it]=Traccia...
+Name[ja]=ブレイム...
+Name[ka]=ბრალი...
+Name[kk]=Кім екен...
+Name[lt]=Nustatyti...
+Name[nb]=Skyld på …
+Name[nds]=Naspören...
+Name[ne]=दोष...
+Name[nl]=Annotatie...
+Name[nn]=Skuld på …
+Name[pa]=ਬਲਾਮੀ...
+Name[pl]=Obwiń...
+Name[pt]=Culpar...
+Name[pt_BR]=Culpar...
+Name[ru]=Определить авторов...
+Name[sk]=Žalovať...
+Name[sl]=Odgovornost ...
+Name[sr]=Окриви...
+Name[sr@Latn]=Okrivi...
+Name[sv]=Klandra...
+Name[uk]=Вина...
+Name[zh_CN]=历史...
+Name[zh_TW]=最後狀態註記...
+Icon=svn_blame
+Comment=See who wrote each line of the file and in what revision
+Comment[bg]=Информация за това кой е написал файла и в коя версия
+Comment[ca]=Veu qui va escriure cada línia del fitxer i en qui l'ha revisat
+Comment[cs]=Zobrazit, kdo napsal kterou řádku souboru spolu s revizí
+Comment[da]=Se hvem der skrev hver linje i filen og i hvilken revision
+Comment[de]=Zeigt an, wer die Zeilen einer Datei wann geändert hat.
+Comment[el]=Δείτε ποιος έγραψε κάθε γραμμή του αρχείου και σε ποια αναθεώρηση
+Comment[es]=Ver quién escribió cada línea del archivo y en qué revisión
+Comment[et]=Vaatamine, kes ja millises versioonis mingi faili rea kirjutas
+Comment[eu]=Ikusi nork idatzi duen lerro bakoitza eta zer errebisiotan
+Comment[fa]=ببینید چه کسی هر خط پرونده را و در چه بازبینی نوشته است
+Comment[fi]=Tarkista kuka on kirjoittanut tiedoston rivit missäkin versiossa
+Comment[fr]=Voir qui a écrit chacune des lignes du fichier, et dans quelle version.
+Comment[gl]=Consulta quen escribiu unha liña dada no ficheiro e en que versión
+Comment[hu]=A fájlok készítőinek megtekintése soronként, verzió szerint
+Comment[is]=Sjá hver skrifaði hvaða línu og í hvaða útgáfu
+Comment[it]=Vedi chi ha scritto ogni riga del file e in quale revisione
+Comment[ja]=誰がどのリビジョンの、どのファイルの、どの行を書いたのかを見ます。
+Comment[ka]=ნახეთ თუ ვინ ჩაწერა ფაილის ყოველი ხაზი და რომელ რევიზიაში
+Comment[kk]=Файлдағы жолды кім және қай нұсқасында жазғанын білу
+Comment[lt]=Patikrinti, kas parašė kiekvieną eilutę ir kurio keitimo metu tai buvo atlikta
+Comment[nb]=Se hvem som skrev hver linje i fila og i hvilken revisjon
+Comment[nds]=Wiest, wokeen wannehr welke Dateiregen ännert hett
+Comment[ne]=प्रत्येक फाइल कसले लेखेको छ र के दोहोरिएको छ हेर्नुहोस्
+Comment[nl]=Bekijk wie welke regel van het bestand geschreven heeft en in welke revisie
+Comment[nn]=Sjå kven som skreiv kvar linje i fila og i kva revisjon
+Comment[pl]=Pokazuje, kto ostatni zmienił każdą linię w pliku i w której wersji
+Comment[pt]=Vê quem escreveu uma dada linha no ficheiro e em que versão
+Comment[pt_BR]=Vê quem escreveu uma determinada linha no arquivo e em que versão
+Comment[ru]=Просмотреть авторов каждой строки в файле и в выбранной ревизии
+Comment[sk]=Pozrite sa, kto a v ktorej revízii napísal každý riadok súboru
+Comment[sl]=Prikaži, kdo je napisal katero vrstico in v kateri reviziji
+Comment[sr]=Прикажи за сваку линију фајла ко ју је написао и у којој ревизији
+Comment[sr@Latn]=Prikaži za svaku liniju fajla ko ju je napisao i u kojoj reviziji
+Comment[sv]=Se vem som skrev varje rad i filen och för vilken version
+Comment[uk]=Подивитись хто написав кожний рядок файла і в якій модифікації
+Comment[zh_CN]=查看谁在哪次修订中写了文件的哪一行
+Comment[zh_TW]=看檔案中的每一行是誰寫的,其版本為何
+Exec=kio_svn_helper -b %U
+
+[Desktop Action CreatePatch]
+Name=Create Patch...
+Name[bg]=Създаване на кръпка...
+Name[ca]=Crea pedaç...
+Name[cs]=Vytvořit záplatu...
+Name[da]=Lav rettelse...
+Name[de]=Patch erstellen ...
+Name[el]=Δημιουργία διόρθωσης...
+Name[eo]=Krei Flikon...
+Name[es]=Crear parche...
+Name[et]=Paiga loomine...
+Name[eu]=Sortu adabakia...
+Name[fa]=ایجاد کژنه...
+Name[fi]=Luo korjaus...
+Name[fr]=Créer un correctif...
+Name[ga]=Cruthaigh Paiste...
+Name[gl]=Criar un parche...
+Name[he]=צור טלאי...
+Name[hu]=Folt készítése...
+Name[is]=Búa til plástur...
+Name[it]=Crea correzione...
+Name[ja]=パッチの作成...
+Name[ka]=ბებკის შექმნა...
+Name[kk]=Жамауды құру...
+Name[lt]=Kurti pataisymą...
+Name[nb]=Lag lapp …
+Name[nds]=Kodeplaster opstellen...
+Name[ne]=प्याच सिर्जना...
+Name[nl]=Patch aanmaken...
+Name[nn]=Lag lapp …
+Name[pa]=ਪੈਂਚ ਬਣਾਓ...
+Name[pl]=Stwórz łatę...
+Name[pt]=Criar um 'Patch'...
+Name[pt_BR]=Criar um 'Patch'...
+Name[ru]=Создать заплатку...
+Name[sk]=Vytvoriť záplatu...
+Name[sl]=Ustvari popravek ...
+Name[sr]=Направи закрпу...
+Name[sr@Latn]=Napravi zakrpu...
+Name[sv]=Skapa programfix...
+Name[tr]=Yama Oluştur...
+Name[uk]=Створити латку...
+Name[zh_CN]=创建补丁...
+Name[zh_TW]=建立修補檔...
+Exec=kio_svn_helper -p %U
+
+[Desktop Action Export]
+Name=Export...
+Name[bg]=Експортиране...
+Name[br]=Ezporzh ...
+Name[ca]=Exporta...
+Name[cs]=Exportovat...
+Name[cy]=Allforio...
+Name[da]=Eksportér...
+Name[de]=Exportieren ...
+Name[el]=Εξαγωγή...
+Name[eo]=Eksporti...
+Name[es]=Exportar...
+Name[et]=Eksport...
+Name[eu]=Esportatu...
+Name[fa]=صادرات...
+Name[fi]=Vie...
+Name[fr]=Exporter...
+Name[ga]=Easpórtáil...
+Name[gl]=Exportar...
+Name[he]=ייצא....
+Name[hu]=Exportálás...
+Name[is]=Flytja út...
+Name[it]=Esporta...
+Name[ja]=エクスポート...
+Name[ka]=ექსპორტი...
+Name[kk]=Экспорттау...
+Name[lt]=Eksportuoti...
+Name[nb]=Eksporter …
+Name[nds]=Exporteren...
+Name[ne]=निर्यात...
+Name[nl]=Exporteren...
+Name[nn]=Eksporter …
+Name[pa]=ਨਿਰਯਾਤ...
+Name[pl]=Eksportuj...
+Name[pt]=Exportar...
+Name[pt_BR]=Exportar...
+Name[ru]=Экспорт...
+Name[sk]=Exportovať...
+Name[sl]=Izvozi ...
+Name[sr]=Извези...
+Name[sr@Latn]=Izvezi...
+Name[sv]=Exportera...
+Name[tr]=Dışa Aktar...
+Name[uk]=Експортувати...
+Name[zh_CN]=导出...
+Name[zh_TW]=匯出...
+Icon=svn_export
+Exec=kio_svn_helper -e %U
+Comment=Checkout out an unversioned copy of a tree from a repository
+Comment[bg]=Изтегляне на копие на дървото от хранилището.
+Comment[ca]=Exporta una còpia sense versió d'un arbre del repositori
+Comment[cs]=Získat z repository kopii stromu bez verze
+Comment[da]=Tjek en kopi uden version ud af et træ fra et lager
+Comment[de]=Herausholen eines Baums aus dem SVN-Archiv ohne Versionsinformationen
+Comment[el]=Έλεγχος εξόδου ενός αντιγράφου χωρίς έκδοση από ένα δέντρο του χώρου αποθήκευσης
+Comment[es]=Exporta una copia no versionada de un árbol de un repositorio
+Comment[et]=Hoidla failipuu versioonita koopia väljavõte
+Comment[eu]=Deskargatu bertsio-gabeko zuhaitz baten kopia bat biltegitik
+Comment[fa]=وارسی یک رونوشت کلی درخت از مخزن
+Comment[fi]=Nouda versioimaton kopio versionhallinnan puusta
+Comment[fr]=Extraire une copie sans contrôle de version d'une arborescence depuis un référentiel
+Comment[gl]=Obtén unha copia sen control de versións dunha árbore do repositorio
+Comment[hu]=Verzió nélküli másolat készítése az adattárból
+Comment[is]=Ná í afrit af tré án útgáfunúmers frá geymslu
+Comment[it]=Ritira una copia senza versione di un albero da un deposito
+Comment[ja]=リポジトリから非バージョン管理ツリーとしてチェックアウトします。
+Comment[ka]=რეპოზიტტორიიდან ხის უვერსიო ასლის შემოწმება
+Comment[kk]=Жоба бұтағын қоймасынан, нұсқалар есебін қадағалауынан тыс көшіріп алу
+Comment[lt]=Atsisiųsti bylas iš egzistuojančios saugyklos be keitimų sekimo.
+Comment[nb]=Sjekk ut en kopi av et tre uten versjon fra et lager
+Comment[nds]=En Boomkopie ahn Verschooninformatschoon ut en Archiv daalladen
+Comment[ne]=भण्डारबाट संस्करण ननिकालिएको ट्री बाहिरको प्रति जाँच गर्नुहोस्
+Comment[nl]=Een niet onder versiebeheer vallende kopie uitchecken van een tak uit de repository
+Comment[nn]=Sjekk ut ein kopi av eit tre utan versjon frå eit lager
+Comment[pl]=Pobiera kopię drzewa z repozytorium bez informacji do kontroli wersji
+Comment[pt]=Obtém uma cópia sem controlo de versões de uma árvore do repositório
+Comment[pt_BR]=Obtém uma cópia sem controle de versões de uma árvore do repositório
+Comment[ru]=Загрузить копию дерева без служебной информации системы управления версиями
+Comment[sk]=Získa neverzionovanú kópiu stromu z archívu
+Comment[sl]=Iz skladišča prevzemi kopijo drevesa brez različice
+Comment[sr]=Довуци неверзирану копију стабла из складишта
+Comment[sr@Latn]=Dovuci neverziranu kopiju stabla iz skladišta
+Comment[sv]=Checka ut en kopia utan versionskontroll från ett arkiv
+Comment[tr]=Depodaki bir ağaçtan kusurlu bir versionsuz kopyayı kontrol et
+Comment[uk]=Взяти зі сховища копію дерева без версій
+Comment[zh_CN]=从仓库中检出无版本副本
+Comment[zh_TW]=從主目錄中取出不含版本資訊的工作複本
+
+[Desktop Action Diff]
+Name=Diff (local)
+Name[bg]=Разлика (локално)
+Name[cs]=Rozdíl (místní)
+Name[da]=Diff (lokal)
+Name[de]=Diff (lokal)
+Name[el]=Διαφορές (τοπικά)
+Name[es]=Diferencias (locales)
+Name[et]=Võrdlemine (kohalik)
+Name[eu]=Desberdintasunak (lokala)
+Name[fa]=Diff (محلی)
+Name[fi]=Diff (paikallinen)
+Name[fr]=Différences (locales)
+Name[ga]=Diff (logánta)
+Name[gl]=Diferenzas (local)
+Name[he]=Diff (מקומי)
+Name[hu]=Diff (helyi)
+Name[is]=Bera saman (staðbundið)
+Name[it]=Differenza (locale)
+Name[ja]=Diff (ローカル)
+Name[ka]=Diff (ლოკალური)
+Name[kk]=Жергілікті өзгерістер
+Name[lt]=Diff (vietinis)
+Name[ms]=Diff (tempatan)
+Name[nb]=Diff (lokal)
+Name[nds]=Verscheel (lokaal)
+Name[ne]=Diff (स्थानीय)
+Name[nl]=Diff (lokaal)
+Name[nn]=Diff (lokal)
+Name[pa]=ਅੰਤਰ (ਸਥਾਨਕ)
+Name[pl]=Różnice (lokalne)
+Name[pt]=Diferenças (local)
+Name[pt_BR]=Diferenças (local)
+Name[ru]=Локальные изменения
+Name[sk]=Rozdiel (lokálne)
+Name[sl]=Diff (krajevno)
+Name[sr]=Разликуј (локално)
+Name[sr@Latn]=Razlikuj (lokalno)
+Name[sv]=Jämför (lokalt)
+Name[tr]=Diff (yerel)
+Name[uk]=Розбіжності (локальні)
+Name[zh_CN]=Diff (本地)
+Name[zh_TW]=比較(本地端)
+Icon=svn_diff
+Exec=kio_svn_helper -D %U
+Comment=Show local changes since last update
+Comment[bg]=Показване на локалните промени след последното обновяване.
+Comment[ca]=Mostra els canvis locals des de l'última actualització
+Comment[cs]=Zobrazit lokální změny od poslední aktualizace
+Comment[da]=Vis lokale ændringer siden sidste opdatering
+Comment[de]=Zeigt die lokal durchgeführten Änderungen seit der letzten Aktualisierung
+Comment[el]=Εμφάνιση τοπικών αλλαγών από την τελευταία ενημέρωση
+Comment[es]=Mostrar los cambios locales desde la última actualización
+Comment[et]=Kohalike muudatuste näitamine pärast viimast uuendamist
+Comment[eu]=Erakutsi azken aldaketatik gertatu diren aldaketa lokalak
+Comment[fa]=نمایش تغییرات محلی از آخرین به‌روزرسانی
+Comment[fi]=Näytä viimeisen päivityksen jälkeen tehdyt paikalliset muutokset
+Comment[fr]=Afficher les changements locaux effectués depuis la dernière mise à jour
+Comment[gl]=Mostra as modificacións locais desde a última actualización
+Comment[hu]=A helyi módosítások mutatása (az utolsó frissítés óta)
+Comment[is]=Sýna staðbundnar breytingar frá seinustu uppfærslu
+Comment[it]=Mostra i cambiamenti locali dall'ultimo aggiornamento
+Comment[ja]=最終アップデートからローカルにどのような変更があったのかを表示します。
+Comment[ka]=უკანასკნელი განახლების შემდეგ ლოკალური ცვლილებების ჩვენება
+Comment[kk]=Қоймасына әлі тапсырылмаған жергілікті өзгерістерді көрсету
+Comment[lt]=Rodyti vietinius pakeitimus nuo paskutinio atnaujinimo
+Comment[nb]=Vis lokale endringer siden siste oppdatering
+Comment[nds]=Lokaal Ännern na de verleden Opfrischen wiesen
+Comment[ne]=अन्तिम अद्यावधिक पछिका स्थानीय परिवर्तन देखाउनुहोस्
+Comment[nl]=Lokale wijzigingen sinds de laatste update tonen
+Comment[nn]=Vis lokale endringar sidan siste oppdatering
+Comment[pl]=Pokazuje lokalne zmiany od ostatniego uaktualnienia
+Comment[pt]=Mostra as modificações locais desde a última actualização
+Comment[pt_BR]=Mostra as modificações locais desde a última atualização
+Comment[ru]=Определить изменения, не внесенные в общее хранилище
+Comment[sk]=Zobrazí lokálne zmeny od poslednej aktualizácie
+Comment[sl]=Prikaži krajevne spremembe od zadnje posodobitve
+Comment[sr]=Прикажи локалне измене од последњег ажурирања
+Comment[sr@Latn]=Prikaži lokalne izmene od poslednjeg ažuriranja
+Comment[sv]=Visa lokala ändringar sedan senaste uppdateringen
+Comment[tr]=Son güncellemeden sonraki yerel değişiklikleri göster
+Comment[uk]=Показати локальні зміни з часу останнього оновлення
+Comment[zh_CN]=显示上次更新后本地的更改
+Comment[zh_TW]=顯示最後一次更新之後於本地端所做的改變
+
diff --git a/kioslave/svn/svnhelper/subversion_toplevel.desktop b/kioslave/svn/svnhelper/subversion_toplevel.desktop
new file mode 100644
index 00000000..bf38f02c
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversion_toplevel.desktop
@@ -0,0 +1,97 @@
+[Desktop Entry]
+ServiceTypes=inode/directory,all/all
+X-KDE-Priority=TopLevel
+
+X-KDE-GetActionMenu=kded ksvnd getTopLevelActionMenu(KURL::List)
+
+[Desktop Action Update]
+Name=SVN Update
+Name[bg]=Обновяване SVN
+Name[ca]=Actualitza SVN
+Name[cs]=SVN update
+Name[da]=SVN Opdatér
+Name[de]=Aktualisieren (SVN)
+Name[el]=Ενημέρωση SVN
+Name[es]=Actualizar SVN
+Name[et]=SVN uuendamine
+Name[eu]=SVN eguneratu
+Name[fa]=به‌روزرسانی SVN
+Name[fi]=SVN-päivitys (Update)
+Name[fr]=Mise à jour SVN
+Name[gl]=Actualización SVN
+Name[he]=עדכון SVN
+Name[hu]=SVN frissítés
+Name[is]=Uppfæra SVN
+Name[it]=Aggiornamento SVN
+Name[ja]=SVN アップデート
+Name[ka]=SVN განახლება
+Name[kk]=SVN жаңарту
+Name[lt]=SVN atnaujinti
+Name[ms]=Kemaskini SVN
+Name[nb]=SVN oppdater
+Name[nds]=SVN-Archiv opfrischen
+Name[ne]=एसभीएन अद्यावधिक
+Name[nl]=SVN bijwerken
+Name[nn]=SVN oppdater
+Name[pa]=SVN ਅੱਪਡੇਟ
+Name[pl]=Uaktualnij
+Name[pt]=Actualização do SVN
+Name[pt_BR]=Atualização a partir do SVN
+Name[ru]=Обновить
+Name[sk]=SVN aktualizácia
+Name[sl]=Posodobitev SVN
+Name[sr]=SVN ажурирање
+Name[sr@Latn]=SVN ažuriranje
+Name[sv]=SVN-uppdatera
+Name[tr]=SVN Güncelleme
+Name[uk]=SVN-оновлення
+Name[zh_CN]=SVN 更新
+Name[zh_TW]=SVN 更新
+Icon=redo
+Exec=kio_svn_helper -u %U
+
+[Desktop Action Commit]
+Name=SVN Commit
+Name[bg]=Изпращане SVN
+Name[ca]=Entrega SVN
+Name[cs]=SVN commit
+Name[de]=Einspielen (SVN)
+Name[el]=Καταχώρηση SVN
+Name[es]=Entrega SVN
+Name[et]=SVN sissekanne
+Name[eu]=SVN entregatu
+Name[fa]=تصدیق SVN
+Name[fi]=SVN-toimitus (Commit)
+Name[fr]=Validation SVN
+Name[ga]=SVN Cur i bhFeidhm
+Name[gl]=Entrega SVN
+Name[he]=שליחת שינויים של ה־SVN
+Name[hu]=SVN eltárolás
+Name[is]=Setja inn í SVN
+Name[it]=Deposito SVN
+Name[ja]=SVN コミット
+Name[ka]=SVN შესრულება
+Name[kk]=SVN тапсыру
+Name[lt]=SVN išsiųsti
+Name[nb]=SVN meld inn
+Name[nds]=Na SVN-Archiv inspelen
+Name[ne]=एसभीएन कमिट
+Name[nl]=SVN vastleggen
+Name[nn]=SVN meld inn
+Name[pa]=SVN ਕਮਿਟ
+Name[pl]=Wyślij
+Name[pt]=Envio do SVN
+Name[pt_BR]=Envio para o SVN
+Name[ru]=Опубликовать
+Name[sk]=SVN potvrdenie
+Name[sl]=Udejanjanje SVN
+Name[sr]=SVN предаја
+Name[sr@Latn]=SVN predaja
+Name[sv]=SVN-arkivera
+Name[tr]=SVN Teslim Etme
+Name[uk]=SVN-передання
+Name[zh_CN]=SVN 提交
+Name[zh_TW]=SVN 提交
+Icon=undo
+Exec=kio_svn_helper -c %U
+
diff --git a/kioslave/svn/svnhelper/subversioncheckout.ui b/kioslave/svn/svnhelper/subversioncheckout.ui
new file mode 100644
index 00000000..5b320eee
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversioncheckout.ui
@@ -0,0 +1,204 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SubversionCheckout</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SubversionCheckout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>498</width>
+ <height>133</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Subversion Checkout</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <string>F1</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KURLRequester" row="0" column="0">
+ <property name="name">
+ <cstring>url</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Revision (0 for HEAD):</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>revision</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>SubversionCheckout</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SubversionCheckout</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kioslave/svn/svnhelper/subversiondiff.ui b/kioslave/svn/svnhelper/subversiondiff.ui
new file mode 100644
index 00000000..dab4ca0e
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversiondiff.ui
@@ -0,0 +1,100 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Subversion_Diff</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Subversion_Diff</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Subversion Diff</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextBrowser">
+ <property name="name">
+ <cstring>text</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="autoFormatting">
+ <set>AutoAll</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>Subversion_Diff</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kioslave/svn/svnhelper/subversionlog.ui b/kioslave/svn/svnhelper/subversionlog.ui
new file mode 100644
index 00000000..2c167d5b
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversionlog.ui
@@ -0,0 +1,100 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Subversion_Log</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>Subversion_Log</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Subversion Log</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextBrowser">
+ <property name="name">
+ <cstring>text</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>NoWrap</enum>
+ </property>
+ <property name="autoFormatting">
+ <set>AutoAll</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>Subversion_Log</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kioslave/svn/svnhelper/subversionswitch.ui b/kioslave/svn/svnhelper/subversionswitch.ui
new file mode 100644
index 00000000..8ee1a37c
--- /dev/null
+++ b/kioslave/svn/svnhelper/subversionswitch.ui
@@ -0,0 +1,204 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SubversionSwitch</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SubversionSwitch</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>498</width>
+ <height>133</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Subversion Switch</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonHelp</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Help</string>
+ </property>
+ <property name="accel">
+ <string>F1</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KURLRequester" row="0" column="0">
+ <property name="name">
+ <cstring>url</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Revision (0 for HEAD) :</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>revision</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>SubversionSwitch</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SubversionSwitch</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>