/// <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);
 }