Added Support for ignored files

Better handling when refreshing workspaces with lots of files



FossilOrigin-Name: f038928c484d177fbe86bee4cd689d8a7d1e3eeb
This commit is contained in:
kostas 2011-10-06 13:02:09 +00:00
parent ee6a90530e
commit 3387439c2c
9 changed files with 300 additions and 213 deletions

View File

@ -13,6 +13,7 @@
#include <QInputDialog> #include <QInputDialog>
#include "CommitDialog.h" #include "CommitDialog.h"
#include "FileActionDialog.h" #include "FileActionDialog.h"
#include <QDebug>
#define SILENT_STATUS true #define SILENT_STATUS true
#define COUNTOF(array) (sizeof(array)/sizeof(array[0])) #define COUNTOF(array) (sizeof(array)/sizeof(array[0]))
@ -50,7 +51,7 @@ static QStringList QuotePaths(const QStringList &paths)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
typedef QMap<QString, QString> QStringMap; typedef QMap<QString, QString> QStringMap;
static QStringMap MakeKeyValue(QStringList lines) static QStringMap MakeKeyValues(QStringList lines)
{ {
QStringMap res; QStringMap res;
@ -290,29 +291,35 @@ void MainWindow::onOpenRecent()
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static void RecurseDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir) bool MainWindow::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec)
{ {
QDir dir(dirPath); QDir dir(dirPath);
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden); setStatus(dirPath);
QCoreApplication::processEvents();
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
for (int i=0; i<list.count(); ++i) for (int i=0; i<list.count(); ++i)
{ {
QFileInfo info = list[i]; QFileInfo info = list[i];
QString filename = info.fileName();
QString filepath = info.filePath(); QString filepath = info.filePath();
QString rel_path = filepath;
rel_path.remove(baseDir+"/");
// Skip ignored files
if(!ignoreSpec.isEmpty() && QDir::match(ignoreSpec, rel_path))
continue;
if (info.isDir()) if (info.isDir())
{ {
// recursive if(!scanDirectory(entries, filepath, baseDir, ignoreSpec))
if (info.fileName()!=".." && info.fileName()!=".") return false;
{
RecurseDirectory(entries, filepath, baseDir);
}
} }
else else
{
entries.push_back(info); entries.push_back(info);
}
} }
return true;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -355,6 +362,7 @@ bool MainWindow::refresh()
return true; return true;
} }
loadFossilSettings();
scanWorkspace(); scanWorkspace();
setStatus(""); setStatus("");
enableActions(true); enableActions(true);
@ -381,13 +389,24 @@ void MainWindow::scanWorkspace()
bool scan_files = ui->actionViewUnknown->isChecked(); bool scan_files = ui->actionViewUnknown->isChecked();
setStatus(tr("Scanning Workspace..."));
setEnabled(false);
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
workspaceFiles.clear(); workspaceFiles.clear();
if(scan_files) if(scan_files)
{ {
setStatus("Scanning Workspace...");
QCoreApplication::processEvents(); QCoreApplication::processEvents();
RecurseDirectory(all_files, wkdir, wkdir); QString ignore;
// If we should not be showing ignored files, fill in the ignored spec
if(!ui->actionViewIgnored->isChecked())
{
// QDir expects multiple specs being separated by a semicolor
ignore = settings.ignoreGlob.replace(',',';');
}
scanDirectory(all_files, wkdir, wkdir, ignore);
for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it) for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it)
{ {
@ -401,9 +420,9 @@ void MainWindow::scanWorkspace()
e.set(*it, RepoFile::TYPE_UNKNOWN, wkdir); e.set(*it, RepoFile::TYPE_UNKNOWN, wkdir);
workspaceFiles.insert(e.getFilename(), e); workspaceFiles.insert(e.getFilename(), e);
} }
setStatus("");
} }
setStatus(tr("Updating..."));
QCoreApplication::processEvents();
for(QStringList::iterator it=res.begin(); it!=res.end(); ++it) for(QStringList::iterator it=res.begin(); it!=res.end(); ++it)
{ {
@ -476,6 +495,9 @@ void MainWindow::scanWorkspace()
{ RepoFile::TYPE_MISSING, "M", "Missing", ":icons/icons/Button Help-01.png" }, { RepoFile::TYPE_MISSING, "M", "Missing", ":icons/icons/Button Help-01.png" },
}; };
size_t num_files = workspaceFiles.size();
itemModel.insertRows(0, num_files);
size_t i=0; size_t i=0;
for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it, ++i) for(filemap_t::iterator it = workspaceFiles.begin(); it!=workspaceFiles.end(); ++it, ++i)
{ {
@ -512,8 +534,15 @@ void MainWindow::scanWorkspace()
} }
ui->tableView->resizeColumnsToContents(); // Avoid expensive operations on really big datasets
ui->tableView->resizeRowsToContents(); if(num_files < 20000)
{
ui->tableView->resizeColumnsToContents();
ui->tableView->resizeRowsToContents();
}
setEnabled(true);
setStatus("");
QApplication::restoreOverrideCursor();
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
MainWindow::RepoStatus MainWindow::getRepoStatus() MainWindow::RepoStatus MainWindow::getRepoStatus()
@ -821,6 +850,8 @@ void MainWindow::loadSettings()
ui->actionViewModified->setChecked(qsettings.value("ViewModified").toBool()); ui->actionViewModified->setChecked(qsettings.value("ViewModified").toBool());
if(qsettings.contains("ViewUnchanged")) if(qsettings.contains("ViewUnchanged"))
ui->actionViewUnchanged->setChecked(qsettings.value("ViewUnchanged").toBool()); ui->actionViewUnchanged->setChecked(qsettings.value("ViewUnchanged").toBool());
if(qsettings.contains("ViewIgnored"))
ui->actionViewUnchanged->setChecked(qsettings.value("ViewIgnored").toBool());
} }
@ -852,6 +883,7 @@ void MainWindow::saveSettings()
qsettings.setValue("ViewUnknown", ui->actionViewUnknown->isChecked()); qsettings.setValue("ViewUnknown", ui->actionViewUnknown->isChecked());
qsettings.setValue("ViewModified", ui->actionViewModified->isChecked()); qsettings.setValue("ViewModified", ui->actionViewModified->isChecked());
qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked());
qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked());
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -1344,47 +1376,61 @@ void MainWindow::on_actionUpdate_triggered()
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void MainWindow::on_actionSettings_triggered() void MainWindow::loadFossilSettings()
{ {
// Also retrieve the fossil global settings // Also retrieve the fossil global settings
QStringList out; QStringList out;
if(!runFossil(QStringList() << "settings", &out, true)) if(!runFossil(QStringList() << "settings", &out, true))
return; return;
QStringMap kv = MakeKeyValue(out); QStringMap kv = MakeKeyValues(out);
struct { const char *command; QString *value; } maps[] =
{
{ "gdiff-command", &settings.gDiffCommand },
{ "gmerge-command", &settings.gMergeCommand }
};
for(size_t m=0; m<COUNTOF(maps); ++m) for(Settings::mappings_t::iterator it=settings.Mappings.begin(); it!=settings.Mappings.end(); ++it)
{ {
if(!kv.contains(maps[m].command)) const QString &name = it.key();
if(!kv.contains(name))
continue; continue;
QString value = kv[maps[m].command]; QString value = kv[name];
if(value.indexOf("(global)") != -1) if(value.indexOf("(global)") != -1 || value.indexOf("(local)") != -1)
{ {
int i = value.indexOf(" "); int i = value.indexOf(" ");
Q_ASSERT(i!=-1); Q_ASSERT(i!=-1);
*maps[m].value = value.mid(i).trimmed(); Q_ASSERT(it.value());
value = value.mid(i).trimmed();
// Remove quotes if any
if(value.length()>=2 && value.at(0)=='\"' && value.at(value.length()-1)=='\"')
value = value.mid(1, value.length()-2);
*it.value() = value;
} }
} }
}
//------------------------------------------------------------------------------
void MainWindow::on_actionSettings_triggered()
{
loadFossilSettings();
// Run the dialog // Run the dialog
if(SettingsDialog::run(this, settings)) if(!SettingsDialog::run(this, settings))
return;
// Apply settings
for(Settings::mappings_t::iterator it=settings.Mappings.begin(); it!=settings.Mappings.end(); ++it)
{ {
// Apply settings const QString &name = it.key();
for(size_t m=0; m<COUNTOF(maps); ++m) QString *value = it.value();
Q_ASSERT(value);
if(value->isEmpty())
runFossil(QStringList() << "unset" << name << "-global");
else
{ {
if(maps[m].value->isEmpty()) runFossil(QStringList() << "settings" << name << "\"" + *value + "\"" <<"-global");
runFossil(QStringList() << "unset" << maps[m].command << "-global");
else
runFossil(QStringList() << "settings" << maps[m].command << *maps[m].value << "-global");
} }
} }
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -1429,9 +1475,16 @@ void MainWindow::on_actionViewUnknown_triggered()
refresh(); refresh();
} }
//------------------------------------------------------------------------------
void MainWindow::on_actionViewIgnored_triggered()
{
refresh();
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
QString MainWindow::getFossilHttpAddress() QString MainWindow::getFossilHttpAddress()
{ {
return "http://127.0.0.1:"+fossilUIPort; return "http://127.0.0.1:"+fossilUIPort;
} }

View File

@ -117,8 +117,10 @@ private:
void addWorkspace(const QString &dir); void addWorkspace(const QString &dir);
void rebuildRecent(); void rebuildRecent();
bool openWorkspace(const QString &dir); bool openWorkspace(const QString &dir);
void loadFossilSettings();
QString getFossilPath(); QString getFossilPath();
QString getFossilHttpAddress(); QString getFossilHttpAddress();
bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec);
enum RepoStatus enum RepoStatus
{ {
@ -163,6 +165,8 @@ private slots:
void on_actionViewModified_triggered(); void on_actionViewModified_triggered();
void on_actionViewUnknown_triggered(); void on_actionViewUnknown_triggered();
void on_actionViewIgnored_triggered();
private: private:
enum enum
{ {
@ -187,6 +191,7 @@ private:
// Repo State // Repo State
typedef QMap<QString, RepoFile> filemap_t; typedef QMap<QString, RepoFile> filemap_t;
filemap_t workspaceFiles; filemap_t workspaceFiles;
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H

View File

@ -116,6 +116,7 @@
<addaction name="actionViewModified"/> <addaction name="actionViewModified"/>
<addaction name="actionViewUnchanged"/> <addaction name="actionViewUnchanged"/>
<addaction name="actionViewUnknown"/> <addaction name="actionViewUnknown"/>
<addaction name="actionViewIgnored"/>
</widget> </widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
<addaction name="menuView"/> <addaction name="menuView"/>
@ -497,6 +498,14 @@
<string>Unknown</string> <string>Unknown</string>
</property> </property>
</action> </action>
<action name="actionViewIgnored">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>Ignored</string>
</property>
</action>
</widget> </widget>
<layoutdefault spacing="6" margin="11"/> <layoutdefault spacing="6" margin="11"/>
<resources> <resources>

View File

@ -19,9 +19,6 @@ static QString SelectExe(QWidget *parent, const QString &description)
if(!QFile::exists(path)) if(!QFile::exists(path))
return QString(); return QString();
// Quote path if it contains spaces
if(path.contains(' '))
path = '"'+path + '"';
return path; return path;
} }
@ -35,6 +32,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Settings &_settings) :
ui->lineFossilPath->setText(settings->fossilPath); ui->lineFossilPath->setText(settings->fossilPath);
ui->lineGDiffCommand->setText(settings->gDiffCommand); ui->lineGDiffCommand->setText(settings->gDiffCommand);
ui->lineGMergeCommand->setText(settings->gMergeCommand); ui->lineGMergeCommand->setText(settings->gMergeCommand);
ui->lineIgnore->setText(settings->ignoreGlob);
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -56,6 +54,7 @@ void SettingsDialog::on_buttonBox_accepted()
settings->fossilPath = ui->lineFossilPath->text(); settings->fossilPath = ui->lineFossilPath->text();
settings->gDiffCommand = ui->lineGDiffCommand->text(); settings->gDiffCommand = ui->lineGDiffCommand->text();
settings->gMergeCommand = ui->lineGMergeCommand->text(); settings->gMergeCommand = ui->lineGMergeCommand->text();
settings->ignoreGlob = ui->lineIgnore->text();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void SettingsDialog::on_btnSelectFossil_clicked() void SettingsDialog::on_btnSelectFossil_clicked()

View File

@ -2,6 +2,7 @@
#define SETTINGSDIALOG_H #define SETTINGSDIALOG_H
#include <QDialog> #include <QDialog>
#include <QMap>
namespace Ui { namespace Ui {
class SettingsDialog; class SettingsDialog;
@ -12,6 +13,17 @@ struct Settings
QString fossilPath; QString fossilPath;
QString gDiffCommand; QString gDiffCommand;
QString gMergeCommand; QString gMergeCommand;
QString ignoreGlob;
typedef QMap<QString, QString *> mappings_t;
mappings_t Mappings;
Settings()
{
Mappings.insert("gdiff-command", &gDiffCommand);
Mappings.insert("gmerge-command", &gMergeCommand);
Mappings.insert("ignore-glob", &ignoreGlob);
}
}; };

View File

@ -9,8 +9,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>520</width> <width>544</width>
<height>150</height> <height>160</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -20,9 +20,6 @@
<bool>true</bool> <bool>true</bool>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@ -57,6 +54,26 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineGDiffCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossilGDiff">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
@ -84,7 +101,17 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Ignore List</string>
</property>
</widget>
</item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="lineIgnore"/>
</item>
<item row="4" column="1">
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -94,31 +121,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLineEdit" name="lineGDiffCommand"/>
</item>
<item>
<widget class="QPushButton" name="btnSelectFossilGDiff">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
<zorder>buttonBox</zorder> <zorder>buttonBox</zorder>
<zorder>label_2</zorder> <zorder>label_2</zorder>
<zorder>label_3</zorder> <zorder>label_3</zorder>
<zorder>label</zorder> <zorder>label</zorder>
<zorder>label_4</zorder>
<zorder>lineIgnore</zorder>
</widget> </widget>
<resources/> <resources/>
<connections> <connections>

View File

@ -5,11 +5,11 @@ int main(int argc, char *argv[])
{ {
QApplication a(argc, argv); QApplication a(argc, argv);
a.setApplicationName("Fuel"); a.setApplicationName("Fuel");
a.setApplicationVersion("0.9.2"); a.setApplicationVersion("0.9.4");
a.setOrganizationDomain("karanik.com"); a.setOrganizationDomain("karanik.com");
a.setOrganizationName("Karanik"); a.setOrganizationName("Karanik");
// Native applications on OSX don't use menu icons // Native OSX applications don't use menu icons
#ifdef Q_WS_MACX #ifdef Q_WS_MACX
a.setAttribute(Qt::AA_DontShowIconsInMenus); a.setAttribute(Qt::AA_DontShowIconsInMenus);
#endif #endif

View File

@ -1,20 +1,20 @@
C Added\sstatus\smessage\swhen\sscanning\sfor\sworkspace\sfiles C Added\sSupport\sfor\signored\sfiles\nBetter\shandling\swhen\srefreshing\sworkspaces\swith\slots\sof\sfiles\n\n
D 2011-09-04T04:30:52.025 D 2011-10-06T13:02:09.111
F CommitDialog.cpp 8965e52d077c300cf1acb1b16fb2dcca5c7070f8 F CommitDialog.cpp 8965e52d077c300cf1acb1b16fb2dcca5c7070f8
F CommitDialog.h a9596d99865cf312b419d01d51334ffc916f5508 F CommitDialog.h a9596d99865cf312b419d01d51334ffc916f5508
F CommitDialog.ui 5067623f6af6f5a42c87df903278e383e945e154 F CommitDialog.ui 5067623f6af6f5a42c87df903278e383e945e154
F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8
F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce
F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7
F MainWindow.cpp e89d09b783fdd0dcb87703e6347cd2d6f2766f0b F MainWindow.cpp d4bc0072c249f758aa39e9096207f904ba8dd44c
F MainWindow.h cb4d2ab3c3fb3ecc26c5d162358316516090a89e F MainWindow.h 55f90fe948661a6b7382470f3cdc80dc592e76c4
F MainWindow.ui fcce2709fd2dc332061ee72cbc5a5a17adfd0779 F MainWindow.ui d22becfdb32d4b31ed9a6e6d68dd144870d9a957
F RepoDialog.cpp 8f20e1511526973555c774350ec413dcecf51c9e F RepoDialog.cpp 8f20e1511526973555c774350ec413dcecf51c9e
F RepoDialog.h a958c5f98f1e6882bf41dbdd2e4df3cb89700802 F RepoDialog.h a958c5f98f1e6882bf41dbdd2e4df3cb89700802
F RepoDialog.ui be7b18199c04a3003f3c7534a616cd7441b7bb0c F RepoDialog.ui be7b18199c04a3003f3c7534a616cd7441b7bb0c
F SettingsDialog.cpp 638a513e765ef4268a514d679f78c8bd3f55862c F SettingsDialog.cpp 4e8d12cd19c19590c68eaa3516441d21d08f0ee6
F SettingsDialog.h 9b02af204d7cf90c2fb92de50fb634fb36f179dc F SettingsDialog.h c2a7828466a5459d8c08a759f0ddf3e368357e80
F SettingsDialog.ui 9114ca5b9d8644cd0e910954c04f0425f89a960d F SettingsDialog.ui 292eea79612f0daa48b67436fcf812f48ff5af54
F fuel.pro 295944fd817518c7c2412c5e52ce5ecad11dd8f8 F fuel.pro 295944fd817518c7c2412c5e52ce5ecad11dd8f8
F fuel.rc 8e9ac966f283102c11a77cd7f936cdc09e09bd79 F fuel.rc 8e9ac966f283102c11a77cd7f936cdc09e09bd79
F icons/Address\sBook-01.png ef2cec80ea5a559b72e8be4a344a1869fe69cbd8 F icons/Address\sBook-01.png ef2cec80ea5a559b72e8be4a344a1869fe69cbd8
@ -171,9 +171,9 @@ F icons/Zoom\sOut-01.png 8eda092100d9e00c9097f43a80d1e26695947448
F icons/Zoom-01.png 67ca532922e9166325c5c75fce1ca3fbb0d2b6a6 F icons/Zoom-01.png 67ca532922e9166325c5c75fce1ca3fbb0d2b6a6
F icons/fuel.icns 81e535004b62db801a02f3e15d0a33afc9d4070b F icons/fuel.icns 81e535004b62db801a02f3e15d0a33afc9d4070b
F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038 F icons/fuel.ico eb529ab3332a17b9302ef3e851db5b9ebce2a038
F main.cpp 083845039c167badd57a4abf482dd3d5e77aab35 F main.cpp f67a9b5c9ca0b634b19ef08e7136032372d37f93
F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53
P 30fdcc0810046768f9635d4972026cadb1bb9dd3 P 165842900a857fa07fa58f43f309b79065ecc42c
R b0543f1058270ddb516a4c0a9a543c63 R a1ade7274295322c9cef6524f98c75a7
U kostas U kostas
Z 48e6b15a7648a3d3c0d67d63a64a810f Z 0c76a29513c846b1a1375a9cab3853ad

View File

@ -1 +1 @@
165842900a857fa07fa58f43f309b79065ecc42c f038928c484d177fbe86bee4cd689d8a7d1e3eeb