1818import os
1919import platform
2020import subprocess
21- import sys
2221import time
2322
2423import click
@@ -122,13 +121,17 @@ def install_platformio_core(shutdown_piohome=True, develop=False, ignore_pythons
122121
123122
124123def check (dev = False , auto_upgrade = False , version_requirements = None ):
125-
126124 # pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
127125 from pioinstaller import penv
128126
129127 platformio_exe = os .path .join (
130128 penv .get_penv_bin_dir (), "platformio.exe" if util .IS_WINDOWS else "platformio" ,
131129 )
130+ python_exe = os .path .join (
131+ penv .get_penv_bin_dir (), "python.exe" if util .IS_WINDOWS else "python"
132+ )
133+ result = {}
134+
132135 if not os .path .isfile (platformio_exe ):
133136 raise exception .InvalidPlatformIOCore (
134137 "PlatformIO executable not found in `%s`" % penv .get_penv_bin_dir ()
@@ -141,18 +144,35 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
141144 )
142145
143146 try :
144- # pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
145- import platformio
146- except ImportError :
147- raise exception .InvalidPlatformIOCore ("Could not import PlatformIO module" )
147+ result .update (fetch_python_state (python_exe ))
148+ except subprocess .CalledProcessError as e :
149+ error = e .output .decode ()
150+ raise exception .InvalidPlatformIOCore (
151+ "Could not import PlatformIO module. Error: %s" % error
152+ )
153+
154+ piocore_version = convert_version (result .get ("core_version" ))
155+ dev = dev or bool (piocore_version .prerelease if piocore_version else False )
156+ result .update (
157+ {
158+ "core_dir" : get_core_dir (),
159+ "cache_dir" : get_cache_dir (),
160+ "penv_dir" : penv .get_penv_dir (),
161+ "penv_bin_dir" : penv .get_penv_bin_dir (),
162+ "platformio_exe" : platformio_exe ,
163+ "installer_version" : __version__ ,
164+ "python_exe" : python_exe ,
165+ "system" : util .get_systype (),
166+ "is_develop_core" : dev ,
167+ }
168+ )
148169
149- pio_version = get_pio_version (platformio )
150170 if version_requirements :
151171 try :
152- if pio_version in semantic_version .Spec (version_requirements ):
172+ if piocore_version in semantic_version .Spec (version_requirements ):
153173 raise exception .InvalidPlatformIOCore (
154174 "PlatformIO Core version %s does not match version requirements %s."
155- % (str (pio_version ), version_requirements )
175+ % (str (piocore_version ), version_requirements )
156176 )
157177 except ValueError :
158178 click .secho (
@@ -161,46 +181,28 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
161181 % version_requirements
162182 )
163183
164- state = None
165-
166184 with open (os .path .join (penv .get_penv_dir (), "state.json" )) as fp :
167- state = json .load (fp )
168- if state .get ("platform" ) != platform .platform ():
185+ penv_state = json .load (fp )
186+ if penv_state .get ("platform" ) != platform .platform ():
169187 raise exception .InvalidPlatformIOCore (
170188 "PlatformIO installed using another platform `%s`. Your platform: %s"
171- % (state .get ("platform" ), platform .platform ())
189+ % (penv_state .get ("platform" ), platform .platform ())
172190 )
173191
174192 try :
175193 subprocess .check_output ([platformio_exe , "--version" ], stderr = subprocess .STDOUT )
176194 except subprocess .CalledProcessError as e :
177195 error = e .output .decode ()
178196 raise exception .InvalidPlatformIOCore (
179- "Could not run `%s --version`.\n Error: %s" % (platformio , str (error ))
197+ "Could not run `%s --version`.\n Error: %s" % (platformio_exe , str (error ))
180198 )
181199
182- dev = dev or bool (pio_version .prerelease )
183- result = {
184- "core_dir" : get_core_dir (),
185- "cache_dir" : get_cache_dir (),
186- "penv_dir" : penv .get_penv_dir (),
187- "penv_bin_dir" : penv .get_penv_bin_dir (),
188- "platformio_exe" : platformio_exe ,
189- "core_version" : str (pio_version ),
190- "installer_version" : __version__ ,
191- "python_exe" : os .path .join (
192- penv .get_penv_bin_dir (), "python.exe" if util .IS_WINDOWS else "python"
193- ),
194- "system" : util .get_systype (),
195- "is_develop_core" : dev ,
196- }
197-
198200 if not auto_upgrade :
199201 return result
200202
201203 time_now = int (round (time .time ()))
202204
203- last_piocore_version_check = state .get ("last_piocore_version_check" )
205+ last_piocore_version_check = penv_state .get ("last_piocore_version_check" )
204206
205207 if (
206208 last_piocore_version_check
@@ -209,31 +211,43 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
209211 return result
210212
211213 with open (os .path .join (penv .get_penv_dir (), "state.json" ), "w" ) as fp :
212- state ["last_piocore_version_check" ] = time_now
213- json .dump (state , fp )
214+ penv_state ["last_piocore_version_check" ] = time_now
215+ json .dump (penv_state , fp )
214216
215217 if not last_piocore_version_check :
216218 return result
217219
218220 upgrade_core (platformio_exe , dev )
219221
220- result ["core_version" ] = get_pio_version (platformio )
221-
222+ try :
223+ result .update (fetch_python_state (python_exe ))
224+ except : # pylint:disable=bare-except
225+ raise exception .InvalidPlatformIOCore ("Could not import PlatformIO module" )
222226 return result
223227
224228
225- def get_pio_version (platformio ):
229+ def fetch_python_state (python_exe ):
230+ code = """import platform
231+ import json
232+ import platformio
233+
234+ state = {
235+ "core_version": platformio.__version__,
236+ "python_version": platform.python_version()
237+ }
238+ print(json.dumps(state))
239+ """
240+ state = subprocess .check_output (
241+ [python_exe , "-c" , code ,], stderr = subprocess .STDOUT ,
242+ )
243+ return json .loads (state .decode ())
244+
245+
246+ def convert_version (version ):
226247 try :
227- if sys .version_info [0 ] == 3 :
228- # pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
229- import importlib
230-
231- importlib .reload (platformio ) # pylint:disable=no-member
232- else :
233- reload (platformio )
234- return semantic_version .Version (util .pepver_to_semver (platformio .__version__ ))
248+ return semantic_version .Version (util .pepver_to_semver (version ))
235249 except : # pylint:disable=bare-except
236- return platformio . __version__
250+ return None
237251
238252
239253def upgrade_core (platformio_exe , dev = False ):
0 commit comments