[prev in list] [next in list] [prev in thread] [next in thread]
List: kdevelop-devel
Subject: [Patch] Bugs in KDev-3.4's cvs-part (Part 2)
From: Robert Gruber <rgruber () users ! sourceforge ! net>
Date: 2007-05-04 9:23:04
Message-ID: 200705041123.04232.rgruber () users ! sourceforge ! net
[Download RAW message or body]
Hi!
The patch for CvsFileInfoProvider I sent yesterday has some shortcomings.
As I ignored the "bool checkRepos" parameter, everytime the user expands a
directory, the cvs server get queried. This would lead to heavy traffic to
the cvs server if someone does a lot of directory switching. So I though
it might be better to read the status from the CVS/Entries file if
checkRepos is set to false. And just query the cvs server if the user
explicitly requests a status update (checkRepos==true).
But while implementing the read from the local CVS/Entries file I ran
into another problem. The FileTree part requests the status everytime
the expanded() signal of a directory-item is executed. When the directory
is expanded for the first time, the directory-item does not contain any
childs at the time the CvsFileInfoProvider gets called. The childs seam
to be created async (but I wasn't able to find out how). The reading from
CVS/Entries file is so damned fast, that the CvsFileInfoProvider sends
the status back to the FileTree even before it has added the childs to
the directory-item. No problem here when calling "cvs status". The
dcop call is pretty slow so it seams there is enough time for FileTree
to create the childs.
So in the slot VCSFileTreeWidgetImpl::vcsDirStatusReady() no childs will
be found for the directory-item and the FileTree will therefore ignore the
status that has been reported by the CvsFileInfoProvider. When I then
close and re-expand the directory-item, the status-update works
because the childs have been created in the previous run.
I found no other solution than holding back the statusReady() signal a
bit using QTimer::singleShot(1000,...). But this looks quit ugly to me.
Hopefully anybody has a better solution?
Nevertheless I've attached the patch...
Robert
["kdev_34_cvs_part2.patch" (text/x-diff)]
Index: cvsfileinfoprovider.h
===================================================================
--- cvsfileinfoprovider.h (revision 660601)
+++ cvsfileinfoprovider.h (working copy)
@@ -43,6 +43,8 @@
public slots:
void updateStatusFor( const CVSDir& );
+private slots:
+ void propagateUpdate();
signals:
void needStatusUpdate(const CVSDir&);
Index: cvsfileinfoprovider.cpp
===================================================================
--- cvsfileinfoprovider.cpp (revision 660601)
+++ cvsfileinfoprovider.cpp (working copy)
@@ -10,6 +10,7 @@
***************************************************************************/
#include <qregexp.h>
+#include <qtimer.h>
#include <kurl.h>
#include <kdebug.h>
@@ -82,8 +83,30 @@
}
+ if (!checkRepos) {
+ kdDebug(9006) << "No repo check reqested; Just read CVS/Entries from: " << dirPath << endl;
+ QDir qd(projectDirectory()+QDir::separator()+dirPath);
+ CVSDir cdir(qd);
+ if (cdir.isValid())
+ {
+ emit needStatusUpdate(cdir);
+ return true;
+ }
+ kdDebug(9006) << dirPath << " is not a valid cvs directory" << endl;
+ return false;
+ }
+
+ // Fix a possible bug in cvs client:
+ // When "cvs status" get's called nonrecursiv for a directory, it will
+ // not print anything if the path ends with a slash. So we need to ensure
+ // this here.
+ QString newPath = dirPath;
+ if (newPath.endsWith("/"))
+ newPath.truncate( newPath.length()-1 );
+
+
// path, recursive, tagInfo: hmmm ... we may use tagInfo for collecting file tags ...
- DCOPRef job = m_cvsService->status( dirPath, recursive, checkRepos );
+ DCOPRef job = m_cvsService->status( newPath, recursive, false );
m_requestStatusJob = new CvsJob_stub( job.app(), job.obj() );
kdDebug(9006) << "Running command : " << m_requestStatusJob->cvsCommand() << endl;
@@ -101,10 +124,29 @@
}*/
}
+void CVSFileInfoProvider::propagateUpdate()
+{
+ emit statusReady( *m_cachedDirEntries, m_savedCallerData );
+}
+
void CVSFileInfoProvider::updateStatusFor(const CVSDir& dir)
{
m_cachedDirEntries = dir.cacheableDirStatus();
- emit statusReady( *m_cachedDirEntries, m_savedCallerData );
+ printOutFileInfoMap( *m_cachedDirEntries );
+
+ /* FileTree will call requestStatus() everytime the user expands a directory
+ * Unfortunatly requestStatus() will be called before the
+ * VCSFileTreeViewItem of the directory will be filled with the files
+ * it contains. Meaning, m_savedCallerData contains no childs at that
+ * time. When a dcop call is made to run "cvs status" this is no problem.
+ * The dcop call takes quit long, and so FileTree has enough time the fill
+ * in the childs before we report the status back.
+ * As far as the reading of the CVS/Entries file is very fast,
+ * it will happen that we emit statusReady() here before the directory
+ * item conains any childs. Therefor we need to give FileTree some time
+ * to update the directory item before we give the status infos.
+ */
+ QTimer::singleShot( 1000, this, SLOT(propagateUpdate()) );
}
///////////////////////////////////////////////////////////////////////////////
_______________________________________________
KDevelop-devel mailing list
KDevelop-devel@kdevelop.org
https://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic