James Moger
2013-01-06 4027303c4df7bc44f02446178bfd9d4c180930c3
Improve pushlog api and model class
3 files modified
68 ■■■■ changed files
src/com/gitblit/models/PushLogEntry.java 52 ●●●●● patch | view | raw | blame | history
src/com/gitblit/models/RepositoryCommit.java 8 ●●●●● patch | view | raw | blame | history
src/com/gitblit/utils/PushLogUtils.java 8 ●●●● patch | view | raw | blame | history
src/com/gitblit/models/PushLogEntry.java
@@ -20,13 +20,16 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.transport.ReceiveCommand;
/**
 * Model class to represent a push into a repository.
@@ -44,6 +47,8 @@
    public final UserModel user;
    private final Set<RepositoryCommit> commits;
    private final Map<String, ReceiveCommand.Type> refUpdates;
    /**
     * Constructor for specified duration of push from start date.
@@ -60,6 +65,19 @@
        this.date = date;
        this.user = user;
        this.commits = new LinkedHashSet<RepositoryCommit>();
        this.refUpdates = new HashMap<String, ReceiveCommand.Type>();
    }
    /**
     * Tracks the change type for the specified ref.
     *
     * @param ref
     * @param type
     */
    public void updateRef(String ref, ReceiveCommand.Type type) {
        if (!refUpdates.containsKey(ref)) {
            refUpdates.put(ref, type);
        }
    }
    /**
@@ -77,6 +95,20 @@
            return commitModel;
        }
        return null;
    }
    /**
     * Returns true if this push contains a non-fastforward ref update.
     *
     * @return true if this is a non-fastforward push
     */
    public boolean isNonFastForward() {
        for (Map.Entry<String, ReceiveCommand.Type> entry : refUpdates.entrySet()) {
            if (ReceiveCommand.Type.UPDATE_NONFASTFORWARD.equals(entry.getValue())) {
                return true;
            }
        }
        return false;
    }
    
    /**
@@ -105,9 +137,9 @@
     */
    protected List<String> getChangedRefs(String baseRef) {
        Set<String> refs = new HashSet<String>();
        for (RepositoryCommit commit : commits) {
            if (baseRef == null || commit.branch.startsWith(baseRef)) {
                refs.add(commit.branch);
        for (String ref : refUpdates.keySet()) {
            if (baseRef == null || ref.startsWith(baseRef)) {
                refs.add(ref);
            }
        }
        List<String> list = new ArrayList<String>(refs);
@@ -160,7 +192,17 @@
    
    @Override
    public String toString() {
        return MessageFormat.format("{0,date,yyyy-MM-dd HH:mm}: {1} pushed {2,number,0} commit{3} to {4} ",
                date, user.getDisplayName(), commits.size(), commits.size() == 1 ? "":"s", repository);
        StringBuilder sb = new StringBuilder();
        sb.append(MessageFormat.format("{0,date,yyyy-MM-dd HH:mm}: {1} pushed {2,number,0} commit{3} to {4} ",
                date, user.getDisplayName(), commits.size(), commits.size() == 1 ? "":"s", repository));
        for (Map.Entry<String, ReceiveCommand.Type> entry : refUpdates.entrySet()) {
            String ref = entry.getKey();
            ReceiveCommand.Type type = entry.getValue();
            sb.append("\n  ").append(ref).append(' ').append(type.name()).append('\n');
            for (RepositoryCommit commit : getCommits(ref)) {
                sb.append("    ").append(commit.toString()).append('\n');
            }
        }
        return sb.toString();
    }
}
src/com/gitblit/models/RepositoryCommit.java
@@ -16,6 +16,7 @@
package com.gitblit.models;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.List;
import org.eclipse.jgit.lib.PersonIdent;
@@ -101,4 +102,11 @@
        }
        return 0;
    }
    @Override
    public String toString() {
        return MessageFormat.format("{0} {1} {2,date,yyyy-MM-dd HH:mm} {3} {4}",
                getShortName(), branch, getCommitterIdent().getWhen(), getAuthorIdent().getName(),
                getShortMessage());
    }
}
src/com/gitblit/utils/PushLogUtils.java
@@ -321,20 +321,20 @@
            for (PathChangeModel change : changedRefs) {
                switch (change.changeType) {
                case DELETE:
                    log.updateRef(change.path, ReceiveCommand.Type.DELETE);
                    break;
                case ADD:
                case MODIFY:
                    log.updateRef(change.path, ReceiveCommand.Type.CREATE);
                default:
                    String content = JGitUtils.getStringContent(repository, push.getTree(), change.path);
                    String [] fields = content.split(" ");
                    log.updateRef(change.path, ReceiveCommand.Type.valueOf(fields[0]));
                    String oldId = fields[1];
                    String newId = fields[2];
                    List<RevCommit> pushedCommits = JGitUtils.getRevLog(repository, oldId, newId);
                    for (RevCommit pushedCommit : pushedCommits) {
                        log.addCommit(change.path, pushedCommit);
                    }
                    break;
                default:
                    break;
                }
            }
        }