anchor.diff:  
   import 'constants.dart';
   import 'index.dart';
  +import '../file_operations.dart';
   import '../objectstore.dart';
   import '../utils.dart';
   
  
positive.code:    * usage in the future.
     */
    static Future isWorkingTreeClean(ObjectStore store) {
      return _getFileStatusesForTypes(store, [FileStatusType.MODIFIED,
          FileStatusType.STAGED]).then((r) {
        if (!r.isEmpty) {
          //TODO(grv) : throw custom exception.
          throw "Uncommitted changes in the working tree.";
        }
      });
    }
  
    static Future<Map<String, FileStatus>> getUnstagedChanges(ObjectStore store)
        => _getFileStatusesForTypes(store, [FileStatusType.MODIFIED]);
  
    static Future<Map<String, FileStatus>> getStagedChanges(ObjectStore store)
        => _getFileStatusesForTypes(store, [FileStatusType.STAGED]);
  
    static Future<Map<String, FileStatus>> getUntrackedChanges(ObjectStore store)
        => _getFileStatusesForTypes(store, [FileStatusType.UNTRACKED]);
  
    static Future<List<String>> getDeletedFiles(ObjectStore store) {
      return _getFileStatusesForTypes(store, [FileStatusType.MODIFIED], false)
          .then(
          (Map<String, FileStatus> statuses) {
        List<String> deletedFilesStatus = [];
        statuses.forEach((String filePath, FileStatus status) {
          if (status.deleted) {
            deletedFilesStatus.add(filePath);
          }
        });
        return deletedFilesStatus;
      });
    }
  
    static Future<Map<String, FileStatus>> _getFileStatusesForTypes(
        ObjectStore store, List<String> types, [bool updateSha=true]) {
      return store.index.updateIndex(updateSha).then((_) {
        Map result = {};
        store.index.statusMap.forEach((k, v) {
          if (types.any((type) => v.type == type)) {
            result[k] = v;
          }
        });
        return result;
      });
    }
  }
  
negative.code:         status.size = data.size;
          status.modificationTime = data.modificationTime.millisecondsSinceEpoch;
          store.index.updateIndexForEntry(status);
  
        });
      }).then((_) {
        return _updateParent(store, entry).then((_) => status);
  
      });
    }
  
    static Future _updateParent(ObjectStore store, chrome.Entry entry) {
      print('up parent');
      return entry.getParent().then((chrome.DirectoryEntry root) {
        print(root.fullPath);
        return FileOps.listFiles(root).then((entries) {
          bool isChanged = entries.any((entry) {
            FileStatus status = store.index.getStatusForEntry(entry);
              return status != null && status.type != FileStatusType.COMMITTED;
          });
          FileStatus status = FileStatus.createForDirectory(root);
          if (isChanged) {
            status.type = FileStatusType.MODIFIED;
          } else {
            status.type = FileStatusType.COMMITTED;
          }
          store.index.updateIndexForEntry(status);
          print('asdf');
          if (root.fullPath != store.root.fullPath) {
            return _updateParent(store, root);
          }
        });
      });
    }
  