anchor.diff:    }
   }
   
  +void _copyFileWithNewName(File srcFile, Directory destDir, String destFileName,
  +                          [GrinderContext context]) {
  +  File destFile = joinFile(destDir, [destFileName]);
  +  if (context != null) {
  +    context.log('copying ${srcFile.path} to ${destFile.path}');
  +  }
  +  destDir.createSync(recursive: true);
  +  destFile.writeAsBytesSync(srcFile.readAsBytesSync());
  +}
  +
   void _runCommandSync(GrinderContext context, String command, {String cwd}) {
     context.log(command);
   
  
positive.code:   _polymerDeploy(context, sourceDir, destDir);
  
    Directory deployWeb = joinDir(destDir, ['web']);
    _dart2jsCompile(context, deployWeb, 'services_impl.dart', true);
    _copyFileWithNewName(
        joinFile(deployWeb, ['services_impl.dart.precompiled.js']),
        deployWeb, 'services_impl.dart.js', context);
    _dart2jsCompile(context, deployWeb,
        'spark_polymer.html_bootstrap.dart', true);
  
    _runCommandSync(
        context,
        'patch ${destDir.path}/web/packages/shadow_dom/shadow_dom.debug.js tool/shadow_dom.patch');
  }
  
  // Left out from grinder package due to plans to deprecate it in favor of hop.
  void _copyFileWithNewName(File srcFile, Directory destDir, String destFilename,
        GrinderContext context) {
    File destFile = joinFile(destDir, [destFilename]);
  
    if (context != null) {
      context.log('copying ${srcFile.path} to ${destFile.path}');
    }
    destDir.createSync(recursive: true);
    destFile.writeAsBytesSync(srcFile.readAsBytesSync());
  }
  
  // Creates a release build to be uploaded to Chrome Web Store.
  
negative.code: }
  
  /**
   * Copy all source to `build/deploy`. Do a polymer deploy to `build/deploy-out`.
   * This builds the regular (non-test) version of the app.
   */
  