diff options
Diffstat (limited to 'bitbake/lib/bb/__init__.py')
| -rw-r--r-- | bitbake/lib/bb/__init__.py | 91 |
1 files changed, 75 insertions, 16 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py index 0460c96ff4..6179ef9a1c 100644 --- a/bitbake/lib/bb/__init__.py +++ b/bitbake/lib/bb/__init__.py | |||
| @@ -155,8 +155,7 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 155 | if not sstat: | 155 | if not sstat: |
| 156 | sstat=os.lstat(src) | 156 | sstat=os.lstat(src) |
| 157 | except Exception, e: | 157 | except Exception, e: |
| 158 | print "!!! Stating source file failed... movefile()" | 158 | print "movefile: Stating source file failed...", e |
| 159 | print "!!!",e | ||
| 160 | return None | 159 | return None |
| 161 | 160 | ||
| 162 | destexists=1 | 161 | destexists=1 |
| @@ -180,13 +179,11 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 180 | if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): | 179 | if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): |
| 181 | os.unlink(dest) | 180 | os.unlink(dest) |
| 182 | os.symlink(target,dest) | 181 | os.symlink(target,dest) |
| 183 | # os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | 182 | #os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) |
| 184 | os.unlink(src) | 183 | os.unlink(src) |
| 185 | return os.lstat(dest) | 184 | return os.lstat(dest) |
| 186 | except Exception, e: | 185 | except Exception, e: |
| 187 | print "!!! failed to properly create symlink:" | 186 | print "movefile: failed to properly create symlink:", dest, "->", target, e |
| 188 | print "!!!",dest,"->",target | ||
| 189 | print "!!!",e | ||
| 190 | return None | 187 | return None |
| 191 | 188 | ||
| 192 | renamefailed=1 | 189 | renamefailed=1 |
| @@ -198,8 +195,7 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 198 | import errno | 195 | import errno |
| 199 | if e[0]!=errno.EXDEV: | 196 | if e[0]!=errno.EXDEV: |
| 200 | # Some random error. | 197 | # Some random error. |
| 201 | print "!!! Failed to move",src,"to",dest | 198 | print "movefile: Failed to move", src, "to", dest, e |
| 202 | print "!!!",e | ||
| 203 | return None | 199 | return None |
| 204 | # Invalid cross-device-link 'bind' mounted or actually Cross-Device | 200 | # Invalid cross-device-link 'bind' mounted or actually Cross-Device |
| 205 | 201 | ||
| @@ -211,16 +207,13 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 211 | os.rename(dest+"#new",dest) | 207 | os.rename(dest+"#new",dest) |
| 212 | didcopy=1 | 208 | didcopy=1 |
| 213 | except Exception, e: | 209 | except Exception, e: |
| 214 | print '!!! copy',src,'->',dest,'failed.' | 210 | print 'movefile: copy', src, '->', dest, 'failed.', e |
| 215 | print "!!!",e | ||
| 216 | return None | 211 | return None |
| 217 | else: | 212 | else: |
| 218 | #we don't yet handle special, so we need to fall back to /bin/mv | 213 | #we don't yet handle special, so we need to fall back to /bin/mv |
| 219 | a=getstatusoutput("/bin/mv -f "+"'"+src+"' '"+dest+"'") | 214 | a=getstatusoutput("/bin/mv -f "+"'"+src+"' '"+dest+"'") |
| 220 | if a[0]!=0: | 215 | if a[0]!=0: |
| 221 | print "!!! Failed to move special file:" | 216 | print "movefile: Failed to move special file:" + src + "' to '" + dest + "'", a |
| 222 | print "!!! '"+src+"' to '"+dest+"'" | ||
| 223 | print "!!!",a | ||
| 224 | return None # failure | 217 | return None # failure |
| 225 | try: | 218 | try: |
| 226 | if didcopy: | 219 | if didcopy: |
| @@ -228,9 +221,7 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 228 | os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown | 221 | os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown |
| 229 | os.unlink(src) | 222 | os.unlink(src) |
| 230 | except Exception, e: | 223 | except Exception, e: |
| 231 | print "!!! Failed to chown/chmod/unlink in movefile()" | 224 | print "movefile: Failed to chown/chmod/unlink", dest, e |
| 232 | print "!!!",dest | ||
| 233 | print "!!!",e | ||
| 234 | return None | 225 | return None |
| 235 | 226 | ||
| 236 | if newmtime: | 227 | if newmtime: |
| @@ -240,7 +231,75 @@ def movefile(src,dest,newmtime=None,sstat=None): | |||
| 240 | newmtime=sstat[stat.ST_MTIME] | 231 | newmtime=sstat[stat.ST_MTIME] |
| 241 | return newmtime | 232 | return newmtime |
| 242 | 233 | ||
| 234 | def copyfile(src,dest,newmtime=None,sstat=None): | ||
| 235 | """ | ||
| 236 | Copies a file from src to dest, preserving all permissions and | ||
| 237 | attributes; mtime will be preserved even when moving across | ||
| 238 | filesystems. Returns true on success and false on failure. | ||
| 239 | """ | ||
| 240 | import os, stat, shutil | ||
| 241 | |||
| 242 | #print "copyfile("+src+","+dest+","+str(newmtime)+","+str(sstat)+")" | ||
| 243 | try: | ||
| 244 | if not sstat: | ||
| 245 | sstat=os.lstat(src) | ||
| 246 | except Exception, e: | ||
| 247 | print "copyfile: Stating source file failed...", e | ||
| 248 | return False | ||
| 249 | |||
| 250 | destexists=1 | ||
| 251 | try: | ||
| 252 | dstat=os.lstat(dest) | ||
| 253 | except: | ||
| 254 | dstat=os.lstat(os.path.dirname(dest)) | ||
| 255 | destexists=0 | ||
| 256 | |||
| 257 | if destexists: | ||
| 258 | if stat.S_ISLNK(dstat[stat.ST_MODE]): | ||
| 259 | try: | ||
| 260 | os.unlink(dest) | ||
| 261 | destexists=0 | ||
| 262 | except Exception, e: | ||
| 263 | pass | ||
| 264 | |||
| 265 | if stat.S_ISLNK(sstat[stat.ST_MODE]): | ||
| 266 | try: | ||
| 267 | target=os.readlink(src) | ||
| 268 | if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): | ||
| 269 | os.unlink(dest) | ||
| 270 | os.symlink(target,dest) | ||
| 271 | #os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
| 272 | return os.lstat(dest) | ||
| 273 | except Exception, e: | ||
| 274 | print "copyfile: failed to properly create symlink:", dest, "->", target, e | ||
| 275 | return False | ||
| 276 | |||
| 277 | if stat.S_ISREG(sstat[stat.ST_MODE]): | ||
| 278 | try: # For safety copy then move it over. | ||
| 279 | shutil.copyfile(src,dest+"#new") | ||
| 280 | os.rename(dest+"#new",dest) | ||
| 281 | except Exception, e: | ||
| 282 | print 'copyfile: copy', src, '->', dest, 'failed.', e | ||
| 283 | return False | ||
| 284 | else: | ||
| 285 | #we don't yet handle special, so we need to fall back to /bin/mv | ||
| 286 | a=getstatusoutput("/bin/cp -f "+"'"+src+"' '"+dest+"'") | ||
| 287 | if a[0]!=0: | ||
| 288 | print "copyfile: Failed to copy special file:" + src + "' to '" + dest + "'", a | ||
| 289 | return False # failure | ||
| 290 | try: | ||
| 291 | os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
| 292 | os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown | ||
| 293 | except Exception, e: | ||
| 294 | print "copyfile: Failed to chown/chmod/unlink", dest, e | ||
| 295 | return False | ||
| 243 | 296 | ||
| 297 | if newmtime: | ||
| 298 | os.utime(dest,(newmtime,newmtime)) | ||
| 299 | else: | ||
| 300 | os.utime(dest, (sstat[stat.ST_ATIME], sstat[stat.ST_MTIME])) | ||
| 301 | newmtime=sstat[stat.ST_MTIME] | ||
| 302 | return newmtime | ||
| 244 | 303 | ||
| 245 | ####################################################################### | 304 | ####################################################################### |
| 246 | ####################################################################### | 305 | ####################################################################### |
