From 34bf8adb99302711d3c7f82457a76f3735f104aa Mon Sep 17 00:00:00 2001 From: Simo Kinnunen Date: Tue, 2 Dec 2014 15:00:09 +0900 Subject: [PATCH] Remove packages that were not present when the device was connected. --- lib/units/device/index.js | 1 + lib/units/device/plugins/cleanup.js | 46 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 lib/units/device/plugins/cleanup.js diff --git a/lib/units/device/index.js b/lib/units/device/index.js index 1e1b904b..d77586be 100644 --- a/lib/units/device/index.js +++ b/lib/units/device/index.js @@ -30,6 +30,7 @@ module.exports = function(options) { .dependency(require('./plugins/install')) .dependency(require('./plugins/forward')) .dependency(require('./plugins/group')) + .dependency(require('./plugins/cleanup')) .dependency(require('./plugins/reboot')) .dependency(require('./plugins/connect')) .dependency(require('./plugins/data')) diff --git a/lib/units/device/plugins/cleanup.js b/lib/units/device/plugins/cleanup.js new file mode 100644 index 00000000..5f5021e6 --- /dev/null +++ b/lib/units/device/plugins/cleanup.js @@ -0,0 +1,46 @@ +var syrup = require('stf-syrup') +var Promise = require('bluebird') +var _ = require('lodash') + +var logger = require('../../../util/logger') + +module.exports = syrup.serial() + .dependency(require('../support/adb')) + .dependency(require('../resources/service')) + .dependency(require('./group')) + .define(function(options, adb, service, group) { + var log = logger.createLogger('device:plugins:cleanup') + var plugin = Object.create(null) + + function listPackages() { + return adb.getPackages(options.serial) + } + + function uninstallPackage(pkg) { + log.info('Cleaning up package "%s"', pkg) + return adb.uninstall(options.serial, pkg) + .catch(function(err) { + log.warn('Unable to clean up package "%s"', pkg, err) + return true + }) + } + + return listPackages() + .then(function(initialPackages) { + initialPackages.push(service.pkg) + + plugin.removePackages = function() { + return listPackages() + .then(function(currentPackages) { + var remove = _.difference(currentPackages, initialPackages) + return Promise.map(remove, uninstallPackage) + }) + } + + group.on('leave', function() { + plugin.removePackages() + }) + + }) + .return(plugin) + })