func (app *App) installPackage( packageName string, settings config.Settings, progressCallback caravel.RetrievalProgressCallback) (err error) { remoteDescriptor := app.GetRemoteDescriptor() packageURL, err := remoteDescriptor.GetRemoteFileURL(packageName) if err != nil { return err } log.Debug("Creating package temp file...") packageTempFile, err := ioutil.TempFile(os.TempDir(), packageName) if err != nil { return err } packageTempFilePath := packageTempFile.Name() log.Debug("Package temp file created '%v'", packageTempFilePath) defer func() { packageTempFile.Close() log.Debug("Deleting package temp file: '%v'", packageTempFilePath) tempFileRemovalErr := os.Remove(packageTempFilePath) if tempFileRemovalErr != nil { log.Warning("Could not remove the package temp file! '%v'", tempFileRemovalErr) } else { log.Notice("Package temp file removed") } }() log.Info("Retrieving package: %v", packageURL) err = caravel.RetrieveChunksFromURL(packageURL, packageTempFile, settings.GetBufferSize(), progressCallback) if err != nil { return err } log.Notice("Package retrieved") log.Debug("Closing the package temp file...") packageTempFile.Close() if err != nil { return err } log.Notice("Package temp file closed") err = os.MkdirAll(app.filesDirectory, 0700) if err != nil { return err } log.Info("Extracting the package. Skipping levels: %v...", remoteDescriptor.GetSkipPackageLevels()) err = caravel.ExtractZipSkipLevels(packageTempFilePath, app.filesDirectory, remoteDescriptor.GetSkipPackageLevels()) if err != nil { return err } log.Notice("Package extracted") return nil }