/************************************************************************** ** cvsdiffparser.cpp ** ----------------- ** begin : Sun Aug 4 15:05:35 2002 ** copyright : (C) 2002-2004 Otto Bruggeman ** email : otto.bruggeman@home.nl ** ***************************************************************************/ /*************************************************************************** ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** ( at your option ) any later version. ** ***************************************************************************/ #include #include #include "cvsdiffparser.h" #include "komparemodellist.h" using namespace Diff2; CVSDiffParser::CVSDiffParser( const KompareModelList* list, const TQStringList& diff ) : ParserBase( list, diff ) { // The regexps needed for context cvs diff parsing, the rest is the same as in parserbase.cpp // third capture in header1 is non optional for cvs diff, it is the revision m_contextDiffHeader1.setPattern( "\\*\\*\\* ([^\\t]+)\\t([^\\t]+)\\t(.*)\\n" ); m_contextDiffHeader2.setPattern( "--- ([^\\t]+)\\t([^\\t]+)(|\\t(.*))\\n" ); m_normalDiffHeader.setPattern( "Index: (.*)\\n" ); } CVSDiffParser::~CVSDiffParser() { } enum Kompare::Format CVSDiffParser::determineFormat() { // kdDebug(8101) << "Determining the format of the CVSDiff" << endl; TQRegExp normalRE ( "[0-9]+[0-9,]*[acd][0-9]+[0-9,]*" ); TQRegExp unifiedRE( "^--- [^\\t]+\\t" ); TQRegExp contextRE( "^\\*\\*\\* [^\\t]+\\t" ); TQRegExp rcsRE ( "^[acd][0-9]+ [0-9]+" ); TQRegExp edRE ( "^[0-9]+[0-9,]*[acd]" ); TQStringList::ConstIterator it = m_diffLines.begin(); while( it != m_diffLines.end() ) { if( (*it).find( normalRE, 0 ) == 0 ) { // kdDebug(8101) << "Difflines are from a Normal diff..." << endl; return Kompare::Normal; } else if( (*it).find( unifiedRE, 0 ) == 0 ) { // kdDebug(8101) << "Difflines are from a Unified diff..." << endl; return Kompare::Unified; } else if( (*it).find( contextRE, 0 ) == 0 ) { // kdDebug(8101) << "Difflines are from a Context diff..." << endl; return Kompare::Context; } else if( (*it).find( rcsRE, 0 ) == 0 ) { // kdDebug(8101) << "Difflines are from a RCS diff..." << endl; return Kompare::RCS; } else if( (*it).find( edRE, 0 ) == 0 ) { // kdDebug(8101) << "Difflines are from an ED diff..." << endl; return Kompare::Ed; } ++it; } // kdDebug(8101) << "Difflines are from an unknown diff..." << endl; return Kompare::UnknownFormat; } bool CVSDiffParser::parseNormalDiffHeader() { kdDebug(8101) << "CVSDiffParser::parseNormalDiffHeader()" << endl; bool result = false; TQStringList::ConstIterator diffEnd = m_diffLines.end(); while ( m_diffIterator != diffEnd ) { if ( m_normalDiffHeader.exactMatch( *m_diffIterator ) ) { kdDebug(8101) << "Matched length Header = " << m_normalDiffHeader.matchedLength() << endl; kdDebug(8101) << "Matched string Header = " << m_normalDiffHeader.cap( 0 ) << endl; m_currentModel = new DiffModel(); TQObject::connect( m_currentModel, TQ_SIGNAL( setModified( bool ) ), m_list, TQ_SLOT( slotSetModified( bool ) ) ); m_currentModel->setSourceFile ( m_normalDiffHeader.cap( 1 ) ); m_currentModel->setDestinationFile ( m_normalDiffHeader.cap( 1 ) ); result = true; ++m_diffIterator; break; } else { kdDebug(8101) << "No match for: " << ( *m_diffIterator ) << endl; } ++m_diffIterator; } if ( result == false ) { // Set this to the first line again and hope it is a single file diff m_diffIterator = m_diffLines.begin(); m_currentModel = new DiffModel(); TQObject::connect( m_currentModel, TQ_SIGNAL( setModified( bool ) ), m_list, TQ_SLOT( slotSetModified( bool ) ) ); m_singleFileDiff = true; } return result; } bool CVSDiffParser::parseEdDiffHeader() { return false; } bool CVSDiffParser::parseRCSDiffHeader() { return false; } bool CVSDiffParser::parseEdHunkHeader() { return false; } bool CVSDiffParser::parseRCSHunkHeader() { return false; } bool CVSDiffParser::parseEdHunkBody() { return false; } bool CVSDiffParser::parseRCSHunkBody() { return false; }