/// <summary> /// Processing an entry in the context of /// <see cref="PrescanOneTree()">PrescanOneTree()</see> /// when only /// one tree is given /// </summary> /// <param name="m">the tree to merge</param> /// <param name="i">the index</param> /// <param name="f">the working tree</param> /// <exception cref="System.IO.IOException">System.IO.IOException</exception> internal virtual void ProcessEntry(CanonicalTreeParser m, DirCacheBuildIterator i , WorkingTreeIterator f) { if (m != null) { // There is an entry in the merge commit. Means: we want to update // what's currently in the index and working-tree to that one if (i == null) { // The index entry is missing if (f != null && !FileMode.TREE.Equals(f.EntryFileMode) && !f.IsEntryIgnored()) { // don't overwrite an untracked and not ignored file conflicts.AddItem(walk.PathString); } else { Update(m.EntryPathString, m.EntryObjectId, m.EntryFileMode); } } else { if (f == null || !m.IdEqual(i)) { // The working tree file is missing or the merge content differs // from index content Update(m.EntryPathString, m.EntryObjectId, m.EntryFileMode); } else { if (i.GetDirCacheEntry() != null) { // The index contains a file (and not a folder) if (f.IsModified(i.GetDirCacheEntry(), true) || i.GetDirCacheEntry().Stage != 0) { // The working tree file is dirty or the index contains a // conflict Update(m.EntryPathString, m.EntryObjectId, m.EntryFileMode); } else { Keep(i.GetDirCacheEntry()); } } else { // The index contains a folder Keep(i.GetDirCacheEntry()); } } } } else { // There is no entry in the merge commit. Means: we want to delete // what's currently in the index and working tree if (f != null) { // There is a file/folder for that path in the working tree if (walk.IsDirectoryFileConflict()) { conflicts.AddItem(walk.PathString); } else { // No file/folder conflict exists. All entries are files or // all entries are folders if (i != null) { // ... and the working tree contained a file or folder // -> add it to the removed set and remove it from // conflicts set Remove(i.EntryPathString); conflicts.Remove(i.EntryPathString); } } } else { // untracked file, neither contained in tree to merge // nor in index // There is no file/folder for that path in the working tree. // The only entry we have is the index entry. If that entry is a // conflict simply remove it. Otherwise keep that entry in the // index if (i.GetDirCacheEntry().Stage == 0) { Keep(i.GetDirCacheEntry()); } } } }