All Downloads are FREE. Search and download functionalities are using the official Maven repository.

br.com.jarch.svn.CommitSvn Maven / Gradle / Ivy

There is a newer version: 24.8.0
Show newest version
package br.com.jarch.svn;

import org.tmatesoft.svn.core.SVNCommitInfo;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.*;

import java.io.File;
import java.net.URL;
import java.util.*;

class CommitSvn extends BaseSvn {

    private final List listaFileConflit = new ArrayList<>();
    private final Set listFileIgnoreUser = new HashSet<>();
    private final List listFile = new ArrayList<>();
    private final List listRevision = new ArrayList<>();

    private final transient ISVNStatusHandler isvnStatusHandler = status -> {
        String mensagem = status.getNodeStatus().toString().toUpperCase() + ": " + status.getFile().getAbsolutePath();
        System.out.println(mensagem);

        boolean commitArquivo = true;

        if (listFileIgnoreUser.contains(status.getFile().getName())) {
            commitArquivo = false;
            mensagem = "IGNORADO: " + status.getFile();
        } else if (status.getNodeStatus().equals(SVNStatusType.STATUS_NORMAL) || status.getNodeStatus().equals(SVNStatusType.STATUS_INCOMPLETE)) {
            commitArquivo = false;
        } else if (status.isConflicted()) {
            System.out.println(status);
            listaFileConflit.add(status.getFile().getPath() + "\n");
            mensagem = "CONFLITO: " + status.getFile();
        } else if (SvnUtil.ignora(status.getFile())) {
            mensagem = "IGNORADO: " + status.getFile();
            commitArquivo = false;
        } else if (SVNStatusType.STATUS_UNVERSIONED.equals(status.getNodeStatus())) {
            getWCClient().doAdd(status.getFile(), true, false, false, SVNDepth.EMPTY, false, false);
            mensagem = "ADD: " + status.getFile();
        } else if (SVNStatusType.MISSING.equals(status.getNodeStatus()) || SVNStatusType.STATUS_MISSING.equals(status.getNodeStatus())) {
            getWCClient().doDelete(status.getFile(), true, false, false);
            mensagem = "DELETE_PHISICAL: " + status.getFile();
        }

        logUtil.formatMiddle(log, mensagem);

        if (commitArquivo)
            listFile.add(status.getFile());
    };

    private final transient ISVNEventHandler eventHandlerCommit = new ISVNEventHandler() {

        @Override
        public void checkCancelled() {
            // Não utilizado
        }

        @Override
        public void handleEvent(SVNEvent svnEvent, double arg1) {
            if (svnEvent.getFile() != null) {
                String mensagem = "COMMIT: " + svnEvent.getFile();
                logUtil.formatMiddle(log, mensagem);
            }
        }
    };

    public CommitSvn(List log, String login, String senha) {
        super(log, login, senha);
    }

    public void commit(URL urlRepositorio, File pastaTrabalho, Collection listaArquivoIgnora,
                       String comentario) throws Exception {
        if (!existeRepositorio(urlRepositorio)) {
            throw new Exception("Repositório " + urlRepositorio + " NÃO Localizado ");
        }

        if (!pastaTrabalho.exists()) {
            throw new Exception("Pasta trabalho " + pastaTrabalho.getAbsolutePath() + " NÃO Localizado ");
        }

        if (listaArquivoIgnora != null) {
            listFileIgnoreUser.addAll(listaArquivoIgnora);
        }

        URL urlWorkingCopy = getRepositorio(pastaTrabalho);

        if (!urlWorkingCopy.toURI().equals(urlRepositorio.toURI())) {
            throw new Exception(String.format("Working Copy %s não está apontando para URL %s", pastaTrabalho,
                urlRepositorio));
        }

        logUtil.formatBegin(log, "COMMIT");
        logUtil.formatMiddle(log, "FOLDER: " + pastaTrabalho.getAbsolutePath() + " URL: " + urlWorkingCopy);

        do {
            listFile.clear();

            verificaConflito(pastaTrabalho);

            File[] arrayFile;

            if (listFile.isEmpty()) {
                arrayFile = new File[]{pastaTrabalho};
            } else {
                arrayFile = new File[listFile.size()];
                int i = 0;
                for (File file : listFile) {
                    arrayFile[i++] = file;
                }
            }

            try {
                SVNCommitClient svnCommitClient = getCommitClient();
                svnCommitClient.setEventHandler(eventHandlerCommit);
                SVNCommitInfo svnCommitInfo = svnCommitClient.doCommit(arrayFile, false, comentario, null, null, false,
                    true, SVNDepth.INFINITY);

                if (svnCommitInfo.getNewRevision() > -1) {
                    listRevision.add(svnCommitInfo.getNewRevision());
                }

            } catch (SVNException svnException) {
                if (svnException.getMessage().contains("is out of date")) {
                    UpdateSvn updateSvn = new UpdateSvn(log, login, senha);
                    updateSvn.update(urlRepositorio, pastaTrabalho);
                    continue;
                }

                throw new Exception(svnException.getMessage());
            }

        } while (!listFile.isEmpty());

        logUtil.formatMiddle(log, "REVISÃO(ÕES): " + listRevision);
        logUtil.formatEnd(log, "COMMIT");
    }

    public void verificaConflito(File pastaTrabalho) throws Exception {
        if (!pastaTrabalho.exists()) {
            throw new Exception("Pasta trabalho " + pastaTrabalho.getAbsolutePath() + " NÃO Localizado ");
        }

        listaFileConflit.clear();

        getStatusClient().doStatus(pastaTrabalho, SVNRevision.HEAD, SVNDepth.INFINITY, false, false, false, false,
                isvnStatusHandler, listaFileConflit);

        if (!listaFileConflit.isEmpty())
            throw new Exception("Existe(m) arquivo(s) em conflito em " + listaFileConflit);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy