@@ -26,12 +26,7 @@ func InstallAll(args []string) error {
2626
2727 errCount := 0
2828 for _ , pkg := range lck .Packages {
29- path := pkg .Specfile
30- if path == "" {
31- debug ("missing specfile for %s, falling back to name/owner" , pkg .FullName ())
32- path = pkg .FullName ()
33- }
34- err = installPackage (path )
29+ err = installLockedPackage (pkg )
3530 if err != nil {
3631 errCount += 1
3732 log ("! %s" , err )
@@ -111,3 +106,61 @@ func installPackage(path string) error {
111106 log ("✓ installed package %s to %s" , pkg .FullName (), dir )
112107 return nil
113108}
109+
110+ // installLockedPackage installs a specific version of a package from the lockfile.
111+ func installLockedPackage (lckPkg * spec.Package ) error {
112+ path := lckPkg .Specfile
113+ if path == "" {
114+ debug ("missing specfile for %s, falling back to name/owner" , lckPkg .FullName ())
115+ path = lckPkg .FullName ()
116+ }
117+
118+ log ("> installing %s..." , path )
119+
120+ pkg , err := readSpec (path )
121+ if err != nil {
122+ return err
123+ }
124+
125+ // lock the version
126+ debug ("locked version = %s" , lckPkg .Version )
127+ pkg .Version = lckPkg .Version
128+ pkg .Assets = lckPkg .Assets
129+
130+ if ! hasNewVersion (pkg ) {
131+ log ("✓ already at the %s version" , pkg .Version )
132+ return nil
133+ }
134+
135+ assetPath , err := buildAssetPath (pkg )
136+ if err != nil {
137+ return err
138+ }
139+
140+ asset , err := downloadAsset (pkg , assetPath )
141+ if err != nil {
142+ return err
143+ }
144+
145+ err = validateAsset (pkg , asset )
146+ if err != nil {
147+ return err
148+ }
149+
150+ err = unpackAsset (pkg , asset )
151+ if err != nil {
152+ return err
153+ }
154+
155+ err = installFiles (pkg , asset )
156+ if err != nil {
157+ return err
158+ }
159+
160+ // no need to add the package to the lockfile,
161+ // it's already there
162+
163+ dir := spec .Dir (workDir , pkg .Owner , pkg .Name )
164+ log ("✓ installed package %s to %s" , pkg .FullName (), dir )
165+ return nil
166+ }
0 commit comments