diff options
Diffstat (limited to 'bitbake/lib/bb/fetch2/git.py')
-rw-r--r-- | bitbake/lib/bb/fetch2/git.py | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index 07af02f061..c54d826a01 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py | |||
@@ -57,7 +57,13 @@ class Git(Fetch): | |||
57 | if 'nocheckout' in ud.parm: | 57 | if 'nocheckout' in ud.parm: |
58 | ud.nocheckout = True | 58 | ud.nocheckout = True |
59 | 59 | ||
60 | ud.branch = ud.parm.get("branch", "master") | 60 | branches = ud.parm.get("branch", "master").split(',') |
61 | if len(branches) != len(ud.names): | ||
62 | raise bb.fetch2.ParameterError("SRC_URI (%) name and branch number mismatch" % ud.url) | ||
63 | ud.branches = {} | ||
64 | for name in ud.names: | ||
65 | branch = branches[ud.names.index(name)] | ||
66 | ud.branches[name] = branch | ||
61 | 67 | ||
62 | gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) | 68 | gitsrcname = '%s%s' % (ud.host, ud.path.replace('/', '.')) |
63 | ud.mirrortarball = 'git_%s.tar.gz' % (gitsrcname) | 69 | ud.mirrortarball = 'git_%s.tar.gz' % (gitsrcname) |
@@ -66,25 +72,18 @@ class Git(Fetch): | |||
66 | ud.basecmd = data.getVar("FETCHCMD_git", d, True) or "git" | 72 | ud.basecmd = data.getVar("FETCHCMD_git", d, True) or "git" |
67 | 73 | ||
68 | def localpath(self, url, ud, d): | 74 | def localpath(self, url, ud, d): |
69 | ud.tag = ud.revision | 75 | for name in ud.names: |
70 | if not ud.tag or ud.tag == "master": | 76 | if not ud.revisions[name] or ud.revisions[name] == "master": |
71 | ud.tag = self.latest_revision(url, ud, d) | 77 | ud.revisions[name] = self.latest_revision(url, ud, d, name) |
72 | 78 | ||
73 | ud.localfile = ud.mirrortarball | 79 | ud.localfile = ud.mirrortarball |
74 | 80 | ||
75 | if 'noclone' in ud.parm: | ||
76 | ud.localfile = None | ||
77 | return None | ||
78 | |||
79 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) | 81 | return os.path.join(data.getVar("DL_DIR", d, True), ud.localfile) |
80 | 82 | ||
81 | def forcefetch(self, url, ud, d): | 83 | def forcefetch(self, url, ud, d): |
82 | if 'fullclone' in ud.parm: | 84 | for name in ud.names: |
83 | return True | 85 | if not self._contains_ref(ud.revisions[name], d): |
84 | if 'noclone' in ud.parm: | 86 | return True |
85 | return False | ||
86 | if not self._contains_ref(ud.tag, d): | ||
87 | return True | ||
88 | return False | 87 | return False |
89 | 88 | ||
90 | def try_premirror(self, u, ud, d): | 89 | def try_premirror(self, u, ud, d): |
@@ -122,18 +121,15 @@ class Git(Fetch): | |||
122 | 121 | ||
123 | os.chdir(ud.clonedir) | 122 | os.chdir(ud.clonedir) |
124 | # Update the checkout if needed | 123 | # Update the checkout if needed |
125 | if not self._contains_ref(ud.tag, d) or 'fullclone' in ud.parm: | 124 | for name in ud.names: |
126 | # Remove all but the .git directory | 125 | if not self._contains_ref(ud.revisions[name], d): |
127 | bb.fetch2.check_network_access(d, "git fetch %s%s" %(ud.host, ud.path)) | 126 | # Remove all but the .git directory |
128 | runfetchcmd("rm * -Rf", d) | 127 | bb.fetch2.check_network_access(d, "git fetch %s%s" %(ud.host, ud.path)) |
129 | if 'fullclone' in ud.parm: | 128 | runfetchcmd("%s fetch %s://%s%s%s %s" % (ud.basecmd, ud.proto, username, ud.host, ud.path, ud.branches[name]), d) |
130 | runfetchcmd("%s fetch --all" % (ud.basecmd), d) | 129 | runfetchcmd("%s fetch --tags %s://%s%s%s" % (ud.basecmd, ud.proto, username, ud.host, ud.path), d) |
131 | else: | 130 | runfetchcmd("%s prune-packed" % ud.basecmd, d) |
132 | runfetchcmd("%s fetch %s://%s%s%s %s" % (ud.basecmd, ud.proto, username, ud.host, ud.path, ud.branch), d) | 131 | runfetchcmd("%s pack-redundant --all | xargs -r rm" % ud.basecmd, d) |
133 | runfetchcmd("%s fetch --tags %s://%s%s%s" % (ud.basecmd, ud.proto, username, ud.host, ud.path), d) | 132 | ud.repochanged = True |
134 | runfetchcmd("%s prune-packed" % ud.basecmd, d) | ||
135 | runfetchcmd("%s pack-redundant --all | xargs -r rm" % ud.basecmd, d) | ||
136 | ud.repochanged = True | ||
137 | 133 | ||
138 | def build_mirror_data(self, url, ud, d): | 134 | def build_mirror_data(self, url, ud, d): |
139 | # Generate a mirror tarball if needed | 135 | # Generate a mirror tarball if needed |
@@ -141,7 +137,7 @@ class Git(Fetch): | |||
141 | 137 | ||
142 | os.chdir(ud.clonedir) | 138 | os.chdir(ud.clonedir) |
143 | mirror_tarballs = data.getVar("BB_GENERATE_MIRROR_TARBALLS", d, True) | 139 | mirror_tarballs = data.getVar("BB_GENERATE_MIRROR_TARBALLS", d, True) |
144 | if (mirror_tarballs != "0" or 'fullclone' in ud.parm) and ud.repochanged: | 140 | if mirror_tarballs != "0" and ud.repochanged: |
145 | logger.info("Creating tarball of git repository") | 141 | logger.info("Creating tarball of git repository") |
146 | runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d) | 142 | runfetchcmd("tar -czf %s %s" % (repofile, os.path.join(".", ".git", "*") ), d) |
147 | 143 | ||
@@ -165,7 +161,7 @@ class Git(Fetch): | |||
165 | runfetchcmd("cp -af %s/.git/packed-refs %s/.git/" %(ud.clonedir, destdir), d) | 161 | runfetchcmd("cp -af %s/.git/packed-refs %s/.git/" %(ud.clonedir, destdir), d) |
166 | if not ud.nocheckout: | 162 | if not ud.nocheckout: |
167 | os.chdir(destdir) | 163 | os.chdir(destdir) |
168 | runfetchcmd("%s read-tree %s%s" % (ud.basecmd, ud.tag, readpathspec), d) | 164 | runfetchcmd("%s read-tree %s%s" % (ud.basecmd, ud.revisions[ud.names[0]], readpathspec), d) |
169 | runfetchcmd("%s checkout-index -q -f -a" % ud.basecmd, d) | 165 | runfetchcmd("%s checkout-index -q -f -a" % ud.basecmd, d) |
170 | return True | 166 | return True |
171 | 167 | ||
@@ -177,13 +173,13 @@ class Git(Fetch): | |||
177 | output = runfetchcmd("%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, tag), d, quiet=True) | 173 | output = runfetchcmd("%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, tag), d, quiet=True) |
178 | return output.split()[0] != "0" | 174 | return output.split()[0] != "0" |
179 | 175 | ||
180 | def _revision_key(self, url, ud, d): | 176 | def _revision_key(self, url, ud, d, name): |
181 | """ | 177 | """ |
182 | Return a unique key for the url | 178 | Return a unique key for the url |
183 | """ | 179 | """ |
184 | return "git:" + ud.host + ud.path.replace('/', '.') + ud.branch | 180 | return "git:" + ud.host + ud.path.replace('/', '.') + ud.branches[name] |
185 | 181 | ||
186 | def _latest_revision(self, url, ud, d): | 182 | def _latest_revision(self, url, ud, d, name): |
187 | """ | 183 | """ |
188 | Compute the HEAD revision for the url | 184 | Compute the HEAD revision for the url |
189 | """ | 185 | """ |
@@ -192,16 +188,16 @@ class Git(Fetch): | |||
192 | else: | 188 | else: |
193 | username = "" | 189 | username = "" |
194 | 190 | ||
195 | bb.fetch2.check_network_access(d, "git ls-remote %s%s %s" % (ud.host, ud.path, ud.branch)) | 191 | bb.fetch2.check_network_access(d, "git ls-remote %s%s %s" % (ud.host, ud.path, ud.branches[name])) |
196 | basecmd = data.getVar("FETCHCMD_git", d, True) or "git" | 192 | basecmd = data.getVar("FETCHCMD_git", d, True) or "git" |
197 | cmd = "%s ls-remote %s://%s%s%s %s" % (basecmd, ud.proto, username, ud.host, ud.path, ud.branch) | 193 | cmd = "%s ls-remote %s://%s%s%s %s" % (basecmd, ud.proto, username, ud.host, ud.path, ud.branches[name]) |
198 | output = runfetchcmd(cmd, d, True) | 194 | output = runfetchcmd(cmd, d, True) |
199 | if not output: | 195 | if not output: |
200 | raise bb.fetch2.FetchError("Fetch command %s gave empty output\n" % (cmd)) | 196 | raise bb.fetch2.FetchError("Fetch command %s gave empty output\n" % (cmd)) |
201 | return output.split()[0] | 197 | return output.split()[0] |
202 | 198 | ||
203 | def _build_revision(self, url, ud, d): | 199 | def _build_revision(self, url, ud, d, name): |
204 | return ud.tag | 200 | return ud.revisions[name] |
205 | 201 | ||
206 | def _sortable_buildindex_disabled(self, url, ud, d, rev): | 202 | def _sortable_buildindex_disabled(self, url, ud, d, rev): |
207 | """ | 203 | """ |