/// <exception cref="System.IO.IOException"></exception> public override Ref Peel(Ref @ref) { Ref leaf = @ref.GetLeaf(); if (leaf.IsPeeled() || leaf.GetObjectId() == null) { return(@ref); } ObjectIdRef newLeaf = DoPeel(leaf); // Try to remember this peeling in the cache, so we don't have to do // it again in the future, but only if the reference is unchanged. if (leaf.GetStorage().IsLoose()) { RefList <RefDirectory.LooseRef> curList = looseRefs.Get(); int idx = curList.Find(leaf.GetName()); if (0 <= idx && curList.Get(idx) == leaf) { RefDirectory.LooseRef asPeeled = ((RefDirectory.LooseRef)leaf).Peel(newLeaf); RefList <RefDirectory.LooseRef> newList = curList.Set(idx, asPeeled); looseRefs.CompareAndSet(curList, newList); } } return(Recreate(@ref, newLeaf)); }
private static Ref Recreate(Ref old, ObjectIdRef leaf) { if (old.IsSymbolic()) { Ref dst = Recreate(old.GetTarget(), leaf); return(new SymbolicRef(old.GetName(), dst)); } return(leaf); }
public RefDirectory.LooseRef Peel(ObjectIdRef newLeaf) { if (newLeaf.GetPeeledObjectId() != null) { return(new RefDirectory.LoosePeeledTag(snapShot, GetName(), GetObjectId(), newLeaf .GetPeeledObjectId())); } else { return(new RefDirectory.LooseNonTag(snapShot, GetName(), GetObjectId())); } }
public RefDirectory.LooseRef Peel(ObjectIdRef newLeaf) { // We should never try to peel the symbolic references. throw new NGit.Errors.NotSupportedException(); }
public RefDirectory.LooseRef Peel(ObjectIdRef newLeaf) { return(this); }