Ppchelko has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/310602

Change subject: Update restbase to 78daf7f
......................................................................

Update restbase to 78daf7f

List of changes:
e784a01 Populate feed with summaries from RESTBase (#668)
78daf7f Added spec for the feed endpoint (#669)
xxxxxxx Update node module dependencies

Change-Id: I9f07027d3b83af27f73b9b701b5db9e869776440
---
M node_modules/content-type/package.json
M node_modules/heapdump/build/Makefile
M 
node_modules/heapdump/build/Release/.deps/Release/obj.target/addon/src/heapdump.o.d
M node_modules/heapdump/build/addon.target.mk
M node_modules/heapdump/build/config.gypi
M node_modules/hyperswitch/node_modules/json-stable-stringify/package.json
M node_modules/hyperswitch/node_modules/swagger-ui/package.json
M node_modules/json-stable-stringify/package.json
M 
node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json
M 
node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json
M 
node_modules/restbase-mod-table-cassandra/node_modules/json-stable-stringify/package.json
M node_modules/service-runner/lib/docker.js
M 
node_modules/service-runner/node_modules/limitation/node_modules/kad/package.json
M 
node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/core-util-is/package.json
M 
node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/inherits/package.json
M 
node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/string_decoder/package.json
M node_modules/service-runner/node_modules/yargs/lib/command.js
D node_modules/service-runner/node_modules/yargs/lib/levenshtein.js
M node_modules/service-runner/node_modules/yargs/lib/usage.js
M node_modules/service-runner/node_modules/yargs/lib/validation.js
M node_modules/service-runner/node_modules/yargs/locales/de.json
M node_modules/service-runner/node_modules/yargs/locales/en.json
A node_modules/service-runner/node_modules/yargs/locales/zh.json
M 
node_modules/service-runner/node_modules/yargs/node_modules/lodash.assign/package.json
M 
node_modules/service-runner/node_modules/yargs/node_modules/string-width/package.json
M 
node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/index.js
M 
node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/package.json
M node_modules/service-runner/node_modules/yargs/package.json
M node_modules/service-runner/node_modules/yargs/yargs.js
M node_modules/service-runner/package.json
M restbase
31 files changed, 212 insertions(+), 363 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/restbase/deploy 
refs/changes/02/310602/1

diff --git a/node_modules/content-type/package.json 
b/node_modules/content-type/package.json
index 494bebc..310a3e7 100644
--- a/node_modules/content-type/package.json
+++ b/node_modules/content-type/package.json
@@ -44,7 +44,7 @@
   },
   "homepage": "https://github.com/jshttp/content-type#readme";,
   "_id": "[email protected]",
-  "_shasum": "f504384d189ec2bb3ceacd672c60fb155cae8cdc",
+  "_shasum": "852be0e80402d1d405b9037743ecffcfe342c359",
   "_from": "git+https://github.com/wikimedia/content-type.git#master";,
   "_resolved": 
"git+https://github.com/wikimedia/content-type.git#47b2632d0a2ee79a7d67268e2f6621becd95d05b";
 }
diff --git a/node_modules/heapdump/build/Makefile 
b/node_modules/heapdump/build/Makefile
index 71b2b2b..15a8e24 100644
--- a/node_modules/heapdump/build/Makefile
+++ b/node_modules/heapdump/build/Makefile
@@ -308,8 +308,8 @@
 endif
 
 quiet_cmd_regen_makefile = ACTION Regenerating $@
-cmd_regen_makefile = cd $(srcdir); 
/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py
 -fmake --ignore-environment "--toplevel-dir=." 
-I/opt/service/node_modules/heapdump/build/config.gypi 
-I/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/addon.gypi
 -I/home/runuser/.node-gyp/4.4.6/include/node/common.gypi "--depth=." 
"-Goutput_dir=." "--generator-output=build" "-Dlibrary=shared_library" 
"-Dvisibility=default" "-Dnode_root_dir=/home/runuser/.node-gyp/4.4.6" 
"-Dnode_gyp_dir=/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp"
 "-Dnode_lib_file=node.lib" 
"-Dmodule_root_dir=/opt/service/node_modules/heapdump" binding.gyp
-Makefile: 
$(srcdir)/../../../../usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/addon.gypi
 $(srcdir)/build/config.gypi $(srcdir)/binding.gyp 
$(srcdir)/../../../../home/runuser/.node-gyp/4.4.6/include/node/common.gypi
+cmd_regen_makefile = cd $(srcdir); 
/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/gyp/gyp_main.py
 -fmake --ignore-environment "--toplevel-dir=." 
-I/opt/service/node_modules/heapdump/build/config.gypi 
-I/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/addon.gypi
 -I/root/.node-gyp/4.4.6/include/node/common.gypi "--depth=." "-Goutput_dir=." 
"--generator-output=build" "-Dlibrary=shared_library" "-Dvisibility=default" 
"-Dnode_root_dir=/root/.node-gyp/4.4.6" 
"-Dnode_gyp_dir=/usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp"
 "-Dnode_lib_file=node.lib" 
"-Dmodule_root_dir=/opt/service/node_modules/heapdump" binding.gyp
+Makefile: 
$(srcdir)/../../../../usr/local/nvm/versions/node/v4.4.6/lib/node_modules/npm/node_modules/node-gyp/addon.gypi
 $(srcdir)/../../../../root/.node-gyp/4.4.6/include/node/common.gypi 
$(srcdir)/build/config.gypi $(srcdir)/binding.gyp
        $(call do_cmd,regen_makefile)
 
 # "all" is a concatenation of the "all" targets from all the included
diff --git 
a/node_modules/heapdump/build/Release/.deps/Release/obj.target/addon/src/heapdump.o.d
 
b/node_modules/heapdump/build/Release/.deps/Release/obj.target/addon/src/heapdump.o.d
index c044ce4..4e8267a 100644
--- 
a/node_modules/heapdump/build/Release/.deps/Release/obj.target/addon/src/heapdump.o.d
+++ 
b/node_modules/heapdump/build/Release/.deps/Release/obj.target/addon/src/heapdump.o.d
@@ -1,36 +1,34 @@
-cmd_Release/obj.target/addon/src/heapdump.o := g++ 
'-DNODE_GYP_MODULE_NAME=addon' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' 
'-DBUILDING_NODE_EXTENSION' -I/home/runuser/.node-gyp/4.4.6/include/node 
-I/home/runuser/.node-gyp/4.4.6/src 
-I/home/runuser/.node-gyp/4.4.6/deps/uv/include 
-I/home/runuser/.node-gyp/4.4.6/deps/v8/include  -fPIC -pthread -Wall -Wextra 
-Wno-unused-parameter -m64 -O3 -ffunction-sections -fdata-sections 
-fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++0x -MMD -MF 
./Release/.deps/Release/obj.target/addon/src/heapdump.o.d.raw   -c -o 
Release/obj.target/addon/src/heapdump.o ../src/heapdump.cc
+cmd_Release/obj.target/addon/src/heapdump.o := g++ 
'-DNODE_GYP_MODULE_NAME=addon' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' 
'-DBUILDING_NODE_EXTENSION' -I/root/.node-gyp/4.4.6/include/node 
-I/root/.node-gyp/4.4.6/src -I/root/.node-gyp/4.4.6/deps/uv/include 
-I/root/.node-gyp/4.4.6/deps/v8/include  -fPIC -pthread -Wall -Wextra 
-Wno-unused-parameter -m64 -O3 -ffunction-sections -fdata-sections 
-fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++0x -MMD -MF 
./Release/.deps/Release/obj.target/addon/src/heapdump.o.d.raw   -c -o 
Release/obj.target/addon/src/heapdump.o ../src/heapdump.cc
 Release/obj.target/addon/src/heapdump.o: ../src/heapdump.cc \
