diff options
Diffstat (limited to 'kioslave/svn/ksvnd')
-rw-r--r-- | kioslave/svn/ksvnd/Makefile.am | 13 | ||||
-rw-r--r-- | kioslave/svn/ksvnd/commitdlg.ui | 116 | ||||
-rw-r--r-- | kioslave/svn/ksvnd/commitdlg.ui.h | 30 | ||||
-rw-r--r-- | kioslave/svn/ksvnd/ksvnd.cpp | 351 | ||||
-rw-r--r-- | kioslave/svn/ksvnd/ksvnd.desktop | 50 | ||||
-rw-r--r-- | kioslave/svn/ksvnd/ksvnd.h | 69 |
6 files changed, 629 insertions, 0 deletions
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 |