diff options
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/fetch2/gitsm.py | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/bitbake/lib/bb/fetch2/gitsm.py b/bitbake/lib/bb/fetch2/gitsm.py index 9fdde468cb..1a762153c4 100644 --- a/bitbake/lib/bb/fetch2/gitsm.py +++ b/bitbake/lib/bb/fetch2/gitsm.py | |||
@@ -42,6 +42,53 @@ class GitSM(Git): | |||
42 | pass | 42 | pass |
43 | return False | 43 | return False |
44 | 44 | ||
45 | def _set_relative_paths(self, repopath): | ||
46 | """ | ||
47 | Fix submodule paths to be relative instead of absolute, | ||
48 | so that when we move the repo it doesn't break | ||
49 | (In Git 1.7.10+ this is done automatically) | ||
50 | """ | ||
51 | submodules = [] | ||
52 | with open(os.path.join(repopath, '.gitmodules'), 'r') as f: | ||
53 | for line in f.readlines(): | ||
54 | if line.startswith('[submodule'): | ||
55 | submodules.append(line.split('"')[1]) | ||
56 | |||
57 | for module in submodules: | ||
58 | repo_conf = os.path.join(repopath, module, '.git') | ||
59 | if os.path.exists(repo_conf): | ||
60 | with open(repo_conf, 'r') as f: | ||
61 | lines = f.readlines() | ||
62 | newpath = '' | ||
63 | for i, line in enumerate(lines): | ||
64 | if line.startswith('gitdir:'): | ||
65 | oldpath = line.split(': ')[-1].rstrip() | ||
66 | if oldpath.startswith('/'): | ||
67 | newpath = '../' * (module.count('/') + 1) + '.git/modules/' + module | ||
68 | lines[i] = 'gitdir: %s\n' % newpath | ||
69 | break | ||
70 | if newpath: | ||
71 | with open(repo_conf, 'w') as f: | ||
72 | for line in lines: | ||
73 | f.write(line) | ||
74 | |||
75 | repo_conf2 = os.path.join(repopath, '.git', 'modules', module, 'config') | ||
76 | if os.path.exists(repo_conf2): | ||
77 | with open(repo_conf2, 'r') as f: | ||
78 | lines = f.readlines() | ||
79 | newpath = '' | ||
80 | for i, line in enumerate(lines): | ||
81 | if line.lstrip().startswith('worktree = '): | ||
82 | oldpath = line.split(' = ')[-1].rstrip() | ||
83 | if oldpath.startswith('/'): | ||
84 | newpath = '../' * (module.count('/') + 3) + module | ||
85 | lines[i] = '\tworktree = %s\n' % newpath | ||
86 | break | ||
87 | if newpath: | ||
88 | with open(repo_conf2, 'w') as f: | ||
89 | for line in lines: | ||
90 | f.write(line) | ||
91 | |||
45 | def update_submodules(self, ud, d): | 92 | def update_submodules(self, ud, d): |
46 | # We have to convert bare -> full repo, do the submodule bit, then convert back | 93 | # We have to convert bare -> full repo, do the submodule bit, then convert back |
47 | tmpclonedir = ud.clonedir + ".tmp" | 94 | tmpclonedir = ud.clonedir + ".tmp" |
@@ -54,6 +101,7 @@ class GitSM(Git): | |||
54 | runfetchcmd(ud.basecmd + " reset --hard", d) | 101 | runfetchcmd(ud.basecmd + " reset --hard", d) |
55 | runfetchcmd(ud.basecmd + " submodule init", d) | 102 | runfetchcmd(ud.basecmd + " submodule init", d) |
56 | runfetchcmd(ud.basecmd + " submodule update", d) | 103 | runfetchcmd(ud.basecmd + " submodule update", d) |
104 | self._set_relative_paths(tmpclonedir) | ||
57 | runfetchcmd("sed " + gitdir + "/config -i -e 's/bare.*=.*false/bare = true/'", d) | 105 | runfetchcmd("sed " + gitdir + "/config -i -e 's/bare.*=.*false/bare = true/'", d) |
58 | os.rename(gitdir, ud.clonedir,) | 106 | os.rename(gitdir, ud.clonedir,) |
59 | bb.utils.remove(tmpclonedir, True) | 107 | bb.utils.remove(tmpclonedir, True) |