- /home/runuser/.node-gyp/4.4.6/include/node/node.h \
- /home/runuser/.node-gyp/4.4.6/include/node/v8.h \
- /home/runuser/.node-gyp/4.4.6/include/node/v8-version.h \
- /home/runuser/.node-gyp/4.4.6/include/node/v8config.h \
- /home/runuser/.node-gyp/4.4.6/include/node/node_version.h \
- ../src/compat-inl.h ../src/compat.h \
- /home/runuser/.node-gyp/4.4.6/include/node/node_version.h \
- /home/runuser/.node-gyp/4.4.6/include/node/v8.h \
- /home/runuser/.node-gyp/4.4.6/include/node/v8-profiler.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv-errno.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv-version.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv-unix.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv-threadpool.h \
- /home/runuser/.node-gyp/4.4.6/include/node/uv-linux.h \
- ../src/heapdump-posix.h
+ /root/.node-gyp/4.4.6/include/node/node.h \
+ /root/.node-gyp/4.4.6/include/node/v8.h \
+ /root/.node-gyp/4.4.6/include/node/v8-version.h \
+ /root/.node-gyp/4.4.6/include/node/v8config.h \
+ /root/.node-gyp/4.4.6/include/node/node_version.h ../src/compat-inl.h \
+ ../src/compat.h /root/.node-gyp/4.4.6/include/node/node_version.h \
+ /root/.node-gyp/4.4.6/include/node/v8.h \
+ /root/.node-gyp/4.4.6/include/node/v8-profiler.h \
+ /root/.node-gyp/4.4.6/include/node/uv.h \
+ /root/.node-gyp/4.4.6/include/node/uv-errno.h \
+ /root/.node-gyp/4.4.6/include/node/uv-version.h \
+ /root/.node-gyp/4.4.6/include/node/uv-unix.h \
+ /root/.node-gyp/4.4.6/include/node/uv-threadpool.h \
+ /root/.node-gyp/4.4.6/include/node/uv-linux.h ../src/heapdump-posix.h
 ../src/heapdump.cc:
-/home/runuser/.node-gyp/4.4.6/include/node/node.h:
-/home/runuser/.node-gyp/4.4.6/include/node/v8.h:
-/home/runuser/.node-gyp/4.4.6/include/node/v8-version.h:
-/home/runuser/.node-gyp/4.4.6/include/node/v8config.h:
-/home/runuser/.node-gyp/4.4.6/include/node/node_version.h:
+/root/.node-gyp/4.4.6/include/node/node.h:
+/root/.node-gyp/4.4.6/include/node/v8.h:
+/root/.node-gyp/4.4.6/include/node/v8-version.h:
+/root/.node-gyp/4.4.6/include/node/v8config.h:
+/root/.node-gyp/4.4.6/include/node/node_version.h:
 ../src/compat-inl.h:
 ../src/compat.h:
-/home/runuser/.node-gyp/4.4.6/include/node/node_version.h:
-/home/runuser/.node-gyp/4.4.6/include/node/v8.h:
-/home/runuser/.node-gyp/4.4.6/include/node/v8-profiler.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv-errno.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv-version.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv-unix.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv-threadpool.h:
-/home/runuser/.node-gyp/4.4.6/include/node/uv-linux.h:
+/root/.node-gyp/4.4.6/include/node/node_version.h:
+/root/.node-gyp/4.4.6/include/node/v8.h:
+/root/.node-gyp/4.4.6/include/node/v8-profiler.h:
+/root/.node-gyp/4.4.6/include/node/uv.h:
+/root/.node-gyp/4.4.6/include/node/uv-errno.h:
+/root/.node-gyp/4.4.6/include/node/uv-version.h:
+/root/.node-gyp/4.4.6/include/node/uv-unix.h:
+/root/.node-gyp/4.4.6/include/node/uv-threadpool.h:
+/root/.node-gyp/4.4.6/include/node/uv-linux.h:
 ../src/heapdump-posix.h:
diff --git a/node_modules/heapdump/build/addon.target.mk 
b/node_modules/heapdump/build/addon.target.mk
index 1368a66..9606bba 100644
--- a/node_modules/heapdump/build/addon.target.mk
+++ b/node_modules/heapdump/build/addon.target.mk
@@ -31,10 +31,10 @@
        -std=gnu++0x
 
 INCS_Debug := \
-       -I/home/runuser/.node-gyp/4.4.6/include/node \
-       -I/home/runuser/.node-gyp/4.4.6/src \
-       -I/home/runuser/.node-gyp/4.4.6/deps/uv/include \
-       -I/home/runuser/.node-gyp/4.4.6/deps/v8/include
+       -I/root/.node-gyp/4.4.6/include/node \
+       -I/root/.node-gyp/4.4.6/src \
+       -I/root/.node-gyp/4.4.6/deps/uv/include \
+       -I/root/.node-gyp/4.4.6/deps/v8/include
 
 DEFS_Release := \
        '-DNODE_GYP_MODULE_NAME=addon' \
@@ -65,10 +65,10 @@
        -std=gnu++0x
 
 INCS_Release := \
-       -I/home/runuser/.node-gyp/4.4.6/include/node \
-       -I/home/runuser/.node-gyp/4.4.6/src \
-       -I/home/runuser/.node-gyp/4.4.6/deps/uv/include \
-       -I/home/runuser/.node-gyp/4.4.6/deps/v8/include
+       -I/root/.node-gyp/4.4.6/include/node \
+       -I/root/.node-gyp/4.4.6/src \
+       -I/root/.node-gyp/4.4.6/deps/uv/include \
+       -I/root/.node-gyp/4.4.6/deps/v8/include
 
 OBJS := \
        $(obj).target/$(TARGET)/src/heapdump.o
diff --git a/node_modules/heapdump/build/config.gypi 
b/node_modules/heapdump/build/config.gypi
index 2182d3f..db159cd 100644
--- a/node_modules/heapdump/build/config.gypi
+++ b/node_modules/heapdump/build/config.gypi
@@ -45,7 +45,7 @@
     "v8_random_seed": 0,
     "v8_use_snapshot": "true",
     "want_separate_host_toolset": 0,
-    "nodedir": "/home/runuser/.node-gyp/4.4.6",
+    "nodedir": "/root/.node-gyp/4.4.6",
     "copy_dev_lib": "true",
     "standalone_static_library": 1,
     "cache_lock_stale": "60000",
@@ -67,7 +67,7 @@
     "rollback": "true",
     "tag_version_prefix": "v",
     "cache_max": "Infinity",
-    "userconfig": "/home/runuser/.npmrc",
+    "userconfig": "/root/.npmrc",
     "engine_strict": "",
     "init_author_name": "",
     "init_author_url": "",
@@ -88,7 +88,7 @@
     "scope": "",
     "searchopts": "",
     "versions": "",
-    "cache": "/home/runuser/.npm",
+    "cache": "/root/.npm",
     "ignore_scripts": "",
     "searchsort": "name",
     "version": "",
@@ -109,7 +109,7 @@
     "unicode": "true",
     "long": "",
     "production": "",
-    "unsafe_perm": "true",
+    "unsafe_perm": "",
     "node_version": "4.4.6",
     "tag": "latest",
     "git_tag_version": "true",
@@ -121,12 +121,12 @@
     "strict_ssl": "true",
     "dev": "",
     "globalconfig": "/usr/local/nvm/versions/node/v4.4.6/etc/npmrc",
-    "init_module": "/home/runuser/.npm-init.js",
+    "init_module": "/root/.npm-init.js",
     "parseable": "",
     "globalignorefile": "/usr/local/nvm/versions/node/v4.4.6/etc/npmignore",
     "cache_lock_retries": "10",
     "save_prefix": "^",
-    "group": "1000",
+    "group": "",
     "init_author_email": "",
     "searchexclude": "",
     "git": "git",
diff --git 
a/node_modules/hyperswitch/node_modules/json-stable-stringify/package.json 
b/node_modules/hyperswitch/node_modules/json-stable-stringify/package.json
index 2b51ede..ec0d61f 100644
--- a/node_modules/hyperswitch/node_modules/json-stable-stringify/package.json
+++ b/node_modules/hyperswitch/node_modules/json-stable-stringify/package.json
@@ -50,7 +50,7 @@
     "url": "https://github.com/substack/json-stable-stringify/issues";
   },
   "_id": "[email protected]",
-  "_shasum": "ce60cf2e2c4dd6179c7de6c18747cf0ac7a2dada",
+  "_shasum": "2dd261051e1e30c16a08db23c59867a4dd5f4785",
   "_from": "git+https://github.com/wikimedia/json-stable-stringify.git#master";,
   "_resolved": 
"git+https://github.com/wikimedia/json-stable-stringify.git#c05178e4dfc3834017f017732934c1c52ba3dd8f";
 }
diff --git a/node_modules/hyperswitch/node_modules/swagger-ui/package.json 
b/node_modules/hyperswitch/node_modules/swagger-ui/package.json
index 3dd7380..604ad40 100644
--- a/node_modules/hyperswitch/node_modules/swagger-ui/package.json
+++ b/node_modules/hyperswitch/node_modules/swagger-ui/package.json
@@ -70,7 +70,7 @@
     "url": "https://github.com/swagger-api/swagger-ui/issues";
   },
   "_id": "[email protected]",
-  "_shasum": "dd346200e126f27179ce7dda7e7b34103b9dcc74",
+  "_shasum": "654da9007437b2515ba1dc0e84d4e6f084ce5c27",
   "_from": "git+https://github.com/wikimedia/swagger-ui.git#master";,
   "_resolved": 
"git+https://github.com/wikimedia/swagger-ui.git#f89ca3d27111bde918492db6d7eaca37302407f6";
 }
diff --git a/node_modules/json-stable-stringify/package.json 
b/node_modules/json-stable-stringify/package.json
index 886abcd..54fc3cb 100644
--- a/node_modules/json-stable-stringify/package.json
+++ b/node_modules/json-stable-stringify/package.json
@@ -50,7 +50,7 @@
     "url": "https://github.com/substack/json-stable-stringify/issues";
   },
   "_id": "[email protected]",
-  "_shasum": "0fe8ae8b20889eea4b00ea1a5bc7994ba7eecb86",
+  "_shasum": "73eb3cc6629216c603e89bee8de067508e0f99da",
   "_from": "git+https://github.com/wikimedia/json-stable-stringify.git#master";,
   "_resolved": 
"git+https://github.com/wikimedia/json-stable-stringify.git#c05178e4dfc3834017f017732934c1c52ba3dd8f";
 }
diff --git 
a/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json
 
b/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json
index 19fb859..f65d83f 100644
--- 
a/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json
+++ 
b/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/core-util-is/package.json
@@ -55,6 +55,5 @@
     }
   ],
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
-  "readme": "ERROR: No README data found!"
+  "_resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
 }
diff --git 
a/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json
 
b/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json
index 8e8b77d..fdf923e 100644
--- 
a/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json
+++ 
b/node_modules/jsonwebtoken/node_modules/jws/node_modules/base64url/node_modules/concat-stream/node_modules/readable-stream/node_modules/string_decoder/package.json
@@ -49,6 +49,5 @@
     "tarball": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
   },
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";,
-  "readme": "ERROR: No README data found!"
+  "_resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
 }
diff --git 
a/node_modules/restbase-mod-table-cassandra/node_modules/json-stable-stringify/package.json
 
b/node_modules/restbase-mod-table-cassandra/node_modules/json-stable-stringify/package.json
index 2b51ede..ec0d61f 100644
--- 
a/node_modules/restbase-mod-table-cassandra/node_modules/json-stable-stringify/package.json
+++ 
b/node_modules/restbase-mod-table-cassandra/node_modules/json-stable-stringify/package.json
@@ -50,7 +50,7 @@
     "url": "https://github.com/substack/json-stable-stringify/issues";
   },
   "_id": "[email protected]",
-  "_shasum": "ce60cf2e2c4dd6179c7de6c18747cf0ac7a2dada",
+  "_shasum": "2dd261051e1e30c16a08db23c59867a4dd5f4785",
   "_from": "git+https://github.com/wikimedia/json-stable-stringify.git#master";,
   "_resolved": 
"git+https://github.com/wikimedia/json-stable-stringify.git#c05178e4dfc3834017f017732934c1c52ba3dd8f";
 }
diff --git a/node_modules/service-runner/lib/docker.js 
b/node_modules/service-runner/lib/docker.js
index 4299bdc..bfa3a76 100644
--- a/node_modules/service-runner/lib/docker.js
+++ b/node_modules/service-runner/lib/docker.js
@@ -212,8 +212,8 @@
             // In 'Docker for Mac' the mapping between users/groups
             // is done internally by docker, so we can run as root
             && os.type() !== 'Darwin') {
-        contents += 'RUN groupadd -g ' + opts.gid + ' -r rungroup && ' +
-        'useradd -m -r -g rungroup -u ' + opts.uid + ' runuser\n' +
+        contents += 'RUN groupadd -o -g ' + opts.gid + ' -r rungroup && ' +
+        'useradd -o -m -r -g rungroup -u ' + opts.uid + ' runuser\n' +
         'USER runuser\n' + 'ENV HOME=/home/runuser LINK=g++\n';
     } else {
         contents += 'ENV HOME=/root/ LINK=g++\n';
diff --git 
a/node_modules/service-runner/node_modules/limitation/node_modules/kad/package.json
 
b/node_modules/service-runner/node_modules/limitation/node_modules/kad/package.json
index 0bb0e87..497d381 100644
--- 
a/node_modules/service-runner/node_modules/limitation/node_modules/kad/package.json
+++ 
b/node_modules/service-runner/node_modules/limitation/node_modules/kad/package.json
@@ -75,7 +75,7 @@
   },
   "homepage": "https://github.com/kadtools/kad#readme";,
   "_id": "[email protected]",
-  "_shasum": "e3a311aa0f3366f46acb65503046efd9a952c339",
+  "_shasum": "3d9507c2f3f3818c66e43320e1bee47ea1518db3",
   "_from": "git+https://github.com/gwicke/kad.git#master";,
   "_resolved": 
"git+https://github.com/gwicke/kad.git#f35971036f43814043245da82b12d035b7bbfd16";
 }
diff --git 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/core-util-is/package.json
 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/core-util-is/package.json
index f65d83f..19fb859 100644
--- 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/core-util-is/package.json
+++ 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/core-util-is/package.json
@@ -55,5 +55,6 @@
     }
   ],
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
+  "_resolved": 
"https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";,
+  "readme": "ERROR: No README data found!"
 }
diff --git 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/inherits/package.json
 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/inherits/package.json
index fd63bd6..9146e75 100644
--- 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/inherits/package.json
+++ 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/inherits/package.json
@@ -36,7 +36,7 @@
   "homepage": "https://github.com/isaacs/inherits#readme";,
   "_id": "[email protected]",
   "_shasum": "633c2c83e3da42a502f52466022480f4208261de",
-  "_from": "inherits@>=2.0.0 <3.0.0",
+  "_from": "inherits@>=2.0.1 <2.1.0",
   "_npmVersion": "3.10.7",
   "_nodeVersion": "6.5.0",
   "_npmUser": {
@@ -58,5 +58,6 @@
     "tmp": "tmp/inherits-2.0.3.tgz_1473295776489_0.08142363070510328"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
+  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";,
+  "readme": "ERROR: No README data found!"
 }
diff --git 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/string_decoder/package.json
 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/string_decoder/package.json
