You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by an...@apache.org on 2013/07/27 23:17:25 UTC

git commit: adding registry code in plugman and removing dependencies. Updated configuration handling

Updated Branches:
  refs/heads/plugman-registry 453553d5c -> fd679f380


adding registry code in plugman and removing dependencies. Updated configuration handling


Project: http://git-wip-us.apache.org/repos/asf/cordova-plugman/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugman/commit/fd679f38
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugman/tree/fd679f38
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugman/diff/fd679f38

Branch: refs/heads/plugman-registry
Commit: fd679f38013c3171cddebed8173409b4546f0c95
Parents: 453553d
Author: Anis Kadri <an...@apache.org>
Authored: Sat Jul 27 14:17:27 2013 -0700
Committer: Anis Kadri <an...@apache.org>
Committed: Sat Jul 27 14:17:27 2013 -0700

----------------------------------------------------------------------
 package.json              |   5 +-
 spec/adduser.spec.js      |   9 +-
 spec/config.js            |  10 ++
 spec/fetch.spec.js        |   2 +
 spec/publish.spec.js      |   5 +-
 spec/registry/registry.js |  20 ++++
 spec/search.spec.js       |   5 +-
 spec/unpublish.spec.js    |   5 +-
 src/adduser.js            |  23 ++---
 src/config.js             |  15 +++
 src/fetch.js              |   4 +-
 src/publish.js            |  25 +++--
 src/registry/manifest.js  |  69 +++++++++++++
 src/registry/registry.js  | 218 +++++++++++++++++++++++++++++++++++++++++
 src/search.js             |  13 +--
 src/unpublish.js          |  23 ++---
 16 files changed, 381 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 16d9285..6a2af97 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,10 @@
     "underscore":"1.4.4",
     "dep-graph":"1.1.0",
     "semver": "2.0.x",
