From abbde2fafab5d722e156aa6fadd343e671446ace Mon Sep 17 00:00:00 2001 From: Raynos Date: Tue, 21 May 2013 15:10:34 -0600 Subject: [PATCH 1/9] doc: mention objectMode for Writable streams --- doc/api/stream.markdown | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/api/stream.markdown b/doc/api/stream.markdown index 5826c71afd6..be3aacfebec 100644 --- a/doc/api/stream.markdown +++ b/doc/api/stream.markdown @@ -961,6 +961,9 @@ how to implement Writable streams in your programs. returning false. Default=16kb * `decodeStrings` {Boolean} Whether or not to decode strings into Buffers before passing them to [`_write()`][]. Default=true + * `objectMode` {Boolean} Whether or not the `write(anyObj)` is + a valid operation. If set you can write arbitrary data instead + of only `Buffer` / `String` data. Default=false In classes that extend the Writable class, make sure to call the constructor so that the buffering settings can be properly From c2aea3747dafaa979c9d21cc7acead32324bfb3a Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 13:04:29 -0800 Subject: [PATCH 2/9] uv: Upgrade to v0.10.25 --- deps/uv/AUTHORS | 3 ++ deps/uv/ChangeLog | 24 ++++++++- deps/uv/build.mk | 1 + deps/uv/src/unix/linux-core.c | 4 +- deps/uv/src/unix/stream.c | 12 +++-- deps/uv/src/unix/sunos.c | 19 ++++--- deps/uv/src/version.c | 2 +- deps/uv/src/win/tcp.c | 3 ++ deps/uv/test/test-list.h | 4 ++ deps/uv/test/test-shutdown-twice.c | 83 ++++++++++++++++++++++++++++++ deps/uv/uv.gyp | 1 + 11 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 deps/uv/test/test-shutdown-twice.c diff --git a/deps/uv/AUTHORS b/deps/uv/AUTHORS index bf8f7ee7c82..dcb99318185 100644 --- a/deps/uv/AUTHORS +++ b/deps/uv/AUTHORS @@ -91,3 +91,6 @@ Alex Gaynor huxingyi Alex Crichton Luca Bruno +Trevor Norris +Oguz Bastemur +Alexis Campailla diff --git a/deps/uv/ChangeLog b/deps/uv/ChangeLog index 13c4efcb406..b41636dd53e 100644 --- a/deps/uv/ChangeLog +++ b/deps/uv/ChangeLog @@ -1,4 +1,26 @@ -2014.01.23, Version 0.10.23 (Stable) +2014.02.19, Version 0.10.25 (Stable) + +Changes since version 0.10.24: + +* stream: start thread after assignments (Oguz Bastemur) + +* unix: correct error when calling uv_shutdown twice (Saúl Ibarra Corretgé) + +* windows: freeze in uv_tcp_endgame (Alexis Campailla) + +* sunos: handle rearm errors (Fedor Indutny) + + +2014.01.30, Version 0.10.24 (Stable), aecd296b6bce9b40f06a61c5c94e43d45ac7308a + +Changes since version 0.10.23: + +* linux: move sscanf() out of the assert() (Trevor Norris) + +* linux: fix C99/C++ comment (Fedor Indutny) + + +2014.01.23, Version 0.10.23 (Stable), dbd218e699fec8be311d85e4788be9e28ae884f8 Changes since version 0.10.22: diff --git a/deps/uv/build.mk b/deps/uv/build.mk index 5077929d616..e273e251bd1 100644 --- a/deps/uv/build.mk +++ b/deps/uv/build.mk @@ -109,6 +109,7 @@ TESTS= \ test/test-semaphore.o \ test/test-shutdown-close.o \ test/test-shutdown-eof.o \ + test/test-shutdown-twice.o \ test/test-signal.o \ test/test-signal-multiple-loops.o \ test/test-spawn.o \ diff --git a/deps/uv/src/unix/linux-core.c b/deps/uv/src/unix/linux-core.c index 74294eb2ca0..7a8fcd3548f 100644 --- a/deps/uv/src/unix/linux-core.c +++ b/deps/uv/src/unix/linux-core.c @@ -602,7 +602,9 @@ static int read_times(unsigned int numcpus, uv_cpu_info_t* ci) { /* skip "cpu " marker */ { unsigned int n; - assert(sscanf(buf, "cpu%u ", &n) == 1); + int r = sscanf(buf, "cpu%u ", &n); + assert(r == 1); + (void) r; /* silence build warning */ for (len = sizeof("cpu0"); n /= 10; len++); } diff --git a/deps/uv/src/unix/stream.c b/deps/uv/src/unix/stream.c index 0bc5fe8534f..98e41a308b1 100644 --- a/deps/uv/src/unix/stream.c +++ b/deps/uv/src/unix/stream.c @@ -282,6 +282,7 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { int fds[2]; int ret; int kq; + int old_fd; kq = kqueue(); if (kq == -1) { @@ -333,16 +334,20 @@ int uv__stream_try_select(uv_stream_t* stream, int* fd) { s->fake_fd = fds[0]; s->int_fd = fds[1]; - if (uv_thread_create(&s->thread, uv__stream_osx_select, stream)) - goto fatal4; - + old_fd = *fd; s->stream = stream; stream->select = s; *fd = s->fake_fd; + if (uv_thread_create(&s->thread, uv__stream_osx_select, stream)) + goto fatal4; + return 0; fatal4: + s->stream = NULL; + stream->select = NULL; + *fd = old_fd; close(s->fake_fd); close(s->int_fd); s->fake_fd = -1; @@ -1075,6 +1080,7 @@ int uv_shutdown(uv_shutdown_t* req, uv_stream_t* stream, uv_shutdown_cb cb) { if (!(stream->flags & UV_STREAM_WRITABLE) || stream->flags & UV_STREAM_SHUT || + stream->flags & UV_STREAM_SHUTTING || stream->flags & UV_CLOSED || stream->flags & UV_CLOSING) { uv__set_artificial_error(stream->loop, UV_ENOTCONN); diff --git a/deps/uv/src/unix/sunos.c b/deps/uv/src/unix/sunos.c index e2a72dbc56c..9030bfa6b39 100644 --- a/deps/uv/src/unix/sunos.c +++ b/deps/uv/src/unix/sunos.c @@ -303,9 +303,9 @@ void uv_loadavg(double avg[3]) { #if defined(PORT_SOURCE_FILE) -static void uv__fs_event_rearm(uv_fs_event_t *handle) { +static int uv__fs_event_rearm(uv_fs_event_t* handle) { if (handle->fd == -1) - return; + return 0; if (port_associate(handle->loop->fs_fd, PORT_SOURCE_FILE, @@ -313,8 +313,10 @@ static void uv__fs_event_rearm(uv_fs_event_t *handle) { FILE_ATTRIB | FILE_MODIFIED, handle) == -1) { uv__set_sys_error(handle->loop, errno); + return -1; } handle->fd = PORT_LOADED; + return 0; } @@ -361,11 +363,12 @@ static void uv__fs_event_read(uv_loop_t* loop, assert(events != 0); handle->fd = PORT_FIRED; handle->cb(handle, NULL, events, 0); + + if (handle->fd != PORT_DELETED) + if (uv__fs_event_rearm(handle) != 0) + handle->cb(handle, NULL, 0, -1); } while (handle->fd != PORT_DELETED); - - if (handle != NULL && handle->fd != PORT_DELETED) - uv__fs_event_rearm(handle); } @@ -387,14 +390,16 @@ int uv_fs_event_init(uv_loop_t* loop, } uv__handle_init(loop, (uv_handle_t*)handle, UV_FS_EVENT); - uv__handle_start(handle); /* FIXME shouldn't start automatically */ handle->filename = strdup(filename); handle->fd = PORT_UNUSED; handle->cb = cb; memset(&handle->fo, 0, sizeof handle->fo); handle->fo.fo_name = handle->filename; - uv__fs_event_rearm(handle); + if (uv__fs_event_rearm(handle) != 0) + return -1; + + uv__handle_start(handle); /* FIXME shouldn't start automatically */ if (first_run) { uv__io_init(&loop->fs_event_watcher, uv__fs_event_read, portfd); diff --git a/deps/uv/src/version.c b/deps/uv/src/version.c index 028ff2537c0..8ea385ed58b 100644 --- a/deps/uv/src/version.c +++ b/deps/uv/src/version.c @@ -34,7 +34,7 @@ #define UV_VERSION_MAJOR 0 #define UV_VERSION_MINOR 10 -#define UV_VERSION_PATCH 23 +#define UV_VERSION_PATCH 25 #define UV_VERSION_IS_RELEASE 1 diff --git a/deps/uv/src/win/tcp.c b/deps/uv/src/win/tcp.c index 59a36de01fa..a91c57848bd 100644 --- a/deps/uv/src/win/tcp.c +++ b/deps/uv/src/win/tcp.c @@ -577,6 +577,7 @@ int uv_tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { req->accept_socket = INVALID_SOCKET; req->data = handle; req->wait_handle = INVALID_HANDLE_VALUE; + req->event_handle = NULL; } } @@ -1040,9 +1041,11 @@ void uv_process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, if (handle->flags & UV_HANDLE_EMULATE_IOCP) { if (req->wait_handle != INVALID_HANDLE_VALUE) { UnregisterWait(req->wait_handle); + req->wait_handle = INVALID_HANDLE_VALUE; } if (req->event_handle) { CloseHandle(req->event_handle); + req->event_handle = NULL; } } diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h index 06c56fca9cf..f60eab30b33 100644 --- a/deps/uv/test/test-list.h +++ b/deps/uv/test/test-list.h @@ -94,6 +94,7 @@ TEST_DECLARE (connection_fail_doesnt_auto_close) TEST_DECLARE (shutdown_close_tcp) TEST_DECLARE (shutdown_close_pipe) TEST_DECLARE (shutdown_eof) +TEST_DECLARE (shutdown_twice) TEST_DECLARE (callback_stack) TEST_DECLARE (error_message) TEST_DECLARE (timer) @@ -344,6 +345,9 @@ TASK_LIST_START TEST_ENTRY (shutdown_eof) TEST_HELPER (shutdown_eof, tcp4_echo_server) + TEST_ENTRY (shutdown_twice) + TEST_HELPER (shutdown_twice, tcp4_echo_server) + TEST_ENTRY (callback_stack) TEST_HELPER (callback_stack, tcp4_echo_server) diff --git a/deps/uv/test/test-shutdown-twice.c b/deps/uv/test/test-shutdown-twice.c new file mode 100644 index 00000000000..7ce3e04a283 --- /dev/null +++ b/deps/uv/test/test-shutdown-twice.c @@ -0,0 +1,83 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * 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. + */ + +/* + * This is a regression test for issue #1113 (calling uv_shutdown twice will + * leave a ghost request in the system) + */ + +#include "uv.h" +#include "task.h" + +static uv_shutdown_t req1; +static uv_shutdown_t req2; + +static int shutdown_cb_called = 0; + +static void close_cb(uv_handle_t* handle) { + +} + +static void shutdown_cb(uv_shutdown_t* req, int status) { + ASSERT(req == &req1); + ASSERT(status == 0); + shutdown_cb_called++; + uv_close((uv_handle_t*) req->handle, close_cb); +} + +static void connect_cb(uv_connect_t* req, int status) { + int r; + + ASSERT(status == 0); + + r = uv_shutdown(&req1, req->handle, shutdown_cb); + ASSERT(r == 0); + r = uv_shutdown(&req2, req->handle, shutdown_cb); + ASSERT(r != 0); + +} + +TEST_IMPL(shutdown_twice) { + struct sockaddr_in addr = uv_ip4_addr("127.0.0.1", TEST_PORT); + uv_loop_t* loop; + int r; + uv_tcp_t h; + + uv_connect_t connect_req; + + loop = uv_default_loop(); + + r = uv_tcp_init(loop, &h); + + r = uv_tcp_connect(&connect_req, + &h, + addr, + connect_cb); + ASSERT(r == 0); + + r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); + ASSERT(r == 0); + + ASSERT(shutdown_cb_called == 1); + + MAKE_VALGRIND_HAPPY(); + return 0; +} diff --git a/deps/uv/uv.gyp b/deps/uv/uv.gyp index ea8707b790b..4e87dc1a38d 100644 --- a/deps/uv/uv.gyp +++ b/deps/uv/uv.gyp @@ -329,6 +329,7 @@ 'test/test-semaphore.c', 'test/test-shutdown-close.c', 'test/test-shutdown-eof.c', + 'test/test-shutdown-twice.c', 'test/test-signal.c', 'test/test-signal-multiple-loops.c', 'test/test-spawn.c', From 3e6e63406d04093be39bafab84845365a1d0c971 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 13:09:41 -0800 Subject: [PATCH 3/9] test: make test-net-error-twice less racey --- test/simple/test-net-error-twice.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/simple/test-net-error-twice.js b/test/simple/test-net-error-twice.js index 5435930a24c..5ab370eb33b 100644 --- a/test/simple/test-net-error-twice.js +++ b/test/simple/test-net-error-twice.js @@ -36,15 +36,18 @@ var srv = net.createServer(function onConnection(conn) { if (errs.length > 1 && errs[0] === errs[1]) assert(false, "We should not be emitting the same error twice"); }); + conn.on('close', function() { + srv.unref(); + }); }).listen(common.PORT, function () { var client = net.connect({ port: common.PORT }); client.on('connect', function () { - client.resume(); client.destroy(); }); -}).unref(); +}); process.on('exit', function() { + console.log(errs); assert.equal(errs.length, 1); }); From 1d734a75b5764ac7414daab489ce82d6ca09f69f Mon Sep 17 00:00:00 2001 From: Pedro Ballesteros Date: Mon, 17 Feb 2014 16:22:05 +0100 Subject: [PATCH 4/9] doc: stdout blocking or non-blocking behaviour Makes clear that the behaviour of stdout is blocking in Linux/Unix even when they refer to pipes. --- doc/api/process.markdown | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/api/process.markdown b/doc/api/process.markdown index 8cb613525d5..9d3125ce91c 100644 --- a/doc/api/process.markdown +++ b/doc/api/process.markdown @@ -125,9 +125,13 @@ Example: the definition of `console.log` }; `process.stderr` and `process.stdout` are unlike other streams in Node in -that writes to them are usually blocking. They are blocking in the case -that they refer to regular files or TTY file descriptors. In the case they -refer to pipes, they are non-blocking like other streams. +that writes to them are usually blocking. + +- They are blocking in the case that they refer to regular files or TTY file + descriptors. +- In the case they refer to pipes: + - They are blocking in Linux/Unix. + - They are non-blocking like other streams in Windows. To check if Node is being run in a TTY context, read the `isTTY` property on `process.stderr`, `process.stdout`, or `process.stdin`: @@ -149,9 +153,13 @@ See [the tty docs](tty.html#tty_tty) for more information. A writable stream to stderr. `process.stderr` and `process.stdout` are unlike other streams in Node in -that writes to them are usually blocking. They are blocking in the case -that they refer to regular files or TTY file descriptors. In the case they -refer to pipes, they are non-blocking like other streams. +that writes to them are usually blocking. + +- They are blocking in the case that they refer to regular files or TTY file + descriptors. +- In the case they refer to pipes: + - They are blocking in Linux/Unix. + - They are non-blocking like other streams in Windows. ## process.stdin From 1fa5cff4f21782fb1ba499c38e690a13d70ba765 Mon Sep 17 00:00:00 2001 From: Anton Khlynovskiy Date: Mon, 8 Jul 2013 21:09:44 +0400 Subject: [PATCH 5/9] docs: clarify process.stdin and old mode --- doc/api/process.markdown | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/doc/api/process.markdown b/doc/api/process.markdown index 9d3125ce91c..dafcd23bddc 100644 --- a/doc/api/process.markdown +++ b/doc/api/process.markdown @@ -164,22 +164,34 @@ that writes to them are usually blocking. ## process.stdin -A `Readable Stream` for stdin. The stdin stream is paused by default, so one -must call `process.stdin.resume()` to read from it. +A `Readable Stream` for stdin. Example of opening standard input and listening for both events: - process.stdin.resume(); process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(chunk) { - process.stdout.write('data: ' + chunk); + process.stdin.on('readable', function(chunk) { + var chunk = process.stdin.read(); + if (chunk !== null) { + process.stdout.write('data: ' + chunk); + } }); process.stdin.on('end', function() { process.stdout.write('end'); }); +As a Stream, `process.stdin` can also be used in "old" mode that is compatible +with scripts written for node prior v0.10. +For more information see +[Stream compatibility](stream.html#stream_compatibility_with_older_node_versions). + +In "old" Streams mode the stdin stream is paused by default, so one +must call `process.stdin.resume()` to read from it. Note also that calling +`process.stdin.resume()` itself would switch stream to "old" mode. + +If you are starting a new project you should prefer a more recent "new" Streams +mode over "old" one. ## process.argv From 31c510ca8829ef6e6727e530a57d75b4233b275a Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 14:55:58 -0800 Subject: [PATCH 6/9] 2014.02.18, Version 0.10.26 (Stable) * uv: Upgrade to v0.10.25 (Timothy J Fontaine) * npm: upgrade to 1.4.3 (isaacs) * v8: support compiling with VS2013 (Fedor Indutny) * cares: backport TXT parsing fix (Fedor Indutny) * crypto: throw on SignFinal failure (Fedor Indutny) * crypto: update root certificates (Ben Noordhuis) * debugger: Fix breakpoint not showing after restart (Farid Neshat) * fs: make unwatchFile() insensitive to path (iamdoron) * net: do not re-emit stream errors (Fedor Indutny) * net: make Socket destroy() re-entrance safe (Jun Ma) * net: reset `endEmitted` on reconnect (Fedor Indutny) * node: do not close stdio implicitly (Fedor Indutny) * zlib: avoid assertion in close (Fedor Indutny) --- AUTHORS | 8 ++++++++ ChangeLog | 31 ++++++++++++++++++++++++++++++- src/node_version.h | 2 +- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 28cbb58f75a..fe995578497 100644 --- a/AUTHORS +++ b/AUTHORS @@ -485,3 +485,11 @@ ayanamist Lorenz Leutgeb Brandon Cheng Alexis Campailla +Jun Ma +Maxime Quandalle +Benjamin Waters +Doron Pagot +Kenan Sulayman +Christian Schulz +Pedro Ballesteros +Anton Khlynovskiy diff --git a/ChangeLog b/ChangeLog index 51fe083764e..8538c7f726f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,33 @@ -2014.01.23, Version 0.10.25 (Stable) +2014.02.18, Version 0.10.26 (Stable) + +* uv: Upgrade to v0.10.25 (Timothy J Fontaine) + +* npm: upgrade to 1.4.3 (isaacs) + +* v8: support compiling with VS2013 (Fedor Indutny) + +* cares: backport TXT parsing fix (Fedor Indutny) + +* crypto: throw on SignFinal failure (Fedor Indutny) + +* crypto: update root certificates (Ben Noordhuis) + +* debugger: Fix breakpoint not showing after restart (Farid Neshat) + +* fs: make unwatchFile() insensitive to path (iamdoron) + +* net: do not re-emit stream errors (Fedor Indutny) + +* net: make Socket destroy() re-entrance safe (Jun Ma) + +* net: reset `endEmitted` on reconnect (Fedor Indutny) + +* node: do not close stdio implicitly (Fedor Indutny) + +* zlib: avoid assertion in close (Fedor Indutny) + + +2014.01.23, Version 0.10.25 (Stable), b0e5f195dfce3e2b99f5091373d49f6616682596 * uv: Upgrade to v0.10.23 diff --git a/src/node_version.h b/src/node_version.h index 74aa502be2d..4e89a378831 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -26,7 +26,7 @@ #define NODE_MINOR_VERSION 10 #define NODE_PATCH_VERSION 26 -#define NODE_VERSION_IS_RELEASE 0 +#define NODE_VERSION_IS_RELEASE 1 #ifndef NODE_TAG # define NODE_TAG "" From cc56c62ed879ad4f93b1fdab3235c43e60f48b7e Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 15:34:29 -0800 Subject: [PATCH 7/9] build: readd missing installer resources This were accidentally moved during the website refactor --- doc/full-white-stripe.jpg | Bin 0 -> 4383 bytes doc/mac_osx_nodejs_installer_logo.png | Bin 0 -> 23317 bytes doc/thin-white-stripe.jpg | Bin 0 -> 3316 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/full-white-stripe.jpg create mode 100644 doc/mac_osx_nodejs_installer_logo.png create mode 100644 doc/thin-white-stripe.jpg diff --git a/doc/full-white-stripe.jpg b/doc/full-white-stripe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b990aeff7bc09015ffa89c8c77f400026f185b2 GIT binary patch literal 4383 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 literal 0 HcmV?d00001 diff --git a/doc/thin-white-stripe.jpg b/doc/thin-white-stripe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8dc3d4ae8f9bdea7fca0ffeae7708003f24f87ca GIT binary patch literal 3316 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 literal 0 HcmV?d00001 From ae418f974d78e52c22b8d49a84963b8b416b1438 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 16:43:12 -0800 Subject: [PATCH 8/9] Now working on v0.10.27 --- src/node_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node_version.h b/src/node_version.h index 4e89a378831..4473289c2d0 100644 --- a/src/node_version.h +++ b/src/node_version.h @@ -24,9 +24,9 @@ #define NODE_MAJOR_VERSION 0 #define NODE_MINOR_VERSION 10 -#define NODE_PATCH_VERSION 26 +#define NODE_PATCH_VERSION 27 -#define NODE_VERSION_IS_RELEASE 1 +#define NODE_VERSION_IS_RELEASE 0 #ifndef NODE_TAG # define NODE_TAG "" From 085db9dd6c1f3faf526c16170e9ffe89b8ec6211 Mon Sep 17 00:00:00 2001 From: Timothy J Fontaine Date: Tue, 18 Feb 2014 18:57:45 -0800 Subject: [PATCH 9/9] tools: update to support separate website repo --- tools/node-release-post-build.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tools/node-release-post-build.sh b/tools/node-release-post-build.sh index 6adda19f7d7..4e3555c4f0b 100755 --- a/tools/node-release-post-build.sh +++ b/tools/node-release-post-build.sh @@ -4,6 +4,12 @@ set -e +if [[ ! -e ../node-website/Makefile ]]; +then + echo "node-website must be checked out one level up" + exit 1 +fi + stability="$(python tools/getstability.py)" NODE_STABC="$(tr '[:lower:]' '[:upper:]' <<< ${stability:0:1})${stability:1}" NODE_STABL="$stability" @@ -43,15 +49,16 @@ make email.md echo "title: Node v"$(python tools/getnodeversion.py)" ($NODE_STABC)" echo "slug: node-v"$(python tools/getnodeversion.py | sed 's|\.|-|g')"-$NODE_STABL" echo "" - cat email.md ) > doc/blog/release/v$(python tools/getnodeversion.py).md + cat email.md ) > ../node-website/doc/blog/release/v$(python tools/getnodeversion.py).md if [ "$stability" = "stable" ]; then ## this needs to happen here because the website depends on the current node ## node version + ## this will get the api docs in the right place make website-upload - make blog-upload BRANCH="v$(python tools/getnodeversion.py | sed -E 's#\.[0-9]+$##')" + echo $(python tools/getnodeversion.py) > ../node-website/STABLE else BRANCH="master" fi @@ -67,13 +74,6 @@ git merge --no-ff v$(python tools/getnodeversion.py)-release vim src/node_version.h git commit -am "Now working on "$(python tools/getnodeversion.py) -if [ "$stability" = "stable" ]; -then - echo "Adding blog" - git add doc/blog - git commit -m "blog: Post for v$(python tools/getprevnodeversion.py)" -else - echo "copy blog to stable branch" -fi - git push git@github.com:joyent/node $BRANCH + +echo "Now go do the website stuff"