index fdf923e..8e8b77d 100644
--- 
a/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/string_decoder/package.json
+++ 
b/node_modules/service-runner/node_modules/limitation/node_modules/readable-stream/node_modules/string_decoder/package.json
@@ -49,5 +49,6 @@
     "tarball": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
   },
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
+  "_resolved": 
"https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";,
+  "readme": "ERROR: No README data found!"
 }
diff --git a/node_modules/service-runner/node_modules/yargs/lib/command.js 
b/node_modules/service-runner/node_modules/yargs/lib/command.js
index f56bbfa..da3dff6 100644
--- a/node_modules/service-runner/node_modules/yargs/lib/command.js
+++ b/node_modules/service-runner/node_modules/yargs/lib/command.js
@@ -1,5 +1,7 @@
 const path = require('path')
 const inspect = require('util').inspect
+const requireDirectory = require('require-directory')
+const whichModule = require('which-module')
 
 // handles parsing positional arguments,
 // and populating argv with said positional
@@ -32,7 +34,9 @@
     handlers[parsedCommand.cmd] = {
       original: cmd,
       handler: handler,
-      builder: builder || {},
+      // TODO: default to a noop builder in
+      // [email protected]
+      builder: builder,
       demanded: parsedCommand.demanded,
       optional: parsedCommand.optional
     }
@@ -60,13 +64,13 @@
       }
       return visited
     }
-    require('require-directory')({ require: req, filename: callerFile }, dir, 
opts)
+    requireDirectory({ require: req, filename: callerFile }, dir, opts)
   }
 
   // lookup module object from require()d command and derive name
   // if module was not require()d and no name given, throw error
   function moduleName (obj) {
-    const mod = require('which-module')(obj)
+    const mod = whichModule(obj)
     if (!mod) throw new Error('No command name given for module: ' + 
inspect(obj))
     return commandFromFilename(mod.filename)
   }
@@ -125,23 +129,19 @@
     var currentContext = yargs.getContext()
     var parentCommands = currentContext.commands.slice()
     currentContext.commands.push(command)
