⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 revisiontree.cpp

📁 LINUX 下以 QT/KDE 写的 SVN 客户端
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                }                label = i18n("%1<br>Check change entry %2 of %3").arg(olabel).arg(i).arg(m_Data->m_OldHistory[j].changedPaths.count());                m_Data->progress->setLabel(label);                kapp->processEvents();            }            if (!m_Data->m_OldHistory[j].changedPaths[i].copyFromPath.isEmpty()) {                long r = m_Data->m_OldHistory[j].changedPaths[i].copyFromRevision;                QString sourcepath = m_Data->m_OldHistory[j].changedPaths[i].copyFromPath;                char a = m_Data->m_OldHistory[j].changedPaths[i].action;                if (m_Data->m_OldHistory[j].changedPaths[i].path.isEmpty()) {                    kdDebug()<<"Empty entry! rev " << j << " source " << sourcepath << endl;                    continue;                }                if (a=='R') {                    m_Data->m_OldHistory[j].changedPaths[i].action=0;                } else if (a=='A'){                    a=INTERNALCOPY;                    for (unsigned z = 0;z<m_Data->m_OldHistory[j].changedPaths.count();++z) {                        if (m_Data->m_OldHistory[j].changedPaths[z].action=='D'                            && isParent(m_Data->m_OldHistory[j].changedPaths[z].path,sourcepath) ) {                            a=INTERNALRENAME;                            m_Data->m_OldHistory[j].changedPaths[z].action=0;                            break;                        }                    }                    m_Data->m_History[r].addCopyTo(sourcepath,m_Data->m_OldHistory[j].changedPaths[i].path,j,a,r);                    m_Data->m_OldHistory[j].changedPaths[i].action=0;                } else {                    kdDebug()<<"Action with source path but wrong action \""<<a<<"\" found!"<<endl;                }            }        }    }    kdDebug()<<"Stage two done"<<endl;    if (cancel==true) {        return false;    }    m_Data->progress->setLabel(olabel);    for (long j=m_Data->max_rev;j>=m_Data->min_rev;--j) {        m_Data->progress->progressBar()->setProgress(m_Data->max_rev-j);        kapp->processEvents();        if (m_Data->progress->wasCancelled()) {            cancel=true;            break;        }        for (unsigned i = 0; i<m_Data->m_OldHistory[j].changedPaths.count();++i) {            if (m_Data->m_OldHistory[j].changedPaths[i].action==0) {                continue;            }            if (i>0 && i%100==0) {                if (m_Data->progress->wasCancelled()) {                    cancel=true;                    break;                }                label = i18n("%1<br>Check change entry %2 of %3").arg(olabel).arg(i).arg(m_Data->m_OldHistory[j].changedPaths.count());                m_Data->progress->setLabel(label);                kapp->processEvents();            }            m_Data->m_History[j].addCopyTo(m_Data->m_OldHistory[j].changedPaths[i].path,QString::null,-1,m_Data->m_OldHistory[j].changedPaths[i].action);        }        m_Data->m_History[j].author=m_Data->m_OldHistory[j].author;        m_Data->m_History[j].date=m_Data->m_OldHistory[j].date;        m_Data->m_History[j].revision=m_Data->m_OldHistory[j].revision;        m_Data->m_History[j].message=m_Data->m_OldHistory[j].message;    }    kdDebug()<<"Stage three done"<<endl;    return !cancel;}bool RevisionTree::isParent(const QString&_par,const QString&tar){    if (_par==tar) return true;    QString par = _par+(_par.endsWith("/")?"":"/");    return tar.startsWith(par);}bool RevisionTree::isValid()const{    return m_Valid;}static QString uniqueNodeName(long rev,const QString&path){    QString res = KCodecs::base64Encode(path.local8Bit(),false);    res.replace("\"","_quot_");    res.replace(" ","_space_");    QString n; n.sprintf("%05ld",rev);    res = "\""+n+QString("_%1\"").arg(res);    return res;}bool RevisionTree::bottomUpScan(long startrev,unsigned recurse,const QString&_path,long _last){#define REVENTRY m_Data->m_History[j]#define FORWARDENTRY m_Data->m_History[j].changedPaths[i]    QString path = _path;    long lastrev = _last;    /* this is required if an item will modified AND copied at same revision.*/    long trev = -1;#ifdef DEBUG_PARSE    kdDebug()<<"Searching for "<<path<< " at revision " << startrev        << " recursion " << recurse << endl;#endif    bool cancel = false;    for (long j=startrev;j<=m_Data->max_rev;++j) {        if (m_Data->m_stopTick.elapsed()>500) {            m_Data->progress->progressBar()->advance(1);            kapp->processEvents();            m_Data->m_stopTick.restart();        }        if (m_Data->progress->wasCancelled()) {            cancel=true;            break;        }        for (unsigned i=0;i<REVENTRY.changedPaths.count();++i) {            if (!isParent(FORWARDENTRY.path,path)) {                continue;            }            QString n1,n2;            if (isParent(FORWARDENTRY.path,path)) {                bool get_out = false;                if (FORWARDENTRY.path!=path) {#ifdef DEBUG_PARSE                    kdDebug()<<"Parent rename? "<< FORWARDENTRY.path << " -> " << FORWARDENTRY.copyToPath << " -> " << FORWARDENTRY.copyFromPath << endl;#endif                }                if (FORWARDENTRY.action==INTERNALCOPY ||                    FORWARDENTRY.action==INTERNALRENAME ) {                    bool ren = FORWARDENTRY.action==INTERNALRENAME;                    QString tmpPath = path;                    QString recPath;                    if (FORWARDENTRY.copyToPath.length()==0) {                        continue;                    }                    QString r = path.mid(FORWARDENTRY.path.length());                    recPath= FORWARDENTRY.copyToPath;                    recPath+=r;                    n1 = uniqueNodeName(lastrev,tmpPath);                    n2 = uniqueNodeName(FORWARDENTRY.copyToRevision,recPath);                    if (lastrev>0) {                        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n1].targets.append(RevGraphView::targetData(n2,FORWARDENTRY.action));                    }                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].name=recPath;                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].rev = FORWARDENTRY.copyToRevision;                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].Action=FORWARDENTRY.action;                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].Author=m_Data->m_History[FORWARDENTRY.copyToRevision].author;                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].Message=m_Data->m_History[FORWARDENTRY.copyToRevision].message;                    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].Date=helpers::sub2qt::apr_time2qtString(m_Data->m_History[FORWARDENTRY.copyToRevision].date);                    if (ren) {                        lastrev = FORWARDENTRY.copyToRevision;                        /* skip items between */                        j=lastrev;#ifdef DEBUG_PARSE                        kdDebug()<<"Renamed to "<< recPath << " at revision " << FORWARDENTRY.copyToRevision << endl;#endif                        path=recPath;                    } else {#ifdef DEBUG_PARSE                        kdDebug()<<"Copy to "<< recPath << endl;#endif                        if (!bottomUpScan(FORWARDENTRY.copyToRevision,recurse+1,recPath,FORWARDENTRY.copyToRevision)) {                            return false;                        }                    }                } else if (FORWARDENTRY.path==path) {                    switch (FORWARDENTRY.action) {                    case 'A':#ifdef DEBUG_PARSE                        kdDebug()<<"Inserting adding base item"<<endl;#endif                        n1 = uniqueNodeName(j,FORWARDENTRY.path);                        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n1].Action=FORWARDENTRY.action;                        fillItem(j,i,n1,path);                        lastrev=j;                    break;                    case 'M':                    case 'R':#ifdef DEBUG_PARSE                        kdDebug()<<"Item modified at revision "<< j << " recurse " << recurse << endl;#endif                        n1 = uniqueNodeName(j,FORWARDENTRY.path);                        n2 = uniqueNodeName(lastrev,FORWARDENTRY.path);                        if (lastrev>0) m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].targets.append(RevGraphView::targetData(n1,FORWARDENTRY.action));                        fillItem(j,i,n1,path);                        /* modify of same item (in same recurse) should be only once at a revision                         * so check if lastrev==j must not be done but will cost cpu ticks so I always                         * set trev and lastrev.                         */                        trev = lastrev;                        lastrev = j;                    break;                    case 'D':#ifdef DEBUG_PARSE                        kdDebug()<<"(Sloppy match) Item deleted at revision "<< j << " recurse " << recurse << endl;#endif                        n1 = uniqueNodeName(j,path);                        n2 = uniqueNodeName(lastrev,path);                        if (n1==n2) {                            /* cvs import - copy and deletion at same revision.                             * CVS sucks.                             */                            n1 = uniqueNodeName(j,"D_"+path);                        }                        if (lastrev>0) m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].targets.append(RevGraphView::targetData(n1,FORWARDENTRY.action));                        fillItem(j,i,n1,path);                        lastrev = j;                        get_out= true;                    break;                    default:                    break;                    }                } else {                    switch (FORWARDENTRY.action) {                    case 'D':#ifdef DEBUG_PARSE                        kdDebug()<<"(Exact match) Item deleted at revision "<< j << " recurse " << recurse << endl;#endif                        n1 = uniqueNodeName(j,path);                        n2 = uniqueNodeName(lastrev,path);                        if (n1==n2) {                            /* cvs import - copy and deletion at same revision.                             * CVS sucks.                             */                            n1 = uniqueNodeName(j,"D_"+path);                        }                        if (lastrev>0) m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[n2].targets.append(RevGraphView::targetData(n1,FORWARDENTRY.action));                        fillItem(j,i,n1,path);                        lastrev = j;                        get_out = true;                    break;                    default:                    break;                    }                }                if (get_out) {                    return true;                }            }        }    }    return !cancel;}QWidget*RevisionTree::getView(){    return m_Data->m_TreeDisplay;}void RevisionTree::fillItem(long rev,int pathIndex,const QString&nodeName,const QString&path){    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].name=path;    m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].rev = rev;    if (pathIndex>=0) {        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Action=m_Data->m_History[rev].changedPaths[pathIndex].action;        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Author=m_Data->m_History[rev].author;        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Message=m_Data->m_History[rev].message;        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Date=helpers::sub2qt::apr_time2qtString(m_Data->m_History[rev].date);    } else {        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Action=0;        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Author="";        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Message="";        m_Data->m_TreeDisplay->m_RevGraphView->m_Tree[nodeName].Date=helpers::sub2qt::apr_time2qtString(0);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -