本文整理汇总了C#中NGit.Dircache.DirCacheEntry类的典型用法代码示例。如果您正苦于以下问题:C# DirCacheEntry类的具体用法?C# DirCacheEntry怎么用?C# DirCacheEntry使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
DirCacheEntry类属于NGit.Dircache命名空间,在下文中一共展示了DirCacheEntry类的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C#代码示例。
示例1: TestNoSubtree_NoTreeWalk
public virtual void TestNoSubtree_NoTreeWalk()
{
DirCache dc = DirCache.NewInCore();
string[] paths = new string[] { "a.", "a0b" };
DirCacheEntry[] ents = new DirCacheEntry[paths.Length];
for (int i = 0; i < paths.Length; i++)
{
ents[i] = new DirCacheEntry(paths[i]);
ents[i].FileMode = FileMode.REGULAR_FILE;
}
DirCacheBuilder b = dc.Builder();
for (int i_1 = 0; i_1 < ents.Length; i_1++)
{
b.Add(ents[i_1]);
}
b.Finish();
DirCacheIterator i_2 = new DirCacheIterator(dc);
int pathIdx = 0;
for (; !i_2.Eof; i_2.Next(1))
{
NUnit.Framework.Assert.AreEqual(pathIdx, i_2.ptr);
NUnit.Framework.Assert.AreSame(ents[pathIdx], i_2.GetDirCacheEntry());
pathIdx++;
}
NUnit.Framework.Assert.AreEqual(paths.Length, pathIdx);
}
开发者ID:LunarLanding,项目名称:ngit,代码行数:26,代码来源:DirCacheIteratorTest.cs
示例2: TestNonRecursiveFiltering
public virtual void TestNonRecursiveFiltering()
{
ObjectInserter odi = db.NewObjectInserter();
ObjectId aSth = odi.Insert(Constants.OBJ_BLOB, Sharpen.Runtime.GetBytesForString(
"a.sth"));
ObjectId aTxt = odi.Insert(Constants.OBJ_BLOB, Sharpen.Runtime.GetBytesForString(
"a.txt"));
DirCache dc = db.ReadDirCache();
DirCacheBuilder builder = dc.Builder();
DirCacheEntry aSthEntry = new DirCacheEntry("a.sth");
aSthEntry.FileMode = FileMode.REGULAR_FILE;
aSthEntry.SetObjectId(aSth);
DirCacheEntry aTxtEntry = new DirCacheEntry("a.txt");
aTxtEntry.FileMode = FileMode.REGULAR_FILE;
aTxtEntry.SetObjectId(aTxt);
builder.Add(aSthEntry);
builder.Add(aTxtEntry);
builder.Finish();
ObjectId treeId = dc.WriteTree(odi);
odi.Flush();
TreeWalk tw = new TreeWalk(db);
tw.Filter = PathSuffixFilter.Create(".txt");
tw.AddTree(treeId);
IList<string> paths = new List<string>();
while (tw.Next())
{
paths.AddItem(tw.PathString);
}
IList<string> expected = new List<string>();
expected.AddItem("a.txt");
NUnit.Framework.Assert.AreEqual(expected, paths);
}
开发者ID:LunarLanding,项目名称:ngit,代码行数:32,代码来源:PathSuffixFilterTestCase.cs
示例3: MakeEntry
/// <exception cref="System.Exception"></exception>
private DirCacheEntry MakeEntry(string path, FileMode mode)
{
DirCacheEntry ent = new DirCacheEntry(path);
ent.FileMode = mode;
ent.SetObjectId(new ObjectInserter.Formatter().IdFor(Constants.OBJ_BLOB, Constants
.Encode(path)));
return ent;
}
开发者ID:shoff,项目名称:ngit,代码行数:9,代码来源:ForPathTest.cs
示例4: TestEntriesWithin
public virtual void TestEntriesWithin()
{
DirCache dc = db.ReadDirCache();
string[] paths = new string[] { "a.", "a/b", "a/c", "a/d", "a0b" };
DirCacheEntry[] ents = new DirCacheEntry[paths.Length];
for (int i = 0; i < paths.Length; i++)
{
ents[i] = new DirCacheEntry(paths[i]);
ents[i].FileMode = FileMode.REGULAR_FILE;
}
int aFirst = 1;
int aLast = 3;
DirCacheBuilder b = dc.Builder();
for (int i_1 = 0; i_1 < ents.Length; i_1++)
{
b.Add(ents[i_1]);
}
b.Finish();
NUnit.Framework.Assert.AreEqual(paths.Length, dc.GetEntryCount());
for (int i_2 = 0; i_2 < ents.Length; i_2++)
{
NUnit.Framework.Assert.AreSame(ents[i_2], dc.GetEntry(i_2));
}
{
DirCacheEntry[] aContents = dc.GetEntriesWithin("a");
NUnit.Framework.Assert.IsNotNull(aContents);
NUnit.Framework.Assert.AreEqual(aLast - aFirst + 1, aContents.Length);
for (int i_3 = aFirst, j=0; i_3 <= aLast; i_3++, j++)
{
NUnit.Framework.Assert.AreSame(ents[i_3], aContents[j]);
}
}
{
DirCacheEntry[] aContents = dc.GetEntriesWithin("a/");
NUnit.Framework.Assert.IsNotNull(aContents);
NUnit.Framework.Assert.AreEqual(aLast - aFirst + 1, aContents.Length);
for (int i_3 = aFirst, j=0; i_3 <= aLast; i_3++, j++)
{
NUnit.Framework.Assert.AreSame(ents[i_3], aContents[j]);
}
}
{
DirCacheEntry[] aContents = dc.GetEntriesWithin(string.Empty);
NUnit.Framework.Assert.IsNotNull(aContents);
NUnit.Framework.Assert.AreEqual(ents.Length, aContents.Length);
for (int i_3 = 0; i_3 < ents.Length; i_3++)
{
NUnit.Framework.Assert.AreSame(ents[i_3], aContents[i_3]);
}
}
NUnit.Framework.Assert.IsNotNull(dc.GetEntriesWithin("a."));
NUnit.Framework.Assert.AreEqual(0, dc.GetEntriesWithin("a.").Length);
NUnit.Framework.Assert.IsNotNull(dc.GetEntriesWithin("a0b"));
NUnit.Framework.Assert.AreEqual(0, dc.GetEntriesWithin("a0b.").Length);
NUnit.Framework.Assert.IsNotNull(dc.GetEntriesWithin("zoo"));
NUnit.Framework.Assert.AreEqual(0, dc.GetEntriesWithin("zoo.").Length);
}
开发者ID:LunarLanding,项目名称:ngit,代码行数:57,代码来源:DirCacheFindTest.cs
示例5: TestBuildRejectsUnsetFileMode
public virtual void TestBuildRejectsUnsetFileMode()
{
DirCache dc = DirCache.NewInCore();
DirCacheBuilder b = dc.Builder();
NUnit.Framework.Assert.IsNotNull(b);
DirCacheEntry e = new DirCacheEntry("a");
NUnit.Framework.Assert.AreEqual(0, e.RawMode);
try
{
b.Add(e);
}
catch (ArgumentException err)
{
NUnit.Framework.Assert.AreEqual("FileMode not set for path a", err.Message);
}
}
开发者ID:shoff,项目名称:ngit,代码行数:16,代码来源:DirCacheBuilderTest.cs
示例6: TestPathFilterGroup_DoesNotSkipTail
public virtual void TestPathFilterGroup_DoesNotSkipTail()
{
DirCache dc = db.ReadDirCache();
FileMode mode = FileMode.REGULAR_FILE;
string[] paths = new string[] { "a.", "a/b", "a/c", "a/d", "a0b" };
DirCacheEntry[] ents = new DirCacheEntry[paths.Length];
for (int i = 0; i < paths.Length; i++)
{
ents[i] = new DirCacheEntry(paths[i]);
ents[i].FileMode = mode;
}
{
DirCacheBuilder b = dc.Builder();
for (int i_1 = 0; i_1 < ents.Length; i_1++)
{
b.Add(ents[i_1]);
}
b.Finish();
}
int expIdx = 2;
DirCacheBuilder b_1 = dc.Builder();
TreeWalk tw = new TreeWalk(db);
tw.AddTree(new DirCacheBuildIterator(b_1));
tw.Recursive = true;
tw.Filter = PathFilterGroup.CreateFromStrings(Collections.Singleton(paths[expIdx]
));
NUnit.Framework.Assert.IsTrue(tw.Next(), "found " + paths[expIdx]);
DirCacheIterator c = tw.GetTree<DirCacheIterator>(0);
NUnit.Framework.Assert.IsNotNull(c);
NUnit.Framework.Assert.AreEqual(expIdx, c.ptr);
NUnit.Framework.Assert.AreSame(ents[expIdx], c.GetDirCacheEntry());
NUnit.Framework.Assert.AreEqual(paths[expIdx], tw.PathString);
NUnit.Framework.Assert.AreEqual(mode.GetBits(), tw.GetRawMode(0));
NUnit.Framework.Assert.AreSame(mode, tw.GetFileMode(0));
b_1.Add(c.GetDirCacheEntry());
NUnit.Framework.Assert.IsFalse(tw.Next(), "no more entries");
b_1.Finish();
NUnit.Framework.Assert.AreEqual(ents.Length, dc.GetEntryCount());
for (int i_2 = 0; i_2 < ents.Length; i_2++)
{
NUnit.Framework.Assert.AreSame(ents[i_2], dc.GetEntry(i_2));
}
}
开发者ID:LunarLanding,项目名称:ngit,代码行数:43,代码来源:DirCacheBuilderIteratorTest.cs
示例7: Bad
private static InvalidOperationException Bad(DirCacheEntry a, string msg)
{
return new InvalidOperationException(msg + ": " + a.Stage + " " + a.PathString);
}
开发者ID:yayanyang,项目名称:monodevelop,代码行数:4,代码来源:DirCacheBuilder.cs
示例8: ToEntry
private DirCacheEntry ToEntry(int stage, TreeWalk tw)
{
DirCacheEntry e = new DirCacheEntry(tw.RawPath, stage);
AbstractTreeIterator i;
i = tw.GetTree<AbstractTreeIterator>(0);
e.FileMode = tw.GetFileMode(0);
e.SetObjectIdFromRaw(i.IdBuffer, i.IdOffset);
return e;
}
开发者ID:yayanyang,项目名称:monodevelop,代码行数:9,代码来源:DirCacheBuilder.cs
示例9: ResetIndex
/// <summary>Resets the index to represent exactly some filesystem content.</summary>
/// <remarks>
/// Resets the index to represent exactly some filesystem content. E.g. the
/// following call will replace the index with the working tree content:
/// <p>
/// <code>resetIndex(new FileSystemIterator(db))</code>
/// <p>
/// This method can be used by testcases which first prepare a new commit
/// somewhere in the filesystem (e.g. in the working-tree) and then want to
/// have an index which matches their prepared content.
/// </remarks>
/// <param name="treeItr">
/// a
/// <see cref="NGit.Treewalk.FileTreeIterator">NGit.Treewalk.FileTreeIterator</see>
/// which determines which files should
/// go into the new index
/// </param>
/// <exception cref="System.IO.FileNotFoundException">System.IO.FileNotFoundException
/// </exception>
/// <exception cref="System.IO.IOException">System.IO.IOException</exception>
protected internal virtual void ResetIndex(FileTreeIterator treeItr)
{
ObjectInserter inserter = db.NewObjectInserter();
DirCacheBuilder builder = db.LockDirCache().Builder();
DirCacheEntry dce;
while (!treeItr.Eof)
{
long len = treeItr.GetEntryLength();
dce = new DirCacheEntry(treeItr.EntryPathString);
dce.FileMode = treeItr.EntryFileMode;
dce.LastModified = treeItr.GetEntryLastModified();
dce.SetLength((int)len);
FileInputStream @in = new FileInputStream(treeItr.GetEntryFile());
dce.SetObjectId(inserter.Insert(Constants.OBJ_BLOB, len, @in));
@in.Close();
builder.Add(dce);
treeItr.Next(1);
}
builder.Commit();
inserter.Flush();
inserter.Release();
}
开发者ID:shoff,项目名称:ngit,代码行数:42,代码来源:RepositoryTestCase.cs
示例10: Add
/// <summary>adds a new path with the specified stage to the index builder</summary>
/// <param name="path"></param>
/// <param name="p"></param>
/// <param name="stage"></param>
/// <returns>the entry which was added to the index</returns>
private DirCacheEntry Add(byte[] path, CanonicalTreeParser p, int stage)
{
if (p != null && !p.EntryFileMode.Equals(FileMode.TREE))
{
DirCacheEntry e = new DirCacheEntry(path, stage);
e.FileMode = p.EntryFileMode;
e.SetObjectId(p.EntryObjectId);
builder.Add(e);
return e;
}
return null;
}
开发者ID:stewartwhaley,项目名称:monodevelop,代码行数:17,代码来源:ResolveMerger.cs
示例11: FastKeep
/// <summary>Add a range of existing entries from the destination cache.</summary>
/// <remarks>
/// Add a range of existing entries from the destination cache.
/// <p/>
/// The entries are placed at the end of the entry list, preserving their
/// current order. The caller is responsible for making sure the final table
/// is correctly sorted.
/// <p/>
/// This method copies from the destination cache, which has not yet been
/// updated with this editor's new table. So all offsets into the destination
/// cache are not affected by any updates that may be currently taking place
/// in this editor.
/// <p/>
/// The
/// <see cref="entries">entries</see>
/// table is automatically expanded if there is
/// insufficient space for the new additions.
/// </remarks>
/// <param name="pos">first entry to copy from the destination cache.</param>
/// <param name="cnt">number of entries to copy.</param>
protected internal virtual void FastKeep(int pos, int cnt)
{
if (entryCnt + cnt > entries.Length)
{
int m1 = (entryCnt + 16) * 3 / 2;
int m2 = entryCnt + cnt;
DirCacheEntry[] n = new DirCacheEntry[Math.Max(m1, m2)];
System.Array.Copy(entries, 0, n, 0, entryCnt);
entries = n;
}
cache.ToArray(pos, entries, entryCnt, cnt);
entryCnt += cnt;
}
开发者ID:sharwell,项目名称:ngit,代码行数:33,代码来源:BaseDirCacheEditor.cs
示例12: AddEntryToBuilder
/// <exception cref="System.IO.IOException"></exception>
private DirCacheEntry AddEntryToBuilder(string path, FilePath file, ObjectInserter
newObjectInserter, DirCacheBuilder builder, int stage)
{
FileInputStream inputStream = new FileInputStream(file);
ObjectId id = newObjectInserter.Insert(Constants.OBJ_BLOB, file.Length(), inputStream
);
inputStream.Close();
DirCacheEntry entry = new DirCacheEntry(path, stage);
entry.SetObjectId(id);
entry.FileMode = FileMode.REGULAR_FILE;
entry.LastModified = file.LastModified();
entry.SetLength((int)file.Length());
builder.Add(entry);
return entry;
}
开发者ID:stinos,项目名称:ngit,代码行数:16,代码来源:AddCommandTest.cs
示例13: UpdateIndex
/// <summary>Updates the index after a content merge has happened.</summary>
/// <remarks>
/// Updates the index after a content merge has happened. If no conflict has
/// occurred this includes persisting the merged content to the object
/// database. In case of conflicts this method takes care to write the
/// correct stages to the index.
/// </remarks>
/// <param name="base"></param>
/// <param name="ours"></param>
/// <param name="theirs"></param>
/// <param name="result"></param>
/// <param name="of"></param>
/// <exception cref="System.IO.FileNotFoundException">System.IO.FileNotFoundException
/// </exception>
/// <exception cref="System.IO.IOException">System.IO.IOException</exception>
private void UpdateIndex(CanonicalTreeParser @base, CanonicalTreeParser ours, CanonicalTreeParser
theirs, MergeResult<RawText> result, FilePath of)
{
if (result.ContainsConflicts())
{
// a conflict occurred, the file will contain conflict markers
// the index will be populated with the three stages and only the
// workdir (if used) contains the halfways merged content
Add(tw.RawPath, @base, DirCacheEntry.STAGE_1);
Add(tw.RawPath, ours, DirCacheEntry.STAGE_2);
Add(tw.RawPath, theirs, DirCacheEntry.STAGE_3);
mergeResults.Put(tw.PathString, result.Upcast ());
}
else
{
// no conflict occurred, the file will contain fully merged content.
// the index will be populated with the new merged version
DirCacheEntry dce = new DirCacheEntry(tw.PathString);
int newMode = MergeFileModes(tw.GetRawMode(0), tw.GetRawMode(1), tw.GetRawMode(2)
);
// set the mode for the new content. Fall back to REGULAR_FILE if
// you can't merge modes of OURS and THEIRS
dce.FileMode = (newMode == FileMode.MISSING.GetBits()) ? FileMode.REGULAR_FILE :
FileMode.FromBits(newMode);
dce.LastModified = of.LastModified();
dce.SetLength((int)of.Length());
InputStream @is = new FileInputStream(of);
try
{
dce.SetObjectId(oi.Insert(Constants.OBJ_BLOB, of.Length(), @is));
}
finally
{
@is.Close();
if (inCore)
{
FileUtils.Delete(of);
}
}
builder.Add(dce);
}
}
开发者ID:kenji-tan,项目名称:ngit,代码行数:57,代码来源:ResolveMerger.cs
示例14: ProcessEntry
/// <summary>Processes one path and tries to merge.</summary>
/// <remarks>
/// Processes one path and tries to merge. This method will do all do all
/// trivial (not content) merges and will also detect if a merge will fail.
/// The merge will fail when one of the following is true
/// <ul>
/// <li>the index entry does not match the entry in ours. When merging one
/// branch into the current HEAD, ours will point to HEAD and theirs will
/// point to the other branch. It is assumed that the index matches the HEAD
/// because it will only not match HEAD if it was populated before the merge
/// operation. But the merge commit should not accidentally contain
/// modifications done before the merge. Check the <a href=
/// "http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_3_way_merge"
/// >git read-tree</a> documentation for further explanations.</li>
/// <li>A conflict was detected and the working-tree file is dirty. When a
/// conflict is detected the content-merge algorithm will try to write a
/// merged version into the working-tree. If the file is dirty we would
/// override unsaved data.</li>
/// </remarks>
/// <param name="base">the common base for ours and theirs</param>
/// <param name="ours">
/// the ours side of the merge. When merging a branch into the
/// HEAD ours will point to HEAD
/// </param>
/// <param name="theirs">
/// the theirs side of the merge. When merging a branch into the
/// current HEAD theirs will point to the branch which is merged
/// into HEAD.
/// </param>
/// <param name="index">the index entry</param>
/// <param name="work">the file in the working tree</param>
/// <returns>
/// <code>false</code> if the merge will fail because the index entry
/// didn't match ours or the working-dir file was dirty and a
/// conflict occurred
/// </returns>
/// <exception cref="NGit.Errors.MissingObjectException">NGit.Errors.MissingObjectException
/// </exception>
/// <exception cref="NGit.Errors.IncorrectObjectTypeException">NGit.Errors.IncorrectObjectTypeException
/// </exception>
/// <exception cref="NGit.Errors.CorruptObjectException">NGit.Errors.CorruptObjectException
/// </exception>
/// <exception cref="System.IO.IOException">System.IO.IOException</exception>
private bool ProcessEntry(CanonicalTreeParser @base, CanonicalTreeParser ours, CanonicalTreeParser
theirs, DirCacheBuildIterator index, WorkingTreeIterator work)
{
enterSubtree = true;
int modeO = tw.GetRawMode(T_OURS);
int modeT = tw.GetRawMode(T_THEIRS);
int modeB = tw.GetRawMode(T_BASE);
if (modeO == 0 && modeT == 0 && modeB == 0)
{
// File is either untracked or new, staged but uncommitted
return true;
}
if (IsIndexDirty())
{
return false;
}
DirCacheEntry ourDce = null;
if (index == null || index.GetDirCacheEntry() == null)
{
// create a fake DCE, but only if ours is valid. ours is kept only
// in case it is valid, so a null ourDce is ok in all other cases.
if (NonTree(modeO))
{
ourDce = new DirCacheEntry(tw.RawPath);
ourDce.SetObjectId(tw.GetObjectId(T_OURS));
ourDce.FileMode = tw.GetFileMode(T_OURS);
}
}
else
{
ourDce = index.GetDirCacheEntry();
}
if (NonTree(modeO) && NonTree(modeT) && tw.IdEqual(T_OURS, T_THEIRS))
{
// OURS and THEIRS have equal content. Check the file mode
if (modeO == modeT)
{
// content and mode of OURS and THEIRS are equal: it doesn't
// matter which one we choose. OURS is chosen. Since the index
// is clean (the index matches already OURS) we can keep the existing one
Keep(ourDce);
// no checkout needed!
return true;
}
else
{
// same content but different mode on OURS and THEIRS.
// Try to merge the mode and report an error if this is
// not possible.
int newMode = MergeFileModes(modeB, modeO, modeT);
if (newMode != FileMode.MISSING.GetBits())
{
if (newMode == modeO)
{
// ours version is preferred
Keep(ourDce);
}
//.........这里部分代码省略.........
开发者ID:stinos,项目名称:ngit,代码行数:101,代码来源:ResolveMerger.cs
示例15: Keep
/// <summary>
/// adds a entry to the index builder which is a copy of the specified
/// DirCacheEntry
/// </summary>
/// <param name="e">the entry which should be copied</param>
/// <returns>the entry which was added to the index</returns>
private DirCacheEntry Keep(DirCacheEntry e)
{
DirCacheEntry newEntry = new DirCacheEntry(e.PathString, e.Stage);
newEntry.FileMode = e.FileMode;
newEntry.SetObjectId(e.GetObjectId());
newEntry.LastModified = e.LastModified;
newEntry.SetLength(e.Length);
builder.Add(newEntry);
return newEntry;
}
开发者ID:stinos,项目名称:ngit,代码行数:16,代码来源:ResolveMerger.cs
示例16: FastAdd
/// <summary>Append one entry into the resulting entry list.</summary>
/// <remarks>
/// Append one entry into the resulting entry list.
/// <p/>
/// The entry is placed at the end of the entry list. The caller is
/// responsible for making sure the final table is correctly sorted.
/// <p/>
/// The
/// <see cref="entries">entries</see>
/// table is automatically expanded if there is
/// insufficient space for the new addition.
/// </remarks>
/// <param name="newEntry">the new entry to add.</param>
protected internal virtual void FastAdd(DirCacheEntry newEntry)
{
if (entries.Length == entryCnt)
{
DirCacheEntry[] n = new DirCacheEntry[(entryCnt + 16) * 3 / 2];
System.Array.Copy(entries, 0, n, 0, entryCnt);
entries = n;
}
entries[entryCnt++] = newEntry;
}
开发者ID:sharwell,项目名称:ngit,代码行数:23,代码来源:BaseDirCacheEditor.cs
示例17: Apply
public override void Apply(DirCacheEntry ent)
{
ent.FileMode = FileMode.REGULAR_FILE;
ent.SetObjectId(gitmodulesBlob);
}
开发者ID:LunarLanding,项目名称:ngit,代码行数:5,代码来源:SubmoduleWalkTest.cs
示例18: Replace
/// <summary>
/// Update the DirCache with the contents of
/// <see cref="entries">entries</see>
/// .
/// <p/>
/// This method should be invoked only during an implementation of
/// <see cref="Finish()">Finish()</see>
/// , and only after
/// <see cref="entries">entries</see>
/// is sorted.
/// </summary>
protected internal virtual void Replace()
{
if (entryCnt < entries.Length / 2)
{
DirCacheEntry[] n = new DirCacheEntry[entryCnt];
System.Array.Copy(entries, 0, n, 0, entryCnt);
entries = n;
}
cache.Replace(entries, entryCnt);
}
开发者ID:sharwell,项目名称:ngit,代码行数:21,代码来源:BaseDirCacheEditor.cs
示例19: Apply
public override void Apply(DirCacheEntry ent)
{
ent.FileMode = FileMode.REGULAR_FILE;
ent.SetLength(length);
ent.SetObjectId(data);
}
开发者ID:JamesChan,项目名称:ngit,代码行数:6,代码来源:DirCacheCheckoutTest.cs
示例20: Revert
public override void Revert (FilePath[] localPaths, bool recurse, IProgressMonitor monitor)
{
foreach (var group in localPaths.GroupBy (f => GetRepository (f))) {
var repository = group.Key;
var files = group.ToArray ();
var c = GetHeadCommit (repository);
RevTree tree = c != null ? c.Tree : null;
List<FilePath> changedFiles = new List<FilePath> ();
List<FilePath> removedFiles = new List<FilePath> ();
monitor.BeginTask (GettextCatalog.GetString ("Reverting files"), 3);
monitor.BeginStepTask (GettextCatalog.GetString ("Reverting files"), files.Length, 2);
DirCache dc = repository.LockDirCache ();
DirCacheBuilder builder = dc.Builder ();
try {
HashSet<string> entriesToRemove = new HashSet<string> ();
HashSet<string> foldersToRemove = new HashSet<string> ();
// Add the new entries
foreach (FilePath fp in files) {
string p = repository.ToGitPath (fp);
// Register entries to be removed from the index
if (Directory.Exists (fp))
foldersToRemove.Add (p);
else
entriesToRemove.Add (p);
TreeWalk tw = tree != null ? TreeWalk.ForPath (repository, p, tree) : null;
if (tw == null) {
// Removed from the index
}
else {
// Add new entries
TreeWalk r;
if (tw.IsSubtree) {
// It's a directory. Make sure we remove existing index entries of this directory
foldersToRemove.Add (p);
// We have to iterate through all folder files. We need a new iterator since the
// existing rw is not recursive
r = new NGit.Treewalk.TreeWalk(repository);
r.Reset (tree);
r.Filter = PathFilterGroup.CreateFromStrings(new string[]{p});
r.Recursive = true;
r.Next ();
} else {
r = tw;
}
do {
// There can be more than one entry if reverting a whole directory
string rpath = repository.FromGitPath (r.PathString);
DirCacheEntry e = new DirCacheEntry (r.PathString);
e.SetObjectId (r.GetObjectId (0));
e.FileMode = r.GetFileMode (0);
if (!Directory.Exists (Path.GetDirectoryName (rpath)))
Directory.CreateDirectory (rpath);
DirCacheCheckout.CheckoutEntry (repository, rpath, e);
builder.Add (e);
changedFiles.Add (rpath);
} while (r.Next ());
}
monitor.Step (1);
}
// Add entries we want to keep
int count = dc.GetEntryCount ();
for (int n=0; n<count; n++) {
DirCacheEntry e = dc.GetEntry (n);
string path = e.PathString;
if (!entriesToRemove.Contains (path) && !foldersToRemove.Any (f => IsSubpath (f,path)))
builder.Add (e);
}
builder.Commit ();
}
catch {
dc.Unlock ();
throw;
}
monitor.EndTask ();
monitor.BeginTask (null, files.Length);
foreach (FilePath p in changedFiles) {
FileService.NotifyFileChanged (p);
monitor.Step (1);
}
foreach (FilePath p in removedFiles) {
FileService.NotifyFileRemoved (p);
monitor.Step (1);
}
monitor.EndTask ();
}
//.........这里部分代码省略.........
开发者ID:kthguru,项目名称:monodevelop,代码行数:101,代码来源:GitRepository.cs
注:本文中的NGit.Dircache.DirCacheEntry类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论