Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * ====================================================================
   * Copyright (c) 2004-2006 TMate Software Ltd.  All rights reserved.
   *
   * This software is licensed as described in the file COPYING, which
   * you should have received as part of this distribution.  The terms
   * are also available at http://svnkit.com/license.html
   * If newer versions of this license are posted there, you may use a
   * newer version instead, at your option.
  * ====================================================================
  */
 package org.tmatesoft.svn.core.internal.wc;
 
 import java.io.File;
 import java.util.Map;
 

Author(s):
TMate Software Ltd.
Version:
1.1.0
 
 public class SVNCommitter implements ISVNCommitPathHandler {
 
     private Map myCommitItems;
     private Map myModifiedFiles;
     private Collection myTmpFiles;
     private String myRepositoryRoot;
 
     public SVNCommitter(Map commitItemsString reposRootCollection tmpFiles) {
          = commitItems;
          = new TreeMap();
          = tmpFiles;
          = reposRoot;
     }
 
     public boolean handleCommitPath(String commitPathISVNEditor commitEditorthrows SVNException {
         SVNCommitItem item = (SVNCommitItem.get(commitPath);
         SVNWCAccess wcAccess = item.getWCAccess();
         wcAccess.checkCancelled();
         if (item.isCopied()) {
             if (item.getCopyFromURL() == null) {
                 SVNErrorMessage err = SVNErrorMessage.create(."Commit item ''{0}'' has copy flag but no copyfrom URL"item.getFile());                    
                 SVNErrorManager.error(err);
             } else if (item.getRevision().getNumber() < 0) {
                 SVNErrorMessage err = SVNErrorMessage.create(."Commit item ''{0}'' has copy flag but an invalid revision"item.getFile());                    
                 SVNErrorManager.error(err);
             }
         }
         SVNEvent event = null;
         boolean closeDir = false;
 
         if (item.isAdded() && item.isDeleted()) {
             event = SVNEventFactory.createCommitEvent(wcAccess.getAnchor(), item.getFile(), .item.getKind(), null);
         } else if (item.isAdded()) {
             String mimeType = null;
             if (item.getKind() == .) {
                 SVNAdminArea dir = item.getWCAccess().retrieve(item.getFile().getParentFile());
                 mimeType = dir.getProperties(item.getFile().getName()).getPropertyValue(.);
             }
             event = SVNEventFactory.createCommitEvent(wcAccess.getAnchor(), item.getFile(), .item.getKind(), mimeType);
         } else if (item.isDeleted()) {
             event = SVNEventFactory.createCommitEvent(wcAccess.getAnchor(), item.getFile(), .item.getKind(), null);
         } else if (item.isContentsModified() || item.isPropertiesModified()) {
             event = SVNEventFactory.createCommitEvent(wcAccess.getAnchor(), item.getFile(), .item.getKind());
         }
         if (event != null) {
             event.setPath(item.getPath());
             wcAccess.handleEvent(event.);
         }
         long rev = item.getRevision().getNumber();
         long cfRev = item.getCopyFromRevision().getNumber();//item.getCopyFromURL() != null ? rev : -1;
         if (item.isDeleted()) {
             commitEditor.deleteEntry(commitPathrev);
         }
         boolean fileOpen = false;
        if (item.isAdded()) {
            String copyFromPath = getCopyFromPath(item.getCopyFromURL());
            if (item.getKind() == .) {
                commitEditor.addFile(commitPathcopyFromPathcfRev);
                fileOpen = true;
            } else {
                commitEditor.addDir(commitPathcopyFromPathcfRev);
                closeDir = true;
            }
        }
        if (item.isPropertiesModified()) {
            if (item.getKind() == .) {
                if (!fileOpen) {
                    commitEditor.openFile(commitPathrev);
                }
                fileOpen = true;
            } else if (!item.isAdded()) {
                // do not open dir twice.
                if ("".equals(commitPath)) {
                    commitEditor.openRoot(rev);
                } else {
                    commitEditor.openDir(commitPathrev);
                }
                closeDir = true;
            }
            sendPropertiedDelta(commitPathitemcommitEditor);
        }
        if (item.isContentsModified() && item.getKind() == .) {
            if (!fileOpen) {
                commitEditor.openFile(commitPathrev);
            }
            .put(commitPathitem);
        } else if (fileOpen) {
            commitEditor.closeFile(commitPathnull);
        }
        return closeDir;
    }
    public void sendTextDeltas(ISVNEditor editorthrows SVNException {
        for (Iterator paths = .keySet().iterator(); paths.hasNext();) {
            String path = (Stringpaths.next();
            SVNCommitItem item = (SVNCommitItem.get(path);
            SVNWCAccess wcAccess = item.getWCAccess();
            wcAccess.checkCancelled();
            SVNEvent event = SVNEventFactory.createCommitEvent(wcAccess.getAnchor(), item.getFile(),
                    ..null);
            wcAccess.handleEvent(event.);
            SVNAdminArea dir = wcAccess.retrieve(item.getFile().getParentFile());
            String name = SVNPathUtil.tail(item.getPath());
            SVNEntry entry = dir.getEntry(namefalse);
            File tmpFile = dir.getBaseFile(nametrue);
            .add(tmpFile);
            SVNTranslator.translate(dirnamename, SVNFileUtil.getBasePath(tmpFile), falsefalse);
            String checksum = null;
            if (!item.isAdded()) {
                checksum = SVNFileUtil.computeChecksum(dir.getBaseFile(namefalse));
                String realChecksum = entry.getChecksum();
                if (realChecksum != null && !realChecksum.equals(checksum)) {
                    SVNErrorMessage err = SVNErrorMessage.create(."Checksum mismatch for ''{0}''; expected: ''{1}'', actual: ''{2}''",
                            new Object[] {dir.getFile(name), realChecksumchecksum}); 
                    SVNErrorManager.error(err);
                }
            }
            editor.applyTextDelta(pathchecksum);
            if ( == null) {
                 = new SVNDeltaGenerator();
            }
            InputStream sourceIS = null;
            InputStream targetIS = null;
            File baseFile = dir.getBaseFile(namefalse);
            String newChecksum = null;
            try {
                sourceIS = !item.isAdded() && baseFile.exists() ? SVNFileUtil.openFileForReading(baseFile) : .;
                targetIS = tmpFile.exists() ? SVNFileUtil.openFileForReading(tmpFile) : .;
                newChecksum = .sendDelta(pathsourceIS, 0, targetISeditortrue);
            } finally {
                SVNFileUtil.closeFile(sourceIS);
                SVNFileUtil.closeFile(targetIS);
            }
            editor.closeFile(pathnewChecksum);
        }
    }
    private void sendPropertiedDelta(String commitPathSVNCommitItem itemISVNEditor editorthrows SVNException {
        SVNAdminArea dir;
        String name;
        SVNWCAccess wcAccess = item.getWCAccess();
        if (item.getKind() == .) {
            dir = wcAccess.retrieve(item.getFile());
            name = "";
        } else {
            dir = wcAccess.retrieve(item.getFile().getParentFile());
            name = SVNPathUtil.tail(item.getPath());
        }
        if (!dir.hasPropModifications(name)) {
            return;
        }
        SVNEntry entry = dir.getEntry(namefalse);
        boolean replaced = false;
        if (entry != null) {
            replaced = entry.isScheduledForReplacement();
        }
        SVNVersionedProperties props = dir.getProperties(name);
        SVNVersionedProperties baseProps = replaced ? null : dir.getBaseProperties(name);
        Map diff = replaced ? props.asMap() : baseProps.compareTo(props).asMap();
        if (diff != null && !diff.isEmpty()) {
            File tmpPropsFile = dir.getPropertiesFile(nametrue);
            SVNProperties tmpProps = new SVNProperties(tmpPropsFilenull);
            for(Iterator propNames = props.getPropertyNames(null).iterator(); propNames.hasNext();) {
                String propName = (StringpropNames.next();
                String propValue = props.getPropertyValue(propName);
                tmpProps.setPropertyValue(propNamepropValue);
            }
            if (!tmpPropsFile.exists()) {
                // create empty tmp (!) file just to make sure it will be used on post-commit.
                SVNFileUtil.createEmptyFile(tmpPropsFile);
            }
            .add(tmpPropsFile);
            for (Iterator names = diff.keySet().iterator(); names.hasNext();) {
                String propName = (Stringnames.next();
                String value = (Stringdiff.get(propName);
                if (item.getKind() == .) {
                    editor.changeFileProperty(commitPathpropNamevalue);
                } else {
                    editor.changeDirProperty(propNamevalue);
                }
            }
        }
    }
    private String getCopyFromPath(SVNURL url) {
        if (url == null) {
            return null;
        }
        String path = url.getPath();
        if (.equals(path)) {
            return "/";
        }
        return path.substring(.length());
    }
    public static SVNCommitInfo commit(Collection tmpFilesMap commitItemsString repositoryRootISVNEditor commitEditorthrows SVNException {
        SVNCommitter committer = new SVNCommitter(commitItemsrepositoryRoottmpFiles);
        SVNCommitUtil.driveCommitEditor(committercommitItems.keySet(), commitEditor, -1);
        committer.sendTextDeltas(commitEditor);
        return commitEditor.closeEdit();
    }
New to GrepCode? Check out our FAQ X