org.eclipse.egit.ui.internal.commit.RepositoryCommit.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.egit.ui.internal.commit.RepositoryCommit.java

Source

/*******************************************************************************
 *  Copyright (c) 2011, 2012 GitHub Inc. and others.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  Contributors:
 *    Kevin Sawicki (GitHub Inc.) - initial API and implementation
 *    Robin Stocker (independent)
 *******************************************************************************/
package org.eclipse.egit.ui.internal.commit;

import java.io.IOException;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIIcons;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.egit.ui.internal.history.FileDiff;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.notes.Note;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.TreeWalk;
import org.eclipse.jgit.treewalk.filter.TreeFilter;
import org.eclipse.ui.model.WorkbenchAdapter;

/**
 * Class that encapsulates a particular {@link Repository} instance and
 * {@link RevCommit} instance.
 *
 * This class computes and provides access to the {@link FileDiff} objects
 * introduced by the commit.
 */
public class RepositoryCommit extends WorkbenchAdapter implements IAdaptable {

    private static DateFormat FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);

    /**
     * Format commit date
     *
     * @param date
     * @return date string
     */
    public static String formatDate(final Date date) {
        if (date == null)
            return ""; //$NON-NLS-1$
        synchronized (FORMAT) {
            return FORMAT.format(date);
        }
    }

    /**
     * NAME_LENGTH
     */
    public static final int NAME_LENGTH = 8;

    private Repository repository;

    private RevCommit commit;

    private FileDiff[] diffs;

    private RepositoryCommitNote[] notes;

    /**
     * Create a repository commit
     *
     * @param repository
     * @param commit
     */
    public RepositoryCommit(Repository repository, RevCommit commit) {
        Assert.isNotNull(repository, "Repository cannot be null"); //$NON-NLS-1$
        Assert.isNotNull(commit, "Commit cannot be null"); //$NON-NLS-1$
        this.repository = repository;
        this.commit = commit;
    }

    public Object getAdapter(Class adapter) {
        if (Repository.class == adapter)
            return repository;

        if (RevCommit.class == adapter)
            return commit;

        return Platform.getAdapterManager().getAdapter(this, adapter);
    }

    /**
     * Abbreviate commit id to {@link #NAME_LENGTH} size.
     *
     * @return abbreviated commit id
     */
    public String abbreviate() {
        return commit.abbreviate(NAME_LENGTH).name();
    }

    /**
     * Get repository name
     *
     * @return repo name
     */
    public String getRepositoryName() {
        if (!repository.isBare())
            return repository.getDirectory().getParentFile().getName();
        else
            return repository.getDirectory().getName();
    }

    /**
     * Get repository
     *
     * @return repository
     */
    public Repository getRepository() {
        return repository;
    }

    /**
     * Get rev commit
     *
     * @return rev commit
     */
    public RevCommit getRevCommit() {
        return commit;
    }

    /**
     * Get file diffs
     *
     * @return non-null but possibly empty array of {@link FileDiff} instances.
     */
    public FileDiff[] getDiffs() {
        if (diffs == null) {
            RevWalk revWalk = new RevWalk(repository);
            TreeWalk treewalk = new TreeWalk(revWalk.getObjectReader());
            treewalk.setRecursive(true);
            treewalk.setFilter(TreeFilter.ANY_DIFF);
            try {
                for (RevCommit parent : commit.getParents())
                    revWalk.parseBody(parent);
                diffs = FileDiff.compute(treewalk, commit, TreeFilter.ALL);
            } catch (IOException e) {
                diffs = new FileDiff[0];
            } finally {
                revWalk.release();
                treewalk.release();
            }
        }
        return diffs;
    }

    /**
     * Get notes for this commit.
     *
     * @return non-null but possibly empty array of {@link RepositoryCommitNote}
     *         instances.
     */
    public RepositoryCommitNote[] getNotes() {
        if (notes == null) {
            List<RepositoryCommitNote> noteList = new ArrayList<RepositoryCommitNote>();
            try {
                Repository repo = getRepository();
                Git git = Git.wrap(repo);
                RevCommit revCommit = getRevCommit();
                for (Ref ref : repo.getRefDatabase().getRefs(Constants.R_NOTES).values()) {
                    Note note = git.notesShow().setNotesRef(ref.getName()).setObjectId(revCommit).call();
                    if (note != null)
                        noteList.add(new RepositoryCommitNote(this, ref, note));
                }
                notes = noteList.toArray(new RepositoryCommitNote[noteList.size()]);
            } catch (Exception e) {
                Activator.logError("Error showing notes", e); //$NON-NLS-1$
                notes = new RepositoryCommitNote[0];
            }
        }
        return notes;
    }

    public Object[] getChildren(Object o) {
        return new Object[0];
    }

    public ImageDescriptor getImageDescriptor(Object object) {
        return UIIcons.CHANGESET;
    }

    public String getLabel(Object o) {
        return abbreviate();
    }

    public Object getParent(Object o) {
        return null;
    }

    /**
     * @param object
     * @return styled text
     */
    public StyledString getStyledText(Object object) {
        StyledString styled = new StyledString();
        styled.append(abbreviate());
        styled.append(": "); //$NON-NLS-1$
        styled.append(commit.getShortMessage());

        PersonIdent person = commit.getAuthorIdent();
        if (person == null)
            person = commit.getCommitterIdent();
        if (person != null)
            styled.append(MessageFormat.format(UIText.RepositoryCommit_UserAndDate, person.getName(),
                    formatDate(person.getWhen())), StyledString.QUALIFIER_STYLER);
        return styled;
    }

}