diff --git a/src/app/installed-packages-config-panel.coffee b/src/app/installed-packages-config-panel.coffee index d9c5607e4..7d8f34d14 100644 --- a/src/app/installed-packages-config-panel.coffee +++ b/src/app/installed-packages-config-panel.coffee @@ -3,14 +3,20 @@ _ = require 'underscore' Package = require 'package' ConfigPanel = require 'config-panel' PackageConfigView = require 'package-config-view' +packageManager = require 'package-manager' ### Internal ### module.exports = class InstalledPackagesConfigPanel extends ConfigPanel @content: -> - @div class: 'installed-packages' + @div class: 'installed-packages', => + @div outlet: 'loadingArea', class: 'alert alert-info loading-area', => + @span 'Loading installed packages\u2026' initialize: -> - for metadata in _.sortBy(atom.getAvailablePackageMetadata(), 'name') - @append(new PackageConfigView(metadata)) + packages = _.sortBy(atom.getAvailablePackageMetadata(), 'name') + packageManager.renderMarkdownInMetadata packages, => + @loadingArea.hide() + @append(new PackageConfigView(pack)) for pack in packages + @trigger 'installed-packages-loaded', [packages] diff --git a/src/app/package-config-panel.coffee b/src/app/package-config-panel.coffee index e5aa949b4..39fead24f 100644 --- a/src/app/package-config-panel.coffee +++ b/src/app/package-config-panel.coffee @@ -34,6 +34,8 @@ class PackageConfigPanel extends ConfigPanel @availableLink.addClass('active') @available.show() - @installedCount.text(atom.getAvailablePackageNames().length) + @installed.on 'installed-packages-loaded', (event, packages) => + @installedCount.text(packages.length) + @available.on 'available-packages-loaded', (event, packages) => @availableCount.text(packages.length) diff --git a/src/app/package-manager.coffee b/src/app/package-manager.coffee index fb486a685..870c938a6 100644 --- a/src/app/package-manager.coffee +++ b/src/app/package-manager.coffee @@ -4,57 +4,68 @@ async = require 'async' ### Internal ### -module.exports = - getAvailable: (callback) -> - apm = require.resolve '.bin/apm' - apmProcess = spawn(apm, ['available', '--json']) - chunks = [] - apmProcess.stdout.on 'data', (chunk) -> chunks.push(chunk) - apmProcess.on 'close', (code) -> - if code is 0 - try - packages = JSON.parse(Buffer.concat(chunks).toString()) ? [] - catch error - callback(error) - return +renderMarkdownInMetadata = (packages, callback) -> + queue = async.queue (pack, callback) -> + operations = [] + if pack.description + operations.push (callback) -> + roaster pack.description, {}, (error, html) -> + pack.descriptionHtml = html + callback() + if pack.readme + operations.push (callback) -> + roaster pack.readme, {}, (error, html) -> + pack.readmeHtml = html + callback() + async.waterfall(operations, callback) + queue.push(pack) for pack in packages + queue.drain = callback - if packages.length > 0 - queue = async.queue (pack, callback) -> - roaster pack.description, {}, (error, html) -> - pack.descriptionHtml = html - roaster pack.readme, {}, (error, html) -> - pack.readmeHtml = html - callback() - queue.push(pack) for pack in packages - queue.drain = -> callback(null, packages) - else - callback(null, packages) +getAvailable = (callback) -> + apm = require.resolve '.bin/apm' + apmProcess = spawn(apm, ['available', '--json']) + chunks = [] + apmProcess.stdout.on 'data', (chunk) -> chunks.push(chunk) + apmProcess.on 'close', (code) -> + if code is 0 + try + packages = JSON.parse(Buffer.concat(chunks).toString()) ? [] + catch error + callback(error) + return + + if packages.length > 0 + renderMarkdownInMetadata packages, -> callback(null, packages) else - callback(new Error("apm failed with code: #{code}")) + callback(null, packages) + else + callback(new Error("apm failed with code: #{code}")) - install: ({name, version}, callback) -> - activateOnSuccess = !atom.isPackageDisabled(name) - activateOnFailure = atom.isPackageActive(name) - atom.deactivatePackage(name) if atom.isPackageActive(name) +install = ({name, version}, callback) -> + activateOnSuccess = !atom.isPackageDisabled(name) + activateOnFailure = atom.isPackageActive(name) + atom.deactivatePackage(name) if atom.isPackageActive(name) - apm = require.resolve '.bin/apm' - apmProcess = spawn(apm, ['install', "#{name}@#{version}"]) - apmProcess.on 'close', (code) => - if code is 0 - atom.activatePackage(name) if activateOnSuccess - callback() - else - actom.activatePackage(name) if activateOnFailure - callback(new Error("Installing '#{name}' failed.")) + apm = require.resolve '.bin/apm' + apmProcess = spawn(apm, ['install', "#{name}@#{version}"]) + apmProcess.on 'close', (code) => + if code is 0 + atom.activatePackage(name) if activateOnSuccess + callback() + else + actom.activatePackage(name) if activateOnFailure + callback(new Error("Installing '#{name}' failed.")) - uninstall: ({name}, callback) -> - atom.deactivatePackage(name) if atom.isPackageActive(name) +uninstall = ({name}, callback) -> + atom.deactivatePackage(name) if atom.isPackageActive(name) - apm = require.resolve '.bin/apm' - apmProcess = spawn(apm, ['uninstall', name]) - apmProcess.on 'close', (code) => - if code is 0 - atom.unloadPackage(name) - callback() - else - callback(new Error("Uninstalling '#{name}' failed.")) + apm = require.resolve '.bin/apm' + apmProcess = spawn(apm, ['uninstall', name]) + apmProcess.on 'close', (code) => + if code is 0 + atom.unloadPackage(name) + callback() + else + callback(new Error("Uninstalling '#{name}' failed.")) + +module.exports = {renderMarkdownInMetadata, install, uninstall, getAvailable}