diff options
Diffstat (limited to 'kioslave')
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 Binary files differnew file mode 100644 index 00000000..0b26fdbc --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_add.png diff --git a/kioslave/svn/icons/cr128-action-svn_branch.png b/kioslave/svn/icons/cr128-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..9fafce71 --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_branch.png diff --git a/kioslave/svn/icons/cr128-action-svn_merge.png b/kioslave/svn/icons/cr128-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..8d534b3a --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_merge.png diff --git a/kioslave/svn/icons/cr128-action-svn_remove.png b/kioslave/svn/icons/cr128-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..2af59d2f --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_remove.png diff --git a/kioslave/svn/icons/cr128-action-svn_status.png b/kioslave/svn/icons/cr128-action-svn_status.png Binary files differnew file mode 100644 index 00000000..bcbfaaa3 --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_status.png diff --git a/kioslave/svn/icons/cr128-action-svn_switch.png b/kioslave/svn/icons/cr128-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..74fbded1 --- /dev/null +++ b/kioslave/svn/icons/cr128-action-svn_switch.png diff --git a/kioslave/svn/icons/cr16-action-svn_add.png b/kioslave/svn/icons/cr16-action-svn_add.png Binary files differnew file mode 100644 index 00000000..70769a36 --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_add.png diff --git a/kioslave/svn/icons/cr16-action-svn_branch.png b/kioslave/svn/icons/cr16-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..f8c701f0 --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_branch.png diff --git a/kioslave/svn/icons/cr16-action-svn_merge.png b/kioslave/svn/icons/cr16-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..1321a5fd --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_merge.png diff --git a/kioslave/svn/icons/cr16-action-svn_remove.png b/kioslave/svn/icons/cr16-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..8f6f3040 --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_remove.png diff --git a/kioslave/svn/icons/cr16-action-svn_status.png b/kioslave/svn/icons/cr16-action-svn_status.png Binary files differnew file mode 100644 index 00000000..8ad00fd7 --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_status.png diff --git a/kioslave/svn/icons/cr16-action-svn_switch.png b/kioslave/svn/icons/cr16-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..c28b3b98 --- /dev/null +++ b/kioslave/svn/icons/cr16-action-svn_switch.png diff --git a/kioslave/svn/icons/cr22-action-svn_add.png b/kioslave/svn/icons/cr22-action-svn_add.png Binary files differnew file mode 100644 index 00000000..249005eb --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_add.png diff --git a/kioslave/svn/icons/cr22-action-svn_branch.png b/kioslave/svn/icons/cr22-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..db729c2a --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_branch.png diff --git a/kioslave/svn/icons/cr22-action-svn_merge.png b/kioslave/svn/icons/cr22-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..08b1a53f --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_merge.png diff --git a/kioslave/svn/icons/cr22-action-svn_remove.png b/kioslave/svn/icons/cr22-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..3005c2ac --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_remove.png diff --git a/kioslave/svn/icons/cr22-action-svn_status.png b/kioslave/svn/icons/cr22-action-svn_status.png Binary files differnew file mode 100644 index 00000000..5561af4b --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_status.png diff --git a/kioslave/svn/icons/cr22-action-svn_switch.png b/kioslave/svn/icons/cr22-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..e6a92dcc --- /dev/null +++ b/kioslave/svn/icons/cr22-action-svn_switch.png diff --git a/kioslave/svn/icons/cr32-action-svn_add.png b/kioslave/svn/icons/cr32-action-svn_add.png Binary files differnew file mode 100644 index 00000000..63b987bd --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_add.png diff --git a/kioslave/svn/icons/cr32-action-svn_branch.png b/kioslave/svn/icons/cr32-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..4fbd9c3f --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_branch.png diff --git a/kioslave/svn/icons/cr32-action-svn_merge.png b/kioslave/svn/icons/cr32-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..0b2b42e2 --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_merge.png diff --git a/kioslave/svn/icons/cr32-action-svn_remove.png b/kioslave/svn/icons/cr32-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..5a213d57 --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_remove.png diff --git a/kioslave/svn/icons/cr32-action-svn_status.png b/kioslave/svn/icons/cr32-action-svn_status.png Binary files differnew file mode 100644 index 00000000..5fb3df96 --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_status.png diff --git a/kioslave/svn/icons/cr32-action-svn_switch.png b/kioslave/svn/icons/cr32-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..28724155 --- /dev/null +++ b/kioslave/svn/icons/cr32-action-svn_switch.png diff --git a/kioslave/svn/icons/cr48-action-svn_add.png b/kioslave/svn/icons/cr48-action-svn_add.png Binary files differnew file mode 100644 index 00000000..4f4f7f34 --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_add.png diff --git a/kioslave/svn/icons/cr48-action-svn_branch.png b/kioslave/svn/icons/cr48-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..d7fe093e --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_branch.png diff --git a/kioslave/svn/icons/cr48-action-svn_merge.png b/kioslave/svn/icons/cr48-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..a052acb1 --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_merge.png diff --git a/kioslave/svn/icons/cr48-action-svn_remove.png b/kioslave/svn/icons/cr48-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..df562606 --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_remove.png diff --git a/kioslave/svn/icons/cr48-action-svn_status.png b/kioslave/svn/icons/cr48-action-svn_status.png Binary files differnew file mode 100644 index 00000000..f98d11eb --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_status.png diff --git a/kioslave/svn/icons/cr48-action-svn_switch.png b/kioslave/svn/icons/cr48-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..131d897d --- /dev/null +++ b/kioslave/svn/icons/cr48-action-svn_switch.png diff --git a/kioslave/svn/icons/cr64-action-svn_add.png b/kioslave/svn/icons/cr64-action-svn_add.png Binary files differnew file mode 100644 index 00000000..54091c32 --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_add.png diff --git a/kioslave/svn/icons/cr64-action-svn_branch.png b/kioslave/svn/icons/cr64-action-svn_branch.png Binary files differnew file mode 100644 index 00000000..74deadc6 --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_branch.png diff --git a/kioslave/svn/icons/cr64-action-svn_merge.png b/kioslave/svn/icons/cr64-action-svn_merge.png Binary files differnew file mode 100644 index 00000000..b73ec742 --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_merge.png diff --git a/kioslave/svn/icons/cr64-action-svn_remove.png b/kioslave/svn/icons/cr64-action-svn_remove.png Binary files differnew file mode 100644 index 00000000..db521dc3 --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_remove.png diff --git a/kioslave/svn/icons/cr64-action-svn_status.png b/kioslave/svn/icons/cr64-action-svn_status.png Binary files differnew file mode 100644 index 00000000..fba134bc --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_status.png diff --git a/kioslave/svn/icons/cr64-action-svn_switch.png b/kioslave/svn/icons/cr64-action-svn_switch.png Binary files differnew file mode 100644 index 00000000..84fd6ee5 --- /dev/null +++ b/kioslave/svn/icons/cr64-action-svn_switch.png diff --git a/kioslave/svn/icons/crsc-action-svn_add.svgz b/kioslave/svn/icons/crsc-action-svn_add.svgz Binary files differnew file mode 100644 index 00000000..8092028e --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_add.svgz diff --git a/kioslave/svn/icons/crsc-action-svn_branch.svgz b/kioslave/svn/icons/crsc-action-svn_branch.svgz Binary files differnew file mode 100644 index 00000000..1622c9f6 --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_branch.svgz diff --git a/kioslave/svn/icons/crsc-action-svn_merge.svgz b/kioslave/svn/icons/crsc-action-svn_merge.svgz Binary files differnew file mode 100644 index 00000000..56f18c44 --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_merge.svgz diff --git a/kioslave/svn/icons/crsc-action-svn_remove.svgz b/kioslave/svn/icons/crsc-action-svn_remove.svgz Binary files differnew file mode 100644 index 00000000..cf0db832 --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_remove.svgz diff --git a/kioslave/svn/icons/crsc-action-svn_status.svgz b/kioslave/svn/icons/crsc-action-svn_status.svgz Binary files differnew file mode 100644 index 00000000..1a6ba518 --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_status.svgz diff --git a/kioslave/svn/icons/crsc-action-svn_switch.svgz b/kioslave/svn/icons/crsc-action-svn_switch.svgz Binary files differnew file mode 100644 index 00000000..4717aac2 --- /dev/null +++ b/kioslave/svn/icons/crsc-action-svn_switch.svgz 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>&OK</string> + </property> + </widget> + <widget class="QPushButton"> + <property name="name"> + <cstring>pushButton2</cstring> + </property> + <property name="text"> + <string>&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 & 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>&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>&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>&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>&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>&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>&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>&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>&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> |