Exemplo n.º 1
0
 /// <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());
             }
         }
     }
 }