| Index: sync/engine/get_commit_ids.cc | 
| diff --git a/sync/engine/get_commit_ids.cc b/sync/engine/get_commit_ids.cc | 
| index e02cce57019fb54bb2b536c29535ea3ded86c726..f87524d66c0b44f0f975054f189928b1426bf414 100644 | 
| --- a/sync/engine/get_commit_ids.cc | 
| +++ b/sync/engine/get_commit_ids.cc | 
| @@ -254,6 +254,8 @@ class Traversal { | 
| const syncable::Directory::Metahandles& traversed, | 
| syncable::Directory::Metahandles* result) const; | 
|  | 
| +  bool SupportsHierarchy(const syncable::Entry& item) const; | 
| + | 
| // Returns true if we've collected enough items. | 
| bool IsFull() const; | 
|  | 
| @@ -288,6 +290,7 @@ bool Traversal::AddUncommittedParentsAndTheirPredecessors( | 
| const std::set<int64>& ready_unsynced_set, | 
| const syncable::Entry& item, | 
| syncable::Directory::Metahandles* result) const { | 
| +  DCHECK(SupportsHierarchy(item)); | 
| syncable::Directory::Metahandles dependencies; | 
| syncable::Id parent_id = item.GetParentId(); | 
|  | 
| @@ -393,6 +396,7 @@ bool Traversal::AddDeletedParents( | 
| const syncable::Entry& item, | 
| const syncable::Directory::Metahandles& traversed, | 
| syncable::Directory::Metahandles* result) const { | 
| +  DCHECK(SupportsHierarchy(item)); | 
| syncable::Directory::Metahandles dependencies; | 
| syncable::Id parent_id = item.GetParentId(); | 
|  | 
| @@ -448,6 +452,10 @@ bool Traversal::HaveItem(int64 handle) const { | 
| return added_handles_.find(handle) != added_handles_.end(); | 
| } | 
|  | 
| +bool Traversal::SupportsHierarchy(const syncable::Entry& item) const { | 
| +  return !item.GetParentId().IsNull(); | 
| +} | 
| + | 
| void Traversal::AppendManyToTraversal( | 
| const syncable::Directory::Metahandles& handles) { | 
| out_->insert(out_->end(), handles.begin(), handles.end()); | 
| @@ -472,17 +480,19 @@ void Traversal::AddCreatesAndMoves( | 
| syncable::GET_BY_HANDLE, | 
| metahandle); | 
| if (!entry.GetIsDel()) { | 
| -      // We only commit an item + its dependencies if it and all its | 
| -      // dependencies are not in conflict. | 
| -      syncable::Directory::Metahandles item_dependencies; | 
| -      if (AddUncommittedParentsAndTheirPredecessors( | 
| -              ready_unsynced_set, | 
| -              entry, | 
| -              &item_dependencies)) { | 
| -        AddPredecessorsThenItem(ready_unsynced_set, | 
| -                                entry, | 
| -                                &item_dependencies); | 
| -        AppendManyToTraversal(item_dependencies); | 
| +      if (SupportsHierarchy(entry)) { | 
| +        // We only commit an item + its dependencies if it and all its | 
| +        // dependencies are not in conflict. | 
| +        syncable::Directory::Metahandles item_dependencies; | 
| +        if (AddUncommittedParentsAndTheirPredecessors(ready_unsynced_set, entry, | 
| +                                                      &item_dependencies)) { | 
| +          AddPredecessorsThenItem(ready_unsynced_set, entry, | 
| +                                  &item_dependencies); | 
| +          AppendManyToTraversal(item_dependencies); | 
| +        } | 
| +      } else { | 
| +        // No hierarchy dependencies, just commit the item itself. | 
| +        AppendToTraversal(metahandle); | 
| } | 
| } | 
| } | 
| @@ -515,13 +525,16 @@ void Traversal::AddDeletes(const std::set<int64>& ready_unsynced_set) { | 
| metahandle); | 
|  | 
| if (entry.GetIsDel()) { | 
| -      syncable::Directory::Metahandles parents; | 
| -      if (AddDeletedParents( | 
| -              ready_unsynced_set, entry, deletion_list, &parents)) { | 
| -        // Append parents and chilren in top to bottom order. | 
| -        deletion_list.insert(deletion_list.end(), | 
| -                             parents.begin(), | 
| -                             parents.end()); | 
| +      if (SupportsHierarchy(entry)) { | 
| +        syncable::Directory::Metahandles parents; | 
| +        if (AddDeletedParents(ready_unsynced_set, entry, deletion_list, | 
| +                              &parents)) { | 
| +          // Append parents and chilren in top to bottom order. | 
| +          deletion_list.insert(deletion_list.end(), parents.begin(), | 
| +                               parents.end()); | 
| +          deletion_list.push_back(metahandle); | 
| +        } | 
| +      } else { | 
| deletion_list.push_back(metahandle); | 
| } | 
| } | 
|  |