Thanks! My bad. The example I looked up in Python docs had a break and I just 
realized it was a looping example.

Here’s the updated patch (or should I submit it again via git send-email?)

>From 9deb390dcdcaef66cec2fae39454c7fb3c81c4e4 Mon Sep 17 00:00:00 2001
From: Devendra Tewari <devendra.tew...@gmail.com>
Date: Mon, 29 Mar 2021 19:41:02 -0300
Subject: [PATCH] Use shutil.move when os.rename fails

Incremental build in Docker fails with

OSError: [Errno 18] Invalid cross-device link

When source and destination are on different overlay filesystems.

This change handles the error with os.rename and retries with shutil.move.
---
 meta/classes/sstate.bbclass               | 22 ++++++++++++++++++----
 vscode-bitbake-build/executeBitBakeCmd.sh |  3 +++
 2 files changed, 21 insertions(+), 4 deletions(-)
 create mode 100755 vscode-bitbake-build/executeBitBakeCmd.sh

diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index f579168162..301dfc27db 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -384,6 +384,7 @@ def sstate_installpkg(ss, d):
 def sstate_installpkgdir(ss, d):
     import oe.path
     import subprocess
+    import shutil
 
     sstateinst = d.getVar("SSTATE_INSTDIR")
     d.setVar('SSTATE_FIXMEDIR', ss['fixmedir'])
@@ -401,7 +402,10 @@ def sstate_installpkgdir(ss, d):
 
     for state in ss['dirs']:
         prepdir(state[1])
-        os.rename(sstateinst + state[0], state[1])
+        try:
+            os.rename(sstateinst + state[0], state[1])
+        except OSError:
+            shutil.move(sstateinst + state[0], state[1])
     sstate_install(ss, d)
 
     for plain in ss['plaindirs']:
@@ -413,7 +417,10 @@ def sstate_installpkgdir(ss, d):
         dest = plain
         bb.utils.mkdirhier(src)
         prepdir(dest)
-        os.rename(src, dest)
+        try:
+            os.rename(src, dest)
+        except OSError:
+            shutil.move(src, dest)
 
     return True
 
