00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qfile.h>
00013
#include <qtextstream.h>
00014
00015
#include "cvsdir.h"
00016
00018
00020
00021 CVSDir::CVSDir() :
QDir()
00022 {
00023 }
00024
00026
00027 CVSDir::CVSDir(
const QDir &dir )
00028 :
QDir( dir )
00029 {
00030
00031 convertToAbs();
00032
00033
m_cvsDir = absPath() + QDir::separator() +
"CVS";
00034
00035
if (
isValid())
00036
refreshEntriesCache();
00037 }
00038
00040
00041 CVSDir::CVSDir(
const CVSDir &aCvsDir )
00042 :
QDir( aCvsDir )
00043 {
00044 *
this = aCvsDir;
00045 }
00046
00048
00049 CVSDir &
CVSDir::operator=(
const CVSDir &aCvsDir )
00050 {
00051
m_cvsDir = aCvsDir.
m_cvsDir;
00052
m_cachedEntries = aCvsDir.
m_cachedEntries;
00053 QDir::operator=( aCvsDir );
00054
00055
return *
this;
00056 }
00057
00059
00060 CVSDir::~CVSDir()
00061 {
00062 }
00063
00065
00066 bool CVSDir::isValid()
const
00067
{
00068
return exists() &&
00069 QFile::exists(
entriesFileName() ) &&
00070 QFile::exists(
rootFileName() ) &&
00071 QFile::exists(
repoFileName() );
00072 }
00073
00075
00076 QString CVSDir::entriesFileName()
const
00077
{
00078
return m_cvsDir + QDir::separator() +
"Entries";
00079 }
00080
00082
00083 QString CVSDir::rootFileName()
const
00084
{
00085
return m_cvsDir + QDir::separator() +
"Root";
00086 }
00087
00089
00090 QString CVSDir::repoFileName()
const
00091
{
00092
return m_cvsDir + QDir::separator() +
"Repository";
00093 }
00094
00096
00097 QString CVSDir::cvsIgnoreFileName()
const
00098
{
00099
return absPath() + QDir::separator() +
".cvsignore";
00100 }
00101
00103
00104 QString CVSDir::repository()
const
00105
{
00106
00107
00108
00109
00110
QString content;
00111
00112
if (!
isValid())
00113
return QString::null;
00114
00115
QByteArray bytes =
cacheFile(
repoFileName() );
00116
QTextStream t( bytes, IO_ReadOnly );
00117 content += t.readLine();
00118
00119
return content;
00120 }
00121
00123
00124 QString CVSDir::root()
const
00125
{
00126
00127
00128
00129
QString content;
00130
00131
if (!
isValid())
00132
return QString::null;
00133
00134
QByteArray bytes =
cacheFile(
repoFileName() );
00135
QTextStream t( bytes, IO_ReadOnly );
00136 content += t.readLine();
00137
00138
return content;
00139 }
00140
00142
00143 QByteArray CVSDir::cacheFile(
const QString &fileName )
00144 {
00145
QFile f( fileName );
00146
if (!f.open( IO_ReadOnly ))
00147
return QByteArray();
00148
return f.readAll();
00149 }
00150
00152
00153 QStringList CVSDir::registeredEntryList()
const
00154
{
00155
QStringList l;
00156
if (!
isValid())
00157
return l;
00158
00159
QByteArray bytes =
cacheFile(
entriesFileName() );
00160
QTextStream t( bytes, IO_ReadOnly );
00161
CVSEntry entry;
00162
while (!t.eof())
00163 {
00164
QString line = t.readLine();
00165 CVSEntry::parse( line, entry );
00166
if (entry.
isValid())
00167 l.append( entry.
fileName() );
00168 }
00169
return l;
00170 }
00171
00173
00174 bool CVSDir::isRegistered(
const QString fileName )
const
00175
{
00176
CVSEntry entry =
fileStatus( fileName );
00177
return entry.
isValid() && entry.
fileName() == fileName;
00178 }
00179
00181
00182 void CVSDir::refreshEntriesCache()
const
00183
{
00184
m_cachedEntries.clear();
00185
00186
QByteArray bytes =
cacheFile(
entriesFileName() );
00187
QTextStream t( bytes, IO_ReadOnly );
00188
CVSEntry entry;
00189
while (!t.eof())
00190 {
00191
QString line = t.readLine();
00192 CVSEntry::parse( line, entry );
00193
if (entry.
isValid())
00194
m_cachedEntries[ entry.
fileName() ] = entry;
00195 }
00196 }
00197
00199
00200 CVSEntry CVSDir::fileStatus(
const QString &fileName,
bool refreshCache )
const
00201
{
00202
if (refreshCache)
00203
refreshEntriesCache();
00204
00205
if (
m_cachedEntries.contains( fileName ))
00206 {
00207
return m_cachedEntries[ fileName ];
00208 }
00209
else
00210
return CVSEntry( fileName );
00211 }
00212
00214
00215 void CVSDir::ignoreFile(
const QString &fileName )
00216 {
00217
if (!
isValid())
00218
return;
00219
00220
QFile f(
cvsIgnoreFileName() );
00221
if (!f.open( IO_ReadOnly))
00222
return;
00223
00224
QByteArray cachedFile = f.readAll();
00225
QTextStream t( cachedFile, IO_ReadOnly | IO_WriteOnly );
00226
00227
QString readFileName;
00228
bool found =
false;
00229
00230
while (!t.eof() && !found)
00231 {
00232 readFileName = t.readLine();
00233 found = (fileName == readFileName);
00234 }
00235
00236 f.close();
00237
if (!found)
00238 {
00239 f.open( IO_WriteOnly );
00240
00241 t << fileName <<
"\n";
00242
00243 f.writeBlock( cachedFile );
00244 f.close();
00245 }
00246 }
00247
00249
00250 void CVSDir::doNotIgnoreFile(
const QString &fileName )
00251 {
00252
if (!
isValid())
00253
return;
00254
00255
00256
QFile f(
cvsIgnoreFileName() );
00257
if (!f.open( IO_ReadOnly ))
00258
return;
00259
00260
QByteArray cachedFile = f.readAll();
00261
QTextIStream is( cachedFile );
00262
00263
QByteArray cachedOutputFile;
00264
QTextOStream os( cachedOutputFile );
00265
00266
bool removed =
false;
00267
while (!is.eof())
00268 {
00269
QString readLine = is.readLine();
00270
if (readLine != fileName)
00271 os << readLine <<
"\n";
00272
else
00273 removed =
true;
00274 }
00275
00276 f.close();
00277
if (removed)
00278 {
00279 f.open( IO_WriteOnly );
00280 f.writeBlock( cachedOutputFile );
00281 f.close();
00282 }
00283 }
00284
00286
00287 VCSFileInfoMap CVSDir::dirStatus()
const
00288
{
00289
VCSFileInfoMap vcsInfo;
00291
QStringList entries =
registeredEntryList();
00292
for (QStringList::const_iterator it = entries.begin(); it != entries.end(); ++it)
00293 {
00294
const QString &fileName = (*it);
00295
const CVSEntry entry =
fileStatus( fileName );
00296
00297 vcsInfo.insert( fileName, entry.
toVCSFileInfo() );
00298 }
00299
00300
return vcsInfo;
00301 }
00302
00304
00305 VCSFileInfoMap *
CVSDir::cacheableDirStatus()
const
00306
{
00307
VCSFileInfoMap *vcsInfo =
new VCSFileInfoMap;
00309
QStringList entries =
registeredEntryList();
00310
for (QStringList::const_iterator it = entries.begin(); it != entries.end(); ++it)
00311 {
00312
const QString &fileName = (*it);
00313
const CVSEntry entry =
fileStatus( fileName );
00314
00315 vcsInfo->insert( fileName, entry.
toVCSFileInfo() );
00316 }
00317
00318
return vcsInfo;
00319 }