forked from qt-creator/qt-creator
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/***************************************************************************
 | 
						|
**
 | 
						|
** This file is part of Qt Creator
 | 
						|
**
 | 
						|
** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
 | 
						|
**
 | 
						|
** Contact:  Qt Software Information (qt-info@nokia.com)
 | 
						|
**
 | 
						|
**
 | 
						|
** Non-Open Source Usage
 | 
						|
**
 | 
						|
** Licensees may use this file in accordance with the Qt Beta Version
 | 
						|
** License Agreement, Agreement version 2.2 provided with the Software or,
 | 
						|
** alternatively, in accordance with the terms contained in a written
 | 
						|
** agreement between you and Nokia.
 | 
						|
**
 | 
						|
** GNU General Public License Usage
 | 
						|
**
 | 
						|
** Alternatively, this file may be used under the terms of the GNU General
 | 
						|
** Public License versions 2.0 or 3.0 as published by the Free Software
 | 
						|
** Foundation and appearing in the file LICENSE.GPL included in the packaging
 | 
						|
** of this file.  Please review the following information to ensure GNU
 | 
						|
** General Public Licensing requirements will be met:
 | 
						|
**
 | 
						|
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
 | 
						|
** http://www.gnu.org/copyleft/gpl.html.
 | 
						|
**
 | 
						|
** In addition, as a special exception, Nokia gives you certain additional
 | 
						|
** rights. These rights are described in the Nokia Qt GPL Exception
 | 
						|
** version 1.2, included in the file GPL_EXCEPTION.txt in this package.
 | 
						|
**
 | 
						|
***************************************************************************/
 | 
						|
 | 
						|
#include "splitter.h"
 | 
						|
 | 
						|
#include <QRegExp>
 | 
						|
 | 
						|
FileDataList splitDiffToFiles(const QByteArray &data)
 | 
						|
{
 | 
						|
    FileDataList ret;
 | 
						|
    QString strData = data;
 | 
						|
    QString splitExpression;
 | 
						|
 | 
						|
    if (data.contains("==== ") && data.contains(" ====\n")) {
 | 
						|
        // Perforce diff
 | 
						|
        splitExpression = "==== ([^\\n\\r]+) - ([^\\n\\r]+) ====";
 | 
						|
 | 
						|
    } else if (data.contains("--- ") && data.contains("\n+++ ")) {
 | 
						|
        // Unified contextual diff
 | 
						|
        splitExpression = "\\-\\-\\- ([^\\n\\r]*)"
 | 
						|
                          "\\n\\+\\+\\+ ([^\\n\\r]*)";
 | 
						|
 | 
						|
    } else if (data.contains("*** ") && data.contains("\n--- ")) {
 | 
						|
        // Copied contextual diff
 | 
						|
        splitExpression = "\\*\\*\\* ([^\\n\\r]*) [0-9\\-]* [0-9:\\.]*[^\\n\\r]*"
 | 
						|
                          "\\n\\-\\-\\- ([^\\n\\r]*) [0-9\\-]* [0-9:\\.]*[^\\n\\r]*";
 | 
						|
 | 
						|
    } else {
 | 
						|
        ret.append(FileData("<not a diff>", data));
 | 
						|
        return ret;
 | 
						|
    }
 | 
						|
 | 
						|
    int splitIndex = 0, previousSplit = -1;
 | 
						|
    QRegExp splitExpr(splitExpression);
 | 
						|
    QString filename, content;
 | 
						|
    // The algorithm works like this:
 | 
						|
    // On the first match we only get the filename of the first patch part
 | 
						|
    // On the second match (if any) we get the diff content, and the name of the next file patch
 | 
						|
    
 | 
						|
    while (-1 != (splitIndex = splitExpr.indexIn(strData,splitIndex))) {
 | 
						|
        if (!filename.isEmpty()) {
 | 
						|
            QString content = strData.mid(previousSplit, splitIndex - previousSplit);
 | 
						|
            ret.append(FileData(filename, content.toLatin1()));
 | 
						|
        }
 | 
						|
 | 
						|
        // If the first index in not at the beginning of the file, then we know there's content
 | 
						|
        // we're about to skip, which is common in commit diffs, so we get that content and give it
 | 
						|
        // a 'fake' filename.
 | 
						|
        if (previousSplit == -1 && splitIndex > 0 && filename.isEmpty()) {
 | 
						|
            QString content = strData.left(splitIndex);
 | 
						|
            ret.append(FileData("<Header information>", content.toLatin1()));
 | 
						|
        }
 | 
						|
 | 
						|
        filename = splitExpr.cap(1);
 | 
						|
        previousSplit = splitIndex;
 | 
						|
        ++splitIndex;
 | 
						|
    }
 | 
						|
    // Append the last patch content
 | 
						|
    if (!filename.isEmpty()) {
 | 
						|
        QString content = strData.mid(previousSplit);
 | 
						|
        ret.append(FileData(filename, content.toLatin1()));
 | 
						|
    }
 | 
						|
 | 
						|
    return ret;
 | 
						|
}
 |