@@ -638,6 +645,7 @@ python sstate_hardcode_path () {
 
 def sstate_package(ss, d):
     import oe.path
+    import shutil
 
     tmpdir = d.getVar('TMPDIR')
 
@@ -664,7 +672,10 @@ def sstate_package(ss, d):
                     continue
                 bb.error("sstate found an absolute path symlink %s pointing at 
%s. Please replace this with a relative link." % (srcpath, link))
         bb.debug(2, "Preparing tree %s for packaging at %s" % (state[1], 
sstatebuild + state[0]))
-        os.rename(state[1], sstatebuild + state[0])
+        try:
+            os.rename(state[1], sstatebuild + state[0])
+        except OSError:
+            shutil.move(state[1], sstatebuild + state[0])
 
     workdir = d.getVar('WORKDIR')
     sharedworkdir = os.path.join(d.getVar('TMPDIR'), "work-shared")
@@ -674,7 +685,10 @@ def sstate_package(ss, d):
             pdir = plain.replace(sharedworkdir, sstatebuild)
         bb.utils.mkdirhier(plain)
         bb.utils.mkdirhier(pdir)
-        os.rename(plain, pdir)
+        try:
+            os.rename(plain, pdir)
+        except OSError:
+            shutil.move(plain, pdir)
 
     d.setVar('SSTATE_BUILDDIR', sstatebuild)
     d.setVar('SSTATE_INSTDIR', sstatebuild)
diff --git a/vscode-bitbake-build/executeBitBakeCmd.sh 
b/vscode-bitbake-build/executeBitBakeCmd.sh
new file mode 100755
index 0000000000..d7a4c5a5aa
--- /dev/null
+++ b/vscode-bitbake-build/executeBitBakeCmd.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+. ./oe-init-build-env vscode-bitbake-build > /dev/null
+bitbake-layers show-layers
\ No newline at end of file
-- 
2.29.2


> On 29 Mar 2021, at 17:38, Richard Purdie <richard.pur...@linuxfoundation.org> 
> wrote:
> 
> On Mon, 2021-03-29 at 12:14 -0300, Devendra Tewari wrote:
>> ---
>>  meta/classes/sstate.bbclass | 26 ++++++++++++++++++++++----
>>  1 file changed, 22 insertions(+), 4 deletions(-)
>> 
>> diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
>> index f579168162..f94aa96d70 100644
>> --- a/meta/classes/sstate.bbclass
>> +++ b/meta/classes/sstate.bbclass
>> @@ -384,6 +384,7 @@ def sstate_installpkg(ss, d):
>>  def sstate_installpkgdir(ss, d):
>>      import oe.path
>>      import subprocess
>> +    import shutil
>>
>> 
>>      sstateinst = d.getVar("SSTATE_INSTDIR")
>>      d.setVar('SSTATE_FIXMEDIR', ss['fixmedir'])
>> @@ -401,7 +402,11 @@ def sstate_installpkgdir(ss, d):
>>
>> 
>>      for state in ss['dirs']:
>>          prepdir(state[1])
>> -        os.rename(sstateinst + state[0], state[1])
>> +        try:
>> +            os.rename(sstateinst + state[0], state[1])
>> +            break
> 
> That break should definitely not be there, that changes behaviour.
> 
>> +        except OSError:
>> +            shutil.move(sstateinst + state[0], state[1])
>>      sstate_install(ss, d)
>>
>> 
>>      for plain in ss['plaindirs']:
>> @@ -413,7 +418,11 @@ def sstate_installpkgdir(ss, d):
>>          dest = plain
>>          bb.utils.mkdirhier(src)
>>          prepdir(dest)
>> -        os.rename(src, dest)
>> +        try:
>> +            os.rename(src, dest)
>> +            break
> 
> Same here...
> 
>> +        except OSError:
>> +            shutil.move(src, dest)
>>
>> 
>>      return True
>>
>> 
>> @@ -638,6 +647,7 @@ python sstate_hardcode_path () {
>>
>> 
>>  def sstate_package(ss, d):
>>      import oe.path
>> +    import shutil
>>
>> 
>>      tmpdir = d.getVar('TMPDIR')
>>
>> 
>> @@ -664,7 +674,11 @@ def sstate_package(ss, d):
>>                      continue
>>                  bb.error("sstate found an absolute path symlink %s pointing 
>> at %s. Please replace this with a relative link." % (srcpath, link))
>>          bb.debug(2, "Preparing tree %s for packaging at %s" % (state[1], 
>> sstatebuild + state[0]))
>> -        os.rename(state[1], sstatebuild + state[0])
>> +        try:
>> +            os.rename(state[1], sstatebuild + state[0])
>> +            break
> 
> and again...
> 
>> +        except OSError:
>> +            shutil.move(state[1], sstatebuild + state[0])
>>
>> 
>>      workdir = d.getVar('WORKDIR')
>>      sharedworkdir = os.path.join(d.getVar('TMPDIR'), "work-shared")
>> @@ -674,7 +688,11 @@ def sstate_package(ss, d):
>>              pdir = plain.replace(sharedworkdir, sstatebuild)
>>          bb.utils.mkdirhier(plain)
>>          bb.utils.mkdirhier(pdir)
>> -        os.rename(plain, pdir)
>> +        try:
>> +            os.rename(plain, pdir)
>> +            break
> 
> 
> and again...
> 
>> +        except OSError:
>> +            shutil.move(plain, pdir)
>>
>> 
>>      d.setVar('SSTATE_BUILDDIR', sstatebuild)
>>      d.setVar('SSTATE_INSTDIR', sstatebuild)
>> 

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#150062): 
https://lists.openembedded.org/g/openembedded-core/message/150062
Mute This Topic: https://lists.openembedded.org/mt/81698791/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to