You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/vcs/clearcase/clearcasepart.cpp

364 lines
11 KiB

/***************************************************************************
* Copyright (C) 2003 by Ajay Guleria *
* ajay_guleria at yahoo dot com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "clearcasepart.h"
#include "commentdlg.h"
#include <tqfileinfo.h>
#include <tqpopupmenu.h>
#include <kpopupmenu.h>
#include <kdebug.h>
#include <kdevgenericfactory.h>
#include <klocale.h>
#include <kprocess.h>
#include <kmessagebox.h>
#include <kapplication.h>
#include "kdevcore.h"
#include "kdevmakefrontend.h"
#include "kdevdifffrontend.h"
#include "kdevappfrontend.h"
#include "execcommand.h"
#include "domutil.h"
#include "kdevmainwindow.h"
#include "kdevproject.h"
#include "kdevplugininfo.h"
#include "clearcasefileinfoprovider.h"
#include "clearcasemanipulator.h"
static const KDevPluginInfo data("kdevclearcase");
typedef KDevGenericFactory<ClearcasePart> ClearcaseFactory;
K_EXPORT_COMPONENT_FACTORY( libkdevclearcase, ClearcaseFactory( data ) )
ClearcasePart::ClearcasePart( TQObject *parent, const char *name, const TQStringList & )
: KDevVersionControl( &data, parent, name ? name : "ClearcasePart" ),
default_checkin(""),
default_checkout(""),
default_uncheckout("-rm"),
default_create("-ci"),
default_remove("-f"),
default_lshistory(""),
default_diff("-pred -diff"),
default_lscheckout("-recurse")
{
// check if project directory is valid and cache it
isValidCCDirectory_ = ClearcaseManipulator::isCCRepository( project()->projectDirectory() );
fileInfoProvider_ = new ClearcaseFileinfoProvider(this);
setInstance(ClearcaseFactory::instance());
connect( core(), TQT_SIGNAL(contextMenu(TQPopupMenu *, const Context *)),
this, TQT_SLOT(contextMenu(TQPopupMenu *, const Context *)) );
}
ClearcasePart::~ClearcasePart()
{}
bool ClearcasePart::isValidDirectory(const TQString &dirPath) const {
return isValidCCDirectory_;
}
void ClearcasePart::contextMenu(TQPopupMenu *popup, const Context *context)
{
if (context->hasType( Context::FileContext )) {
const FileContext *fcontext = static_cast<const FileContext*>(context);
popupfile_ = fcontext->urls().first().path();
TQFileInfo fi(popupfile_);
popup->insertSeparator();
KPopupMenu *sub = new KPopupMenu(popup);
TQString name = fi.fileName();
sub->insertTitle( i18n("Actions for %1").tqarg(name) );
sub->insertItem( i18n("Checkin"),
this, TQT_SLOT(slotCheckin()) );
sub->insertItem( i18n("Checkout"),
this, TQT_SLOT(slotCheckout()) );
sub->insertItem( i18n("Uncheckout"),
this, TQT_SLOT(slotUncheckout()) );
sub->insertSeparator();
sub->insertItem( i18n("Create Element"),
this, TQT_SLOT(slotCreate()) );
sub->insertItem( i18n("Remove Element"),
this, TQT_SLOT(slotRemove()) );
sub->insertSeparator();
sub->insertItem( i18n("History"),
this, TQT_SLOT(slotListHistory()) );
sub->insertSeparator();
sub->insertItem( i18n("Diff"),
this, TQT_SLOT(slotDiff()) );
sub->insertSeparator();
sub->insertItem( i18n("List Checkouts"),
this, TQT_SLOT(slotListCheckouts()) );
popup->insertItem(i18n("Clearcase"), sub);
if (!project() || !isValidDirectory( project()->projectDirectory() )) {
sub->setEnabled( false );
}
}
}
void ClearcasePart::slotCheckin()
{
TQString dir, name;
TQFileInfo fi(popupfile_);
dir = fi.dirPath();
name = fi.fileName();
CcaseCommentDlg dlg(FALSE);
if (dlg.exec() == TQDialog::Rejected)
return;
TQDomDocument &dom = *this->projectDom();
TQString message = DomUtil::readEntry(dom,"/kdevclearcase/checkin_options",default_checkin);
if(dlg.logMessage().isEmpty())
message += "-nc ";
else
message += "-c \"" + dlg.logMessage() + "\"";
TQString command("cd ");
command += KShellProcess::quote(dir);
command += " && ";
command += " cleartool checkin ";
command += message; // Already quoted, see above
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
}
void ClearcasePart::slotCheckout()
{
TQString dir, name;
TQFileInfo fi(popupfile_);
dir = fi.dirPath();
name = fi.fileName();
CcaseCommentDlg dlg(TRUE);
if (dlg.exec() == TQDialog::Rejected)
return;
TQDomDocument &dom = *this->projectDom();
TQString message = DomUtil::readEntry(dom,"/kdevclearcase/checkout_options",default_checkout);
if(!dlg.isReserved())
message += "-unres ";
if(dlg.logMessage().isEmpty())
message += "-nc ";
else
message += "-c \"" + dlg.logMessage() + "\"";
TQString command("cd ");
command += KShellProcess::quote(dir);
command += " && cleartool checkout ";
command += message;
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
emit finishedFetching(dir);
}
void ClearcasePart::slotUncheckout()
{
TQString dir, name;
TQFileInfo fi(popupfile_);
dir = fi.dirPath();
name = fi.fileName();
TQDomDocument &dom = *this->projectDom();
TQString command("cd ");
command += KShellProcess::quote(dir);
command += " && cleartool uncheckout ";
command += DomUtil::readEntry(dom,"/kdevclearcase/uncheckout_options",default_uncheckout);
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
emit finishedFetching(dir);
}
void ClearcasePart::slotCreate()
{
TQFileInfo fi(popupfile_);
TQString dir = fi.dirPath();
TQString name = fi.fileName();
TQDomDocument &dom = *this->projectDom();
// Checking whether current directory is checked out or not is cumbersome so skip it for now
TQString command("cd ");
command += KShellProcess::quote(dir);
TQFileInfo di(dir);
if(!di.isWritable()) { // Work-around to check if directory is checked out
command += " && cleartool co -unres -nc ";
command += KShellProcess::quote(dir);
}
command += " && cleartool mkelem ";
if(fi.isDir())
command += " -elt directory ";
command += DomUtil::readEntry(dom,"/kdevclearcase/create_options",default_create);
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
emit finishedFetching(dir);
}
void ClearcasePart::slotRemove()
{
TQFileInfo fi(popupfile_);
TQString dir = fi.dirPath();
TQString name = fi.fileName();
TQDomDocument &dom = *this->projectDom();
TQString command("cd ");
command += KShellProcess::quote(dir);
TQFileInfo di(dir);
if(!di.isWritable()) { // Work-around to check if directory is checked out
command += " && cleartool co -unres -nc ";
command += KShellProcess::quote(dir);
}
command += " && cleartool rmname "; // Don't use rm command
command += DomUtil::readEntry(dom,"/kdevclearcase/remove_options",default_remove);
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
emit finishedFetching(dir);
}
void ClearcasePart::slotListHistory()
{
TQFileInfo fi(popupfile_);
TQString dir = fi.dirPath();
TQString name = fi.fileName();
TQStringList args;
TQStringList env;
TQString str;
TQDomDocument &dom = *this->projectDom();
TQString command("cd ");
command += KShellProcess::quote(dir);
command += " && cleartool lshistory ";
command += DomUtil::readEntry(dom, "/kdevclearcase/lshistory_options", default_lshistory);
command += " ";
command += KShellProcess::quote(name);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
}
void ClearcasePart::slotDiff()
{
TQFileInfo fi(popupfile_);
TQString dir = fi.dirPath();
TQString name = fi.fileName();
TQStringList args;
TQStringList env;
TQString str;
TQDomDocument &dom = *this->projectDom();
args << "diff";
str = DomUtil::readEntry(dom,"/kdevclearcase/diff_options",default_diff);
if (str.length()) {
TQStringList list = TQStringList::split(' ',str);
for(TQStringList::Iterator it = list.begin(); it != list.end(); ++it) args << *it;
}
args << name;
ExecCommand* cmv = new ExecCommand( "cleartool", args, dir, env, this );
connect( cmv, TQT_SIGNAL(finished( const TQString&, const TQString& )),
this, TQT_SLOT(slotDiffFinished( const TQString&, const TQString& )) );
}
void ClearcasePart::slotDiffFinished( const TQString& diff, const TQString& err )
{
if ( diff.isNull() && err.isNull() ) {
kdDebug(9000) << "clearcase diff canceled" << endl;
return; // user pressed cancel or an error occured
}
if ( diff.isEmpty() && !err.isEmpty() ) {
KMessageBox::detailedError( 0, i18n("Clearcase output errors during diff."), err, i18n("Errors During Diff") );
return;
}
if ( !err.isEmpty() ) {
int s = KMessageBox::warningContinueCancelList( 0, i18n("Clearcase outputted errors during diff. Do you still want to continue?"),
TQStringList::split( "\n", err, false ), i18n("Errors During Diff") );
if ( s != KMessageBox::Continue )
return;
}
if ( diff.isEmpty() ) {
KMessageBox::information( 0, i18n("There is no difference to the repository."), i18n("No Difference Found") );
return;
}
if (KDevDiffFrontend *diffFrontend = extension<KDevDiffFrontend>("KDevelop/DiffFrontend"))
diffFrontend->showDiff( diff );
}
void ClearcasePart::slotListCheckouts()
{
TQString dir;
TQFileInfo fi(popupfile_);
if (fi.isDir()) {
dir = fi.absFilePath();
} else {
dir = fi.dirPath();
}
TQDomDocument &dom = *this->projectDom();
TQString command("cd ");
command += KShellProcess::quote(dir);
command += " && cleartool lsco ";
command += DomUtil::readEntry(dom, "/kdevclearcase/lscheckout_options", default_lscheckout);
if (KDevMakeFrontend *makeFrontend = extension<KDevMakeFrontend>("KDevelop/MakeFrontend"))
makeFrontend->queueCommand(dir, command);
}
#include "clearcasepart.moc"