Question

J'utilise Kit SVN pour rassembler des mesures de dépôt de référentiels SVN.Je suis coincé avec ce problème simple et je suis incapable de le traverser.

J'ai un objet SvnRepository qui me donne des chemins de tous les fichiers du référentiel et de leurs révisions différentes.Je souhaite définir la valeur de révision antérieure pour chacune des révisions. Comment puis-je faire cela sans vérifier ce fichier?Ou plutôt quelle est la meilleure façon de le faire de manière à avoir la meilleure performance de mon code?

Il devrait également envisager la copie / la pâte et le déplacement de l'activité lors de la gestion de la révision précédente.

Était-ce utile?

La solution

La technique suivante a fonctionné pour moi.

//This is where I query SVN server
if (entryPath.getType() != SVNLogEntryPath.TYPE_ADDED) {
    LogEntryPreviousRevFinder handler = new LogEntryPreviousRevFinder(workingFileName.substring(interestingPath.length()), thisRevision);

    //Start checking for previous modified revision for this file in the previous 3 revision.
    //If not found try for previous 5 and then 7. If not found till then, put in a warning and continue.
    //This is necessary because in SVN a branch operation is performed at the folder level and not file 
    //hence we need to go further back and find out the revision than was last modified.
    for (int i = 3; i <= 7; i+=2) {
        repository.log(new String[] {workingFileName}, thisRevision, 0l, true, false, i, handler);
        if (handler.isSuccess()) {
            prevPath = handler.getPreviousPath();
            prevRevision = handler.getPreviousRevision();
            break;
        } else {
            continue;
        }
    }

    if (!handler.isSuccess()) {
        log.warn("Failed to find previous revision for file: " + workingFileName 
                + " Will contine considering this one as added in this revision");
    }
} else {
    //Files with SVNLogEntryPath.TYPE_ADDED are either added in this revision
    //or are copied or renamed from an existing file. If later, we need to identify the Copy from path
    //as that will be the file which will be used for calculating relative metrics and later Flux values
    if (entryPath.getCopyPath() != null && entryPath.getCopyPath().trim().length() > 0) {
        prevPath = entryPath.getCopyPath();
        prevRevision = entryPath.getCopyRevision();
    } else {
        log.debug("File: " + workingFileName + " added in this revision");
    }
}

Mise en œuvre ISVNLOGentryHandler:

//ISVNLogEntryHandler implementation for identifying previous revision
private class LogEntryPreviousRevFinder implements ISVNLogEntryHandler {
    private String interestingFile;
    private String previousPath;
    private long thisRevision;
    private long previousRevision;
    private boolean isSuccess;

    public LogEntryPreviousRevFinder(String interestingFile, long revision) {
        this.interestingFile = interestingFile;
        this.thisRevision = revision;
        isSuccess = false;
    }

    @Override
    public void handleLogEntry(SVNLogEntry logEntry) throws SVNException {
        if (isSuccess)
            return;

        if (thisRevision == logEntry.getRevision())
            return;

        Set changedPathsSet = logEntry.getChangedPaths().keySet();
        for (Iterator changedPaths = changedPathsSet.iterator(); changedPaths.hasNext();) {
            SVNLogEntryPath entryPath = (SVNLogEntryPath) logEntry.getChangedPaths().get(changedPaths.next());
            String workingFileName = entryPath.getPath();

            if (workingFileName.endsWith(interestingFile)) {
                previousRevision = logEntry.getRevision();
                previousPath = workingFileName;
                isSuccess = true;
            }
        }
    }

    public long getPreviousRevision() {
        return previousRevision;
    }
    public String getPreviousPath() {
        return previousPath;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
}

Je me demande s'il y a un moyen meilleur et plus efficace de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top