-    if (typeof commandHandler.builder === 'function') {
-      // a function can be provided, which builds
-      // up a yargs chain and possibly returns it.
+    if (commandHandler.builder && typeof commandHandler.builder === 
'function') {
+      // a function can be provided, which interacts which builds
+      // up a yargs chain and returns it.
       innerArgv = commandHandler.builder(yargs.reset(parsed.aliases))
       // if the builder function did not yet parse argv with reset yargs
       // and did not explicitly set a usage() string, then apply the
       // original command string as usage() for consistent behavior with
       // options object below
-      if (yargs.parsed === false) {
-        if (typeof yargs.getUsageInstance().getUsage() === 'undefined') {
-          yargs.usage('$0 ' + (parentCommands.length ? parentCommands.join(' 
') + ' ' : '') + commandHandler.original)
-        }
-        innerArgv = innerArgv ? innerArgv.argv : yargs.argv
-      } else {
-        innerArgv = yargs.parsed.argv
+      if (yargs.parsed === false && typeof yargs.getUsageInstance().getUsage() 
=== 'undefined') {
+        yargs.usage('$0 ' + (parentCommands.length ? parentCommands.join(' ') 
+ ' ' : '') + commandHandler.original)
       }
-    } else if (typeof commandHandler.builder === 'object') {
+      innerArgv = innerArgv ? innerArgv.argv : argv
+    } else if (commandHandler.builder && typeof commandHandler.builder === 
'object') {
       // as a short hand, an object can instead be provided, specifying
       // the options that a command takes.
       innerArgv = yargs.reset(parsed.aliases)
@@ -152,7 +152,7 @@
       innerArgv = innerArgv.argv
     }
 
-    populatePositional(commandHandler, innerArgv, currentContext, yargs)
+    populatePositional(commandHandler, innerArgv, currentContext)
 
     if (commandHandler.handler) {
       commandHandler.handler(innerArgv)
@@ -161,7 +161,7 @@
     return innerArgv
   }
 
-  function populatePositional (commandHandler, argv, context, yargs) {
+  function populatePositional (commandHandler, argv, context) {
     argv._ = argv._.slice(context.commands.length) // nuke the current commands
     var demanded = commandHandler.demanded.slice(0)
     var optional = commandHandler.optional.slice(0)
@@ -174,7 +174,6 @@
       if (!argv._.length) break
       if (demand.variadic) argv[demand.cmd] = argv._.splice(0)
       else argv[demand.cmd] = argv._.shift()
-      postProcessPositional(yargs, argv, demand.cmd)
     }
 
     while (optional.length) {
@@ -183,22 +182,9 @@
       if (!argv._.length) break
       if (maybe.variadic) argv[maybe.cmd] = argv._.splice(0)
       else argv[maybe.cmd] = argv._.shift()
-      postProcessPositional(yargs, argv, maybe.cmd)
     }
 
     argv._ = context.commands.concat(argv._)
-  }
-
-  // TODO move positional arg logic to yargs-parser and remove this duplication
-  function postProcessPositional (yargs, argv, key) {
-    var coerce = yargs.getOptions().coerce[key]
-    if (typeof coerce === 'function') {
-      try {
-        argv[key] = coerce(argv[key])
-      } catch (err) {
-        yargs.getUsageInstance().fail(err.message, err)
-      }
-    }
   }
 
   self.reset = function () {
diff --git a/node_modules/service-runner/node_modules/yargs/lib/levenshtein.js 
b/node_modules/service-runner/node_modules/yargs/lib/levenshtein.js
deleted file mode 100644
index 6ec216f..0000000
--- a/node_modules/service-runner/node_modules/yargs/lib/levenshtein.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-Copyright (c) 2011 Andrei Mackenzie
-
-Permission is hereby granted, free of charge, to any person obtaining a copy 
of this software and associated documentation files (the "Software"), to deal 
in the Software without restriction, including without limitation the rights to 
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
of the Software, and to permit persons to whom the Software is furnished to do 
so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all 
copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.
-*/
-
-// levenshtein distance algorithm, pulled from Andrei Mackenzie's MIT licensed.
-// gist, which can be found here: https://gist.github.com/andrei-m/982927
-
-// Compute the edit distance between the two given strings
-module.exports = function (a, b) {
-  if (a.length === 0) return b.length
-  if (b.length === 0) return a.length
-
-  var matrix = []
-
-  // increment along the first column of each row
-  var i
-  for (i = 0; i <= b.length; i++) {
-    matrix[i] = [i]
-  }
-
-  // increment each column in the first row
-  var j
-  for (j = 0; j <= a.length; j++) {
-    matrix[0][j] = j
-  }
-
-  // Fill in the rest of the matrix
-  for (i = 1; i <= b.length; i++) {
-    for (j = 1; j <= a.length; j++) {
-      if (b.charAt(i - 1) === a.charAt(j - 1)) {
-        matrix[i][j] = matrix[i - 1][j - 1]
-      } else {
-        matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution
-                                Math.min(matrix[i][j - 1] + 1, // insertion
-                                         matrix[i - 1][j] + 1)) // deletion
-      }
-    }
-  }
-
-  return matrix[b.length][a.length]
-}
diff --git a/node_modules/service-runner/node_modules/yargs/lib/usage.js 
b/node_modules/service-runner/node_modules/yargs/lib/usage.js
index 169fe6e..7c53aa5 100644
--- a/node_modules/service-runner/node_modules/yargs/lib/usage.js
+++ b/node_modules/service-runner/node_modules/yargs/lib/usage.js
@@ -1,6 +1,9 @@
 // this file handles outputting usage instructions,
 // failures, etc. keeps logging in one place.
+const cliui = require('cliui')
+const decamelize = require('decamelize')
 const stringWidth = require('string-width')
+const wsize = require('window-size')
 const objFilter = require('./obj-filter')
 const setBlocking = require('set-blocking')
 
@@ -31,9 +34,9 @@
   var failureOutput = false
   self.fail = function (msg, err) {
     if (fails.length) {
-      for (var i = fails.length - 1; i >= 0; --i) {
-        fails[i](msg, err)
-      }
+      fails.forEach(function (f) {
+        f(msg, err)
+      })
     } else {
       if (yargs.getExitProcess()) setBlocking(true)
 
@@ -122,7 +125,7 @@
         return acc
       }, {})
     )
-    var ui = require('cliui')({
+    var ui = cliui({
       width: wrap,
       wrap: !!wrap
     })
@@ -326,7 +329,7 @@
   }
 
   self.functionDescription = function (fn) {
-    var description = fn.name ? require('decamelize')(fn.name, '-') : 
__('generated-value')
+    var description = fn.name ? decamelize(fn.name, '-') : 
__('generated-value')
     return ['(', description, ')'].join('')
   }
 
@@ -372,7 +375,6 @@
 
   // guess the width of the console window, max-width 80.
   function windowWidth () {
-    const wsize = require('window-size')
     return wsize.width ? Math.min(80, wsize.width) : null
   }
 
@@ -389,7 +391,7 @@
 
   self.reset = function (globalLookup) {
     // do not reset wrap here
-    // do not reset fails here
+    fails = []
     failMessage = null
     failureOutput = false
     usage = undefined
diff --git a/node_modules/service-runner/node_modules/yargs/lib/validation.js 
b/node_modules/service-runner/node_modules/yargs/lib/validation.js
index cc45378..d9a3364 100644
--- a/node_modules/service-runner/node_modules/yargs/lib/validation.js
+++ b/node_modules/service-runner/node_modules/yargs/lib/validation.js
@@ -11,19 +11,18 @@
   // arguments were provided, i.e., '_'.
   self.nonOptionCount = function (argv) {
     const demanded = yargs.getDemanded()
-    // don't count currently executing commands
-    const _s = argv._.length - yargs.getContext().commands.length
+    const _s = argv._.length
 
     if (demanded._ && (_s < demanded._.count || _s > demanded._.max)) {
       if (demanded._.msg !== undefined) {
         usage.fail(demanded._.msg)
       } else if (_s < demanded._.count) {
         usage.fail(
-          __('Not enough non-option arguments: got %s, need at least %s', _s, 
demanded._.count)
+          __('Not enough non-option arguments: got %s, need at least %s', 
argv._.length, demanded._.count)
         )
       } else {
         usage.fail(
-          __('Too many non-option arguments: got %s, maximum of %s', _s, 
demanded._.max)
+          __('Too many non-option arguments: got %s, maximum of %s', 
argv._.length, demanded._.max)
         )
       }
     }
@@ -272,23 +271,6 @@
 
       usage.fail(msg)
     }
-  }
-
-  self.recommendCommands = function (cmd, potentialCommands) {
-    const distance = require('./levenshtein')
-    const threshold = 3 // if it takes more than three edits, let's move on.
-    potentialCommands = potentialCommands.sort(function (a, b) { return 
b.length - a.length })
-
-    var recommended = null
-    var bestDistance = Infinity
-    for (var i = 0, candidate; (candidate = potentialCommands[i]) !== 
undefined; i++) {
-      var d = distance(cmd, candidate)
-      if (d <= threshold && d < bestDistance) {
-        bestDistance = d
-        recommended = candidate
-      }
-    }
-    if (recommended) usage.fail(__('Did you mean %s?', recommended))
   }
 
   self.reset = function (globalLookup) {
diff --git a/node_modules/service-runner/node_modules/yargs/locales/de.json 
b/node_modules/service-runner/node_modules/yargs/locales/de.json
index 86c874c..8586498 100644
--- a/node_modules/service-runner/node_modules/yargs/locales/de.json
+++ b/node_modules/service-runner/node_modules/yargs/locales/de.json
@@ -33,6 +33,5 @@
   "Invalid JSON config file: %s": "Fehlerhafte JSON-Config Datei: %s",
   "Path to JSON config file": "Pfad zur JSON-Config Datei",
   "Show help": "Hilfe anzeigen",
-  "Show version number": "Version anzeigen",
-  "Did you mean %s?": "Meintest du %s?"
+  "Show version number": "Version anzeigen"
 }
diff --git a/node_modules/service-runner/node_modules/yargs/locales/en.json 
b/node_modules/service-runner/node_modules/yargs/locales/en.json
index 59d4eb0..0fab5cc 100644
--- a/node_modules/service-runner/node_modules/yargs/locales/en.json
+++ b/node_modules/service-runner/node_modules/yargs/locales/en.json
@@ -33,6 +33,5 @@
   "Invalid JSON config file: %s": "Invalid JSON config file: %s",
   "Path to JSON config file": "Path to JSON config file",
   "Show help": "Show help",
-  "Show version number": "Show version number",
-  "Did you mean %s?": "Did you mean %s?"
+  "Show version number": "Show version number"
 }
diff --git a/node_modules/service-runner/node_modules/yargs/locales/zh.json 
b/node_modules/service-runner/node_modules/yargs/locales/zh.json
new file mode 100644
index 0000000..b25c7b9
--- /dev/null
+++ b/node_modules/service-runner/node_modules/yargs/locales/zh.json
@@ -0,0 +1,37 @@
+{
+  "Commands:": "命令:",
+  "Options:": "选项:",
+  "Examples:": "示例:",
+  "boolean": "布尔",
+  "count": "计数",
+  "string": "字符串",
+  "number": "数字",
+  "array": "数组",
+  "required": "必需",
+  "default:": "默认值:",
+  "choices:": "可选值:",
+  "generated-value": "生成的值",
+  "Not enough non-option arguments: got %s, need at least %s": "缺少 non-option 
参数:传入了 %s 个, 至少需要 %s 个",
+  "Too many non-option arguments: got %s, maximum of %s": "non-option 参数过多:传入了 
%s 个, 最大允许 %s 个",
+  "Missing argument value: %s": {
+    "one": "没有给此选项指定值:%s",
+    "other": "没有给这些选项指定值:%s"
+  },
+  "Missing required argument: %s": {
+    "one": "缺少必须的选项:%s",
+    "other": "缺少这些必须的选项:%s"
+  },
+  "Unknown argument: %s": {
+    "one": "无法识别的选项:%s",
+    "other": "无法识别这些选项:%s"
+  },
+  "Invalid values:": "无效的选项值:",
+  "Argument: %s, Given: %s, Choices: %s": "选项名称: %s, 传入的值: %s, 可选的值:%s",
+  "Argument check failed: %s": "选项值验证失败:%s",
+  "Implications failed:": "缺少依赖的选项:",
+  "Not enough arguments following: %s": "没有提供足够的值给此选项:%s",
+  "Invalid JSON config file: %s": "无效的 JSON 配置文件:%s",
+  "Path to JSON config file": "JSON 配置文件的路径",
+  "Show help": "显示帮助信息",
+  "Show version number": "显示版本号"
+}
diff --git 
a/node_modules/service-runner/node_modules/yargs/node_modules/lodash.assign/package.json
 
b/node_modules/service-runner/node_modules/yargs/node_modules/lodash.assign/package.json
index 8808d95..4301537 100644
--- 
a/node_modules/service-runner/node_modules/yargs/node_modules/lodash.assign/package.json
+++ 
b/node_modules/service-runner/node_modules/yargs/node_modules/lodash.assign/package.json
@@ -43,7 +43,7 @@
   },
   "_id": "[email protected]",
   "_shasum": "0d99f3ccd7a6d261d19bdaeb9245005d285808e7",
-  "_from": "lodash.assign@>=4.2.0 <5.0.0",
+  "_from": "lodash.assign@>=4.0.3 <5.0.0",
   "_npmVersion": "2.15.10",
   "_nodeVersion": "4.4.7",
   "_npmUser": {
diff --git 
a/node_modules/service-runner/node_modules/yargs/node_modules/string-width/package.json
 
b/node_modules/service-runner/node_modules/yargs/node_modules/string-width/package.json
index 739af7b..ba38f3d 100644
--- 
a/node_modules/service-runner/node_modules/yargs/node_modules/string-width/package.json
+++ 
b/node_modules/service-runner/node_modules/yargs/node_modules/string-width/package.json
@@ -63,7 +63,7 @@
   "homepage": "https://github.com/sindresorhus/string-width#readme";,
   "_id": "[email protected]",
   "_shasum": "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3",
-  "_from": "string-width@>=1.0.2 <2.0.0",
+  "_from": "string-width@>=1.0.1 <2.0.0",
   "_npmVersion": "2.15.5",
   "_nodeVersion": "4.4.5",
   "_npmUser": {
diff --git 
a/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/index.js
 
b/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/index.js
index e2b35b6..35c0272 100644
--- 
a/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/index.js
+++ 
b/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/index.js
@@ -37,10 +37,8 @@
     normalize: {},
     configs: {},
     defaulted: {},
-    nargs: {},
-    coercions: {}
+    nargs: {}
   }
-  var negative = /^-[0-9]+(\.[0-9]+)?/
 
   ;[].concat(opts.array).filter(Boolean).forEach(function (key) {
     flags.arrays[key] = true
@@ -68,10 +66,6 @@
 
   Object.keys(opts.narg || {}).forEach(function (k) {
     flags.nargs[k] = opts.narg[k]
-  })
-
-  Object.keys(opts.coerce || {}).forEach(function (k) {
-    flags.coercions[k] = opts.coerce[k]
   })
 
   if (Array.isArray(opts.config) || typeof opts.config === 'string') {
@@ -156,8 +150,7 @@
       } else {
         next = args[i + 1]
 
-        if (next !== undefined && (!next.match(/^-/) ||
-          next.match(negative)) &&
+        if (next !== undefined && !next.match(/^-/) &&
           !checkAllAliases(key, flags.bools) &&
           !checkAllAliases(key, flags.counts)) {
           setArg(key, next)
@@ -188,7 +181,7 @@
       } else {
         setArg(key, defaultForType(guessType(key, flags)))
       }
-    } else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {
+    } else if (arg.match(/^-[^-]+/)) {
       letters = arg.slice(1, -1).split('')
       broken = false
 
@@ -220,9 +213,8 @@
           continue
         }
 
-        // current letter is an alphabetic character and next value is a number
         if (/[A-Za-z]/.test(letters[j]) &&
-          /^-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+          /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
           setArg(letters[j], next)
           broken = true
           break
@@ -249,8 +241,7 @@
         } else {
           next = args[i + 1]
 
-          if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||
-            next.match(negative)) &&
+          if (next !== undefined && !/^(-|--)[^-]/.test(next) &&
             !checkAllAliases(key, flags.bools) &&
             !checkAllAliases(key, flags.counts)) {
             setArg(key, next)
@@ -280,7 +271,6 @@
   setConfig(argv)
   setConfigObjects()
   applyEnvVars(argv, false)
-  applyArrayCoercions(argv)
   applyDefaultsAndAliases(argv, flags.aliases, defaults)
 
   // for any counts either not in args or without an explicit default, set to 0
@@ -312,7 +302,7 @@
   function eatArray (i, key, args) {
     var start = i + 1
     for (var ii = i + 1; ii < args.length; ii++) {
-      if (/^-/.test(args[ii]) && !negative.test(args[ii])) {
+      if (/^-/.test(args[ii])) {
         if (ii === start) {
           setArg(key, defaultForType('array'))
         }
@@ -340,7 +330,7 @@
     }
 
     var value = val
-    if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, 
flags.coercions)) {
+    if (!checkAllAliases(key, flags.strings)) {
       if (isNumber(val)) value = Number(val)
       if (!isUndefined(val) && !isNumber(val) && checkAllAliases(key, 
flags.numbers)) value = NaN
     }
@@ -352,8 +342,7 @@
 
     // Set normalized value when key is in 'normalize' and in 'arrays'
     if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, 
flags.arrays)) {
-      if (Array.isArray(val)) value = val.map(path.normalize)
-      else value = path.normalize(val)
+      value = path.normalize(val)
     }
 
     var splitKey = key.split('.')
@@ -483,22 +472,6 @@
     })
   }
 
-  function applyArrayCoercions (argv) {
-    var coerce
-    Object.keys(argv).filter(function (key) {
-      return key === '_' || checkAllAliases(key, flags.arrays)
-    }).forEach(function (key) {
-      coerce = checkAllAliases(key, flags.coercions)
-      if (typeof coerce === 'function') {
-        try {
-          argv[key] = coerce(argv[key])
-        } catch (err) {
-          error = err
-        }
-      }
-    })
-  }
-
   function applyDefaultsAndAliases (obj, aliases, defaults) {
     Object.keys(defaults).forEach(function (key) {
       if (!hasKey(obj, key.split('.'))) {
@@ -538,14 +511,6 @@
     })
 
     var key = keys[keys.length - 1]
-    var coerce = !checkAllAliases(key, flags.arrays) && checkAllAliases(key, 
flags.coercions)
-    if (typeof coerce === 'function') {
-      try {
-        value = coerce(value)
-      } catch (err) {
-        error = err
-      }
-    }
 
     if (value === increment) {
       o[key] = increment(o[key])
@@ -628,9 +593,9 @@
   function guessType (key, flags) {
     var type = 'boolean'
 
-    if (checkAllAliases(key, flags.strings)) type = 'string'
-    else if (checkAllAliases(key, flags.numbers)) type = 'number'
-    else if (checkAllAliases(key, flags.arrays)) type = 'array'
+    if (flags.strings && flags.strings[key]) type = 'string'
+    else if (flags.numbers && flags.numbers[key]) type = 'number'
+    else if (flags.arrays && flags.arrays[key]) type = 'array'
 
     return type
   }
diff --git 
a/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/package.json
 
b/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/package.json
index 8fb0e93..058a3ef 100644
--- 
a/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/package.json
+++ 
b/node_modules/service-runner/node_modules/yargs/node_modules/yargs-parser/package.json
@@ -1,13 +1,13 @@
 {
   "name": "yargs-parser",
-  "version": "3.2.0",
+  "version": "2.4.1",
   "description": "the mighty option parser used by yargs",
   "main": "index.js",
   "scripts": {
     "pretest": "standard",
     "test": "nyc mocha test/*.js",
     "coverage": "nyc report --reporter=text-lcov | coveralls",
-    "release": "standard-version"
+    "version": "standard-version"
   },
   "repository": {
     "url": "git+ssh://[email protected]/yargs/yargs-parser.git"
@@ -30,37 +30,37 @@
   "license": "ISC",
   "devDependencies": {
     "chai": "^3.5.0",
-    "coveralls": "^2.11.12",
-    "mocha": "^3.0.1",
-    "nyc": "^7.1.0",
+    "coveralls": "^2.11.8",
+    "mocha": "^2.4.5",
+    "nyc": "^7.0.0",
     "standard": "^7.1.0",
     "standard-version": "^2.1.2"
   },
   "dependencies": {
     "camelcase": "^3.0.0",
-    "lodash.assign": "^4.1.0"
+    "lodash.assign": "^4.0.6"
   },
   "files": [
     "lib",
     "index.js"
   ],
-  "gitHead": "a4c4f0c4e9417c968feec98caa39d69983bf31ec",
+  "gitHead": "e7c71d5b8e0088596aef17a4e2b0261a85fca713",
   "bugs": {
     "url": "https://github.com/yargs/yargs-parser/issues";
   },
   "homepage": "https://github.com/yargs/yargs-parser#readme";,
-  "_id": "[email protected]",
-  "_shasum": "5081355d19d9d0c8c5d81ada908cb4e6d186664f",
-  "_from": "yargs-parser@>=3.2.0 <4.0.0",
-  "_npmVersion": "3.10.6",
+  "_id": "[email protected]",
+  "_shasum": "85568de3cf150ff49fa51825f03a8c880ddcc5c4",
+  "_from": "yargs-parser@>=2.4.1 <3.0.0",
+  "_npmVersion": "3.3.12",
   "_nodeVersion": "5.1.0",
   "_npmUser": {
     "name": "bcoe",
     "email": "[email protected]"
   },
   "dist": {
-    "shasum": "5081355d19d9d0c8c5d81ada908cb4e6d186664f",
-    "tarball": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz";
+    "shasum": "85568de3cf150ff49fa51825f03a8c880ddcc5c4",
+    "tarball": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz";
   },
   "maintainers": [
     {
@@ -73,9 +73,9 @@
     }
   ],
   "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/yargs-parser-3.2.0.tgz_1471118009225_0.3763321761507541"
+    "host": "packages-16-east.internal.npmjs.com",
+    "tmp": "tmp/yargs-parser-2.4.1.tgz_1468709489453_0.7414652374573052"
   },
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz";
+  "_resolved": 
"https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz";
 }
diff --git a/node_modules/service-runner/node_modules/yargs/package.json 
b/node_modules/service-runner/node_modules/yargs/package.json
index 46e8e3d..674949a 100644
--- a/node_modules/service-runner/node_modules/yargs/package.json
+++ b/node_modules/service-runner/node_modules/yargs/package.json
@@ -1,6 +1,6 @@
 {
   "name": "yargs",
-  "version": "5.0.0",
+  "version": "4.8.1",
   "description": "yargs the modern, pirate-themed, successor to optimist.",
   "main": "./index.js",
   "files": [
@@ -15,17 +15,17 @@
     "cliui": "^3.2.0",
     "decamelize": "^1.1.1",
     "get-caller-file": "^1.0.1",
-    "lodash.assign": "^4.2.0",
+    "lodash.assign": "^4.0.3",
     "os-locale": "^1.4.0",
     "read-pkg-up": "^1.0.1",
     "require-directory": "^2.1.1",
     "require-main-filename": "^1.0.1",
     "set-blocking": "^2.0.0",
-    "string-width": "^1.0.2",
+    "string-width": "^1.0.1",
     "which-module": "^1.0.0",
     "window-size": "^0.2.0",
     "y18n": "^3.2.1",
-    "yargs-parser": "^3.2.0"
+    "yargs-parser": "^2.4.1"
   },
   "devDependencies": {
     "chai": "^3.4.1",
@@ -35,8 +35,8 @@
     "cross-spawn": "^4.0.0",
     "es6-promise": "^3.0.2",
     "hashish": "0.0.4",
-    "mocha": "^3.0.1",
-    "nyc": "^8.1.0",
+    "mocha": "^2.5.2",
+    "nyc": "^7.0.0",
     "rimraf": "^2.5.0",
     "standard": "^7.0.0",
     "standard-version": "^2.2.1",
@@ -71,22 +71,22 @@
   "engine": {
     "node": ">=0.10"
   },
-  "gitHead": "985b1ba1201f06d80e57af2f2e0c57221230458f",
+  "gitHead": "6adbe5574885c6ac7f7d42e80010b9f325c1bac3",
   "bugs": {
     "url": "https://github.com/yargs/yargs/issues";
   },
-  "_id": "[email protected]",
-  "_shasum": "3355144977d05757dbb86d6e38ec056123b3a66e",
-  "_from": "yargs@>=5.0.0 <6.0.0",
-  "_npmVersion": "3.10.6",
+  "_id": "[email protected]",
+  "_shasum": "c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0",
+  "_from": "yargs@>=4.8.1 <5.0.0",
+  "_npmVersion": "3.3.12",
   "_nodeVersion": "5.1.0",
   "_npmUser": {
     "name": "bcoe",
     "email": "[email protected]"
   },
   "dist": {
-    "shasum": "3355144977d05757dbb86d6e38ec056123b3a66e",
-    "tarball": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz";
+    "shasum": "c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0",
+    "tarball": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz";
   },
   "maintainers": [
     {
@@ -107,9 +107,9 @@
     }
   ],
   "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/yargs-5.0.0.tgz_1471390523096_0.04234337690286338"
+    "host": "packages-12-west.internal.npmjs.com",
+    "tmp": "tmp/yargs-4.8.1.tgz_1468774517925_0.6020703467074782"
   },
   "directories": {},
-  "_resolved": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz";
+  "_resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz";
 }
diff --git a/node_modules/service-runner/node_modules/yargs/yargs.js 
b/node_modules/service-runner/node_modules/yargs/yargs.js
index c767c0e..ed6fd56 100644
--- a/node_modules/service-runner/node_modules/yargs/yargs.js
+++ b/node_modules/service-runner/node_modules/yargs/yargs.js
@@ -1,4 +1,5 @@
 const assert = require('assert')
+const assign = require('lodash.assign')
 const Command = require('./lib/command')
 const Completion = require('./lib/completion')
 const Parser = require('yargs-parser')
@@ -6,6 +7,7 @@
 const Usage = require('./lib/usage')
 const Validation = require('./lib/validation')
 const Y18n = require('y18n')
+const requireMainFilename = require('require-main-filename')
 const objFilter = require('./lib/obj-filter')
 const setBlocking = require('set-blocking')
 
@@ -96,7 +98,7 @@
 
     var objectOptions = [
       'narg', 'key', 'alias', 'default', 'defaultDescription',
-      'config', 'choices', 'demanded', 'coerce'
+      'config', 'choices', 'demanded'
     ]
 
     arrayOptions.forEach(function (k) {
@@ -111,7 +113,7 @@
       })
     })
 
-    tmpOptions.envPrefix = options.envPrefix
+    tmpOptions.envPrefix = undefined
     options = tmpOptions
 
     // if this is the first time being executed, create
@@ -242,19 +244,6 @@
     return self
   }
 
-  self.coerce = function (key, fn) {
-    if (typeof key === 'object' && !Array.isArray(key)) {
-      Object.keys(key).forEach(function (k) {
-        self.coerce(k, key[k])
-      })
-    } else {
-      [].concat(key).forEach(function (k) {
-        options.coerce[k] = fn
-      })
-    }
-    return self
-  }
-
   self.count = function (counts) {
     options.count.push.apply(options.count, [].concat(counts))
     return self
@@ -375,7 +364,7 @@
     var obj = {}
     try {
       obj = readPkgUp.sync({
-        cwd: path || require('require-main-filename')(parentRequire || require)
+        cwd: path || requireMainFilename(parentRequire || require)
       })
     } catch (noop) {}
 
@@ -414,8 +403,6 @@
         self.normalize(key)
       } if ('choices' in opt) {
         self.choices(key, opt.choices)
-      } if ('coerce' in opt) {
-        self.coerce(key, opt.coerce)
       } if ('group' in opt) {
         self.group(key, opt.group)
       } if (opt.global) {
@@ -473,7 +460,7 @@
   }
   self.getGroups = function () {
     // combine explicit and preserved groups. explicit groups should be first
-    return require('lodash.assign')({}, groups, preservedGroups)
+    return assign({}, groups, preservedGroups)
   }
 
   // as long as options.envPrefix is not undefined,
@@ -533,33 +520,12 @@
   }
 
   var helpOpt = null
-  var useHelpOptAsCommand = false // a call to .help() will enable this
-  self.addHelpOpt = self.help = function (opt, msg, addImplicitCmd) {
-    // argument shuffle
-    if (arguments.length === 0) {
-      useHelpOptAsCommand = true
-    } else if (arguments.length === 1) {
-      if (typeof opt === 'boolean') {
-        useHelpOptAsCommand = opt
-        opt = null
-      } else {
-        useHelpOptAsCommand = true
-      }
-    } else if (arguments.length === 2) {
-      if (typeof msg === 'boolean') {
-        useHelpOptAsCommand = msg
-        msg = null
-      } else {
-        useHelpOptAsCommand = true
-      }
-    } else {
-      useHelpOptAsCommand = Boolean(addImplicitCmd)
-    }
-    // use arguments, fallback to defaults for opt and msg
-    helpOpt = opt || 'help'
-    self.boolean(helpOpt)
-    self.global(helpOpt)
-    self.describe(helpOpt, msg || usage.deferY18nLookup('Show help'))
+  self.addHelpOpt = self.help = function (opt, msg) {
+    opt = opt || 'help'
+    helpOpt = opt
+    self.boolean(opt)
+    self.global(opt)
+    self.describe(opt, msg || usage.deferY18nLookup('Show help'))
     return self
   }
 
@@ -638,12 +604,6 @@
     return detectLocale
   }
 
-  var recommendCommands
-  self.recommendCommands = function () {
-    recommendCommands = true
-    return self
-  }
-
   self.getUsageInstance = function () {
     return usage
   }
@@ -694,56 +654,22 @@
       return argv
     }
 
-    if (argv._.length) {
-      // check for helpOpt in argv._ before running commands
-      // assumes helpOpt must be valid if useHelpOptAsCommand is true
-      if (useHelpOptAsCommand) {
-        // consider any multi-char helpOpt alias as a valid help command
-        // unless all helpOpt aliases are single-char
-        // note that parsed.aliases is a normalized bidirectional map :)
-        var helpCmds = [helpOpt].concat(aliases[helpOpt])
-        var multiCharHelpCmds = helpCmds.filter(function (k) {
-          return k.length > 1
-        })
-        if (multiCharHelpCmds.length) helpCmds = multiCharHelpCmds
-        // look for and strip any helpCmds from argv._
-        argv._ = argv._.filter(function (cmd) {
-          if (~helpCmds.indexOf(cmd)) {
-            argv[helpOpt] = true
-            return false
-          }
-          return true
-        })
+    // if there's a handler associated with a
+    // command defer processing to it.
+    var handlerKeys = command.getCommands()
+    for (var i = 0, cmd; (cmd = argv._[i]) !== undefined; i++) {
+      if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) {
+        setPlaceholderKeys(argv)
+        return command.runCommand(cmd, self, parsed)
       }
+    }
 
-      // if there's a handler associated with a
-      // command defer processing to it.
-      var handlerKeys = command.getCommands()
-      if (handlerKeys.length) {
-        var firstUnknownCommand
-        for (var i = 0, cmd; (cmd = argv._[i]) !== undefined; i++) {
-          if (~handlerKeys.indexOf(cmd) && cmd !== completionCommand) {
-            setPlaceholderKeys(argv)
-            return command.runCommand(cmd, self, parsed)
-          } else if (!firstUnknownCommand && cmd !== completionCommand) {
-            firstUnknownCommand = cmd
-          }
-        }
-
-        // recommend a command if recommendCommands() has
-        // been enabled, and no commands were found to execute
-        if (recommendCommands && firstUnknownCommand) {
-          validation.recommendCommands(firstUnknownCommand, handlerKeys)
-        }
-      }
-
-      // generate a completion script for adding to ~/.bashrc.
-      if (completionCommand && ~argv._.indexOf(completionCommand) && 
!argv[completion.completionKey]) {
-        if (exitProcess) setBlocking(true)
-        self.showCompletionScript()
-        if (exitProcess) {
-          process.exit(0)
-        }
+    // generate a completion script for adding to ~/.bashrc.
+    if (completionCommand && ~argv._.indexOf(completionCommand) && 
!argv[completion.completionKey]) {
+      if (exitProcess) setBlocking(true)
+      self.showCompletionScript()
+      if (exitProcess) {
+        process.exit(0)
       }
     }
 
diff --git a/node_modules/service-runner/package.json 
b/node_modules/service-runner/package.json
index a1f5e91..3607262 100644
--- a/node_modules/service-runner/package.json
+++ b/node_modules/service-runner/package.json
@@ -1,12 +1,13 @@
 {
   "name": "service-runner",
-  "version": "2.1.2",
+  "version": "2.1.4",
   "description": "Generic nodejs service supervisor / cluster runner",
   "main": "service-runner.js",
   "bin": {
     "service-runner": "./service-runner.js"
   },
   "scripts": {
+    "postpublish": "git tag -a \"v${npm_package_version}\" -m 
\"${npm_package_name}@${npm_package_version} release\" && git push upstream 
\"v${npm_package_version}\"",
     "start": "./service-runner.js",
     "test": "mocha"
   },
@@ -39,7 +40,7 @@
     "js-yaml": "^3.6.1",
     "limitation": "^0.1.9",
     "semver": "^5.3.0",
-    "yargs": "^5.0.0"
+    "yargs": "^4.8.1"
   },
   "devDependencies": {
     "mocha": "^3.0.2",
@@ -47,9 +48,9 @@
     "mocha-jscs": "^5.0.1",
     "bunyan-prettystream": 
"git+https://github.com/hadfieldn/node-bunyan-prettystream.git#master";
   },
-  "gitHead": "2717b345bc7a51123b68ee8c21c9887e888cfb27",
-  "_id": "[email protected]",
-  "_shasum": "8a3c00dbabb4b969dbf379f8ed9ffa1e35a3e591",
+  "gitHead": "fe40c71add59634827986c8937c75844bf0c3972",
+  "_id": "[email protected]",
+  "_shasum": "f1c1c7a04049f147eb42e99f2f66588ebb41986f",
   "_from": "service-runner@>=2.1.0 <3.0.0",
   "_npmVersion": "2.15.5",
   "_nodeVersion": "4.4.6",
@@ -58,8 +59,8 @@
     "email": "[email protected]"
   },
   "dist": {
-    "shasum": "8a3c00dbabb4b969dbf379f8ed9ffa1e35a3e591",
-    "tarball": 
"https://registry.npmjs.org/service-runner/-/service-runner-2.1.2.tgz";
+    "shasum": "f1c1c7a04049f147eb42e99f2f66588ebb41986f",
+    "tarball": 
"https://registry.npmjs.org/service-runner/-/service-runner-2.1.4.tgz";
   },
   "maintainers": [
     {
@@ -76,9 +77,9 @@
     }
   ],
   "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/service-runner-2.1.2.tgz_1473714027610_0.9398095468059182"
+    "host": "packages-16-east.internal.npmjs.com",
+    "tmp": "tmp/service-runner-2.1.4.tgz_1473804020338_0.9487119810655713"
   },
   "directories": {},
-  "_resolved": 
"https://registry.npmjs.org/service-runner/-/service-runner-2.1.2.tgz";
+  "_resolved": 
"https://registry.npmjs.org/service-runner/-/service-runner-2.1.4.tgz";
 }
diff --git a/restbase b/restbase
index b89d077..78daf7f 160000
--- a/restbase
+++ b/restbase
@@ -1 +1 @@
-Subproject commit b89d0772488af516aa933da7b8eda7615cfedf69
+Subproject commit 78daf7f48a80b1261886a8d91a97e4303d83b253

-- 
To view, visit https://gerrit.wikimedia.org/r/310602
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9f07027d3b83af27f73b9b701b5db9e869776440
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/restbase/deploy
Gerrit-Branch: master
Gerrit-Owner: Ppchelko <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to