[bitbake-devel] [PATCH] bb.fetch.git: add a way to avoid git protocol, and force http or https mirrors

fabien.proriolpatch at kazoe.org fabien.proriolpatch at kazoe.org
Tue May 31 13:18:04 UTC 2016


From: Fabien Proriol <fabien.proriol at jdsu.com>

This patch add the possibility to bitbake to avoid git protocol to fetch sources.
This is usefull in some network with firewall blocking git port.

When BB_GIT_PROTOCOL_FIREWALL is set, the PROTOCOL_MIRRORS table is used to find the new protocol (http or https) and the new host (if different) to used.

BB_GIT_PROTOCOL_FIREWALL can also contains a list of host accepted. This is usefull for exemple, if we use local git repository inside the network.

Exemple usage:
    # Avoid all git protocol
    BB_GIT_PROTOCOL_FIREWALL = "1"

    # Avoid git protocol, except for srv1 and srv2 in local network
    BB_GIT_PROTOCOL_FIREWALL = "srv1.mydomain.com;srv2.mydomain.com"

Signed-off-by: Fabien Proriol <fabien.proriol at jdsu.com>
---
 bitbake/lib/bb/fetch2/git.py | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
index 526668b..27dde60 100644
--- a/bitbake/lib/bb/fetch2/git.py
+++ b/bitbake/lib/bb/fetch2/git.py
@@ -76,6 +76,20 @@ from   bb.fetch2 import FetchMethod
 from   bb.fetch2 import runfetchcmd
 from   bb.fetch2 import logger
 
+PROTOCOL_MIRRORS = {
+    "sourceware.org": {"protocol":"http"},
+    "github.com": {"protocol":"https"},
+    "git.sv.gnu.org": {"protocol":"https", "host":"git.savannah.gnu.org/r"},
+    "anongit.freedesktop.org": {"protocol":"http"},
+    "anonscm.debian.org": {"protocol":"https", "host":"anonscm.debian.org/git"},
+    "git.gnome.org": {"protocol":"https", "host":"git.gnome.org/browse"},
+    "git.yoctoproject.org": {"protocol":"http", "host":"git.yoctoproject.org/git"},
+    "git.kernel.org": {"protocol":"https"},
+    "git.denx.de": {"protocol":"http"},
+    "git.lttng.org": {"protocol":"http"},
+    "git.infradead.org":  {"protocol":"https", "host":"github.com/eva-oss"},
+}
+
 class Git(FetchMethod):
     """Class to fetch a module or modules from git repositories"""
     def init(self, d):
@@ -102,6 +116,12 @@ class Git(FetchMethod):
         else:
             ud.proto = "git"
 
+        firewall = d.getVar("BB_GIT_PROTOCOL_FIREWALL", True)
+        if firewall:
+            self.git_firewall = firewall.split(";")
+        else:
+            self.git_firewall = None
+
         if not ud.proto in ('git', 'file', 'ssh', 'http', 'https', 'rsync'):
             raise bb.fetch2.ParameterError("Invalid protocol type", ud.url)
 
@@ -315,6 +335,16 @@ class Git(FetchMethod):
             username = ud.user + '@'
         else:
             username = ""
+
+        if (ud.proto == "git") and (self.git_firewall):
+            if not ud.host in self.git_firewall:
+                if ud.host.strip() in PROTOCOL_MIRRORS.keys():
+                    ud.proto = PROTOCOL_MIRRORS[ud.host]["protocol"]
+                    if "host" in PROTOCOL_MIRRORS[ud.host].keys():
+                        ud.host = PROTOCOL_MIRRORS[ud.host]["host"]
+                else:
+                    raise bb.fetch2.FetchError("Unknown protocol mirror for %s (%s)" % (ud.host.strip(), ud.path))
+
         return "%s://%s%s%s" % (ud.proto, username, ud.host, ud.path)
 
     def _revision_key(self, ud, d, name):
-- 
2.7.3



More information about the bitbake-devel mailing list