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); }
public PackedRefsWriter(LockFile lck, RefList <Ref> refs, PackedRefList oldPackedList, AtomicReference <PackedRefList> packedRefs) : base(refs) { _lck = lck; _refs = refs; _oldPackedList = oldPackedList; _packedRefs = packedRefs; }
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(); }
private void commitPackedRefs(LockFile lck, RefList <Ref> refs, PackedRefList oldPackedList) { new PackedRefsWriter(lck, refs, oldPackedList, packedRefs).writePackedRefs(); }