| Index: visual_studio/NativeClientVSAddIn/create_package.py
 | 
| diff --git a/visual_studio/NativeClientVSAddIn/create_package.py b/visual_studio/NativeClientVSAddIn/create_package.py
 | 
| index 6920bcceefb31f8f1241b6516443fd0794cd3af1..9eac232a66d9760cca37745dd6b453dad672ac93 100644
 | 
| --- a/visual_studio/NativeClientVSAddIn/create_package.py
 | 
| +++ b/visual_studio/NativeClientVSAddIn/create_package.py
 | 
| @@ -18,6 +18,7 @@ import win32api
 | 
|  import shutil
 | 
|  import tarfile
 | 
|  import zipfile
 | 
| +import string
 | 
|  import sys
 | 
|  from os.path import join
 | 
|  
 | 
| @@ -30,7 +31,8 @@ ROOT = os.path.dirname(os.path.dirname(SCRIPT_DIR))
 | 
|  BUILD_DIR = join(ROOT, 'out', 'vs_addin')
 | 
|  
 | 
|  # Directory that contains the build assemblies.
 | 
| -ASSEMBLY_DIRECTORY = join(BUILD_DIR, 'Debug')
 | 
| +ASSEMBLY_DIRECTORY_2010 = join(BUILD_DIR, '2010', 'Debug')
 | 
| +ASSEMBLY_DIRECTORY_2012 = join(BUILD_DIR, '2012', 'Debug')
 | 
|  
 | 
|  # Directory containing static installer resources.
 | 
|  RESOURCE_DIRECTORY = join(SCRIPT_DIR, 'InstallerResources')
 | 
| @@ -42,14 +44,16 @@ OUTPUT_NAME = join(BUILD_DIR, 'vs_addin.tgz')
 | 
|  ADDIN_METADATA = join(RESOURCE_DIRECTORY, 'NativeClientVSAddIn.AddIn')
 | 
|  
 | 
|  # AddIn dll file path. We will obtain our add-in version from this.
 | 
| -ADDIN_ASSEMBLY = join(ASSEMBLY_DIRECTORY, 'NativeClientVSAddIn.dll')
 | 
| +ADDIN_ASSEMBLY_2010 = join(ASSEMBLY_DIRECTORY_2010, 'NativeClientVSAddIn.dll')
 | 
| +ADDIN_ASSEMBLY_2012 = join(ASSEMBLY_DIRECTORY_2012, 'NativeClientVSAddIn.dll')
 | 
|  
 | 
|  # Regex list to exclude from the archive. If a file path matches any of the
 | 
|  # expressions during a call to AddFolderToArchive it is excluded from the
 | 
|  # archive file.
 | 
