Skip to contentSkip to conversation

Git fetcher remote fix

PATCH New Paul Eggleton 1 participant 3 messages May 14, 2015

lore
Share & tools
lore
#0 lore raw

cover Git fetcher remote fix

A minor fix for the git fetcher in aid of OE's devtool, as well as a fix for a bitbake-selftest issue I noticed at the same time.

The following changes since commit c7263096ba31ba45daeeb9de90c1cb9ebef24a28:

fetch2: Add BB_ALLOWED_NETWORKS support (2015-05-12 12:17:08 +0100)

are available in the git repository at:

git://git.yoctoproject.org/poky-contrib paule/fetchfix
http://git.yoctoproject.org/cgit.cgi/poky-contrib/log/?h=paule/fetchfix

Paul Eggleton (2):
fetch2/git: ensure the unpacked origin remote points upstream tests/fetch: ensure fetch tests preserve current dir

 lib/bb/fetch2/git.py  | 31 +++++++++++++++++--------------
 lib/bb/tests/fetch.py |  2 ++
 2 files changed, 19 insertions(+), 14 deletions(-)
Signature · 1 line
2.1.0
#1 lore raw

PATCH 1/2 fetch2/git: ensure the unpacked origin remote points upstream

If you're interested in using the checked out repository for development (e.g. in OE with devtool) then you ideally want the origin remote to point to the repository it was fetched from, so just set that after cloning.

(As part of this I did a minor refactor so we have one function to generate the repository URL, which was already in two places.)

Fixes [YOCTO #7756].

---
 lib/bb/fetch2/git.py | 31 +++++++++++++++++--------------
 1 file changed, 17 insertions(+), 14 deletions(-)
lib/bb/fetch2/git.py +17 -14
index 0fd9bee..4cc5811 100644
@@ -178,11 +178,6 @@ class Git(FetchMethod):
     def download(self, ud, d):
         """Fetch url"""
 
-        if ud.user:
-            username = ud.user + '@'
-        else:
-            username = ""
-
         ud.repochanged = not os.path.exists(ud.fullmirror)
 
         # If the checkout doesn't exist and the mirror tarball does, extract it
@@ -191,7 +186,7 @@ class Git(FetchMethod):
             os.chdir(ud.clonedir)
             runfetchcmd("tar -xzf %s" % (ud.fullmirror), d)
 
-        repourl = "%s://%s%s%s" % (ud.proto, username, ud.host, ud.path)
+        repourl = self._get_repo_url(ud)
 
         # If the repo still doesn't exist, fallback to cloning it
         if not os.path.exists(ud.clonedir):
@@ -277,8 +272,10 @@ class Git(FetchMethod):
             clonedir = indirectiondir
 
         runfetchcmd("%s clone %s %s/ %s" % (ud.basecmd, cloneflags, clonedir, destdir), d)
+        os.chdir(destdir)
+        repourl = self._get_repo_url(ud)
+        runfetchcmd("%s remote set-url origin %s" % (ud.basecmd, repourl), d)
         if not ud.nocheckout:
-            os.chdir(destdir)
             if subdir != "":
                 runfetchcmd("%s read-tree %s%s" % (ud.basecmd, ud.revisions[ud.names[0]], readpathspec), d)
                 runfetchcmd("%s checkout-index -q -f -a" % ud.basecmd, d)
@@ -312,6 +309,16 @@ class Git(FetchMethod):
             raise bb.fetch2.FetchError("The command '%s' gave output with more then 1 line unexpectedly, output: '%s'" % (cmd, output))
         return output.split()[0] != "0"
 
+    def _get_repo_url(self, ud):
+        """
+        Return the repository URL
+        """
+        if ud.user:
+            username = ud.user + '@'
+        else:
+            username = ""
+        return "%s://%s%s%s" % (ud.proto, username, ud.host, ud.path)
+
     def _revision_key(self, ud, d, name):
         """
         Return a unique key for the url
@@ -322,13 +329,9 @@ class Git(FetchMethod):
         """
         Run git ls-remote with the specified search string
         """
-        if ud.user:
-            username = ud.user + '@'
-        else:
-            username = ""
-
-        cmd = "%s ls-remote %s://%s%s%s %s" % \
-              (ud.basecmd, ud.proto, username, ud.host, ud.path, search)
+        repourl = self._get_repo_url(ud)
+        cmd = "%s ls-remote %s %s" % \
+              (ud.basecmd, repourl, search)
         if ud.proto.lower() != 'file':
             bb.fetch2.check_network_access(d, cmd)
         output = runfetchcmd(cmd, d, True)
Signature · 1 line
2.1.0
#2 lore raw

PATCH 2/2 tests/fetch: ensure fetch tests preserve current dir

In reply to Paul Eggleton

The fetcher calls os.chdir() in a number of places, which can affect other tests (since the directory it changes into gets deleted) - let's just put the current directory back to where it was when we're done.

(This fixes bb.tests.Path.test_unsafe_delete_path failing if it was run as part of a full bitbake-selftest run, where the fetcher tests get to run before it.)

---
 lib/bb/tests/fetch.py | 2 ++
 1 file changed, 2 insertions(+)
lib/bb/tests/fetch.py +2 -0
index d3f7b6a..3575468 100644
@@ -315,6 +315,7 @@ class URITest(unittest.TestCase):
 class FetcherTest(unittest.TestCase):
 
     def setUp(self):
+        self.origdir = os.getcwd()
         self.d = bb.data.init()
         self.tempdir = tempfile.mkdtemp()
         self.dldir = os.path.join(self.tempdir, "download")
@@ -326,6 +327,7 @@ class FetcherTest(unittest.TestCase):
         self.d.setVar("PERSISTENT_DIR", persistdir)
 
     def tearDown(self):
+        os.chdir(self.origdir)
         bb.utils.prunedir(self.tempdir)
 
 class MirrorUriTest(FetcherTest):
Signature · 1 line
2.1.0