private void ApplyEdits() { _edits.Sort(EditComparison); int maxIdx = Cache.getEntryCount(); int lastIdx = 0; foreach (PathEdit e in _edits) { int eIdx = Cache.findEntry(e.Path, e.Path.Length); bool missing = eIdx < 0; if (eIdx < 0) { eIdx = -(eIdx + 1); } int cnt = Math.Min(eIdx, maxIdx) - lastIdx; if (cnt > 0) { FastKeep(lastIdx, cnt); } lastIdx = missing ? eIdx : Cache.nextEntry(eIdx); if (e is DeletePath) { continue; } if (e is DeleteTree) { lastIdx = Cache.nextEntry(e.Path, e.Path.Length, eIdx); continue; } DirCacheEntry ent; if (missing) { ent = new DirCacheEntry(e.Path); e.Apply(ent); if (ent.getRawMode() == 0) { throw new ArgumentException("FileMode not set" + " for path " + ent.getPathString()); } } else { ent = Cache.getEntry(eIdx); e.Apply(ent); } FastAdd(ent); } int count = maxIdx - lastIdx; if (count > 0) { FastKeep(lastIdx, count); } }
/// <summary> /// Append one entry into the resulting entry list. /// <para /> /// The entry is placed at the end of the entry list. If the entry causes the /// list to now be incorrectly sorted a final sorting phase will be /// automatically enabled within <seealso cref="finish()"/>. /// <para /> /// The internal entry table is automatically expanded if there is /// insufficient space for the new addition. /// </summary> /// <param name="newEntry">the new entry to add.</param> public void add(DirCacheEntry newEntry) { if (newEntry.getRawMode() == 0) { throw new ArgumentException("FileMode not set for path " + newEntry.getPathString()); } BeforeAdd(newEntry); FastAdd(newEntry); }
public void testBuildRejectsUnsetFileMode() { DirCache dc = DirCache.newInCore(); DirCacheBuilder b = dc.builder(); Assert.IsNotNull(b); DirCacheEntry e = new DirCacheEntry("a"); Assert.AreEqual(0, e.getRawMode()); try { b.add(e); } catch (ArgumentException err) { Assert.AreEqual("FileMode not set for path a", err.Message); } }
private void ParseEntry() { _currentEntry = Cache.getEntry(_pointer); byte[] cep = _currentEntry.Path; if (_nextSubtreePos != Tree.getChildCount()) { DirCacheTree s = Tree.getChild(_nextSubtreePos); if (s.contains(cep, PathOffset, cep.Length)) { // The current position is the first file of this subtree. // Use the subtree instead as the current position. // _currentSubtree = s; _nextSubtreePos++; if (s.isValid()) { s.getObjectId().copyRawTo(SubtreeId, 0); } else { SubtreeId.Fill((byte)0); } Mode = FileMode.Tree.Bits; Path = cep; PathLen = PathOffset + s.nameLength(); return; } } // The current position is a file/symlink/gitlink so we // do not have a subtree located here. // Mode = _currentEntry.getRawMode(); Path = cep; PathLen = cep.Length; _currentSubtree = null; }
private void BeforeAdd(DirCacheEntry newEntry) { if (FileMode.Tree.Equals(newEntry.getRawMode())) { throw Bad(newEntry, "Adding subtree not allowed"); } if (_sorted && EntryCnt > 0) { DirCacheEntry lastEntry = Entries[EntryCnt - 1]; int cr = DirCache.Compare(lastEntry, newEntry); if (cr > 0) { // The new entry sorts before the old entry; we are // no longer sorted correctly. We'll need to redo // the sorting before we can close out the build. // _sorted = false; } else if (cr == 0) { // Same file path; we can only insert this if the // stages won't be violated. // int peStage = lastEntry.getStage(); int dceStage = newEntry.getStage(); if (peStage == dceStage) { throw Bad(newEntry, "Duplicate stages not allowed"); } if (peStage == 0 || dceStage == 0) { throw Bad(newEntry, "Mixed stages not allowed"); } if (peStage > dceStage) { _sorted = false; } } } }
public void testBuildOneFile_FinishWriteCommit() { string path = "a-File-path"; var mode = GitSharp.Core.FileMode.RegularFile; long lastModified = 1218123387057L; int Length = 1342; DirCacheEntry entOrig; DirCache dc = DirCache.Lock(db); DirCacheBuilder b = dc.builder(); Assert.IsNotNull(b); entOrig = new DirCacheEntry(path); entOrig.setFileMode(mode); entOrig.setLastModified(lastModified); entOrig.setLength(Length); Assert.AreNotSame(path, entOrig.getPathString()); Assert.AreEqual(path, entOrig.getPathString()); Assert.AreEqual(ObjectId.ZeroId, entOrig.getObjectId()); Assert.AreEqual(mode.Bits, entOrig.getRawMode()); Assert.AreEqual(0, entOrig.getStage()); Assert.AreEqual(lastModified, entOrig.getLastModified()); Assert.AreEqual(Length, entOrig.getLength()); Assert.IsFalse(entOrig.isAssumeValid()); b.add(entOrig); b.finish(); Assert.AreEqual(1, dc.getEntryCount()); Assert.AreSame(entOrig, dc.getEntry(0)); dc.write(); Assert.IsTrue(dc.commit()); dc = DirCache.read(db); Assert.AreEqual(1, dc.getEntryCount()); DirCacheEntry entRead = dc.getEntry(0); Assert.AreNotSame(entOrig, entRead); Assert.AreEqual(path, entRead.getPathString()); Assert.AreEqual(ObjectId.ZeroId, entOrig.getObjectId()); Assert.AreEqual(mode.Bits, entOrig.getRawMode()); Assert.AreEqual(0, entOrig.getStage()); Assert.AreEqual(lastModified, entOrig.getLastModified()); Assert.AreEqual(Length, entOrig.getLength()); Assert.IsFalse(entOrig.isAssumeValid()); }
public void testSetFileMode() { DirCacheEntry e = new DirCacheEntry("a"); Assert.AreEqual(0, e.getRawMode()); e.setFileMode(FileMode.RegularFile); Assert.AreSame(FileMode.RegularFile, e.getFileMode()); Assert.AreEqual(FileMode.RegularFile.Bits, e.getRawMode()); e.setFileMode(FileMode.ExecutableFile); Assert.AreSame(FileMode.ExecutableFile, e.getFileMode()); Assert.AreEqual(FileMode.ExecutableFile.Bits, e.getRawMode()); e.setFileMode(FileMode.Symlink); Assert.AreSame(FileMode.Symlink, e.getFileMode()); Assert.AreEqual(FileMode.Symlink.Bits, e.getRawMode()); e.setFileMode(FileMode.GitLink); Assert.AreSame(FileMode.GitLink, e.getFileMode()); Assert.AreEqual(FileMode.GitLink.Bits, e.getRawMode()); try { e.setFileMode(FileMode.Missing); Assert.Fail("incorrectly accepted FileMode.MISSING"); } catch (ArgumentException err) { Assert.AreEqual("Invalid mode 0 for path a", err.Message); } try { e.setFileMode(FileMode.Tree); Assert.Fail("incorrectly accepted FileMode.TREE"); } catch (ArgumentException err) { Assert.AreEqual("Invalid mode " + FileMode.TYPE_TREE + " for path a", err.Message); } }
private static void AssertAreEqual(CGitIndexRecord c, DirCacheEntry j) { Assert.IsNotNull(c); Assert.IsNotNull(j); Assert.AreEqual(c.Path, j.getPathString()); Assert.AreEqual(c.Id, j.getObjectId()); Assert.AreEqual(c.Mode, j.getRawMode()); Assert.AreEqual(c.Stage, j.getStage()); }
/// <summary> /// Append one entry into the resulting entry list. /// <para /> /// The entry is placed at the end of the entry list. If the entry causes the /// list to now be incorrectly sorted a final sorting phase will be /// automatically enabled within <seealso cref="finish()"/>. /// <para /> /// The internal entry table is automatically expanded if there is /// insufficient space for the new addition. /// </summary> /// <param name="newEntry">the new entry to add.</param> public void add(DirCacheEntry newEntry) { if (newEntry.getRawMode() == 0) { throw new ArgumentException("FileMode not set for path " + newEntry.getPathString()); } BeforeAdd(newEntry); FastAdd(newEntry); }
private void ApplyEdits() { _edits.Sort(EditComparison); int maxIdx = Cache.getEntryCount(); int lastIdx = 0; foreach (PathEdit e in _edits) { int eIdx = Cache.findEntry(e.Path, e.Path.Length); bool missing = eIdx < 0; if (eIdx < 0) { eIdx = -(eIdx + 1); } int cnt = Math.Min(eIdx, maxIdx) - lastIdx; if (cnt > 0) { FastKeep(lastIdx, cnt); } lastIdx = missing ? eIdx : Cache.nextEntry(eIdx); if (e is DeletePath) continue; if (e is DeleteTree) { lastIdx = Cache.nextEntry(e.Path, e.Path.Length, eIdx); continue; } DirCacheEntry ent; if (missing) { ent = new DirCacheEntry(e.Path); e.Apply(ent); if (ent.getRawMode() == 0) throw new ArgumentException("FileMode not set" + " for path " + ent.getPathString()); } else { ent = Cache.getEntry(eIdx); e.Apply(ent); } FastAdd(ent); } int count = maxIdx - lastIdx; if (count > 0) { FastKeep(lastIdx, count); } }
private void BeforeAdd(DirCacheEntry newEntry) { if (FileMode.Tree.Equals(newEntry.getRawMode())) { throw Bad(newEntry, "Adding subtree not allowed"); } if (_sorted && EntryCnt > 0) { DirCacheEntry lastEntry = Entries[EntryCnt - 1]; int cr = DirCache.Compare(lastEntry, newEntry); if (cr > 0) { // The new entry sorts before the old entry; we are // no longer sorted correctly. We'll need to redo // the sorting before we can close out the build. // _sorted = false; } else if (cr == 0) { // Same file path; we can only insert this if the // stages won't be violated. // int peStage = lastEntry.getStage(); int dceStage = newEntry.getStage(); if (peStage == dceStage) throw Bad(newEntry, "Duplicate stages not allowed"); if (peStage == 0 || dceStage == 0) throw Bad(newEntry, "Mixed stages not allowed"); if (peStage > dceStage) _sorted = false; } } }
private void ParseEntry() { _currentEntry = Cache.getEntry(_pointer); byte[] cep = _currentEntry.Path; if (_nextSubtreePos != Tree.getChildCount()) { DirCacheTree s = Tree.getChild(_nextSubtreePos); if (s.contains(cep, PathOffset, cep.Length)) { // The current position is the first file of this subtree. // Use the subtree instead as the current position. // _currentSubtree = s; _nextSubtreePos++; if (s.isValid()) { s.getObjectId().copyRawTo(SubtreeId, 0); } else { SubtreeId.Fill((byte)0); } Mode = FileMode.Tree.Bits; Path = cep; PathLen = PathOffset + s.nameLength(); return; } } // The current position is a file/symlink/gitlink so we // do not have a subtree located here. // Mode = _currentEntry.getRawMode(); Path = cep; PathLen = cep.Length; _currentSubtree = null; }