|  EXCLUDES = [
 | 
|      r'\.svn', # Exclude .svn directories.
 | 
| -    r'\.swp', # Exclude .swp files.
 | 
| +    r'\.swp$', # Exclude .swp files.
 | 
| +    r'\.pyc$', # Exclude .pyc files.
 | 
|      r'examples\\.*\\chrome_data',
 | 
|      r'examples\\.*\\Debug',
 | 
|      r'examples\\.*\\newlib',
 | 
| @@ -64,8 +68,11 @@ EXCLUDES = [
 | 
|  
 | 
|  # List of source/destination pairs to include in archive file.
 | 
|  FILE_LIST = [
 | 
| -  (ADDIN_ASSEMBLY, ''),
 | 
| -  (join(ASSEMBLY_DIRECTORY, 'NaCl.Build.CPPTasks.dll'), 'NaCl')]
 | 
| +  (ADDIN_ASSEMBLY_2010, '2010'),
 | 
| +  (ADDIN_ASSEMBLY_2012, '2012'),
 | 
| +  (join(ASSEMBLY_DIRECTORY_2010, 'NativeClientVSAddIn.AddIn'), '2010'),
 | 
| +  (join(ASSEMBLY_DIRECTORY_2012, 'NativeClientVSAddIn.AddIn'), '2012'),
 | 
| +  (join(ASSEMBLY_DIRECTORY_2010, 'NaCl.Build.CPPTasks.dll'), 'NaCl')]
 | 
|  
 | 
|  
 | 
|  def AddFolderToArchive(path, archive, root=""):
 | 
| @@ -95,33 +102,31 @@ def AddFolderToArchive(path, archive, root=""):
 | 
|        WriteFileToArchive(archive, read_path, write_path)
 | 
|  
 | 
|  
 | 
| -def AddVersionModifiedAddinFile(archive):
 | 
| -  """Modifies the .AddIn file with the build version and adds to the zip.
 | 
| +def CopyAddinFile(assembly, path, vs_version):
 | 
| +  """Copy the .AddIn file to the given path while making the necessary
 | 
| +  replacements.
 | 
|  
 | 
|    The version number is obtained from the NativeClientAddIn.dll assembly which
 | 
|    is built during the build process.
 | 
| -
 | 
| -  Args:
 | 
| -  archive: Already open archive file.
 | 
|    """
 | 
| -  path = '\\VarFileInfo\\Translation'
 | 
| -  pairs = win32api.GetFileVersionInfo(ADDIN_ASSEMBLY, path)
 | 
| +  infopath = '\\VarFileInfo\\Translation'
 | 
| +  pairs = win32api.GetFileVersionInfo(assembly, infopath)
 | 
|    lang, codepage = pairs[0]
 | 
| -  path = u'\\StringFileInfo\\%04X%04X\\ProductVersion' % (lang, codepage)
 | 
| -  prodVersion = win32api.GetFileVersionInfo(ADDIN_ASSEMBLY, path)
 | 
| +  infopath = u'\\StringFileInfo\\%04X%04X\\ProductVersion' % (lang, codepage)
 | 
| +  prodVersion = win32api.GetFileVersionInfo(assembly, infopath)
 | 
|    version = "[%s]" % prodVersion
 | 
|    print "\nNaCl VS Add-in Build version: %s\n" % (version)
 | 
|  
 | 
|    metadata_filename = os.path.basename(ADDIN_METADATA)
 | 
| -  modified_file = join(ASSEMBLY_DIRECTORY, metadata_filename)
 | 
| +  modified_file = join(path, metadata_filename)
 | 
|  
 | 
|    # Copy the metadata file to new location and modify the version info.
 | 
|    with open(ADDIN_METADATA, 'r') as source_file:
 | 
|      with open(modified_file, 'w') as dest_file:
 | 
| -      for line in source_file:
 | 
| -        dest_file.write(line.replace("[REPLACE_ADDIN_VERSION]", version))
 | 
| -
 | 
| -  WriteFileToArchive(archive, modified_file, metadata_filename)
 | 
| +      data = source_file.read()
 | 
| +      replacements = {'VS_VERSION': vs_version, 'ADDIN_VERSION': version}
 | 
| +      data = string.Template(data).substitute(replacements)
 | 
| +      dest_file.write(data)
 | 
|  
 | 
|  
 | 
|  def Error(msg):
 | 
| @@ -144,25 +149,41 @@ def CopyWithReplacement(src, dest, replacements):
 | 
|    os.makedirs(dest)
 | 
|    src_basename = os.path.basename(src)
 | 
|    dest_basename = os.path.basename(dest)
 | 
| -  for filename in os.listdir(src):
 | 
| -    srcfile = join(src, filename)
 | 
| -    # skip non-files, in particular .svn folders.
 | 
| -    if not os.path.isfile(srcfile):
 | 
| -      continue
 | 
| -    destfile = join(dest, filename.replace(src_basename, dest_basename))
 | 
| -    with open(srcfile, "rb") as f:
 | 
| -      data = f.read()
 | 
| -      for pat, subst in replacements.iteritems():
 | 
| -        data = data.replace(pat, subst)
 | 
| -    with open(destfile, "wb") as f:
 | 
| -      f.write(data)
 | 
| +
 | 
| +  olddir = os.getcwd()
 | 
| +  try:
 | 
| +    os.chdir(src)
 | 
| +    for root, dirs, filenames in os.walk('.'):
 | 
| +      for filename in filenames:
 | 
| +        srcfile = join(root, filename)
 | 
| +        # skip non-files, in particular .svn folders.
 | 
| +        if not os.path.isfile(srcfile):
 | 
| +          continue
 | 
| +
 | 
| +        destdir = join(dest, root.replace(src_basename, dest_basename))
 | 
| +        if not os.path.exists(destdir):
 | 
| +          os.makedirs(destdir)
 | 
| +
 | 
| +        destfile = join(destdir, filename.replace(src_basename, dest_basename))
 | 
| +        with open(srcfile, "rb") as f:
 | 
| +          data = f.read()
 | 
| +          for pat, subst in replacements.iteritems():
 | 
| +            data = data.replace(pat, subst)
 | 
| +        with open(destfile, "wb") as f:
 | 
| +          f.write(data)
 | 
| +  finally:
 | 
| +    os.chdir(olddir)
 | 
|  
 | 
|  
 | 
|  def main():
 | 
|    if not os.path.exists(BUILD_DIR):
 | 
|      Error("build dir not found: %s" % BUILD_DIR)
 | 
|  
 | 
| +  CopyAddinFile(ADDIN_ASSEMBLY_2010, ASSEMBLY_DIRECTORY_2010, '10.0')
 | 
| +  CopyAddinFile(ADDIN_ASSEMBLY_2012, ASSEMBLY_DIRECTORY_2012, '11.0')
 | 
| +
 | 
|    archive = tarfile.open(OUTPUT_NAME, 'w:gz')
 | 
| +
 | 
|    for source_dest in FILE_LIST:
 | 
|      file_name = os.path.basename(source_dest[0])
 | 
|      dest = join(source_dest[1], file_name)
 | 
| @@ -203,7 +224,6 @@ def main():
 | 
|    CopyWithReplacement(src, dest, pnacl_replacements)
 | 
|    AddFolderToArchive(dest, archive, "PNaCl")
 | 
|  
 | 
| -  AddVersionModifiedAddinFile(archive)
 | 
|    archive.close()
 | 
|  
 | 
|  
 | 
| 
 |