# HG changeset patch # User Chris Cannam # Date 1291028479 0 # Node ID c92f5859c707d18f783860f7f951ea4c3ce1700f # Parent 005a54380502b2bb46961618e9728dfd5831246c * Add incremental log (though not incremental relayout) diff -r 005a54380502 -r c92f5859c707 hgrunner.cpp --- a/hgrunner.cpp Sun Nov 28 21:52:00 2010 +0000 +++ b/hgrunner.cpp Mon Nov 29 11:01:19 2010 +0000 @@ -50,7 +50,10 @@ HgRunner::~HgRunner() { closeTerminal(); - if (m_proc) delete m_proc; + if (m_proc) { + m_proc->kill(); + delete m_proc; + } } void HgRunner::requestAction(HgAction action) diff -r 005a54380502 -r c92f5859c707 hgtabwidget.cpp --- a/hgtabwidget.cpp Sun Nov 28 21:52:00 2010 +0000 +++ b/hgtabwidget.cpp Mon Nov 29 11:01:19 2010 +0000 @@ -127,9 +127,14 @@ m_fileStatusWidget->setFileStates(m_fileStates); } -void HgTabWidget::updateLocalRepoHgLogList(QString hgLogList) +void HgTabWidget::setNewLog(QString hgLogList) { - m_historyWidget->parseLog(hgLogList); + m_historyWidget->parseNewLog(hgLogList); +} + +void HgTabWidget::addIncrementalLog(QString hgLogList) +{ + m_historyWidget->parseIncrementalLog(hgLogList); } void HgTabWidget::setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath) diff -r 005a54380502 -r c92f5859c707 hgtabwidget.h --- a/hgtabwidget.h Sun Nov 28 21:52:00 2010 +0000 +++ b/hgtabwidget.h Mon Nov 29 11:01:19 2010 +0000 @@ -41,7 +41,10 @@ HgTabWidget(QWidget *parent, QString remoteRepo, QString workFolderPath); void updateWorkFolderFileList(QString fileList); - void updateLocalRepoHgLogList(QString hgLogList); + + void setNewLog(QString hgLogList); + void addIncrementalLog(QString hgLogList); + void setWorkFolderAndRepoNames(QString workFolderPath, QString remoteRepoPath); void setState(QString state); diff -r 005a54380502 -r c92f5859c707 historywidget.cpp --- a/historywidget.cpp Sun Nov 28 21:52:00 2010 +0000 +++ b/historywidget.cpp Mon Nov 29 11:01:19 2010 +0000 @@ -52,20 +52,42 @@ m_changesets.clear(); } -void HistoryWidget::parseLog(QString log) +void HistoryWidget::parseNewLog(QString log) +{ + DEBUG << "HistoryWidget::parseNewLog: log has " << log.length() << " chars" << endl; + Changesets csets = parseChangeSets(log); + DEBUG << "HistoryWidget::parseNewLog: log has " << csets.size() << " changesets" << endl; + clearChangesets(); + m_changesets = csets; + layoutAll(); +} + +void HistoryWidget::parseIncrementalLog(QString log) +{ + DEBUG << "HistoryWidget::parseIncrementalLog: log has " << log.length() << " chars" << endl; + Changesets csets = parseChangeSets(log); + DEBUG << "HistoryWidget::parseIncrementalLog: log has " << csets.size() << " changesets" << endl; + if (!csets.empty()) { + m_changesets << csets; + layoutAll(); + } +} + +void HistoryWidget::layoutAll() { ChangesetScene *scene = new ChangesetScene(); - Changesets csets = parseChangeSets(log); ChangesetItem *tipItem = 0; - if (!csets.empty()) { + if (!m_changesets.empty()) { Grapher g(scene); try { - g.layout(csets); + g.layout(m_changesets); } catch (std::string s) { std::cerr << "Internal error: Layout failed: " << s << std::endl; } - tipItem = g.getItemFor(csets[0]); + tipItem = g.getItemFor(m_changesets[0]); + DEBUG << "tipItem is " << tipItem << " for tip changeset " + << m_changesets[0]->id() << endl; } QGraphicsScene *oldScene = m_panned->scene(); @@ -73,10 +95,6 @@ m_panner->setScene(scene); if (oldScene) delete oldScene; - clearChangesets(); - - m_changesets = csets; - if (tipItem) tipItem->ensureVisible(); } diff -r 005a54380502 -r c92f5859c707 historywidget.h --- a/historywidget.h Sun Nov 28 21:52:00 2010 +0000 +++ b/historywidget.h Mon Nov 29 11:01:19 2010 +0000 @@ -33,7 +33,8 @@ HistoryWidget(); virtual ~HistoryWidget(); - void parseLog(QString log); + void parseNewLog(QString log); + void parseIncrementalLog(QString log); private: Changesets m_changesets; @@ -42,6 +43,7 @@ Panner *m_panner; void clearChangesets(); + void layoutAll(); Changesets parseChangeSets(QString); }; diff -r 005a54380502 -r c92f5859c707 mainwindow.cpp --- a/mainwindow.cpp Sun Nov 28 21:52:00 2010 +0000 +++ b/mainwindow.cpp Mon Nov 29 11:01:19 2010 +0000 @@ -64,7 +64,6 @@ readSettings(); -// tabPage = 0; justMerged = false; hgTabs = new HgTabWidget((QWidget *) this, remoteRepoPath, workFolderPath); setCentralWidget(hgTabs); @@ -74,6 +73,7 @@ setUnifiedTitleAndToolBarOnMac(true); connectActions(); + clearState(); enableDisableActions(); if (firstStart) { @@ -145,6 +145,12 @@ hgTabs->clearSelections(); } +void MainWindow::hgRefresh() +{ + clearState(); + hgQueryPaths(); +} + void MainWindow::hgStat() { QStringList params; @@ -176,8 +182,6 @@ void MainWindow::hgLog() { -//!!! This needs to be incremental, except when we pull or set new repo. - // Be sure to use ACT_LOG_INCREMENTAL for incremental logs QStringList params; params << "log"; params << "--template"; @@ -186,6 +190,21 @@ runner->requestAction(HgAction(ACT_LOG, workFolderPath, params)); } +void MainWindow::hgLogIncremental() +{ + QStringList params; + params << "log"; + + foreach (Changeset *head, currentHeads) { + int n = head->number(); + params << "--prune" << QString("%1").arg(n); + } + + params << "--template"; + params << "id: {rev}:{node|short}\\nauthor: {author}\\nbranch: {branches}\\ntag: {tag}\\ndatetime: {date|isodate}\\ntimestamp: {date|hgdate}\\nage: {date|age}\\nparents: {parents}\\ncomment: {desc|json}\\n\\n"; + + runner->requestAction(HgAction(ACT_LOG_INCREMENTAL, workFolderPath, params)); +} void MainWindow::hgQueryParents() { @@ -613,6 +632,15 @@ return ret; } +void MainWindow::clearState() +{ + foreach (Changeset *cs, currentParents) delete cs; + currentParents.clear(); + foreach (Changeset *cs, currentHeads) delete cs; + currentHeads.clear(); + currentBranch = ""; + needNewLog = true; +} void MainWindow::hgServe() { @@ -680,6 +708,7 @@ if (result) { enableDisableActions(); + clearState(); hgQueryPaths(); done = true; } @@ -998,16 +1027,32 @@ void MainWindow::fsDirectoryChanged(QString) { - //!!! should just queue one of these! hgStat(); } void MainWindow::fsFileChanged(QString) { - //!!! should just queue one of these! hgStat(); } +void MainWindow::showIncoming(QString output) +{ + runner->hide(); + QMessageBox::information(this, "Incoming", output); +} + +void MainWindow::showPushResult(QString output) +{ + runner->hide(); + QMessageBox::information(this, "Push", output); +} + +void MainWindow::showPullResult(QString output) +{ + runner->hide(); + QMessageBox::information(this, "Pull", output); +} + void MainWindow::commandFailed(HgAction action, QString stderr) { DEBUG << "MainWindow::commandFailed" << endl; @@ -1090,6 +1135,9 @@ break; case ACT_INCOMING: + showIncoming(output); + break; + case ACT_ANNOTATE: case ACT_RESOLVE_LIST: case ACT_RESOLVE_MARK: @@ -1098,13 +1146,12 @@ break; case ACT_PULL: - QMessageBox::information(this, "Pull", output); + showPullResult(output); shouldHgStat = true; break; case ACT_PUSH: - QMessageBox::information(this, "Push", output); - shouldHgStat = true; + showPushResult(output); break; case ACT_INIT: @@ -1124,7 +1171,12 @@ break; case ACT_LOG: - hgTabs -> updateLocalRepoHgLogList(output); + hgTabs->setNewLog(output); + needNewLog = false; + break; + + case ACT_LOG_INCREMENTAL: + hgTabs->addIncrementalLog(output); break; case ACT_QUERY_PARENTS: @@ -1187,7 +1239,11 @@ } else if (action == ACT_QUERY_HEADS) { hgQueryParents(); } else if (action == ACT_QUERY_PARENTS) { - hgLog(); + if (needNewLog) { + hgLog(); + } else { + hgLogIncremental(); + } } else /* Move to commandFailed if ((runningAction == ACT_MERGE) && (exitCode != 0)) @@ -1218,7 +1274,7 @@ connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - connect(hgStatAct, SIGNAL(triggered()), this, SLOT(hgQueryPaths())); + connect(hgRefreshAct, SIGNAL(triggered()), this, SLOT(hgRefresh())); connect(hgRemoveAct, SIGNAL(triggered()), this, SLOT(hgRemove())); connect(hgAddAct, SIGNAL(triggered()), this, SLOT(hgAdd())); connect(hgCommitAct, SIGNAL(triggered()), this, SLOT(hgCommit())); @@ -1305,7 +1361,7 @@ bool haveDiff = (diffBinaryName != ""); hgInitAct -> setEnabled((localRepoExist == false) && (workFolderExist==true)); - hgStatAct -> setEnabled(localRepoActionsEnabled); + hgRefreshAct -> setEnabled(localRepoActionsEnabled); hgFileDiffAct -> setEnabled(localRepoActionsEnabled && haveDiff); hgFolderDiffAct -> setEnabled(localRepoActionsEnabled && haveDiff); hgRevertAct -> setEnabled(localRepoActionsEnabled); @@ -1413,8 +1469,8 @@ exitAct -> setIconVisibleInMenu(true); //Repository actions - hgStatAct = new QAction(QIcon(":/images/status.png"), tr("Refresh"), this); - hgStatAct->setStatusTip(tr("Refresh (info of) status of workfolder files")); + hgRefreshAct = new QAction(QIcon(":/images/status.png"), tr("Refresh"), this); + hgRefreshAct->setStatusTip(tr("Refresh (info of) status of workfolder files")); hgIncomingAct = new QAction(QIcon(":/images/incoming.png"), tr("Preview"), this); hgIncomingAct -> setStatusTip(tr("View info of changesets incoming to us from remote repository (on pull operation)")); @@ -1527,7 +1583,7 @@ fileToolBar = addToolBar(tr("File")); fileToolBar -> setIconSize(QSize(MY_ICON_SIZE, MY_ICON_SIZE)); fileToolBar -> addAction(openAct); - fileToolBar -> addAction(hgStatAct); + fileToolBar -> addAction(hgRefreshAct); fileToolBar -> addSeparator(); // fileToolBar -> addAction(hgChgSetDiffAct); fileToolBar -> setMovable(false); diff -r 005a54380502 -r c92f5859c707 mainwindow.h --- a/mainwindow.h Sun Nov 28 21:52:00 2010 +0000 +++ b/mainwindow.h Mon Nov 29 11:01:19 2010 +0000 @@ -49,13 +49,13 @@ QString currentBranch; Changesets currentHeads; Changesets currentParents; + bool needNewLog; protected: void closeEvent(QCloseEvent *event); public slots: - void hgQueryPaths(); - void hgStat(); + void hgRefresh(); void commandCompleted(HgAction action, QString stdout); void commandFailed(HgAction action, QString stdout); void enableDisableActions(); @@ -67,6 +67,8 @@ void startupDialog(); void clearSelections(); + void hgQueryPaths(); + void hgStat(); void hgRemove(); void hgAdd(); void hgCommit(); @@ -98,6 +100,7 @@ void hgQueryHeads(); void hgQueryParents(); void hgLog(); + void hgLogIncremental(); void createActions(); void connectActions(); void createMenus(); @@ -129,6 +132,12 @@ bool askToOpenParentRepo(QString, QString); bool askToOpenInsteadOfInit(QString); + void showIncoming(QString); + void showPullResult(QString); + void showPushResult(QString); + + void clearState(); + void updateFileSystemWatcher(); bool firstStart; @@ -148,7 +157,7 @@ QAction *hgIncomingAct; QAction *hgPushAct; QAction *hgPullAct; - QAction *hgStatAct; + QAction *hgRefreshAct; QAction *hgFileDiffAct; QAction *hgFolderDiffAct; QAction *hgChgSetDiffAct;