Files
rpmbuild/helpers.py
T
2025-02-25 10:40:56 -05:00

231 lines
7.1 KiB
Python
Executable File

#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# $Id: helpers.py 1370 2022-07-05 11:08:18Z wille_m $
# $HeadURL: svn://192.168.133.21/admin/rpmbuild/helpers.py $
# $Author: wille_m $
# Created by Christian Ehrlicher, SLSE, 20013-02-19
#
import getpass
import os
import re
import shutil
import stat
import subprocess
import sys
# helper functions
def verbose():
verb = os.getenv( "EMERGE_VERBOSE" )
if ( not verb == None and verb.isdigit() and int(verb) > 0 ):
return int( verb )
else:
return 0
def debug( message ):
if verbose() > 1:
print("debug: %s" % message)
return True
def info( message ):
if verbose() > 0:
print("info: %s" % message)
return True
def warning( message ):
print("warning: %s" % message)
return True
def error( message ):
die( message )
def die( message ):
print >> sys.stderr, "emerge fatal error: %s" % message
sys.exit( 1 )
def system( cmdstring, file = None ):
debug( "Executing '%s'" % cmdstring )
out = subprocess.PIPE
if file != None:
out = file
p = subprocess.Popen( cmdstring, shell=True, stdout=out, stderr=sys.stderr )
ret = p.wait()
if ( ret != 0 ):
die( "Error executing %s (%s)" % (cmdstring, ret) )
ret = ""
if file == None:
ret = p.stdout.read().strip()
return ret
def getSvn_Release( svn_dir ):
try:
old_lang = os.environ['LANG']
except:
old_lang = None
os.putenv("LANG", "en_US")
cmd = "svn info %s | grep \"Last Changed Rev\"" % svn_dir
rel = system( cmd ).split(':')[1].strip()
if old_lang:
os.putenv("LANG", old_lang)
return rel
def getSvn_Date( svn_dir ):
try:
old_lang = os.environ['LANG']
except:
old_lang = None
os.putenv("LANG", "en_US")
cmd = "svn info %s | grep \"Last Changed Date\"" % svn_dir
rel = system( cmd ).split()[3].strip()
if old_lang:
os.putenv("LANG", old_lang)
return rel
def getOS_Name():
if os.path.exists('/etc/SuSE-release'):
f = open('/etc/SuSE-release', 'r')
rx = re.compile('^VERSION = (.*)$')
for line in f.readlines():
m = rx.match(line)
if not m:
line = re.sub('\s', '', line)
line = re.sub('\([xX]86[-_]64\)', '', line)
line = line.replace('SUSE', '')
line = line.replace('LinuxEnterpriseServer', 'SLE')
line = line.replace('LinuxEnterpriseDesktop', 'SLE')
return line.strip()
return "unknown"
else:
f = open('/etc/os-release', 'r')
rx = re.compile('^PRETTY_NAME="(.*)"$')
for line in f.readlines():
m = rx.match(line)
if m:
return m.group(1).replace(' ','_')
return "unknown"
def removeDirectory( dest_dir ):
info( "--------------------------------" )
info( "Removing %s" % ( dest_dir ) )
info( "--------------------------------" )
if ( os.path.exists( dest_dir ) and os.path.isdir( dest_dir ) ):
for root, dirs, files in os.walk( dest_dir, topdown=False):
for name in files:
try:
os.remove( os.path.join(root, name) )
except:
die( "couldn't delete file %s\n ( %s )" % ( name, os.path.join( root, name ) ) )
for name in dirs:
try:
if ( os.path.islink(os.path.join(root, name)) ):
os.remove( os.path.join(root, name) )
else:
os.rmdir( os.path.join(root, name) )
except:
die( "couldn't delete directory %s\n( %s )" % ( name, os.path.join( root, name ) ) )
os.rmdir( dest_dir )
def copySrcDirToDestDir( srcdir, dstdir, perm = None, with_subdirs = True ):
info( "--------------------------------" )
info( "Copying %s to %s" % ( srcdir, dstdir ) )
info( "--------------------------------" )
while srcdir[-1] == '/':
srcdir = srcdir[:-1]
if with_subdirs:
for root, dirs, files in os.walk( srcdir ):
tmpdir = root.replace( srcdir, dstdir )
debug( "dstdir = '%s'" % tmpdir )
if ( not os.path.exists( tmpdir ) ):
debug( "Creating dir '%s'" % tmpdir )
os.makedirs( tmpdir )
if perm:
os.chmod( tmpdir, perm | stat.S_IREAD | stat.S_IRGRP | stat.S_IROTH )
for file in files:
if os.path.isfile( tmpdir ) and os.path.exists( tmpdir ):
os.remove( tmpdir )
shutil.copy( os.path.join( root, file ), tmpdir )
if perm:
f = os.path.join( tmpdir, file )
add_perm = 0
if os.path.isdir( f ):
add_perm = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
else:
mode = os.stat( f ).st_mode
if (stat.S_IXUSR & mode) == stat.S_IXUSR:
add_perm = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
os.chmod( f, perm | add_perm )
else:
for f in os.listdir( srcdir ):
if os.path.isdir( f ):
continue
shutil.copy( os.path.join( srcdir, f ),
os.path.join( dstdir, f ) )
def moveFilesToDir( srcdir, dstdir, rx_filter = None, with_subdirs = True ):
info( "--------------------------------" )
info( "Moving files from %s to %s" % ( srcdir, dstdir ) )
info( "--------------------------------" )
moved_files = []
if not os.path.exists( dstdir ):
os.makedirs( dstdir )
if with_subdirs:
for root, dirs, files in os.walk( srcdir ):
for file in files:
if rx_filter and not rx_filter.match( file ):
continue
src = os.path.join( root, file )
dst = os.path.join( dstdir, file )
debug( "Move %s to %s" % ( src, dst ) )
if os.path.exists( dst ):
os.remove( dst )
moved_files.append( dst )
shutil.move( src, dstdir )
else:
for f in os.listdir( srcdir ):
if os.path.isdir( f ):
continue
if rx_filter and not rx_filter.match( f ):
continue
src = os.path.join( srcdir, file )
dst = os.path.join( dstdir, file )
debug( "Move %s to %s" % ( src, dst ) )
moved_files.append( dst )
shutil.move( src, dstdir )
return moved_files
def adjustPermissions( srcdir ):
info( "--------------------------------" )
info( "Adjusting permissions in %s" % srcdir )
info( "--------------------------------" )
stat_file = stat.S_IREAD | stat.S_IWRITE | stat.S_IRUSR | stat.S_IROTH
stat_executable = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
stat_dir = stat_file | stat_executable
while srcdir[-1] == '/':
srcdir = srcdir[:-1]
for root, dirs, files in os.walk( srcdir ):
os.chmod( root, )
for file in files:
f = os.path.join( root, file )
perm = 0
if os.path.isdir( f ):
perm = stat_dir
else:
perm = stat_file
mode = os.stat( f ).st_mode
if (stat.S_IXUSR & mode) == stat.S_IXUSR:
perm |= stat_executable
os.chmod( f, perm )
def exec_rpmbuild( spec_dir, spec_filename, buildroot = None ):
spec = os.path.join( spec_dir, spec_filename )
cmd = "rpmbuild -ba %s" % spec
if buildroot:
cmd += " --buildroot=%s" % buildroot
system( cmd, sys.stdout ) and die( "during rpmbuild. cmd: %s" % command )