diff options
Diffstat (limited to 'cervisia/cvsservice/repository.cpp')
-rw-r--r-- | cervisia/cvsservice/repository.cpp | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/cervisia/cvsservice/repository.cpp b/cervisia/cvsservice/repository.cpp new file mode 100644 index 00000000..d2cff113 --- /dev/null +++ b/cervisia/cvsservice/repository.cpp @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2002-2004 Christian Loose <christian.loose@kdemail.net> + * + * This program 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "repository.h" + +#include <qdir.h> +#include <qfile.h> +#include <qstring.h> + +#include <kapplication.h> +#include <kconfig.h> +#include <kdirwatch.h> +#include <kstandarddirs.h> + +#include "sshagent.h" + + +struct Repository::Private +{ + Private() : compressionLevel(0) {} + + QString configFileName; + + QString workingCopy; + QString location; + + QString client; + QString rsh; + QString server; + int compressionLevel; + bool retrieveCvsignoreFile; + + void readConfig(); + void readGeneralConfig(); +}; + + + +Repository::Repository() + : QObject() + , DCOPObject("CvsRepository") + , d(new Private) +{ + d->readGeneralConfig(); + + // other cvsservice instances might change the configuration file + // so we watch it for changes + d->configFileName = locate("config", "cvsservicerc"); + KDirWatch* fileWatcher = new KDirWatch(this); + connect(fileWatcher, SIGNAL(dirty(const QString&)), + this, SLOT(slotConfigDirty(const QString&))); + fileWatcher->addFile(d->configFileName); +} + + +Repository::Repository(const QString& repository) + : QObject() + , DCOPObject() + , d(new Private) +{ + d->location = repository; + d->readGeneralConfig(); + d->readConfig(); + + // other cvsservice instances might change the configuration file + // so we watch it for changes + d->configFileName = locate("config", "cvsservicerc"); + KDirWatch* fileWatcher = new KDirWatch(this); + connect(fileWatcher, SIGNAL(dirty(const QString&)), + this, SLOT(slotConfigDirty(const QString&))); + fileWatcher->addFile(d->configFileName); +} + + +Repository::~Repository() +{ + delete d; +} + + +QString Repository::cvsClient() const +{ + QString client(d->client); + + // suppress reading of the '.cvsrc' file + client += " -f"; + + // we don't need the command line option if there is no compression level set + if( d->compressionLevel > 0 ) + { + client += " -z" + QString::number(d->compressionLevel) + " "; + } + + return client; +} + + +QString Repository::clientOnly() const +{ + return d->client; +} + + +QString Repository::rsh() const +{ + return d->rsh; +} + + +QString Repository::server() const +{ + return d->server; +} + + +bool Repository::setWorkingCopy(const QString& dirName) +{ + const QFileInfo fi(dirName); + const QString path = fi.absFilePath(); + + // is this really a cvs-controlled directory? + const QFileInfo cvsDirInfo(path + "/CVS"); + if( !cvsDirInfo.exists() || !cvsDirInfo.isDir() || + !QFile::exists( cvsDirInfo.filePath() + "/Entries" ) || + !QFile::exists( cvsDirInfo.filePath() + "/Repository" ) || + !QFile::exists( cvsDirInfo.filePath() + "/Root" ) ) + return false; + + d->workingCopy = path; + d->location = QString::null; + + // determine path to the repository + QFile rootFile(path + "/CVS/Root"); + if( rootFile.open(IO_ReadOnly) ) + { + QTextStream stream(&rootFile); + d->location = stream.readLine(); + } + rootFile.close(); + + // add identities (ssh-add) to ssh-agent + // TODO CL make sure this is called only once + if( d->location.contains(":ext:", false) > 0 ) + { + SshAgent ssh; + ssh.addSshIdentities(); + } + + QDir::setCurrent(path); + d->readConfig(); + + return true; +} + + +QString Repository::workingCopy() const +{ + return d->workingCopy; +} + + +QString Repository::location() const +{ + return d->location; +} + + +bool Repository::retrieveCvsignoreFile() const +{ + return d->retrieveCvsignoreFile; +} + + +void Repository::slotConfigDirty(const QString& fileName) +{ + if( fileName == d->configFileName ) + { + // reread the configuration data from disk + kapp->config()->reparseConfiguration(); + d->readConfig(); + } +} + + +void Repository::Private::readGeneralConfig() +{ + KConfig* config = kapp->config(); + + // get path to cvs client programm + config->setGroup("General"); + client = config->readPathEntry("CVSPath", "cvs"); +} + + +void Repository::Private::readConfig() +{ + KConfig* config = kapp->config(); + + // Sometimes the location can be unequal to the entry in the CVS/Root. + // + // This can happen when the checkout was done with a repository name + // like :pserver:user@cvs.kde.org:/home/kde. When cvs then saves the + // name into the .cvspass file, it adds the default cvs port to it like + // this :pserver:user@cvs.kde.org:2401/home/kde. This name is then also + // used for the configuration group. + // + // In order to be able to read this group, we then have to manually add + // the port number to it. + QString repositoryGroup = QString::fromLatin1("Repository-") + location; + if( !config->hasGroup(repositoryGroup) ) + { + // find the position of the first path separator + const int insertPos = repositoryGroup.find('/'); + if( insertPos > 0 ) + { + // add port to location + // (1) :pserver:user@hostname.com:/path + if( repositoryGroup.at(insertPos - 1) == ':' ) + repositoryGroup.insert(insertPos, "2401"); + // (2) :pserver:user@hostname.com/path + else + repositoryGroup.insert(insertPos, ":2401"); + } + } + + config->setGroup(repositoryGroup); + + // should we retrieve the CVSROOT/cvsignore file from the cvs server? + retrieveCvsignoreFile = config->readBoolEntry("RetrieveCvsignore", false); + + // see if there is a specific compression level set for this repository + compressionLevel = config->readNumEntry("Compression", -1); + + // use default global compression level instead? + if( compressionLevel < 0 ) + { + KConfigGroupSaver cs(config, "General"); + compressionLevel = config->readNumEntry("Compression", 0); + } + + // get remote shell client to access the remote repository + rsh = config->readPathEntry("rsh"); + + // get program to start on the server side + server = config->readEntry("cvs_server"); +} + + +#include "repository.moc" |