diff options
| -rw-r--r-- | project.py | 28 |
1 files changed, 20 insertions, 8 deletions
| @@ -2197,24 +2197,27 @@ class Project: | |||
| 2197 | 2197 | ||
| 2198 | def get_submodules(gitdir, rev): | 2198 | def get_submodules(gitdir, rev): |
| 2199 | # Parse .gitmodules for submodule sub_paths and sub_urls. | 2199 | # Parse .gitmodules for submodule sub_paths and sub_urls. |
| 2200 | sub_paths, sub_urls = parse_gitmodules(gitdir, rev) | 2200 | sub_paths, sub_urls, sub_shallows = parse_gitmodules(gitdir, rev) |
| 2201 | if not sub_paths: | 2201 | if not sub_paths: |
| 2202 | return [] | 2202 | return [] |
| 2203 | # Run `git ls-tree` to read SHAs of submodule object, which happen | 2203 | # Run `git ls-tree` to read SHAs of submodule object, which happen |
| 2204 | # to be revision of submodule repository. | 2204 | # to be revision of submodule repository. |
| 2205 | sub_revs = git_ls_tree(gitdir, rev, sub_paths) | 2205 | sub_revs = git_ls_tree(gitdir, rev, sub_paths) |
| 2206 | submodules = [] | 2206 | submodules = [] |
| 2207 | for sub_path, sub_url in zip(sub_paths, sub_urls): | 2207 | for sub_path, sub_url, sub_shallow in zip( |
| 2208 | sub_paths, sub_urls, sub_shallows | ||
| 2209 | ): | ||
| 2208 | try: | 2210 | try: |
| 2209 | sub_rev = sub_revs[sub_path] | 2211 | sub_rev = sub_revs[sub_path] |
| 2210 | except KeyError: | 2212 | except KeyError: |
| 2211 | # Ignore non-exist submodules. | 2213 | # Ignore non-exist submodules. |
| 2212 | continue | 2214 | continue |
| 2213 | submodules.append((sub_rev, sub_path, sub_url)) | 2215 | submodules.append((sub_rev, sub_path, sub_url, sub_shallow)) |
| 2214 | return submodules | 2216 | return submodules |
| 2215 | 2217 | ||
| 2216 | re_path = re.compile(r"^submodule\.(.+)\.path=(.*)$") | 2218 | re_path = re.compile(r"^submodule\.(.+)\.path=(.*)$") |
| 2217 | re_url = re.compile(r"^submodule\.(.+)\.url=(.*)$") | 2219 | re_url = re.compile(r"^submodule\.(.+)\.url=(.*)$") |
| 2220 | re_shallow = re.compile(r"^submodule\.(.+)\.shallow=(.*)$") | ||
| 2218 | 2221 | ||
| 2219 | def parse_gitmodules(gitdir, rev): | 2222 | def parse_gitmodules(gitdir, rev): |
| 2220 | cmd = ["cat-file", "blob", "%s:.gitmodules" % rev] | 2223 | cmd = ["cat-file", "blob", "%s:.gitmodules" % rev] |
| @@ -2228,9 +2231,9 @@ class Project: | |||
| 2228 | gitdir=gitdir, | 2231 | gitdir=gitdir, |
| 2229 | ) | 2232 | ) |
| 2230 | except GitError: | 2233 | except GitError: |
| 2231 | return [], [] | 2234 | return [], [], [] |
| 2232 | if p.Wait() != 0: | 2235 | if p.Wait() != 0: |
| 2233 | return [], [] | 2236 | return [], [], [] |
| 2234 | 2237 | ||
| 2235 | gitmodules_lines = [] | 2238 | gitmodules_lines = [] |
| 2236 | fd, temp_gitmodules_path = tempfile.mkstemp() | 2239 | fd, temp_gitmodules_path = tempfile.mkstemp() |
| @@ -2247,16 +2250,17 @@ class Project: | |||
| 2247 | gitdir=gitdir, | 2250 | gitdir=gitdir, |
| 2248 | ) | 2251 | ) |
| 2249 | if p.Wait() != 0: | 2252 | if p.Wait() != 0: |
| 2250 | return [], [] | 2253 | return [], [], [] |
| 2251 | gitmodules_lines = p.stdout.split("\n") | 2254 | gitmodules_lines = p.stdout.split("\n") |
| 2252 | except GitError: | 2255 | except GitError: |
| 2253 | return [], [] | 2256 | return [], [], [] |
| 2254 | finally: | 2257 | finally: |
| 2255 | platform_utils.remove(temp_gitmodules_path) | 2258 | platform_utils.remove(temp_gitmodules_path) |
| 2256 | 2259 | ||
| 2257 | names = set() | 2260 | names = set() |
| 2258 | paths = {} | 2261 | paths = {} |
| 2259 | urls = {} | 2262 | urls = {} |
| 2263 | shallows = {} | ||
| 2260 | for line in gitmodules_lines: | 2264 | for line in gitmodules_lines: |
| 2261 | if not line: | 2265 | if not line: |
| 2262 | continue | 2266 | continue |
| @@ -2270,10 +2274,16 @@ class Project: | |||
| 2270 | names.add(m.group(1)) | 2274 | names.add(m.group(1)) |
| 2271 | urls[m.group(1)] = m.group(2) | 2275 | urls[m.group(1)] = m.group(2) |
| 2272 | continue | 2276 | continue |
| 2277 | m = re_shallow.match(line) | ||
| 2278 | if m: | ||
| 2279 | names.add(m.group(1)) | ||
| 2280 | shallows[m.group(1)] = m.group(2) | ||
| 2281 | continue | ||
| 2273 | names = sorted(names) | 2282 | names = sorted(names) |
| 2274 | return ( | 2283 | return ( |
| 2275 | [paths.get(name, "") for name in names], | 2284 | [paths.get(name, "") for name in names], |
| 2276 | [urls.get(name, "") for name in names], | 2285 | [urls.get(name, "") for name in names], |
| 2286 | [shallows.get(name, "") for name in names], | ||
| 2277 | ) | 2287 | ) |
| 2278 | 2288 | ||
| 2279 | def git_ls_tree(gitdir, rev, paths): | 2289 | def git_ls_tree(gitdir, rev, paths): |
| @@ -2314,7 +2324,7 @@ class Project: | |||
| 2314 | # If git repo does not exist yet, querying its submodules will | 2324 | # If git repo does not exist yet, querying its submodules will |
| 2315 | # mess up its states; so return here. | 2325 | # mess up its states; so return here. |
| 2316 | return result | 2326 | return result |
| 2317 | for rev, path, url in self._GetSubmodules(): | 2327 | for rev, path, url, shallow in self._GetSubmodules(): |
| 2318 | name = self.manifest.GetSubprojectName(self, path) | 2328 | name = self.manifest.GetSubprojectName(self, path) |
| 2319 | ( | 2329 | ( |
| 2320 | relpath, | 2330 | relpath, |
| @@ -2336,6 +2346,7 @@ class Project: | |||
| 2336 | review=self.remote.review, | 2346 | review=self.remote.review, |
| 2337 | revision=self.remote.revision, | 2347 | revision=self.remote.revision, |
| 2338 | ) | 2348 | ) |
| 2349 | clone_depth = 1 if shallow.lower() == "true" else None | ||
| 2339 | subproject = Project( | 2350 | subproject = Project( |
| 2340 | manifest=self.manifest, | 2351 | manifest=self.manifest, |
| 2341 | name=name, | 2352 | name=name, |
| @@ -2352,6 +2363,7 @@ class Project: | |||
| 2352 | sync_s=self.sync_s, | 2363 | sync_s=self.sync_s, |
| 2353 | sync_tags=self.sync_tags, | 2364 | sync_tags=self.sync_tags, |
| 2354 | parent=self, | 2365 | parent=self, |
| 2366 | clone_depth=clone_depth, | ||
| 2355 | is_derived=True, | 2367 | is_derived=True, |
| 2356 | ) | 2368 | ) |
| 2357 | result.append(subproject) | 2369 | result.append(subproject) |
