Dependency indication in Crosswalk - PeterWangIntel/crosswalk-website GitHub Wiki

About

Since we will maintain downstream chromium/blink for Crosswalk, may be more other repos in future. It’s necessary to provide a mechanism to indicate the dependency in crosswalk’s main project repo.

Objective

  • The dependency should be accurate as the downstream repo evolving. A bad example of this is to say that Crosswalk dev branch is depends on chromium-crosswalk lkgr branch. The lkgr branch will be changing overtime, and it will be hard to get the specified source tree back to some history point.
  • The indication should come with a solution to check out the whole source tree easily. It will be very helpful for both developer and build infrastructure.
  • Crosswalk should only maintain its real dependency (the downstream repos we forked) instead of copy the whole dependency from chromium.

Solution in chromium

  • Chromium has DEPS file in its major project which contains all dependencies of third party repos.
  • The dependency is expressed by svn revision or git commit hash id.
  • Chromium uses gclient tool to fetch and sync code.
  • For versioned checkout, chromium provides the DEPS for specified version individually at http://src.chromium.org/svn/releases/ . It’s a snapshot of all the repos’s (including chromium itself) svn revision.

For Crosswalk

Solution:

Add two deps file into Crosswalk repo, DEPS and DEPS.crosswalk. DEPS is like:

vars = {
}

deps = {
}

hooks = [
  {
    # Fetch Crosswalk dependencies.
    "pattern": ".",
    "action": ["python", "src/crosswalk/tools/fetch_deps.py", "-v"],
  },
  {
    # A change to a .gyp, .gypi, or to GYP itself should run the generator.
    "pattern": ".",
    "action": ["python", "src/crosswalk/gyp_crosswalk"],
  }
]

DEPS.crosswalk is like:

chromium_version = 'Trunk'
chromium_crosswalk_point = '45a733d6ac45650d9ddc019ade3c7dbd3b91a816'
deps_crosswalk = {
  'src': 'ssh://github.com/crosswalk-project/chromium-crosswalk.git@%s' % chromium_crosswalk_point,
  'src/third_party/WebKit/Tools/DumpRenderTree': None
}

DEPS.crosswalk is the one that keeps all Crosswalk’s dependency information. There will be a python script in Crosswalk which will take this DEPS.crosswalk as input and generate a new .gclient-crosswalk file for chromium. Then the python script will invoke gclient sync upon it. The .gclient-crosswalk file will be like:

solutions = [{
  'url': 'ssh://github.com/crosswalk-project/chromium-crosswalk.git@45a733d6ac45650d9ddc019ade3c7dbd3b91a816',
  'name': 'src',
  'deps_file': '.DEPS.git',
  'custom_deps': {
    'src/third_party/WebKit/Tools/DumpRenderTree': None
  }
}]

And we put the execution of the fetch_deps.py as a hook in Crosswalk's DEPS file. Which means if we run gclient sync on the Crosswalk project, it will do:

  • Checkout Crosswalk
  • Run Crosswalk gclient hooks
    • Invoke fetch_deps.py
      • Setup git repo in src/.
        • git init in src/
        • git remote add in src/
        • git fetch in src/
        • git checkout in src/
      • Generate .gclient-crosswalk.
      • Invoke gclient sync –gclient-file=.gclient-crosswalk
        • Checkout chromium and its dependencies, which some of them are overwritten if it’s also defined in DEPS.crosswalk
        • Run chromium gclient hooks
    • Do gyp crosswalk

For versioned checkout, Crosswalk can do the same thing as chromium. Provide a snapshot that combines the DEPS in chromium and the DEPS.crosswalk in Crosswalk.

Based on the solution:

  • The dependencies is indicated clearly to support bisect.
  • Easy to checkout source tree.
    • Gclient config + gclient sync for trunk/version/any history point checkout.
  • Integration with our downstream rebase work.
    • Do rebase first. After conflict resolve/build/test/etc, prepare the branch in downstream chromium.
    • Send a pull request to Crosswalk to update DEPS.crosswalk, maybe some code together to adapt upstream change.
  • Integration with cross project development.
    • Developer will first send pull request for chromium/blink part of code.
    • After chromium part got merged, send a pull request to Crosswalk to update DEPS.crosswalk as well as the Crosswalk part of code.

Compare with CEF3

  • The idea is very similar
    • CEF3 uses a text file to indicate the chromium revision it depends on
  • The implementation are different:
    • CEF3 use automate.py instead of gclient system for itself, but it do invoke gclient sync for chromium anyway.
    • CEF3 chooses to maintain patches instead of downstream fork, so no custom deps at all.