99import copy
1010import itertools
1111
12- from pyp2rpm import settings
13-
12+ try :
13+ import rpm
14+ except ImportError :
15+ rpm = None
1416
1517logger = logging .getLogger (__name__ )
1618
@@ -39,41 +41,6 @@ def __exit__(self, type, value, traceback): # TODO handle exception
3941 os .chdir (self .primary_path )
4042
4143
42- class RedirectStdStreams (object ):
43- """Temporarily redirect stdout/stderr"""
44-
45- def __init__ (self , stdout = None , stderr = None ):
46- if settings .CONSOLE_LOGGING :
47- self .enabled = False
48- else :
49- self .enabled = True
50- if isinstance (stdout , str ):
51- stdout = self .stdout_descriptor = open (stdout , "w" )
52- if isinstance (stderr , str ):
53- stderr = self .stdout_descriptor = open (stderr , "w" )
54-
55- self ._stdout = stdout or sys .stdout
56- self ._stderr = stderr or sys .stderr
57-
58- def __enter__ (self ):
59- if self .enabled :
60- self .old_stdout , self .old_stderr = sys .stdout , sys .stderr
61- self .old_stdout .flush ()
62- self .old_stderr .flush ()
63- sys .stdout , sys .stderr = self ._stdout , self ._stderr
64-
65- def __exit__ (self , exc_type , exc_value , traceback ):
66- if self .enabled :
67- self ._stdout .flush ()
68- self ._stderr .flush ()
69- sys .stdout = self .old_stdout
70- sys .stderr = self .old_stderr
71- if hasattr (self , 'stdout_descriptor' ):
72- self .stdout_descriptor .close ()
73- if hasattr (self , 'stderr_descriptor' ):
74- self .stderr_descriptor .close ()
75-
76-
7744def memoize_by_args (func ):
7845 """Memoizes return value of a func based on args."""
7946 memory = {}
@@ -89,42 +56,6 @@ def memoized(*args):
8956 return memoized
9057
9158
92- def license_from_trove (trove ):
93- """Finds out license from list of trove classifiers.
94- Args:
95- trove: list of trove classifiers
96- Returns:
97- Fedora name of the package license or empty string, if no licensing
98- information is found in trove classifiers.
99- """
100- license = []
101- for classifier in trove :
102- if 'License' in classifier != - 1 :
103- stripped = classifier .strip ()
104- # if taken from EGG-INFO, begins with Classifier:
105- stripped = stripped [stripped .find ('License' ):]
106- if stripped in settings .TROVE_LICENSES :
107- license .append (settings .TROVE_LICENSES [stripped ])
108- return ' and ' .join (license )
109-
110-
111- def versions_from_trove (trove ):
112- """Finds out python version from list of trove classifiers.
113- Args:
114- trove: list of trove classifiers
115- Returns:
116- python version string
117- """
118- versions = set ()
119- for classifier in trove :
120- if 'Programming Language :: Python ::' in classifier :
121- ver = classifier .split ('::' )[- 1 ]
122- major = ver .split ('.' )[0 ].strip ()
123- if major :
124- versions .add (major )
125- return sorted ([v for v in versions if v .replace ('.' , '' , 1 ).isdigit ()])
126-
127-
12859def build_srpm (specfile , save_dir ):
12960 """Builds a srpm from given specfile using rpmbuild.
13061 Generated srpm is stored in directory specified by save_dir.
@@ -134,7 +65,7 @@ def build_srpm(specfile, save_dir):
13465 save_dir: path to source and build tree
13566 """
13667 logger .info ('Starting rpmbuild to build: {0} SRPM.' .format (specfile ))
137- if save_dir != settings . DEFAULT_PKG_SAVE_PATH :
68+ if save_dir != get_default_save_path () :
13869 try :
13970 msg = subprocess .Popen (['rpmbuild' ,
14071 '--define' , '_sourcedir {0}' .format (save_dir ),
@@ -185,14 +116,6 @@ def unique_deps(deps):
185116 return list (k for k , _ in itertools .groupby (deps ))
186117
187118
188- def get_interpreter_path (version = None ):
189- """Return the executable of a specified or current version."""
190- if version and version != str (sys .version_info [0 ]):
191- return settings .PYTHON_INTERPRETER + version
192- else :
193- return sys .executable
194-
195-
196119if PY3 :
197120 def console_to_str (s ):
198121 try :
@@ -211,3 +134,30 @@ def c_time_locale():
211134 locale .setlocale (locale .LC_TIME , 'C' )
212135 yield
213136 locale .setlocale (locale .LC_TIME , old_time_locale )
137+
138+
139+ def rpm_eval (macro ):
140+ """Get value of given macro using rpm tool"""
141+ try :
142+ value = subprocess .Popen (
143+ ['rpm' , '--eval' , macro ],
144+ stdout = subprocess .PIPE ).communicate ()[0 ].strip ()
145+ except OSError :
146+ logger .error ('Failed to get value of {0} rpm macro' .format (
147+ macro ), exc_info = True )
148+ value = b''
149+ return console_to_str (value )
150+
151+
152+ def get_default_save_path ():
153+ """Return default save path for the packages"""
154+ macro = '%{_topdir}'
155+ if rpm :
156+ save_path = rpm .expandMacro (macro )
157+ else :
158+ save_path = rpm_eval (macro )
159+ if not save_path :
160+ logger .warn ("rpm tools are missing, using default save path "
161+ "~/rpmbuild/." )
162+ save_path = os .path .expanduser ('~/rpmbuild' )
163+ return save_path
0 commit comments