anchor.diff:    }
   }
   
  -// TODO(sunglim): Fix me. This doesn't support Windows.
   String _getCommandOutput(String command) {
  -  return Process.runSync('/bin/sh', ['-c', command]).stdout.trim();
  +  if (Platform.isWindows) {
  +    return Process.runSync('cmd.exe', ['/c', command]).stdout.trim();
  +  } else {
  +    return Process.runSync('/bin/sh', ['-c', command]).stdout.trim();
  +  }
   }
   
   /**
  
positive.code: // archive and name the archive with the revision identifier.
  void _archiveWithRevision(GrinderContext context) {
    context.log('Performing archive instead.');
    archive(context);
    File file = new File('dist/spark.zip');
    String version = _getCurrentRevision();
    String filename = 'spark-rev-${version}.zip';
    file.rename('dist/${filename}');
    context.log("Created ${filename}");
  }
  
  
negative.code: 
    archive(context);
  
    var sep = Platform.pathSeparator;
    _runCommandSync(
      context,
      'git checkout app${sep}manifest.json');
    _increaseBuildNumber(context);
    _runCommandSync(
      context,
      // "(double quotes) is ignored from |args| parameter of Process.runSync.
      // So the commit message is made as one long word with '_' char.
      'git commit -m Build_version_${version} app${sep}manifest.json');
  
    File file = new File('dist/spark.zip');
    String filename = 'spark-${version}.zip';
  