| /* |
| * Copyright (C) 2010, Google Inc. and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.lib; |
| |
| import org.eclipse.jgit.annotations.NonNull; |
| import org.eclipse.jgit.annotations.Nullable; |
| |
| /** |
| * A reference that indirectly points at another |
| * {@link org.eclipse.jgit.lib.Ref}. |
| * <p> |
| * A symbolic reference always derives its current value from the target |
| * reference. |
| */ |
| public class SymbolicRef implements Ref { |
| private final String name; |
| |
| private final Ref target; |
| |
| private final long updateIndex; |
| |
| /** |
| * Create a new ref pairing. |
| * |
| * @param refName |
| * name of this ref. |
| * @param target |
| * the ref we reference and derive our value from. |
| */ |
| public SymbolicRef(@NonNull String refName, @NonNull Ref target) { |
| this.name = refName; |
| this.target = target; |
| this.updateIndex = UNDEFINED_UPDATE_INDEX; |
| } |
| |
| /** |
| * Create a new ref pairing. |
| * |
| * @param refName |
| * name of this ref. |
| * @param target |
| * the ref we reference and derive our value from. |
| * @param updateIndex |
| * index that increases with each update of the reference |
| * @since 5.3 |
| */ |
| public SymbolicRef(@NonNull String refName, @NonNull Ref target, |
| long updateIndex) { |
| this.name = refName; |
| this.target = target; |
| this.updateIndex = updateIndex; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @NonNull |
| public String getName() { |
| return name; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public boolean isSymbolic() { |
| return true; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @NonNull |
| public Ref getLeaf() { |
| Ref dst = getTarget(); |
| while (dst.isSymbolic()) |
| dst = dst.getTarget(); |
| return dst; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @NonNull |
| public Ref getTarget() { |
| return target; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @Nullable |
| public ObjectId getObjectId() { |
| return getLeaf().getObjectId(); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @NonNull |
| public Storage getStorage() { |
| return Storage.LOOSE; |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| @Nullable |
| public ObjectId getPeeledObjectId() { |
| return getLeaf().getPeeledObjectId(); |
| } |
| |
| /** {@inheritDoc} */ |
| @Override |
| public boolean isPeeled() { |
| return getLeaf().isPeeled(); |
| } |
| |
| /** |
| * {@inheritDoc} |
| * @since 5.3 |
| */ |
| @Override |
| public long getUpdateIndex() { |
| if (updateIndex == UNDEFINED_UPDATE_INDEX) { |
| throw new UnsupportedOperationException(); |
| } |
| return updateIndex; |
| } |
| |
| /** {@inheritDoc} */ |
| @SuppressWarnings("nls") |
| @Override |
| public String toString() { |
| StringBuilder r = new StringBuilder(); |
| r.append("SymbolicRef["); |
| Ref cur = this; |
| while (cur.isSymbolic()) { |
| r.append(cur.getName()); |
| r.append(" -> "); |
| cur = cur.getTarget(); |
| } |
| r.append(cur.getName()); |
| r.append('='); |
| r.append(ObjectId.toString(cur.getObjectId())); |
| r.append("("); |
| r.append(updateIndex); // Print value, even if -1 |
| r.append(")]"); |
| return r.toString(); |
| } |
| } |