#!/usr/bin/env python

import errno
import glob
import os
import shutil
import subprocess
import sys
import tarfile

from lib.util import *


SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
DIST_DIR = os.path.join(SOURCE_ROOT, 'dist')
NODE_DIR = os.path.join(SOURCE_ROOT, 'vendor', 'node')
DIST_HEADERS_NAME = 'node-{0}'.format(get_atom_shell_version())
DIST_HEADERS_DIR = os.path.join(DIST_DIR, DIST_HEADERS_NAME)

BUNDLE_NAME = 'Atom.app'
BUNDLE_DIR = os.path.join(SOURCE_ROOT, 'out', 'Release', BUNDLE_NAME)

HEADERS_SUFFIX = [
  '.h',
  '.gypi',
]
HEADERS_DIRS = [
  'src',
  'deps/http_parser',
  'deps/v8',
  'deps/zlib',
  'deps/uv',
]
HEADERS_FILES = [
  'common.gypi',
  'config.gypi',
]


def main():
  rm_rf(DIST_DIR)
  os.makedirs(DIST_DIR)

  force_build()
  copy_binaries()
  copy_headers()
  copy_license()
  create_version()
  create_zip()
  create_header_tarball()


def force_build():
  build = os.path.join(SOURCE_ROOT, 'script', 'build.py')
  subprocess.check_call([sys.executable, build, '-c', 'Release']);


def copy_binaries():
  shutil.copytree(BUNDLE_DIR, os.path.join(DIST_DIR, BUNDLE_NAME),
                  symlinks=True)


def copy_headers():
  os.mkdir(DIST_HEADERS_DIR)
  for include_path in HEADERS_DIRS:
    abs_path = os.path.join(NODE_DIR, include_path)
    for dirpath, dirnames, filenames in os.walk(abs_path):
      for filename in filenames:
        extension = os.path.splitext(filename)[1]
        if extension not in HEADERS_SUFFIX:
          continue
        copy_source_file(os.path.join(dirpath, filename))
  for other_file in HEADERS_FILES:
    copy_source_file(os.path.join(NODE_DIR, other_file))


def copy_license():
  license = os.path.join(SOURCE_ROOT, 'LICENSE')
  shutil.copy2(license, DIST_DIR)


def create_version():
  version_path = os.path.join(SOURCE_ROOT, 'dist', 'version')
  with open(version_path, 'w') as version_file:
    version_file.write(get_atom_shell_version())


def create_zip():
  print "Zipping distribution..."
  zip_file = os.path.join(SOURCE_ROOT, 'dist', 'atom-shell.zip')
  safe_unlink(zip_file)

  with scoped_cwd(DIST_DIR):
    files = ['Atom.app', 'LICENSE', 'version']
    subprocess.check_call(['zip', '-r', '-y', zip_file] + files)


def create_header_tarball():
  with scoped_cwd(DIST_DIR):
    tarball = tarfile.open(name=DIST_HEADERS_DIR + '.tar.gz', mode='w:gz')
    tarball.add(DIST_HEADERS_NAME)
    tarball.close()


def copy_source_file(source):
  relative = os.path.relpath(source, start=NODE_DIR)
  destination = os.path.join(DIST_HEADERS_DIR, relative)
  safe_mkdir(os.path.dirname(destination))
  shutil.copy2(source, destination)


if __name__ == '__main__':
  sys.exit(main())

@@ -623,21 +623,8 @@
 r',%0A
-  'deps/v8',%0A
   'd
@@ -634,16 +634,16 @@
 /zlib',%0A
+
   'deps/
@@ -1208,16 +1208,70 @@
 RS_DIR)%0A
+  # Copy standard node headers from node. repository.%0A
   for in
@@ -1661,32 +1661,41 @@
 opy_source_file(
+source = 
 os.path.join(NOD
@@ -1711,24 +1711,583 @@
 her_file))%0A%0A
+  # Copy V8 headers from chromium's repository.%0A  src = os.path.join(SOURCE_ROOT, 'vendor', 'brightray', 'vendor', 'download',%0A                    'libchromiumcontent', 'src')%0A  for dirpath, dirnames, filenames in os.walk(os.path.join(src, 'v8')):%0A    for filename in filenames:%0A      extension = os.path.splitext(filename)%5B1%5D%0A      if extension not in HEADERS_SUFFIX:%0A        continue%0A      copy_source_file(source=os.path.join(dirpath, filename),%0A                       start=src,%0A                       destination=os.path.join(DIST_HEADERS_DIR, 'deps'))%0A%0A
 %0Adef copy_li
@@ -3065,16 +3065,62 @@
 e(source
+, start=NODE_DIR, destination=DIST_HEADERS_DIR
 ):%0A  rel
@@ -3161,20 +3161,23 @@
 art=
-NODE_DIR)%0A  
+start)%0A  final_
 dest
@@ -3199,32 +3199,27 @@
 th.join(
-DIST_HEADERS_DIR
+destination
 , relati
@@ -3251,16 +3251,22 @@
 dirname(
+final_
 destinat
@@ -3294,16 +3294,22 @@
 source, 
+final_
 destinat

Use Chromium V8's headers in the node headers tarball.