Added missing Workspace.cpp/h
FossilOrigin-Name: 2e7553cddf1db1c9e22e883276829a8032dc9afb
This commit is contained in:
parent
e4aebbe52c
commit
9dff9370ce
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
|||||||
C Renamed\sRepoFile\sto\sWorkspaceFile
|
C Added\smissing\sWorkspace.cpp/h
|
||||||
D 2015-04-30T11:29:21.110
|
D 2015-04-30T11:37:04.334
|
||||||
F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35
|
F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35
|
||||||
F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b
|
F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b
|
||||||
F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b
|
F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b
|
||||||
@ -206,6 +206,8 @@ F src/SettingsDialog.cpp a46cff5e5dd425e3dbdd15632abfd5829f5562b4
|
|||||||
F src/SettingsDialog.h 4e2790f581e991c744ae9f86580f1972b8c7ff43
|
F src/SettingsDialog.h 4e2790f581e991c744ae9f86580f1972b8c7ff43
|
||||||
F src/Utils.cpp f78728e0817b1db23007ba0d2c5c26980ee7ebca
|
F src/Utils.cpp f78728e0817b1db23007ba0d2c5c26980ee7ebca
|
||||||
F src/Utils.h 48ca8ab324068df2bf5120c961216c297b94cb45
|
F src/Utils.h 48ca8ab324068df2bf5120c961216c297b94cb45
|
||||||
|
F src/Workspace.cpp dd657ecc61161e2a14e821424a76220cfd4ca8ce
|
||||||
|
F src/Workspace.h fa11507567ee6dc336e19d18dd9574da4823ae2f
|
||||||
F src/main.cpp 2ac8badc2a63fa123ceae53382ce24cfe1b5a54b
|
F src/main.cpp 2ac8badc2a63fa123ceae53382ce24cfe1b5a54b
|
||||||
F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x
|
F tools/git-push.sh 62cc58434cae5b7bcd6bd9d4cce8b08739f31cd7 x
|
||||||
F tools/pack.sh d7f38a498c4e9327fecd6a6e5ac27be270d43008 x
|
F tools/pack.sh d7f38a498c4e9327fecd6a6e5ac27be270d43008 x
|
||||||
@ -215,7 +217,7 @@ F ui/CommitDialog.ui 6200f6cabdcf40a20812e811be28e0793f82516f
|
|||||||
F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d
|
F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d
|
||||||
F ui/MainWindow.ui 8677f5c8bca5bf7561d5f64bfdd0cef5157c6ac7
|
F ui/MainWindow.ui 8677f5c8bca5bf7561d5f64bfdd0cef5157c6ac7
|
||||||
F ui/SettingsDialog.ui 2b7c2870e0054b0f4106f495d85d02c0b814df8b
|
F ui/SettingsDialog.ui 2b7c2870e0054b0f4106f495d85d02c0b814df8b
|
||||||
P 4c84ad9b0b25c9a77d935f9598b6705498d8e0ae
|
P 8527bab97be43b2370eb03045dee3818fa8a2edf
|
||||||
R 09e377e3947cb9dc34273000bdb7e135
|
R a0658af9a44eb2edc8f67837992ca8ff
|
||||||
U kostas
|
U kostas
|
||||||
Z acf05986975f53be7b8c33e091697cd2
|
Z c61114eaf068b6a2a510be12e212e0db
|
||||||
|
@ -1 +1 @@
|
|||||||
8527bab97be43b2370eb03045dee3818fa8a2edf
|
2e7553cddf1db1c9e22e883276829a8032dc9afb
|
186
src/Workspace.cpp
Normal file
186
src/Workspace.cpp
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
#include "Workspace.h"
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
Workspace::~Workspace()
|
||||||
|
{
|
||||||
|
clearState();
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void Workspace::clearState()
|
||||||
|
{
|
||||||
|
// Dispose RepoFiles
|
||||||
|
foreach(WorkspaceFile *r, getFiles())
|
||||||
|
delete r;
|
||||||
|
|
||||||
|
getFiles().clear();
|
||||||
|
getPaths().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
bool Workspace::scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec, const bool &abort, Bridge::UICallback &uiCallback)
|
||||||
|
{
|
||||||
|
QDir dir(dirPath);
|
||||||
|
|
||||||
|
uiCallback.updateProcess(dirPath);
|
||||||
|
|
||||||
|
QFileInfoList list = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
|
||||||
|
for (int i=0; i<list.count(); ++i)
|
||||||
|
{
|
||||||
|
if(abort)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QFileInfo info = list[i];
|
||||||
|
QString filepath = info.filePath();
|
||||||
|
QString rel_path = filepath;
|
||||||
|
rel_path.remove(baseDir+PATH_SEPARATOR);
|
||||||
|
|
||||||
|
// Skip ignored files
|
||||||
|
if(!ignoreSpec.isEmpty() && QDir::match(ignoreSpec, rel_path))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (info.isDir())
|
||||||
|
{
|
||||||
|
if(!scanDirectory(entries, filepath, baseDir, ignoreSpec, abort, uiCallback))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
entries.push_back(info);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void Workspace::scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QString &ignoreGlob, Bridge::UICallback &uiCallback, bool &operationAborted)
|
||||||
|
{
|
||||||
|
// Scan all workspace files
|
||||||
|
QFileInfoList all_files;
|
||||||
|
QString wkdir = fossil().getCurrentWorkspace();
|
||||||
|
|
||||||
|
if(wkdir.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Retrieve the status of files tracked by fossil
|
||||||
|
QStringList res;
|
||||||
|
if(!fossil().listFiles(res))
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool scan_files = scanLocal;
|
||||||
|
|
||||||
|
clearState();
|
||||||
|
|
||||||
|
operationAborted = false;
|
||||||
|
|
||||||
|
uiCallback.beginProcess("");
|
||||||
|
if(scan_files)
|
||||||
|
{
|
||||||
|
QCoreApplication::processEvents();
|
||||||
|
|
||||||
|
QString ignore;
|
||||||
|
// If we should not be showing ignored files, fill in the ignored spec
|
||||||
|
if(!scanIgnored)
|
||||||
|
{
|
||||||
|
// QDir expects multiple specs being separated by a semicolon
|
||||||
|
ignore = ignoreGlob;
|
||||||
|
ignore.replace(',',';');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!scanDirectory(all_files, wkdir, wkdir, ignore, operationAborted, uiCallback))
|
||||||
|
goto _done;
|
||||||
|
|
||||||
|
for(QFileInfoList::iterator it=all_files.begin(); it!=all_files.end(); ++it)
|
||||||
|
{
|
||||||
|
QString filename = it->fileName();
|
||||||
|
QString fullpath = it->absoluteFilePath();
|
||||||
|
|
||||||
|
// Skip fossil files
|
||||||
|
if(filename == FOSSIL_CHECKOUT1 || filename == FOSSIL_CHECKOUT2 || (!fossil().getRepositoryFile().isEmpty() && QFileInfo(fullpath) == QFileInfo(fossil().getRepositoryFile())))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
WorkspaceFile *rf = new WorkspaceFile(*it, WorkspaceFile::TYPE_UNKNOWN, wkdir);
|
||||||
|
getFiles().insert(rf->getFilePath(), rf);
|
||||||
|
getPaths().insert(rf->getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uiCallback.endProcess();
|
||||||
|
|
||||||
|
uiCallback.beginProcess(QObject::tr("Updating..."));
|
||||||
|
|
||||||
|
// Update Files and Directories
|
||||||
|
|
||||||
|
for(QStringList::iterator line_it=res.begin(); line_it!=res.end(); ++line_it)
|
||||||
|
{
|
||||||
|
QString line = (*line_it).trimmed();
|
||||||
|
if(line.length()==0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QString status_text = line.left(10).trimmed();
|
||||||
|
QString fname = line.right(line.length() - 10).trimmed();
|
||||||
|
WorkspaceFile::Type type = WorkspaceFile::TYPE_UNKNOWN;
|
||||||
|
|
||||||
|
// Generate a RepoFile for all non-existant fossil files
|
||||||
|
// or for all files if we skipped scanning the workspace
|
||||||
|
bool add_missing = !scan_files;
|
||||||
|
|
||||||
|
if(status_text=="EDITED")
|
||||||
|
type = WorkspaceFile::TYPE_EDITTED;
|
||||||
|
else if(status_text=="ADDED")
|
||||||
|
type = WorkspaceFile::TYPE_ADDED;
|
||||||
|
else if(status_text=="DELETED")
|
||||||
|
{
|
||||||
|
type = WorkspaceFile::TYPE_DELETED;
|
||||||
|
add_missing = true;
|
||||||
|
}
|
||||||
|
else if(status_text=="MISSING")
|
||||||
|
{
|
||||||
|
type = WorkspaceFile::TYPE_MISSING;
|
||||||
|
add_missing = true;
|
||||||
|
}
|
||||||
|
else if(status_text=="RENAMED")
|
||||||
|
type = WorkspaceFile::TYPE_RENAMED;
|
||||||
|
else if(status_text=="UNCHANGED")
|
||||||
|
type = WorkspaceFile::TYPE_UNCHANGED;
|
||||||
|
else if(status_text=="CONFLICT")
|
||||||
|
type = WorkspaceFile::TYPE_CONFLICTED;
|
||||||
|
|
||||||
|
// Filter unwanted file types
|
||||||
|
if( ((type & WorkspaceFile::TYPE_MODIFIED) && !scanModified) ||
|
||||||
|
((type & WorkspaceFile::TYPE_UNCHANGED) && !scanUnchanged))
|
||||||
|
{
|
||||||
|
getFiles().remove(fname);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
add_missing = true;
|
||||||
|
|
||||||
|
Workspace::filemap_t::iterator it = getFiles().find(fname);
|
||||||
|
|
||||||
|
WorkspaceFile *rf = 0;
|
||||||
|
if(add_missing && it==getFiles().end())
|
||||||
|
{
|
||||||
|
QFileInfo info(wkdir+QDir::separator()+fname);
|
||||||
|
rf = new WorkspaceFile(info, type, wkdir);
|
||||||
|
getFiles().insert(rf->getFilePath(), rf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!rf)
|
||||||
|
{
|
||||||
|
it = getFiles().find(fname);
|
||||||
|
Q_ASSERT(it!=getFiles().end());
|
||||||
|
rf = *it;
|
||||||
|
}
|
||||||
|
|
||||||
|
rf->setType(type);
|
||||||
|
|
||||||
|
QString path = rf->getPath();
|
||||||
|
getPaths().insert(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the stash
|
||||||
|
fossil().stashList(getStashes());
|
||||||
|
_done:
|
||||||
|
uiCallback.endProcess();
|
||||||
|
}
|
||||||
|
|
135
src/Workspace.h
Normal file
135
src/Workspace.h
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
#ifndef WORKSPACE_H
|
||||||
|
#define WORKSPACE_H
|
||||||
|
|
||||||
|
#include <QStandardItemModel>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QSet>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
#include "Bridge.h"
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// RepoFile
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
struct WorkspaceFile
|
||||||
|
{
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
TYPE_UNKNOWN = 1<<0,
|
||||||
|
TYPE_UNCHANGED = 1<<1,
|
||||||
|
TYPE_EDITTED = 1<<2,
|
||||||
|
TYPE_ADDED = 1<<3,
|
||||||
|
TYPE_DELETED = 1<<4,
|
||||||
|
TYPE_MISSING = 1<<5,
|
||||||
|
TYPE_RENAMED = 1<<6,
|
||||||
|
TYPE_CONFLICTED = 1<<7,
|
||||||
|
TYPE_MODIFIED = TYPE_EDITTED|TYPE_ADDED|TYPE_DELETED|TYPE_MISSING|TYPE_RENAMED|TYPE_CONFLICTED,
|
||||||
|
TYPE_REPO = TYPE_UNCHANGED|TYPE_MODIFIED,
|
||||||
|
TYPE_ALL = TYPE_UNKNOWN|TYPE_REPO
|
||||||
|
};
|
||||||
|
|
||||||
|
WorkspaceFile(const QFileInfo &info, Type type, const QString &repoPath)
|
||||||
|
{
|
||||||
|
FileInfo = info;
|
||||||
|
FileType = type;
|
||||||
|
FilePath = getRelativeFilename(repoPath);
|
||||||
|
Path = FileInfo.absolutePath();
|
||||||
|
|
||||||
|
// Strip the workspace path from the path
|
||||||
|
Q_ASSERT(Path.indexOf(repoPath)==0);
|
||||||
|
Path = Path.mid(repoPath.length()+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isType(Type t) const
|
||||||
|
{
|
||||||
|
return FileType == t;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setType(Type t)
|
||||||
|
{
|
||||||
|
FileType = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
Type getType() const
|
||||||
|
{
|
||||||
|
return FileType;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFileInfo getFileInfo() const
|
||||||
|
{
|
||||||
|
return FileInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString &getFilePath() const
|
||||||
|
{
|
||||||
|
return FilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getFilename() const
|
||||||
|
{
|
||||||
|
return FileInfo.fileName();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString &getPath() const
|
||||||
|
{
|
||||||
|
return Path;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getRelativeFilename(const QString &path)
|
||||||
|
{
|
||||||
|
QString abs_base_dir = QDir(path).absolutePath();
|
||||||
|
|
||||||
|
QString relative = FileInfo.absoluteFilePath();
|
||||||
|
int index = relative.indexOf(abs_base_dir);
|
||||||
|
if(index<0)
|
||||||
|
return QString("");
|
||||||
|
|
||||||
|
return relative.right(relative.length() - abs_base_dir.length()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QFileInfo FileInfo;
|
||||||
|
Type FileType;
|
||||||
|
QString FilePath;
|
||||||
|
QString Path;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef QSet<QString> stringset_t;
|
||||||
|
|
||||||
|
class Workspace
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~Workspace();
|
||||||
|
|
||||||
|
typedef QList<WorkspaceFile*> filelist_t;
|
||||||
|
typedef QMap<QString, WorkspaceFile*> filemap_t;
|
||||||
|
|
||||||
|
void clearState();
|
||||||
|
|
||||||
|
Bridge & fossil() { return bridge; }
|
||||||
|
const Bridge & fossil() const { return bridge; }
|
||||||
|
|
||||||
|
static bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec, const bool& abort, Bridge::UICallback &uiCallback);
|
||||||
|
void scanWorkspace(bool scanLocal, bool scanIgnored, bool scanModified, bool scanUnchanged, const QString &ignoreGlob, Bridge::UICallback &uiCallback, bool &operationAborted);
|
||||||
|
|
||||||
|
QStandardItemModel &getFileModel() { return repoFileModel; }
|
||||||
|
QStandardItemModel &getDirModel() { return repoDirModel; }
|
||||||
|
QStandardItemModel &getStashModel() { return repoStashModel; }
|
||||||
|
filemap_t &getFiles() { return workspaceFiles; }
|
||||||
|
stringset_t &getPaths() { return pathSet; }
|
||||||
|
stashmap_t &getStashes() { return stashMap; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Bridge bridge;
|
||||||
|
filemap_t workspaceFiles;
|
||||||
|
stringset_t pathSet;
|
||||||
|
stashmap_t stashMap;
|
||||||
|
|
||||||
|
QStandardItemModel repoFileModel;
|
||||||
|
QStandardItemModel repoDirModel;
|
||||||
|
QStandardItemModel repoStashModel;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WORKSPACE_H
|
Loading…
x
Reference in New Issue
Block a user