diff options
Diffstat (limited to 'bitbake/lib/bb/fetch2')
-rw-r--r-- | bitbake/lib/bb/fetch2/hg.py | 79 |
1 files changed, 66 insertions, 13 deletions
diff --git a/bitbake/lib/bb/fetch2/hg.py b/bitbake/lib/bb/fetch2/hg.py index cdef4aa110..d978630bac 100644 --- a/bitbake/lib/bb/fetch2/hg.py +++ b/bitbake/lib/bb/fetch2/hg.py | |||
@@ -59,10 +59,12 @@ class Hg(FetchMethod): | |||
59 | 59 | ||
60 | ud.module = ud.parm["module"] | 60 | ud.module = ud.parm["module"] |
61 | 61 | ||
62 | # Create paths to mercurial checkouts | 62 | if 'protocol' in ud.parm: |
63 | relpath = self._strip_leading_slashes(ud.path) | 63 | ud.proto = ud.parm['protocol'] |
64 | ud.pkgdir = os.path.join(data.expand('${HGDIR}', d), ud.host, relpath) | 64 | elif not ud.host: |
65 | ud.moddir = os.path.join(ud.pkgdir, ud.module) | 65 | ud.proto = 'file' |
66 | else: | ||
67 | ud.proto = "hg" | ||
66 | 68 | ||
67 | ud.setup_revisons(d) | 69 | ud.setup_revisons(d) |
68 | 70 | ||
@@ -71,10 +73,20 @@ class Hg(FetchMethod): | |||
71 | elif not ud.revision: | 73 | elif not ud.revision: |
72 | ud.revision = self.latest_revision(ud, d) | 74 | ud.revision = self.latest_revision(ud, d) |
73 | 75 | ||
74 | ud.localfile = ud.moddir | 76 | # Create paths to mercurial checkouts |
77 | hgsrcname = '%s_%s_%s' % (ud.module.replace('/', '.'), \ | ||
78 | ud.host, ud.path.replace('/', '.')) | ||
79 | ud.mirrortarball = 'hg_%s.tar.gz' % hgsrcname | ||
80 | ud.fullmirror = os.path.join(d.getVar("DL_DIR", True), ud.mirrortarball) | ||
75 | 81 | ||
82 | hgdir = d.getVar("HGDIR", True) or (d.getVar("DL_DIR", True) + "/hg/") | ||
83 | ud.pkgdir = os.path.join(hgdir, hgsrcname) | ||
84 | ud.moddir = os.path.join(ud.pkgdir, ud.module) | ||
85 | ud.localfile = ud.moddir | ||
76 | ud.basecmd = data.getVar("FETCHCMD_hg", d, True) or "/usr/bin/env hg" | 86 | ud.basecmd = data.getVar("FETCHCMD_hg", d, True) or "/usr/bin/env hg" |
77 | 87 | ||
88 | ud.write_tarballs = d.getVar("BB_GENERATE_MIRROR_TARBALLS", True) | ||
89 | |||
78 | def need_update(self, ud, d): | 90 | def need_update(self, ud, d): |
79 | revTag = ud.parm.get('rev', 'tip') | 91 | revTag = ud.parm.get('rev', 'tip') |
80 | if revTag == "tip": | 92 | if revTag == "tip": |
@@ -83,6 +95,15 @@ class Hg(FetchMethod): | |||
83 | return True | 95 | return True |
84 | return False | 96 | return False |
85 | 97 | ||
98 | def try_premirror(self, ud, d): | ||
99 | # If we don't do this, updating an existing checkout with only premirrors | ||
100 | # is not possible | ||
101 | if d.getVar("BB_FETCH_PREMIRRORONLY", True) is not None: | ||
102 | return True | ||
103 | if os.path.exists(ud.moddir): | ||
104 | return False | ||
105 | return True | ||
106 | |||
86 | def _buildhgcommand(self, ud, d, command): | 107 | def _buildhgcommand(self, ud, d, command): |
87 | """ | 108 | """ |
88 | Build up an hg commandline based on ud | 109 | Build up an hg commandline based on ud |
@@ -142,18 +163,36 @@ class Hg(FetchMethod): | |||
142 | def download(self, ud, d): | 163 | def download(self, ud, d): |
143 | """Fetch url""" | 164 | """Fetch url""" |
144 | 165 | ||
166 | ud.repochanged = not os.path.exists(ud.fullmirror) | ||
167 | |||
145 | logger.debug(2, "Fetch: checking for module directory '" + ud.moddir + "'") | 168 | logger.debug(2, "Fetch: checking for module directory '" + ud.moddir + "'") |
146 | 169 | ||
170 | # If the checkout doesn't exist and the mirror tarball does, extract it | ||
171 | if not os.path.exists(ud.pkgdir) and os.path.exists(ud.fullmirror): | ||
172 | bb.utils.mkdirhier(ud.pkgdir) | ||
173 | os.chdir(ud.pkgdir) | ||
174 | runfetchcmd("tar -xzf %s" % (ud.fullmirror), d) | ||
175 | |||
147 | if os.access(os.path.join(ud.moddir, '.hg'), os.R_OK): | 176 | if os.access(os.path.join(ud.moddir, '.hg'), os.R_OK): |
148 | updatecmd = self._buildhgcommand(ud, d, "pull") | 177 | # Found the source, check whether need pull |
149 | logger.info("Update " + ud.url) | 178 | updatecmd = self._buildhgcommand(ud, d, "update") |
150 | # update sources there | ||
151 | os.chdir(ud.moddir) | 179 | os.chdir(ud.moddir) |
152 | logger.debug(1, "Running %s", updatecmd) | 180 | logger.debug(1, "Running %s", updatecmd) |
153 | bb.fetch2.check_network_access(d, updatecmd, ud.url) | 181 | try: |
154 | runfetchcmd(updatecmd, d) | 182 | runfetchcmd(updatecmd, d) |
155 | 183 | except bb.fetch2.FetchError: | |
156 | else: | 184 | # Runnning pull in the repo |
185 | pullcmd = self._buildhgcommand(ud, d, "pull") | ||
186 | logger.info("Pulling " + ud.url) | ||
187 | # update sources there | ||
188 | os.chdir(ud.moddir) | ||
189 | logger.debug(1, "Running %s", pullcmd) | ||
190 | bb.fetch2.check_network_access(d, pullcmd, ud.url) | ||
191 | runfetchcmd(pullcmd, d) | ||
192 | ud.repochanged = True | ||
193 | |||
194 | # No source found, clone it. | ||
195 | if not os.path.exists(ud.moddir): | ||
157 | fetchcmd = self._buildhgcommand(ud, d, "fetch") | 196 | fetchcmd = self._buildhgcommand(ud, d, "fetch") |
158 | logger.info("Fetch " + ud.url) | 197 | logger.info("Fetch " + ud.url) |
159 | # check out sources there | 198 | # check out sources there |
@@ -174,6 +213,8 @@ class Hg(FetchMethod): | |||
174 | """ Clean the hg dir """ | 213 | """ Clean the hg dir """ |
175 | 214 | ||
176 | bb.utils.remove(ud.localpath, True) | 215 | bb.utils.remove(ud.localpath, True) |
216 | bb.utils.remove(ud.fullmirror) | ||
217 | bb.utils.remove(ud.fullmirror + ".done") | ||
177 | 218 | ||
178 | def supports_srcrev(self): | 219 | def supports_srcrev(self): |
179 | return True | 220 | return True |
@@ -195,8 +236,20 @@ class Hg(FetchMethod): | |||
195 | """ | 236 | """ |
196 | return "hg:" + ud.moddir | 237 | return "hg:" + ud.moddir |
197 | 238 | ||
239 | def build_mirror_data(self, ud, d): | ||
240 | # Generate a mirror tarball if needed | ||
241 | if ud.write_tarballs == "1" and (ud.repochanged or not os.path.exists(ud.fullmirror)): | ||
242 | # it's possible that this symlink points to read-only filesystem with PREMIRROR | ||
243 | if os.path.islink(ud.fullmirror): | ||
244 | os.unlink(ud.fullmirror) | ||
245 | |||
246 | os.chdir(ud.pkgdir) | ||
247 | logger.info("Creating tarball of hg repository") | ||
248 | runfetchcmd("tar -czf %s %s" % (ud.fullmirror, ud.module), d) | ||
249 | runfetchcmd("touch %s.done" % (ud.fullmirror), d) | ||
250 | |||
198 | def localpath(self, ud, d): | 251 | def localpath(self, ud, d): |
199 | return ud.moddir | 252 | return ud.pkgdir |
200 | 253 | ||
201 | def unpack(self, ud, destdir, d): | 254 | def unpack(self, ud, destdir, d): |
202 | """ | 255 | """ |