00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "clearcasepart.h"
00013
#include "commentdlg.h"
00014
00015
#include <qfileinfo.h>
00016
#include <qpopupmenu.h>
00017
00018
#include <kpopupmenu.h>
00019
#include <kdebug.h>
00020
#include <kdevgenericfactory.h>
00021
#include <klocale.h>
00022
#include <kprocess.h>
00023
#include <kmessagebox.h>
00024
#include <kapplication.h>
00025
00026
#include "kdevcore.h"
00027
#include "kdevmakefrontend.h"
00028
#include "kdevdifffrontend.h"
00029
#include "kdevappfrontend.h"
00030
#include "execcommand.h"
00031
#include "domutil.h"
00032
#include "kdevmainwindow.h"
00033
00034
static const KAboutData data(
"kdevclearcase",
I18N_NOOP(
"Clearcase"),
"1.0");
00035
00036 typedef KDevGenericFactory<ClearcasePart> ClearcaseFactory;
00037 K_EXPORT_COMPONENT_FACTORY( libkdevclearcase,
ClearcaseFactory( &data ) )
00038
00039
ClearcasePart::
ClearcasePart(
QObject *parent, const
char *name, const
QStringList & )
00040 :
KDevPlugin( "Clearcase", "clearcase", parent, name ? name : "
ClearcasePart" ),
00041 default_checkin(""),default_checkout(""),default_uncheckout("-rm"),
00042 default_create("-ci"),default_remove("-f"),default_diff("-pred -diff")
00043 {
00044 setInstance(ClearcaseFactory::instance());
00045 connect( core(), SIGNAL(contextMenu(
QPopupMenu *,
const Context *)),
00046
this, SLOT(contextMenu(
QPopupMenu *,
const Context *)) );
00047
00048 }
00049
00050 ClearcasePart::~ClearcasePart()
00051 {}
00052
00053
00054 void ClearcasePart::contextMenu(
QPopupMenu *popup,
const Context *context)
00055 {
00056
if (context->
hasType( Context::FileContext )) {
00057
const FileContext *fcontext = static_cast<const FileContext*>(context);
00058
popupfile = fcontext->
fileName();
00059
00060
00061
00062
QString s1 =
popupfile.section(
'/', 1, 1);
00063
QString s2 =
popupfile.section(
'/', 2, 2);
00064
QString s3 =
popupfile.section(
'/', 3, 3);
00065
if(s1 ==
"view" && s3 ==
"vobs" || s1 ==
"vobs")
00066
viewname = s2;
00067
else
00068
return;
00069
00070
QFileInfo fi(
popupfile);
00071 popup->insertSeparator();
00072
00073
KPopupMenu *sub =
new KPopupMenu(popup);
00074
QString name = fi.fileName();
00075 sub->
insertTitle( i18n(
"Actions for %1").arg(name) );
00076 sub->insertItem( i18n(
"Checkin"),
00077
this, SLOT(
slotCheckin()) );
00078 sub->insertItem( i18n(
"Checkout"),
00079
this, SLOT(
slotCheckout()) );
00080 sub->insertItem( i18n(
"Uncheckout"),
00081
this, SLOT(
slotUncheckout()) );
00082 sub->insertSeparator();
00083 sub->insertItem( i18n(
"Create Element"),
00084
this, SLOT(
slotCreate()) );
00085 sub->insertItem( i18n(
"Remove Element"),
00086
this, SLOT(
slotRemove()) );
00087 sub->insertSeparator();
00088 sub->insertItem( i18n(
"Diff"),
00089
this, SLOT(
slotDiff()) );
00090
00091 popup->insertItem(i18n(
"Clearcase"), sub);
00092 }
00093 }
00094
00095 void ClearcasePart::slotCheckin()
00096 {
00097
QString dir, name;
00098
QFileInfo fi(
popupfile);
00099
if (fi.isDir()) {
00100 dir = fi.absFilePath();
00101 name =
".";
00102 }
else {
00103 dir = fi.dirPath();
00104 name = fi.fileName();
00105 }
00106
00107
CcaseCommentDlg dlg(FALSE);
00108
if (dlg.exec() == QDialog::Rejected)
00109
return;
00110
00111
QDomDocument &dom = *this->
projectDom();
00112
QString message = DomUtil::readEntry(dom,
"/kdevclearcase/checkin_options",
default_checkin);
00113
if(dlg.
logMessage().isEmpty())
00114
message +=
"-nc ";
00115
else
00116
message +=
"-c \"" + dlg.
logMessage() +
"\"";
00117
00118
QString command(
"cd ");
00119 command += KShellProcess::quote(dir);
00120 command +=
" && ";
00121 command +=
" cleartool checkin ";
00122 command +=
message;
00123 command +=
" ";
00124 command += KShellProcess::quote(name);
00125
00126
makeFrontend()->
queueCommand(dir, command);
00127 }
00128
00129
00130 void ClearcasePart::slotCheckout()
00131 {
00132
QString dir, name;
00133
QFileInfo fi(
popupfile);
00134
if (fi.isDir()) {
00135 dir = fi.absFilePath();
00136 name =
".";
00137 }
else {
00138 dir = fi.dirPath();
00139 name = fi.fileName();
00140 }
00141
00142
CcaseCommentDlg dlg(TRUE);
00143
if (dlg.exec() == QDialog::Rejected)
00144
return;
00145
00146
QDomDocument &dom = *this->
projectDom();
00147
QString message = DomUtil::readEntry(dom,
"/kdevclearcase/checkout_options",
default_checkout);
00148
if(!dlg.
isReserved())
00149
message +=
"-unres ";
00150
if(dlg.
logMessage().isEmpty())
00151
message +=
"-nc ";
00152
else
00153
message +=
"-c \"" + dlg.
logMessage() +
"\"";
00154
00155
QString command(
"cd ");
00156 command += KShellProcess::quote(dir);
00157 command +=
" && cleartool checkout ";
00158 command +=
message;
00159 command +=
" ";
00160 command += KShellProcess::quote(name);
00161
00162
makeFrontend()->
queueCommand(dir, command);
00163 }
00164
00165
00166 void ClearcasePart::slotUncheckout()
00167 {
00168
QString dir, name;
00169
QFileInfo fi(
popupfile);
00170
if (fi.isDir()) {
00171 dir = fi.absFilePath();
00172 name =
".";
00173 }
else {
00174 dir = fi.dirPath();
00175 name = fi.fileName();
00176 }
00177
00178
QDomDocument &dom = *this->
projectDom();
00179
00180
QString command(
"cd ");
00181 command += KShellProcess::quote(dir);
00182 command +=
" && cleartool uncheckout ";
00183 command += DomUtil::readEntry(dom,
"/kdevclearcase/uncheckout_options",
default_uncheckout);
00184 command +=
" ";
00185 command += KShellProcess::quote(name);
00186
00187
makeFrontend()->
queueCommand(dir, command);
00188 }
00189
00190 void ClearcasePart::slotCreate()
00191 {
00192
QFileInfo fi(
popupfile);
00193
QString dir = fi.dirPath();
00194
QString name = fi.fileName();
00195
00196
QDomDocument &dom = *this->
projectDom();
00197
00198
00199
QString command(
"cd ");
00200 command += KShellProcess::quote(dir);
00201
QFileInfo di(dir);
00202
if(!di.isWritable()) {
00203 command +=
" && cleartool co -unres -nc ";
00204 command += KShellProcess::quote(dir);
00205 }
00206 command +=
" && cleartool mkelem ";
00207
if(fi.isDir())
00208 command +=
" -elt directory ";
00209 command += DomUtil::readEntry(dom,
"/kdevclearcase/create_options",
default_create);
00210 command +=
" ";
00211 command += KShellProcess::quote(name);
00212
00213
makeFrontend()->
queueCommand(dir, command);
00214 }
00215
00216
00217 void ClearcasePart::slotRemove()
00218 {
00219
QFileInfo fi(
popupfile);
00220
QString dir = fi.dirPath();
00221
QString name = fi.fileName();
00222
00223
QDomDocument &dom = *this->
projectDom();
00224
00225
QString command(
"cd ");
00226 command += KShellProcess::quote(dir);
00227
QFileInfo di(dir);
00228
if(!di.isWritable()) {
00229 command +=
" && cleartool co -unres -nc ";
00230 command += KShellProcess::quote(dir);
00231 }
00232 command +=
" && cleartool rmname ";
00233 command += DomUtil::readEntry(dom,
"/kdevclearcase/remove_options",
default_remove);
00234 command +=
" ";
00235 command += KShellProcess::quote(name);
00236
00237
makeFrontend()->
queueCommand(dir, command);
00238 }
00239
00240
00241 void ClearcasePart::slotDiff()
00242 {
00243
QFileInfo fi(
popupfile);
00244
QString dir = fi.dirPath();
00245
QString name = fi.fileName();
00246
QStringList args;
00247
QStringList env;
00248
QString str;
00249
00250
QDomDocument &dom = *this->
projectDom();
00251
00252 args <<
"diff";
00253 str = DomUtil::readEntry(dom,
"/kdevclearcase/diff_options",
default_diff);
00254
if (str.length()) {
00255
QStringList list = QStringList::split(
' ',str);
00256
for(QStringList::Iterator it = list.begin(); it != list.end(); ++it) args << *it;
00257 }
00258 args << name;
00259
00260
ExecCommand* cmv =
new ExecCommand(
"cleartool", args, dir, env,
this );
00261 connect( cmv, SIGNAL(finished(
const QString&,
const QString& )),
00262
this, SLOT(
slotDiffFinished(
const QString&,
const QString& )) );
00263 }
00264
00265 void ClearcasePart::slotDiffFinished(
const QString& diff,
const QString& err )
00266 {
00267
if ( diff.isNull() && err.isNull() ) {
00268
kdDebug(9000) <<
"clearcase diff canceled" <<
endl;
00269
return;
00270 }
00271
00272
if ( diff.isEmpty() && !err.isEmpty() ) {
00273 KMessageBox::detailedError( 0, i18n(
"Clearcase outputted errors during diff."), err, i18n(
"Errors During Diff") );
00274
return;
00275 }
00276
00277
if ( !err.isEmpty() ) {
00278
int s = KMessageBox::warningContinueCancelList( 0, i18n(
"Clearcase outputted errors during diff. Do you still want to continue?"),
00279 QStringList::split(
"\n", err,
false ), i18n(
"Errors During Diff") );
00280
if ( s != KMessageBox::Continue )
00281
return;
00282 }
00283
00284
if ( diff.isEmpty() ) {
00285 KMessageBox::information( 0, i18n(
"There is no difference to the repository."), i18n(
"No Difference Found") );
00286
return;
00287 }
00288
00289 Q_ASSERT(
diffFrontend() );
00290
diffFrontend()->
showDiff( diff );
00291 }
00292
00293
#include "clearcasepart.moc"