예제 #1
0
        private PackedRefList getPackedRefs()
        {
            long size = 0;

            if (File.Exists(packedRefsFile.FullName))
            {
                size = packedRefsFile.Length;
            }

            long mtime = size != 0 ? packedRefsFile.lastModified() : 0;

            PackedRefList curList = packedRefs.get();

            if (size == curList.lastSize && mtime == curList.lastModified)
            {
                return(curList);
            }

            PackedRefList newList = readPackedRefs(size, mtime);

            if (packedRefs.compareAndSet(curList, newList))
            {
                modCnt.incrementAndGet();
            }
            return(newList);
        }
예제 #2
0
 public PackedRefsWriter(LockFile lck, RefList <Ref> refs, PackedRefList oldPackedList, AtomicReference <PackedRefList> packedRefs)
     : base(refs)
 {
     _lck           = lck;
     _refs          = refs;
     _oldPackedList = oldPackedList;
     _packedRefs    = packedRefs;
 }
예제 #3
0
        public void delete(RefDirectoryUpdate update)
        {
            Ref    dst  = update.getRef().getLeaf();
            string name = dst.getName();

            // Write the packed-refs file using an atomic update. We might
            // wind up reading it twice, before and after the lock, to ensure
            // we don't miss an edit made externally.
            PackedRefList packed = getPackedRefs();

            if (packed.contains(name))
            {
                var lck = new LockFile(packedRefsFile);
                if (!lck.Lock())
                {
                    throw new IOException("Cannot lock " + packedRefsFile);
                }
                try
                {
                    PackedRefList cur = readPackedRefs(0, 0);
                    int           idx = cur.find(name);
                    if (0 <= idx)
                    {
                        commitPackedRefs(lck, cur.remove(idx), packed);
                    }
                }
                finally
                {
                    lck.Unlock();
                }
            }

            RefList <LooseRef> curLoose, newLoose;

            do
            {
                curLoose = looseRefs.get();
                int idx = curLoose.find(name);
                if (idx < 0)
                {
                    break;
                }
                newLoose = curLoose.remove(idx);
            } while (!looseRefs.compareAndSet(curLoose, newLoose));

            int levels = levelsIn(name) - 2;

            delete(logFor(name), levels);
            if (dst.getStorage().IsLoose)
            {
                update.unlock();
                delete(fileFor(name), levels);
            }

            modCnt.incrementAndGet();
            fireRefsChanged();
        }
예제 #4
0
 private void commitPackedRefs(LockFile lck, RefList <Ref> refs, PackedRefList oldPackedList)
 {
     new PackedRefsWriter(lck, refs, oldPackedList, packedRefs).writePackedRefs();
 }