summaryrefslogtreecommitdiffstats
path: root/mojo/tools/rev_sdk.py
blob: 0ca317fbfd84b0d1b7f8f7004476985a959788e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tool to roll Mojo into Chromium. See:
https://github.com/domokit/mojo/wiki/Rolling-code-between-chromium-and-mojo#mojo---chromium-updates-sdk--edk
"""

import os
import sys
from utils import commit
from utils import chromium_root_dir
from utils import system

sdk_prefix_in_chromium = "third_party/mojo/src"
sdk_dirs_to_clone = [
  "mojo/edk",
  "mojo/public",
  "nacl_bindings",
]

sdk_dirs_to_not_clone = [
  "mojo/public/cpp/application",
  "mojo/public/interfaces/application",
  "mojo/public/interfaces/network",
  "mojo/public/java/application",
]

# Individual files to preserve within the target repository during roll. These
# are relative to |sdk_prefix_in_chromium| but are not maintained in the mojo
# repository.
preserved_chromium_files = [
  "mojo/edk/DEPS",
  "mojo/public/DEPS",
  "mojo/public/platform/nacl/DEPS",
  "nacl_bindings/DEPS",
]

# A dictionary mapping dirs to clone to their destination locations in Chromium.
dirs_to_clone = {}

for sdk_dir in sdk_dirs_to_clone:
  sdk_dir_in_chromium = os.path.join(sdk_prefix_in_chromium, sdk_dir)
  dirs_to_clone[sdk_dir] = sdk_dir_in_chromium

def rev(source_dir, chromium_dir, mojo_revision):
  src_commit = system(["git", "rev-parse", mojo_revision],
                      cwd=source_dir).strip()

  for input_dir, dest_dir in dirs_to_clone.iteritems():
    if os.path.exists(os.path.join(chromium_dir, dest_dir)):
      print "removing directory %s" % dest_dir
      system(["git", "rm", "-r", dest_dir], cwd=chromium_dir)
    print "cloning directory %s into %s" % (input_dir, dest_dir)
    files = system(["git", "ls-files", input_dir], cwd=source_dir)
    for f in files.splitlines():
      # Don't copy presubmit files over since the code is read-only on the
      # chromium side.
      if os.path.basename(f) == "PRESUBMIT.py":
        continue

      exclude = False
      for excluded in sdk_dirs_to_not_clone:
        if f.startswith(excluded):
          exclude = True
          break
      if exclude:
        continue

      # Clone |f| into Chromium under |dest_dir| at its location relative to
      # |input_dir|.
      f_relpath = os.path.relpath(f, input_dir)
      dest_path = os.path.join(chromium_dir, dest_dir, f_relpath)
      system(["mkdir", "-p", os.path.dirname(dest_path)])
      system(["cp", os.path.join(source_dir, f), dest_path])
    os.chdir(chromium_dir)
    system(["git", "add", dest_dir], cwd=chromium_dir)

  mojo_public_dest_dir = os.path.join(sdk_prefix_in_chromium, "mojo/public")
  version_filename = os.path.join(mojo_public_dest_dir, "VERSION")
  with open(version_filename, "w") as version_file:
    version_file.write(src_commit)
  system(["git", "add", version_filename], cwd=chromium_dir)

  # Reset preserved files that were blown away.
  for rel_path in preserved_chromium_files:
    preserved_path = os.path.join(sdk_prefix_in_chromium, rel_path)
    system(["git", "reset", "--", preserved_path])
    system(["git", "checkout", preserved_path])

  commit("Update mojo sdk to rev " + src_commit, cwd=chromium_dir)

if len(sys.argv) < 2:
  print "usage: rev_sdk.py <mojo source dir> [<mojo revision>]"
  sys.exit(1)

# Allow override of the roll revision.
if len(sys.argv) == 3:
  mojo_revision = sys.argv[2]
else:
  mojo_revision = 'origin/HEAD'

rev(sys.argv[1], chromium_root_dir, mojo_revision)