4
4
import json
5
5
from os import makedirs , remove
6
6
from os .path import isdir , isfile , join
7
+ from shutil import rmtree
7
8
9
+ from click import echo , secho , style
8
10
from requests import get
9
11
10
12
from platformio import __pkgmanifesturl__
11
13
from platformio .downloader import FileDownloader
12
14
from platformio .exception import (InvalidPackageVersion , NonSystemPackage ,
13
- PackageInstalled , UnknownPackage )
15
+ UnknownPackage )
14
16
from platformio .unpacker import FileUnpacker
15
17
from platformio .util import get_home_dir , get_system
16
18
17
19
18
20
class PackageManager (object ):
19
21
22
+ DBFILE_PATH = join (get_home_dir (), "installed.json" )
23
+
20
24
def __init__ (self , platform_name ):
21
25
self ._platform_name = platform_name
22
- self ._platforms_dir = get_home_dir ()
23
- self ._dbfile = join (self ._platforms_dir , "installed.json" )
24
26
25
27
@staticmethod
26
28
def get_manifest ():
27
- return get (__pkgmanifesturl__ ).json ()
29
+ try :
30
+ return PackageManager ._cached_manifest
31
+ except AttributeError :
32
+ PackageManager ._cached_manifest = get (__pkgmanifesturl__ ).json ()
33
+ return PackageManager ._cached_manifest
28
34
29
35
@staticmethod
30
36
def download (url , dest_dir , sha1 = None ):
@@ -38,22 +44,23 @@ def unpack(pkgpath, dest_dir):
38
44
fu = FileUnpacker (pkgpath , dest_dir )
39
45
return fu .start ()
40
46
41
- def get_installed (self ):
47
+ @staticmethod
48
+ def get_installed (platform = None ):
42
49
data = {}
43
- if isfile (self . _dbfile ):
44
- with open (self . _dbfile ) as fp :
50
+ if isfile (PackageManager . DBFILE_PATH ):
51
+ with open (PackageManager . DBFILE_PATH ) as fp :
45
52
data = json .load (fp )
46
- return data
53
+ return data .get (platform , None ) if platform else data
54
+
55
+ def get_platform_dir (self ):
56
+ return join (get_home_dir (), self ._platform_name )
47
57
48
58
def is_installed (self , name ):
49
59
installed = self .get_installed ()
50
60
return (self ._platform_name in installed and name in
51
61
installed [self ._platform_name ])
52
62
53
63
def get_info (self , name , version = None ):
54
- if self .is_installed (name ):
55
- raise PackageInstalled (name )
56
-
57
64
manifest = self .get_manifest ()
58
65
if name not in manifest :
59
66
raise UnknownPackage (name )
@@ -74,8 +81,14 @@ def get_info(self, name, version=None):
74
81
return sorted (builds , key = lambda s : s ['version' ])[- 1 ]
75
82
76
83
def install (self , name , path ):
84
+ echo ("Installing %s package:" % style (name , fg = "cyan" ))
85
+
86
+ if self .is_installed (name ):
87
+ secho ("Already installed" , fg = "yellow" )
88
+ return
89
+
77
90
info = self .get_info (name )
78
- pkg_dir = join (self ._platforms_dir , self . _platform_name , path )
91
+ pkg_dir = join (self .get_platform_dir () , path )
79
92
if not isdir (pkg_dir ):
80
93
makedirs (pkg_dir )
81
94
@@ -85,13 +98,59 @@ def install(self, name, path):
85
98
# remove archive
86
99
remove (dlpath )
87
100
101
+ def uninstall (self , name , path ):
102
+ echo ("Uninstalling %s package: \t " % style (name , fg = "cyan" ),
103
+ nl = False )
104
+ rmtree (join (self .get_platform_dir (), path ))
105
+ self ._unregister (name )
106
+ echo ("[%s]" % style ("OK" , fg = "green" ))
107
+
108
+ def update (self , name ):
109
+ echo ("Updating %s package:" % style (name , fg = "yellow" ))
110
+
111
+ installed = self .get_installed (self ._platform_name )
112
+ current_version = installed [name ]['version' ]
113
+ latest_version = self .get_info (name )['version' ]
114
+
115
+ echo ("Versions: Current=%d, Latest=%d \t " % (
116
+ current_version , latest_version ), nl = False )
117
+
118
+ if current_version == latest_version :
119
+ echo ("[%s]" % (style ("Up-to-date" , fg = "green" )))
120
+ return True
121
+ else :
122
+ echo ("[%s]" % (style ("Out-of-date" , fg = "red" )))
123
+
124
+ self .uninstall (name , installed [name ]['path' ])
125
+ self .install (name , installed [name ]['path' ])
126
+
127
+ def register_platform (self , name ):
128
+ data = self .get_installed ()
129
+ if name not in data :
130
+ data [name ] = {}
131
+ self ._update_db (data )
132
+ return data
133
+
134
+ def unregister_platform (self , name ):
135
+ data = self .get_installed ()
136
+ del data [name ]
137
+ self ._update_db (data )
138
+
88
139
def _register (self , name , version , path ):
89
140
data = self .get_installed ()
90
141
if self ._platform_name not in data :
91
- data [ self . _platform_name ] = {}
142
+ data = self . register_platform ( self . _platform_name )
92
143
data [self ._platform_name ][name ] = {
93
144
"version" : version ,
94
145
"path" : path
95
146
}
96
- with open (self ._dbfile , "w" ) as fp :
147
+ self ._update_db (data )
148
+
149
+ def _unregister (self , name ):
150
+ data = self .get_installed ()
151
+ del data [self ._platform_name ][name ]
152
+ self ._update_db (data )
153
+
154
+ def _update_db (self , data ):
155
+ with open (self .DBFILE_PATH , "w" ) as fp :
97
156
json .dump (data , fp )
0 commit comments