Package com.taobao.eclipse.plugin.reviewboard.subclipse.util

Source Code of com.taobao.eclipse.plugin.reviewboard.subclipse.util.RbSVNDiffUtils

/*
* (C) 2007-2011 Alibaba Group Holding Limited
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*
* If you have any question, please contact:千丫 <qianya@taobao.com>
* Authors:智清 <zhiqing.ht@taobao.com>;银时<yinshi.nc@taobao.com>
*
*/
package com.taobao.eclipse.plugin.reviewboard.subclipse.util;

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

import org.eclipse.core.resources.IResource;
import org.tigris.subversion.subclipse.core.ISVNLocalResource;
import org.tigris.subversion.subclipse.core.ISVNRepositoryLocation;
import org.tigris.subversion.subclipse.core.ISVNResource;
import org.tigris.subversion.subclipse.core.SVNException;
import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
import org.tigris.subversion.svnclientadapter.ISVNClientAdapter;
import org.tigris.subversion.svnclientadapter.SVNClientException;
import org.tigris.subversion.svnclientadapter.SVNDiffSummary;
import org.tigris.subversion.svnclientadapter.SVNRevision;
import org.tigris.subversion.svnclientadapter.SVNUrl;

import com.taobao.eclipse.plugin.reviewboard.core.exception.DiffGenerateException;

/**
* 类说明:diff的相关Util
*
* @author 智清
* 创建时间:2010-11-8
*/
public final class RbSVNDiffUtils {

    private RbSVNDiffUtils() {
        super();
    }

    /**
     * 取得diff影响的范围
     * @Param localNewVersionFlag的作用是:如果localNewVersionFlag=true,那么当localResource != null时,取本地的最新版本
     */
    public static SVNDiffSummary[] diffSummarize(SVNUrl fromUrl, SVNRevision fromRevision,
            SVNUrl toUrl, SVNRevision toRevision,
            boolean localNewVersionFlag,ISVNResource localResource) throws DiffGenerateException {
        SVNDiffSummary[] sVNDiffSummarys = null;
        try {
            ISVNClientAdapter client = null;
            ISVNRepositoryLocation repository = SVNProviderPlugin.getPlugin().getRepository(fromUrl.toString());
            if (repository != null){
                client = repository.getSVNClient();
            }
            if( null == client ){
                return sVNDiffSummarys;
            }
            SVNRevision pegRevision = null;
            if ( localNewVersionFlag && fromUrl.toString().equals(toUrl.toString()) && localResource != null) {
                if (localResource.getResource() == null){
                    pegRevision = SVNRevision.HEAD;
                }
                else {
                    IResource resource = localResource.getResource();
                    ISVNLocalResource svnResource = SVNWorkspaceRoot.getSVNResourceFor(resource);
                    pegRevision = svnResource.getRevision();
                }
            }
            if (pegRevision == null){
                sVNDiffSummarys = client.diffSummarize(fromUrl, fromRevision, toUrl, toRevision, 40, false);
            }else{
                sVNDiffSummarys = client.diffSummarize(fromUrl, pegRevision, fromRevision, toRevision, 40, false);
            }
        }catch (SVNClientException e) {
            throw new DiffGenerateException(e);
        }catch ( SVNException e2 ) {
            throw new DiffGenerateException(e2);
        }catch ( Exception e3 ) {
            throw new DiffGenerateException(e3);
        }finally {
        }     
        return sVNDiffSummarys;
    }
   
    /**
     * 整合多个文件的post-commit。整合规则:
     * 如果选中了多个目录和多个文件:
     * 1.如果某个目录和该目录下的文件(包括子目录下的文件)同时被选中,则抛弃文件。
     * 2.如果选中了某个目录,又选中了该目录下的若干个子目录,则直接抛弃子目录
     * 总的来说,抛弃所有存在父子关系中的儿子
     * @param resource
     * @return
     */
    public static IResource[] integerateResourcesForSVNPostCommit(IResource[] resources){
        if( null == resources ){
            return null;
        }
        LinkedList<IResource> resouceLinkedList = new LinkedList<IResource>();
        Set<IResource> resouceSetReturn = new HashSet<IResource>();
        //记录需要删除的元素
        Set<IResource> resouceSetDelete = new HashSet<IResource>();
        for(IResource resource : resources){
            resouceLinkedList.add(resource);
            resouceSetReturn.add(resource);
        }
        while( !resouceLinkedList.isEmpty() ){
            //取出第一个元素,然后立刻将该元素从LinkedList删掉。
            IResource resouceTmpFromList = resouceLinkedList.getFirst();
            IResource resouceTmp = resouceTmpFromList;
            resouceLinkedList.removeFirst();
            for( IResource resource : resouceLinkedList ){
                String resourceTmpPath = resouceTmp.getFullPath().toString();
                String resourcePath = resource.getFullPath().toString();
                if(resourceTmpPath.indexOf(resourcePath)!=-1){
                    resouceSetDelete.add(resouceTmp);
                }else if(resourcePath.indexOf(resourceTmpPath)!=-1){
                    resouceSetDelete.add(resource);
                }
            }
        }
        resouceSetReturn.removeAll(resouceSetDelete);
        IResource[] resourcesReturn = new IResource[resouceSetReturn.size()];
        resouceSetReturn.toArray(resourcesReturn);
        return resourcesReturn;
    }
   
}
TOP

Related Classes of com.taobao.eclipse.plugin.reviewboard.subclipse.util.RbSVNDiffUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.