summaryrefslogtreecommitdiffstats
path: root/tools/scripts/git_submodule.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/scripts/git_submodule.py')
-rw-r--r--tools/scripts/git_submodule.py225
1 files changed, 83 insertions, 142 deletions
diff --git a/tools/scripts/git_submodule.py b/tools/scripts/git_submodule.py
index 4599379a..f45f08ca 100644
--- a/tools/scripts/git_submodule.py
+++ b/tools/scripts/git_submodule.py
@@ -43,7 +43,6 @@ import glob
import os
import subprocess
import sys
-import version_resolver as resolver
extra_os = ['android', 'mac']
@@ -76,65 +75,25 @@ class DEPSParser:
subdir = dep
if subdir.startswith('src/'):
subdir = subdir[4:]
- if subdir.startswith('src'):
- # Ignore the information about chromium since we get that from git.
- continue
- shasum = ''
- if len(rev) == 40: # Length of a git shasum
- shasum = rev
- submodule = Submodule(subdir, repo)
- submodule.os = os
- submodule.shasum = shasum
- if not submodule.shasum:
- # We need to parse the svn branch and revision number.
- ref = repo
- # Try to find out the branch.
- ref_path = repo.split('branches/')
- if len(ref_path) > 1:
- ref = ref_path[1]
- if 'trunk' in ref or 'svn' in ref:
- # Trunk is used, so we can use the remote master.
- ref = 'master'
- name_path = subdir.split('/')
- if len(name_path) > 1:
- # At this point some svn repository paths still include the repo name
- # after the actual branch so we have to strip it together with the leading /
- name = name_path[-1]
- if ref.endswith(name):
- branch = ref[:-(len(name) + 1)]
- ref = 'refs/branch-heads/' + branch
- if name in ref:
- # At this point the last partition in the path
- # is the branch name, so compose the git ref.
- branch = ref.split('/')[-1]
- ref = 'refs/branch-heads/' + branch
- if 'master' not in ref and 'refs/branch-heads' not in ref:
- # Finally compose the refs that did not mach previous rules.
- ref = 'refs/branch-heads/' + ref
- submodule.ref = ref
- submodule.revision = int(rev)
+ submodule = Submodule(subdir, repo, rev, os)
+ submodule.deps = True
submodules.append(submodule)
return submodules
def sanityCheckModules(self, submodules):
- submodule_dict = {}
+ subdirectories = []
for submodule in submodules:
- if not submodule.matchesOS():
- print '-- skipping ' + submodule.path + ' for this operating system. --'
- continue
- if submodule.path in submodule_dict:
- prev_module = submodule_dict[submodule.path]
- # We might have to create our own DEPS file if different platforms use different branches,
- # but for now it should be safe to select the latest revision from the requirements.
- if submodule.shasum or prev_module.revision >= submodule.revision:
- continue
- if prev_module.ref != submodule.ref:
- sys.exit('ERROR: branch mismatch for ' + submodule.path + '(' + prev_module.ref + ' vs ' + submodule.ref + ')')
- print('Duplicate submodule ' + submodule.path + '. Using latest revison ' + str(submodule.revision) + '.')
- submodule_dict[submodule.path] = submodule
- return list(submodule_dict.values())
+ if submodule.path in subdirectories:
+ print 'SUBMODULE WARNING: duplicate for submodule' + submodule.path
+ subdirectories.append(submodule.path)
- def parse(self, deps_content):
+ def parseFile(self, deps_file_name):
+ currentDir = os.getcwd()
+ if not os.path.isfile(deps_file_name):
+ return []
+ deps_file = open(deps_file_name)
+ deps_content = deps_file.read().decode('utf-8')
+ deps_file.close()
exec(deps_content, self.global_scope, self.local_scope)
submodules = []
@@ -142,16 +101,9 @@ class DEPSParser:
for os_dep in self.local_scope['deps_os']:
submodules.extend(self.createSubmodulesFromScope(self.local_scope['deps_os'][os_dep], os_dep))
- return self.sanityCheckModules(submodules)
+ self.sanityCheckModules(submodules)
- def parseFile(self, deps_file_name):
- currentDir = os.getcwd()
- if not os.path.isfile(deps_file_name):
- return []
- deps_file = open(deps_file_name)
- deps_content = deps_file.read().decode('utf-8')
- deps_file.close()
- return self.parse(deps_content)
+ return submodules
@@ -162,7 +114,7 @@ class Submodule:
self.shasum = shasum
self.os = os
self.ref = ''
- self.revision = None
+ self.deps = False
def matchesOS(self):
if not self.os:
@@ -180,45 +132,18 @@ class Submodule:
return True
return False
- def findShaAndCheckout(self):
- oldCwd = os.getcwd()
- os.chdir(self.path)
- error = 0
- if self.ref:
- # Fetch the ref we parsed from the DEPS file.
- val = subprocessCall(['git', 'fetch', 'origin', self.ref])
- if val != 0:
- sys.exit("Could not fetch branch from upstream " + self.ref)
- error = subprocessCall(['git', 'checkout', 'FETCH_HEAD']);
-
- search_string = ''
- if self.path.endswith('/chromium'):
- search_string = resolver.currentVersion()
- elif self.revision:
- search_string = '@' + str(self.revision) + ' '
- if search_string:
- line = subprocessCheckOutput(['git', 'log', '-n1', '--pretty=oneline', '--grep=' + search_string])
- if line:
- self.shasum = line.split(' ')[0]
- else: # No revision set, use the submodule shasum
- os.chdir(oldCwd)
- line = subprocessCheckOutput(['git', 'submodule', 'status', self.path])
- os.chdir(self.path)
- line = line.lstrip(' -')
- self.shasum = line.split(' ')[0]
-
- current_shasum = subprocessCheckOutput(['git', 'show', '-s', '--oneline']).split(' ')[0]
- if not self.shasum.startswith(current_shasum):
- # In case HEAD differs check out the actual shasum we require.
- error = subprocessCall(['git', 'checkout', self.shasum])
- os.chdir(oldCwd)
- return error
+ def findSha(self):
+ if self.shasum != '':
+ return
+ line = subprocessCheckOutput(['git', 'submodule', 'status', self.path])
+ line = line.lstrip(' -')
+ self.shasum = line.split(' ')[0]
def findGitDir(self):
try:
return subprocessCheckOutput(['git', 'rev-parse', '--git-dir']).strip()
except subprocess.CalledProcessError, e:
- sys.exit("git dir could not be determined! - Initialization failed! " + e.output)
+ sys.exit("git dir could not be determined! - Initialization failed!" + e.output)
def reset(self):
currentDir = os.getcwd()
@@ -242,14 +167,26 @@ class Submodule:
print '-- initializing ' + self.path + ' --'
if os.path.isdir(self.path):
self.reset()
-
- if self.url:
+ if self.deps:
subprocessCall(['git', 'submodule', 'add', '-f', self.url, self.path])
subprocessCall(['git', 'submodule', 'init', self.path])
subprocessCall(['git', 'submodule', 'update', self.path])
-
- if self.findShaAndCheckout() != 0:
- sys.exit("!!! initialization failed !!!")
+ self.findSha()
+ currentDir = os.getcwd()
+ os.chdir(self.path)
+ # Make sure we have checked out the right shasum.
+ # In case there were other patches applied before.
+ if self.ref:
+ val = subprocessCall(['git', 'fetch', 'origin', self.ref]);
+ if val != 0:
+ sys.exit("Could not fetch branch from upstream.")
+ subprocessCall(['git', 'checkout', 'FETCH_HEAD']);
+ else:
+ val = subprocessCall(['git', 'checkout', self.shasum])
+ if val != 0:
+ sys.exit("!!! initialization failed !!!")
+ self.initSubmodules()
+ os.chdir(currentDir)
else:
print '-- skipping ' + self.path + ' for this operating system. --'
@@ -266,49 +203,53 @@ class Submodule:
def readSubmodules(self):
- submodules = []
- if self.ref:
- submodules = resolver.readSubmodules()
- print 'DEPS file provides the following submodules:'
- for submodule in submodules:
- submodule_ref = submodule.shasum
- if submodule.revision:
- submodule_ref = submodule.ref + '@' + str(submodule.revision)
- print '{:<80}'.format(submodule.path) + '{:<120}'.format(submodule.url) + submodule_ref
- else: # Try .gitmodules since no ref has been specified
- if not os.path.isfile('.gitmodules'):
- return []
- gitmodules_file = open('.gitmodules')
- gitmodules_lines = gitmodules_file.readlines()
- gitmodules_file.close()
+ if not os.path.isfile('.gitmodules'):
+ return []
+ gitmodules_file = open('.gitmodules')
+ gitmodules_lines = gitmodules_file.readlines()
+ gitmodules_file.close()
- submodules = []
- currentSubmodule = None
- for line in gitmodules_lines:
- if line.find('[submodule') == 0:
- if currentSubmodule:
- submodules.append(currentSubmodule)
- currentSubmodule = Submodule()
- tokens = line.split('=')
- if len(tokens) >= 2:
- key = tokens[0].strip()
- value = tokens[1].strip()
- if key == 'path':
- currentSubmodule.path = value
- elif key == 'url':
- currentSubmodule.url = value
- elif key == 'os':
- currentSubmodule.os = value.split(',')
- if currentSubmodule:
- submodules.append(currentSubmodule)
+ submodules = []
+ currentSubmodule = None
+ for line in gitmodules_lines:
+ if line.find('[submodule') == 0:
+ if currentSubmodule:
+ submodules.append(currentSubmodule)
+ currentSubmodule = Submodule()
+ tokens = line.split('=')
+ if len(tokens) >= 2:
+ key = tokens[0].strip()
+ value = tokens[1].strip()
+ if key == 'path':
+ currentSubmodule.path = value
+ elif key == 'url':
+ currentSubmodule.url = value
+ elif key == 'os':
+ currentSubmodule.os = value.split(',')
+ if currentSubmodule:
+ submodules.append(currentSubmodule)
return submodules
+ def readDeps(self):
+ parser = DEPSParser()
+ return parser.parseFile('.DEPS.git')
+
def initSubmodules(self):
- oldCwd = os.getcwd()
- os.chdir(self.path)
+ # try reading submodules from .gitmodules.
submodules = self.readSubmodules()
for submodule in submodules:
submodule.initialize()
- if self.ref:
- subprocessCall(['git', 'commit', '-a', '-m', 'initialize submodules'])
- os.chdir(oldCwd)
+ if submodules:
+ return
+ # if we could not find any submodules in .gitmodules, try .DEPS.git
+ submodules = self.readDeps()
+
+ if not submodules:
+ return
+
+ print 'DEPS file provides the following submodules:'
+ for submodule in submodules:
+ print '{:<80}'.format(submodule.path) + '{:<120}'.format(submodule.url) + submodule.shasum
+ for submodule in submodules:
+ submodule.initialize()
+ subprocessCall(['git', 'commit', '-a', '-m', '"initialize submodules"'])