1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15- import io
1615import json
1716import logging
1817import os
1918import platform
2019import subprocess
21- import sys
2220import time
2321
2422import click
@@ -122,13 +120,17 @@ def install_platformio_core(shutdown_piohome=True, develop=False, ignore_pythons
122120
123121
124122def check (dev = False , auto_upgrade = False , version_requirements = None ):
125-
126123 # pylint: disable=bad-option-value, import-outside-toplevel, unused-import, import-error, unused-variable, cyclic-import
127124 from pioinstaller import penv
128125
129126 platformio_exe = os .path .join (
130127 penv .get_penv_bin_dir (), "platformio.exe" if util .IS_WINDOWS else "platformio" ,
131128 )
129+ python_exe = os .path .join (
130+ penv .get_penv_bin_dir (), "python.exe" if util .IS_WINDOWS else "python"
131+ )
132+ result = {}
133+
132134 if not os .path .isfile (platformio_exe ):
133135 raise exception .InvalidPlatformIOCore (
134136 "PlatformIO executable not found in `%s`" % penv .get_penv_bin_dir ()
@@ -141,18 +143,35 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
141143 )
142144
143145 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" )
146+ result .update (fetch_python_state (python_exe ))
147+ except subprocess .CalledProcessError as e :
148+ error = e .output .decode ()
149+ raise exception .InvalidPlatformIOCore (
150+ "Could not import PlatformIO module. Error: %s" % error
151+ )
152+
153+ piocore_version = convert_version (result .get ("core_version" ))
154+ dev = dev or bool (piocore_version .prerelease if piocore_version else False )
155+ result .update (
156+ {
157+ "core_dir" : get_core_dir (),
158+ "cache_dir" : get_cache_dir (),
159+ "penv_dir" : penv .get_penv_dir (),
160+ "penv_bin_dir" : penv .get_penv_bin_dir (),
161+ "platformio_exe" : platformio_exe ,
162+ "installer_version" : __version__ ,
163+ "python_exe" : python_exe ,
164+ "system" : util .get_systype (),
165+ "is_develop_core" : dev ,
166+ }
167+ )
148168
149- pio_version = get_pio_version (platformio )
150169 if version_requirements :
151170 try :
152- if pio_version in semantic_version .Spec (version_requirements ):
171+ if piocore_version in semantic_version .Spec (version_requirements ):
153172 raise exception .InvalidPlatformIOCore (
154173 "PlatformIO Core version %s does not match version requirements %s."
155- % (str (pio_version ), version_requirements )
174+ % (str (piocore_version ), version_requirements )
156175 )
157176 except ValueError :
158177 click .secho (
@@ -161,46 +180,28 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
161180 % version_requirements
162181 )
163182
164- state = None
165-
166183 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 ():
184+ penv_state = json .load (fp )
185+ if penv_state .get ("platform" ) != platform .platform (terse = True ):
169186 raise exception .InvalidPlatformIOCore (
170187 "PlatformIO installed using another platform `%s`. Your platform: %s"
171- % (state .get ("platform" ), platform .platform ())
188+ % (penv_state .get ("platform" ), platform .platform (terse = True ))
172189 )
173190
174191 try :
175192 subprocess .check_output ([platformio_exe , "--version" ], stderr = subprocess .STDOUT )
176193 except subprocess .CalledProcessError as e :
177194 error = e .output .decode ()
178195 raise exception .InvalidPlatformIOCore (
179- "Could not run `%s --version`.\n Error: %s" % (platformio , str (error ))
196+ "Could not run `%s --version`.\n Error: %s" % (platformio_exe , str (error ))
180197 )
181198
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-
198199 if not auto_upgrade :
199200 return result
200201
201202 time_now = int (round (time .time ()))
202203
203- last_piocore_version_check = state .get ("last_piocore_version_check" )
204+ last_piocore_version_check = penv_state .get ("last_piocore_version_check" )
204205
205206 if (
206207 last_piocore_version_check
@@ -209,31 +210,43 @@ def check(dev=False, auto_upgrade=False, version_requirements=None):
209210 return result
210211
211212 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 )
213+ penv_state ["last_piocore_version_check" ] = time_now
214+ json .dump (penv_state , fp )
214215
215216 if not last_piocore_version_check :
216217 return result
217218
218219 upgrade_core (platformio_exe , dev )
219220
220- result ["core_version" ] = get_pio_version (platformio )
221-
221+ try :
222+ result .update (fetch_python_state (python_exe ))
223+ except : # pylint:disable=bare-except
224+ raise exception .InvalidPlatformIOCore ("Could not import PlatformIO module" )
222225 return result
223226
224227
225- def get_pio_version (platformio ):
228+ def fetch_python_state (python_exe ):
229+ code = """import platform
230+ import json
231+ import platformio
232+
233+ state = {
234+ "core_version": platformio.__version__,
235+ "python_version": platform.python_version()
236+ }
237+ print(json.dumps(state))
238+ """
239+ state = subprocess .check_output (
240+ [python_exe , "-c" , code ,], stderr = subprocess .STDOUT ,
241+ )
242+ return json .loads (state .decode ())
243+
244+
245+ def convert_version (version ):
226246 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__ ))
247+ return semantic_version .Version (util .pepver_to_semver (version ))
235248 except : # pylint:disable=bare-except
236- return platformio . __version__
249+ return None
237250
238251
239252def upgrade_core (platformio_exe , dev = False ):
@@ -259,5 +272,5 @@ def dump_state(target, state):
259272 if not os .path .isdir (os .path .dirname (target )):
260273 os .makedirs (os .path .dirname (target ))
261274
262- with io . open (target , "w" , encoding = "utf-8 " ) as fp :
275+ with open (target , "w" ) as fp :
263276 json .dump (state , fp )
0 commit comments