-    "plugman-registry": "0.0.6"
+    "npm": "1.3.4",
+    "rc": "0.3.0",
+    "xmldom": "0.1.16",
+    "tar.gz": "0.1.1"
   },
   "devDependencies": {
     "jasmine-node": "1.7.0"

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/adduser.spec.js
----------------------------------------------------------------------
diff --git a/spec/adduser.spec.js b/spec/adduser.spec.js
index 563592d..732ee71 100644
--- a/spec/adduser.spec.js
+++ b/spec/adduser.spec.js
@@ -1,13 +1,10 @@
 var adduser = require('../src/adduser'),
-    config = require('../config'),
-    registry = require('plugman-registry');
+    registry = require('../src/registry/registry');
 
 describe('adduser', function() {
     it('should add a user', function() {
-        var sUse = spyOn(registry, 'use').andCallThrough();
         var sAddUser = spyOn(registry, 'adduser');
-        adduser();
-        expect(sUse).toHaveBeenCalledWith(config.registry, jasmine.any(Function));
-        expect(sAddUser).toHaveBeenCalled();
+        adduser(function(err, result) { });
+        expect(sAddUser).toHaveBeenCalledWith(null, jasmine.any(Function));
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/config.js
----------------------------------------------------------------------
diff --git a/spec/config.js b/spec/config.js
new file mode 100644
index 0000000..5f4f781
--- /dev/null
+++ b/spec/config.js
@@ -0,0 +1,10 @@
+var config = require('../src/config'),
+    registry = require('../src/registry/registry');
+
+describe('config', function() {
+    it('should run config', function() {
+        var sConfig = spyOn(registry, 'config');
+        config(function(err, result) { });
+        expect(sConfig).toHaveBeenCalledWith(jasmine.any(Function));
+    });
+});

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/fetch.spec.js
----------------------------------------------------------------------
diff --git a/spec/fetch.spec.js b/spec/fetch.spec.js
index 4151020..3213ad4 100644
--- a/spec/fetch.spec.js
+++ b/spec/fetch.spec.js
@@ -28,6 +28,8 @@ describe('fetch', function() {
             expect(cp).toHaveBeenCalledWith('-R', path.join(test_plugin, '*'), path.join(temp, 'id'));
         });
         it('should copy locally-available plugin to plugins directory when spaces in path', function() {
+            //XXX: added this because plugman tries to fetch from registry when plugin folder does not exist
+            spyOn(fs,'existsSync').andReturn(true);
             fetch(test_plugin_with_space, temp);
             expect(cp).toHaveBeenCalledWith('-R', path.join(test_plugin_with_space, '*'), path.join(temp, 'id'));
         });

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/publish.spec.js
----------------------------------------------------------------------
diff --git a/spec/publish.spec.js b/spec/publish.spec.js
index 3a253e7..59f863e 100644
--- a/spec/publish.spec.js
+++ b/spec/publish.spec.js
@@ -1,13 +1,10 @@
 var publish = require('../src/publish'),
-    config = require('../config'),
-    registry = require('plugman-registry');
+    registry = require('../src/registry/registry');
 
 describe('publish', function() {
     it('should publish a plugin', function() {
-        var sUse = spyOn(registry, 'use').andCallThrough(); 
         var sPublish = spyOn(registry, 'publish');
         publish(new Array('/path/to/myplugin'));
-        expect(sUse).toHaveBeenCalledWith(config.registry, jasmine.any(Function));
         expect(sPublish).toHaveBeenCalledWith(['/path/to/myplugin'], jasmine.any(Function));
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/registry/registry.js
----------------------------------------------------------------------
diff --git a/spec/registry/registry.js b/spec/registry/registry.js
new file mode 100644
index 0000000..d4baf59
--- /dev/null
+++ b/spec/registry/registry.js
@@ -0,0 +1,20 @@
+var registry = require('../../src/registry/registry'),
+    npm = require('npm');
+
+describe('registry', function() {
+    beforeEach(function() {
+        registry.settings = {
+            cache: plugmanCacheDir,
+            force: true,
+            logstream: fs.createWriteStream(path.resolve(plugmanConfigDir, 'plugman.log')),
+            userconfig: path.resolve(plugmanConfigDir, 'config')
+        };
+    });
+    it('should run config', function() {
+        var sLoad = spyOn(npm, 'load').andCallThrough(); 
+        var sConfig = spyOn(npm, 'config');
+        registry.config(new Array('/path/to/myplugin'));
+        expect(sLoad).toHaveBeenCalledWith(registry.settings, jasmine.any(Function));
+        expect(sPublish).toHaveBeenCalledWith(['/path/to/myplugin'], jasmine.any(Function));
+    });
+});

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/search.spec.js
----------------------------------------------------------------------
diff --git a/spec/search.spec.js b/spec/search.spec.js
index f708854..2393c70 100644
--- a/spec/search.spec.js
+++ b/spec/search.spec.js
@@ -1,13 +1,10 @@
 var search = require('../src/search'),
-    config = require('../config'),
-    registry = require('plugman-registry');
+    registry = require('../src/registry/registry');
 
 describe('search', function() {
     it('should search a plugin', function() {
-        var sUse = spyOn(registry, 'use').andCallThrough();
         var sSearch = spyOn(registry, 'search');
         search(new Array('myplugin', 'keyword'));
-        expect(sUse).toHaveBeenCalledWith(config.registry, jasmine.any(Function));
         expect(sSearch).toHaveBeenCalledWith(['myplugin', 'keyword'], jasmine.any(Function));
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/spec/unpublish.spec.js
----------------------------------------------------------------------
diff --git a/spec/unpublish.spec.js b/spec/unpublish.spec.js
index 207804d..f454a27 100644
--- a/spec/unpublish.spec.js
+++ b/spec/unpublish.spec.js
@@ -1,13 +1,10 @@
 var unpublish = require('../src/unpublish'),
-    config = require('../config'),
-    registry = require('plugman-registry');
+    registry = require('../src/registry/registry');
 
 describe('unpublish', function() {
     it('should unpublish a plugin', function() {
-        var sUse = spyOn(registry, 'use').andCallThrough();
         var sUnpublish = spyOn(registry, 'unpublish');
         unpublish(new Array('myplugin@0.0.1'));
-        expect(sUse).toHaveBeenCalledWith(config.registry, jasmine.any(Function));
         expect(sUnpublish).toHaveBeenCalledWith(['myplugin@0.0.1'], jasmine.any(Function));
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/adduser.js
----------------------------------------------------------------------
diff --git a/src/adduser.js b/src/adduser.js
index 8ca9c9a..3ff5023 100644
--- a/src/adduser.js
+++ b/src/adduser.js
@@ -1,18 +1,15 @@
-var registry = require('plugman-registry')
-  , config = require('../config');
+var registry = require('./registry/registry')
 
 module.exports = function(callback) {
-  registry.use(config.registry, function(err) {
     registry.adduser(null, function(err) {
-      if(callback && typeof callback === 'function') {
-          err ? callback(err) : callback(null);
-      } else {
-          if(err) {
-              throw err;
-          } else {
-              console.log('user added');
-          }
-      }
+        if(callback && typeof callback === 'function') {
+            err ? callback(err) : callback(null);
+        } else {
+            if(err) {
+                throw err;
+            } else {
+                console.log('user added');
+            }
+        }
     });
-  });
 }

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/config.js
----------------------------------------------------------------------
diff --git a/src/config.js b/src/config.js
new file mode 100644
index 0000000..f863717
--- /dev/null
+++ b/src/config.js
@@ -0,0 +1,15 @@
+var registry = require('./registry/registry')
+
+module.exports = function(params, callback) {
+    registry.config(params, function(err) {
+        if(callback && typeof callback === 'function') {
+            err ? callback(err) : callback(null);
+        } else {
+            if(err) {
+                throw err;
+            } else {
+                console.log('done');
+            }
+        }
+    });
+}

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/fetch.js
----------------------------------------------------------------------
diff --git a/src/fetch.js b/src/fetch.js
index 8f76bb5..59b95cf 100644
--- a/src/fetch.js
+++ b/src/fetch.js
@@ -5,7 +5,7 @@ var shell   = require('shelljs'),
     xml_helpers = require('./util/xml-helpers'),
     metadata = require('./util/metadata'),
     path    = require('path'),
-    registry = require('plugman-registry');
+    registry = require('./registry/registry');
 // XXX: leave the require('../plugman') because jasmine shits itself if you declare it up top
 // possible options: link, subdir, git_ref
 module.exports = function fetchPlugin(plugin_dir, plugins_dir, options, callback) {
@@ -82,7 +82,6 @@ module.exports = function fetchPlugin(plugin_dir, plugins_dir, options, callback
 
         
         if(!fs.existsSync(plugin_dir)) {
-          registry.use(require('../plugman').config.registry, function() {
             registry.fetch([plugin_dir], function(err, plugin_dir) {
                 if (err) {
                     if(callback) {
@@ -93,7 +92,6 @@ module.exports = function fetchPlugin(plugin_dir, plugins_dir, options, callback
                 }
                 movePlugin(plugin_dir, false);
             });
-          })
         } else {
           movePlugin(plugin_dir, true);
         }

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/publish.js
----------------------------------------------------------------------
diff --git a/src/publish.js b/src/publish.js
index 06412cc..b5f6832 100644
--- a/src/publish.js
+++ b/src/publish.js
@@ -1,19 +1,16 @@
-var registry = require('plugman-registry')
-  , config = require('../config');
+var registry = require('./registry/registry')
 
 module.exports = function(plugin_path, callback) {
-  registry.use(config.registry, function(err) {
-      // plugin_path is an array of paths
+    // plugin_path is an array of paths
     registry.publish(plugin_path, function(err, d) {
-      if(callback && typeof callback === 'function') {
-          err ? callback(err) : callback(null);
-      } else {
-          if(err) {
-              throw err;
-          } else {
-              console.log('Plugin published');
-          }
-      }
+        if(callback && typeof callback === 'function') {
+            err ? callback(err) : callback(null);
+        } else {
+            if(err) {
+                    throw err;
+            } else {
+                    console.log('Plugin published');
+            }
+        }
     });
-  });
 }

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/registry/manifest.js
----------------------------------------------------------------------
diff --git a/src/registry/manifest.js b/src/registry/manifest.js
new file mode 100644
index 0000000..59f7bb6
--- /dev/null
+++ b/src/registry/manifest.js
@@ -0,0 +1,69 @@
+var DOMParser = require('xmldom').DOMParser,
+    path = require('path'),
+    fs = require('fs');
+
+// Java world big-up!
+// TODO use CALLBACK
+function generatePackageJsonFromPluginXml(plugin_path, cb) {
+  var package_json = {};
+  var plugin_xml = fs.readFileSync(path.resolve(plugin_path, 'plugin.xml'), "utf8");
+  var doc = new DOMParser().parseFromString(plugin_xml);
+  
+  if(!doc || !doc.documentElement) {
+    throw new Error('invalid plugin.xml document');
+  }
+
+  // name, version REQUIRED
+  // setting version
+  var version = doc.documentElement.getAttribute('version')
+  if(!version) {
+    var e = new Error('`version` required');
+    if(cb) {
+      cb(e);
+      return null;
+    }
+    throw e;
+  }
+  package_json.version = version;
+
+  // setting name
+  if(doc.documentElement.getElementsByTagName('name').length != 1 ||
+     !doc.documentElement.getElementsByTagName('name').item(0).firstChild) {
+    var e = new Error('`name` is required');
+    if(cb) {
+      cb(e);
+      return null;
+    }
+    throw e;
+  }
+  var name = doc.documentElement.getElementsByTagName('name').item(0).firstChild.nodeValue;
+  if(!name.match(/^\w+|-*$/)) throw new Error('`name` can only contain alphanumberic characters and -')
+  package_json.name = name.toLowerCase();
+
+  // OPTIONAL fields: description, license, keywords. TODO: add more!
+  if(doc.documentElement.getElementsByTagName('description').length == 1 &&
+     doc.documentElement.getElementsByTagName('description').item(0).firstChild) {
+    package_json.description = doc.documentElement
+                                  .getElementsByTagName('description')
+                                  .item(0).firstChild.nodeValue;
+  }
+  if(doc.documentElement.getElementsByTagName('license').length == 1 &&
+     doc.documentElement.getElementsByTagName('license').item(0).firstChild) {
+    package_json.license = doc.documentElement
+                              .getElementsByTagName('license')
+                              .item(0).firstChild.nodeValue;
+  }
+  if(doc.documentElement.getElementsByTagName('keywords').length == 1 &&
+     doc.documentElement.getElementsByTagName('keywords').item(0).firstChild) {
+    package_json.keywords = doc.documentElement
+                               .getElementsByTagName('keywords')
+                               .item(0).firstChild.nodeValue.split(',');
+  }
+
+  // write package.json
+  var package_json_path = path.resolve(plugin_path, 'package.json');
+  fs.writeFileSync(package_json_path, JSON.stringify(package_json, null, 4), 'utf8');
+  return package_json;
+}
+
+module.exports.generatePackageJsonFromPluginXml = generatePackageJsonFromPluginXml;

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/registry/registry.js
----------------------------------------------------------------------
diff --git a/src/registry/registry.js b/src/registry/registry.js
new file mode 100644
index 0000000..bf99a15
--- /dev/null
+++ b/src/registry/registry.js
@@ -0,0 +1,218 @@
+var npm = require('npm'),
+    path = require('path'),
+    http = require('http'),
+    targz = require('tar.gz'),
+    fs = require('fs'),
+    manifest = require('./manifest'),
+    os = require('os'),
+    rc = require('rc'),
+    plugmanConfigDir = path.resolve(process.env.HOME, '.plugman'),
+    plugmanCacheDir = path.resolve(plugmanConfigDir, 'cache');
+
+var settings = module.exports.settings;
+
+function checkConfig(cb) {
+    if(settings != null) {
+        cb();
+    } else {
+        use(cb);
+    }
+}
+
+function handleError(err, cb) {
+    if(typeof cb == 'function') {
+        return cb(err);
+    }
+    throw err;
+}
+/**
+ * @method use
+ * @param {String} registry NPM registry URL 
+ * @param {Function} cb callback
+ */
+function use(cb) {
+    if(typeof cb != 'function') throw new Error('Please provide a callback');
+    // check if settings already set
+    if(settings != null) return cb();
+    
+    // setting up settings
+    // obviously if settings dir does not exist settings is going to be empty
+    if(!fs.existsSync(plugmanConfigDir)) {
+        fs.mkdirSync(plugmanConfigDir);
+        fs.mkdirSync(plugmanCacheDir);
+    }
+
+    settings = rc('plugman', {
+                 cache: plugmanCacheDir,
+                 force: true,
+                 logstream: fs.createWriteStream(path.resolve(plugmanConfigDir, 'plugman.log')),
+                 userconfig: path.resolve(plugmanConfigDir, 'config')
+              });
+    
+    if(settings.registry) {
+        cb();
+    } else {
+       // setting registry
+       npm.load(settings, function(er) {
+           if (er) return handlError(er);
+           npm.commands.config(['set', 'registry', 'http://registry.cordova.io'], cb);
+       });
+    }
+
+}
+
+/**
+ * @method getPackageInfo
+ * @param {String} args Package names
+ * @param {Function} cb callback 
+ */
+function getPackageInfo(args, cb) {
+    var thing = args.length ? args.shift().split("@") : [],
+            name = thing.shift(),
+            version = thing.join("@"),
+    
+    version = version ? version : 'latest';
+    
+    http.get(settings.registry + '/' + name + '/' + version, function(res) {
+         if(res.statusCode != 200) {
+                 var err = new Error('Error');
+                 if (cb) cb(err);
+                 else throw err;
+         } else {
+             var info = '';
+             res.on('data', function(chunk) {
+                info += chunk;
+             });
+             res.on('end', function() {
+                 cb(null, JSON.parse(info));
+             });
+         }
+    }).on('error', function(err) {
+        cb(err); 
+    });
+}
+
+/**
+ * @method fetchPackage
+ * @param {String} info Package info 
+ * @param {Function} cb callback 
+ */
+function fetchPackage(info, cb) {
+    var cached = path.resolve(settings.cache, info.name, info.version, 'package');
+    if(fs.existsSync(cached)) {
+        cb(null, cached);
+    } else {
+        var target = os.tmpdir() + info.name;
+        var filename = target + '.tgz';
+        var filestream = fs.createWriteStream(filename);
+        var request = http.get(info.dist.tarball, function(res) {
+            if(res.statusCode != 200) {
+                var err = new Error('failed to fetch the plugin archive');
+                if (cb) cb(err);
+                else throw err;
+            } else {
+                res.pipe(filestream);
+                filestream.on('finish', function() {
+                    var decompress = new targz().extract(filename, target, function(err) {
+                        cb(err, path.resolve(target, 'package'));
+                    });
+                });
+            }
+        });
+    }
+}
+
+module.exports = {
+    settings: null,
+    /**
+     * @method config
+     * @param {Array} args Command argument
+     * @param {Function} cb Command callback
+     */
+    config: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb)
+            npm.load(settings, function(er) {
+                if (er) return handlError(er);
+                npm.commands.config(args, cb);
+            });
+        });
+    },
+    /**
+     * @method adduser
+     * @param {Array} args Command argument
+     * @param {Function} cb Command callback
+     */
+    adduser: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb)
+            npm.load(settings, function(er) {
+                if (er) return handlError(er);
+                npm.commands.adduser(args, cb);
+            });
+        });
+    },
+    /**
+     * @method publish
+     * @param {Array} args Command argument
+     * @param {Function} cb Command callback
+     */
+    publish: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb);
+            manifest.generatePackageJsonFromPluginXml(args[0]);
+            npm.load(settings, function(er) {
+                if (er) return handlError(er);
+                npm.commands.publish(args, function(err, data) {
+                    fs.unlink(path.resolve(args[0], 'package.json'));
+                    cb(err, data);
+                });
+            });
+        });
+    },
+    /**
+     * @method search
+     * @param {Array} args Array of keywords
+     * @param {Function} cb Command callback
+     */
+    search: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb);
+            npm.load(settings, function(er) {
+                if (er) return handlError(er, cb);
+                npm.commands.search(args, true, cb);
+            });
+        });
+    },
+    /**
+     * @method unpublish
+     * @param {Array} args Command argument
+     * @param {Function} cb Command callback
+     */
+    unpublish: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb);
+            npm.load(settings, function(er) {
+                if (er) return handlError(er);
+                npm.commands.unpublish(args, function(err, d) {
+                    if(err) return handleError(err, cb);
+                    npm.commands.cache(["clean"], cb);
+                });
+            });
+        });
+    },
+    /**
+     * @method fetch
+     * @param {String} name Plugin name
+     * @param {Function} cb Command callback
+     */
+    fetch: function(args, cb) {
+        checkConfig(function(err) {
+            if(err) return handleError(err, cb)
+            getPackageInfo(args, function(err, info) {
+                if(err) return handleError(err, cb)
+                fetchPackage(info, cb);
+            });
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/search.js
----------------------------------------------------------------------
diff --git a/src/search.js b/src/search.js
index 31b1094..4d679c4 100644
--- a/src/search.js
+++ b/src/search.js
@@ -1,18 +1,15 @@
-var registry = require('plugman-registry')
-  , config = require('../config');
+var registry = require('./registry/registry')
 
 module.exports = function(search_opts, callback) {
-  registry.use(config.registry, function(err) {
     registry.search(search_opts, function(err, plugins) {
         if(callback) {
             if(err) return callback(err);
             callback(null, plugins);
         } else {
-          if(err) return console.log(err);
-          for(var plugin in plugins) {
-            console.log(plugins[plugin].name, '-', plugins[plugin].description || 'no description provided'); 
-          }
+            if(err) return console.log(err);
+            for(var plugin in plugins) {
+              console.log(plugins[plugin].name, '-', plugins[plugin].description || 'no description provided'); 
+            }
         }
     });
-  });
 }

http://git-wip-us.apache.org/repos/asf/cordova-plugman/blob/fd679f38/src/unpublish.js
----------------------------------------------------------------------
diff --git a/src/unpublish.js b/src/unpublish.js
index 22db926..5a428f1 100644
--- a/src/unpublish.js
+++ b/src/unpublish.js
@@ -1,18 +1,15 @@
-var registry = require('plugman-registry')
-  , config = require('../config');
+var registry = require('./registry/registry')
 
 module.exports = function(plugin, callback) {
-  registry.use(config.registry, function(err) {
     registry.unpublish(plugin, function(err, d) {
-      if(callback && typeof callback === 'function') {
-          err ? callback(err) : callback(null);
-      } else {
-          if(err) {
-              throw err;
-          } else {
-              console.log('Plugin unpublished');
-          }
-      }
+        if(callback && typeof callback === 'function') {
+            err ? callback(err) : callback(null);
+        } else {
+            if(err) {
+                throw err;
+            } else {
+                console.log('Plugin unpublished');
+            }
+        }
     });
-  });
 }