/* * Copyright (C) 2007-2008, Robin Rosenberg * Copyright (C) 2006-2007, Shawn O. Pearce * and other copyright owners as documented in the project's IP log. * * This program and the accompanying materials are made available * under the terms of the Eclipse Distribution License v1.0 which * accompanies this distribution, is reproduced below, and is * available at http://www.eclipse.org/org/documents/edl-v10.php * * All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * - Neither the name of the Eclipse Foundation, Inc. nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.eclipse.jgit.lib; import java.io.IOException; import org.eclipse.jgit.util.RawParseUtils; /** * This class represents an entry in a tree, like a blob or another tree. * * @deprecated To look up information about a single path, use * {@link org.eclipse.jgit.treewalk.TreeWalk#forPath(Repository, String, org.eclipse.jgit.revwalk.RevTree)}. * To lookup information about multiple paths at once, use a * {@link org.eclipse.jgit.treewalk.TreeWalk} and obtain the current entry's * information from its getter methods. */ @Deprecated public abstract class TreeEntry implements Comparable { private byte[] nameUTF8; private Tree parent; private ObjectId id; /** * Construct a named tree entry. * * @param myParent * @param myId * @param myNameUTF8 */ protected TreeEntry(final Tree myParent, final ObjectId myId, final byte[] myNameUTF8) { nameUTF8 = myNameUTF8; parent = myParent; id = myId; } /** * @return parent of this tree. */ public Tree getParent() { return parent; } /** * Delete this entry. */ public void delete() { getParent().removeEntry(this); detachParent(); } /** * Detach this entry from it's parent. */ public void detachParent() { parent = null; } void attachParent(final Tree p) { parent = p; } /** * @return the repository owning this entry. */ public Repository getRepository() { return getParent().getRepository(); } /** * @return the raw byte name of this entry. */ public byte[] getNameUTF8() { return nameUTF8; } /** * @return the name of this entry. */ public String getName() { if (nameUTF8 != null) return RawParseUtils.decode(nameUTF8); return null; } /** * Rename this entry. * * @param n The new name * @throws IOException */ public void rename(final String n) throws IOException { rename(Constants.encode(n)); } /** * Rename this entry. * * @param n The new name * @throws IOException */ public void rename(final byte[] n) throws IOException { final Tree t = getParent(); if (t != null) { delete(); } nameUTF8 = n; if (t != null) { t.addEntry(this); } } /** * @return true if this entry is new or modified since being loaded. */ public boolean isModified() { return getId() == null; } /** * Mark this entry as modified. */ public void setModified() { setId(null); } /** * @return SHA-1 of this tree entry (null for new unhashed entries) */ public ObjectId getId() { return id; } /** * Set (update) the SHA-1 of this entry. Invalidates the id's of all * entries above this entry as they will have to be recomputed. * * @param n SHA-1 for this entry. */ public void setId(final ObjectId n) { // If we have a parent and our id is being cleared or changed then force // the parent's id to become unset as it depends on our id. // final Tree p = getParent(); if (p != null && id != n) { if ((id == null && n != null) || (id != null && n == null) || !id.equals(n)) { p.setId(null); } } id = n; } /** * @return repository relative name of this entry */ public String getFullName() { final StringBuilder r = new StringBuilder(); appendFullName(r); return r.toString(); } /** * @return repository relative name of the entry * FIXME better encoding */ public byte[] getFullNameUTF8() { return getFullName().getBytes(); } public int compareTo(final Object o) { if (this == o) return 0; if (o instanceof TreeEntry) return Tree.compareNames(nameUTF8, ((TreeEntry) o).nameUTF8, lastChar(this), lastChar((TreeEntry)o)); return -1; } /** * Helper for accessing tree/blob methods. * * @param treeEntry * @return '/' for Tree entries and NUL for non-treeish objects. */ final public static int lastChar(TreeEntry treeEntry) { if (!(treeEntry instanceof Tree)) return '\0'; else return '/'; } /** * @return mode (type of object) */ public abstract FileMode getMode(); private void appendFullName(final StringBuilder r) { final TreeEntry p = getParent(); final String n = getName(); if (p != null) { p.appendFullName(r); if (r.length() > 0) { r.append('/'); } } if (n != null) { r.append(n); } } }