From 268a775a4862499497d79c53eaf31cbbf5d70704 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Mon, 9 Oct 2023 14:30:19 -0700 Subject: [PATCH 1/4] JS: Use async generator instead of callbacks + add tests JS now also supports writing async code with [Asnc Generators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncGenerator) which work very much like how async code would in Python. This allows us to write code that flows better, is more familiar to python folks, and avoids messy callback hell. This code is a *straight* port of the existing callback based code to use an Async Generator instead. The EventIterator library is a very helpful convenience function here, allowing us to translate the callbacks from EventSource into an async generator without having to write a queue of promises ourselves. The iterator is stopped exactly the same way the callbacks were earlier stopped (whenever .stop() is called). All the callbacks have been switched over to a switch / case statement instead. We can get cleaner and use exceptions to handle failures, instead of the 'failure' case, but that can come in a later PR so this is a purely mechanical refactoring from one async method to another. An appropriate test for this is also added. To fully test the EventSource flow, we create a temporary web server that will serve a real captured eventsource response, with 1ms gaps between lines to fully simulate how this would work in reality. This gives us much more confidence about how this would work than mocking. With this, @jupyterhub/binder-client now has 100% unit test coverage! Ref https://github.com/jupyterhub/binderhub/issues/774 --- binderhub/static/js/index.js | 118 +-- binderhub/templates/index.html | 6 +- binderhub/templates/loading.html | 4 +- js/packages/binderhub-client/lib/index.js | 71 +- js/packages/binderhub-client/package.json | 3 +- .../tests/fixtures/fullbuild.eventsource | 736 ++++++++++++++++++ .../{lib => tests}/index.test.js | 64 +- js/packages/binderhub-client/tests/utils.js | 52 ++ 8 files changed, 949 insertions(+), 105 deletions(-) create mode 100644 js/packages/binderhub-client/tests/fixtures/fullbuild.eventsource rename js/packages/binderhub-client/{lib => tests}/index.test.js (72%) create mode 100644 js/packages/binderhub-client/tests/utils.js diff --git a/binderhub/static/js/index.js b/binderhub/static/js/index.js index 120294f30..f118eca16 100644 --- a/binderhub/static/js/index.js +++ b/binderhub/static/js/index.js @@ -22,7 +22,7 @@ import { BASE_URL } from "./src/constants"; import { getBuildFormValues } from "./src/form"; import { updateRepoText } from "./src/repo"; -function build(providerSpec, log, fitAddon, path, pathType) { +async function build(providerSpec, log, fitAddon, path, pathType) { updateFavicon(BASE_URL + "favicon_building.ico"); // split provider prefix off of providerSpec const spec = providerSpec.slice(providerSpec.indexOf("/") + 1); @@ -52,67 +52,67 @@ function build(providerSpec, log, fitAddon, path, pathType) { buildToken, ); - image.onStateChange("*", function (data) { + for await (const data of image.fetch()) { + // Write message to the log terminal if there is a message if (data.message !== undefined) { log.writeAndStore(data.message); fitAddon.fit(); } else { console.log(data); } - }); - - image.onStateChange("waiting", function () { - $("#phase-waiting").removeClass("hidden"); - }); - - image.onStateChange("building", function () { - $("#phase-building").removeClass("hidden"); - log.show(); - }); - - image.onStateChange("pushing", function () { - $("#phase-pushing").removeClass("hidden"); - }); - - image.onStateChange("failed", function () { - $("#build-progress .progress-bar").addClass("hidden"); - $("#phase-failed").removeClass("hidden"); - - $("#loader").addClass("paused"); - // If we fail for any reason, show an error message and logs - updateFavicon(BASE_URL + "favicon_fail.ico"); - log.show(); - if ($("div#loader-text").length > 0) { - $("#loader").addClass("error"); - $("div#loader-text p.launching").html( - "Error loading " + spec + "!
See logs below for details.", - ); + switch (data.phase) { + case "waiting": + $("#phase-waiting").removeClass("hidden"); + break; + case "building": + $("#phase-building").removeClass("hidden"); + log.show(); + break; + case "pushing": + $("#phase-pushing").removeClass("hidden"); + break; + case "failed": + $("#build-progress .progress-bar").addClass("hidden"); + $("#phase-failed").removeClass("hidden"); + + $("#loader").addClass("paused"); + + // If we fail for any reason, show an error message and logs + updateFavicon(BASE_URL + "favicon_fail.ico"); + log.show(); + if ($("div#loader-text").length > 0) { + $("#loader").addClass("error"); + $("div#loader-text p.launching").html( + "Error loading " + spec + "!
See logs below for details.", + ); + } + image.close(); + break; + case "built": + $("#phase-already-built").removeClass("hidden"); + $("#phase-launching").removeClass("hidden"); + updateFavicon(BASE_URL + "favicon_success.ico"); + break; + case "ready": + image.close(); + // If data.url is an absolute URL, it'll be used. Else, it'll be interpreted + // relative to current page's URL. + const serverUrl = new URL(data.url, window.location.href); + // user server is ready, redirect to there + window.location.href = image.getFullRedirectURL( + serverUrl, + data.token, + path, + pathType, + ); + break; + default: + console.log("Unknown phase in response from server"); + console.log(data); + break; } - image.close(); - }); - - image.onStateChange("built", function () { - $("#phase-already-built").removeClass("hidden"); - $("#phase-launching").removeClass("hidden"); - updateFavicon(BASE_URL + "favicon_success.ico"); - }); - - image.onStateChange("ready", function (data) { - image.close(); - // If data.url is an absolute URL, it'll be used. Else, it'll be interpreted - // relative to current page's URL. - const serverUrl = new URL(data.url, window.location.href); - // user server is ready, redirect to there - window.location.href = image.getFullRedirectURL( - serverUrl, - data.token, - path, - pathType, - ); - }); - - image.fetch(); + } return image; } @@ -170,21 +170,21 @@ function indexMain() { return false; }); - $("#build-form").submit(function () { + $("#build-form").submit(async function (e) { + e.preventDefault(); const formValues = getBuildFormValues(); updateUrls(formValues); - build( + await build( formValues.providerPrefix + "/" + formValues.repo + "/" + formValues.ref, log, fitAddon, formValues.path, formValues.pathType, ); - return false; }); } -function loadingMain(providerSpec) { +async function loadingMain(providerSpec) { const [log, fitAddon] = setUpLog(); // retrieve (encoded) filepath/urlpath from URL // URLSearchParams.get returns the decoded value, @@ -205,7 +205,7 @@ function loadingMain(providerSpec) { } } } - build(providerSpec, log, fitAddon, path, pathType); + await build(providerSpec, log, fitAddon, path, pathType); // Looping through help text every few seconds const launchMessageInterval = 6 * 1000; diff --git a/binderhub/templates/index.html b/binderhub/templates/index.html index 780003f4d..6260c9c9d 100644 --- a/binderhub/templates/index.html +++ b/binderhub/templates/index.html @@ -26,7 +26,7 @@

New to Binder? Get started with a

Build and launch a repository

- +
@@ -197,6 +197,8 @@

How it works

{% block footer %} {{ super () }} {% endblock footer %} diff --git a/binderhub/templates/loading.html b/binderhub/templates/loading.html index 49961a395..dd6369ef2 100644 --- a/binderhub/templates/loading.html +++ b/binderhub/templates/loading.html @@ -59,6 +59,8 @@ {% block footer %} {% endblock footer %} diff --git a/js/packages/binderhub-client/lib/index.js b/js/packages/binderhub-client/lib/index.js index 46b09164f..65f2c0ca8 100644 --- a/js/packages/binderhub-client/lib/index.js +++ b/js/packages/binderhub-client/lib/index.js @@ -1,4 +1,5 @@ import { NativeEventSource, EventSourcePolyfill } from "event-source-polyfill"; +import { EventIterator } from "event-iterator"; // Use native browser EventSource if available, and use the polyfill if not available const EventSource = NativeEventSource || EventSourcePolyfill; @@ -34,29 +35,38 @@ export class BinderRepository { if (buildToken) { this.buildUrl.searchParams.append("build_token", buildToken); } - this.callbacks = {}; + + this.eventIteratorQueue = null; } /** - * Call the BinderHub API + * Call the binderhub API and yield responses as they come in + * + * Returns an Async Generator yielding each item returned by the + * server API. */ fetch() { this.eventSource = new EventSource(this.buildUrl); - this.eventSource.onerror = (err) => { - console.error("Failed to construct event stream", err); - this._changeState("failed", { - message: "Failed to connect to event stream\n", + return new EventIterator((queue) => { + this.eventIteratorQueue = queue; + this.eventSource.onerror = (err) => { + queue.push({ + phase: "failed", + message: "Failed to connect to event stream\n", + }); + queue.stop(); + }; + + this.eventSource.addEventListener("message", (event) => { + // console.log("message received") + // console.log(event) + const data = JSON.parse(event.data); + // FIXME: fix case of phase/state upstream + if (data.phase) { + data.phase = data.phase.toLowerCase(); + } + queue.push(data); }); - }; - this.eventSource.addEventListener("message", (event) => { - const data = JSON.parse(event.data); - // FIXME: Rename 'phase' to 'state' upstream - // FIXME: fix case of phase/state upstream - let state = null; - if (data.phase) { - state = data.phase.toLowerCase(); - } - this._changeState(state, data); }); } @@ -67,6 +77,10 @@ export class BinderRepository { if (this.eventSource !== undefined) { this.eventSource.close(); } + if (this.eventIteratorQueue !== null) { + // Stop any currently running fetch() iterations + this.eventIteratorQueue.stop(); + } } /** @@ -113,29 +127,4 @@ export class BinderRepository { url.searchParams.append("token", token); return url; } - - /** - * Add callback whenever state of the current build changes - * - * @param {str} state The state to add this callback to. '*' to add callback for all state changes - * @param {*} cb Callback function to call whenever this state is reached - */ - onStateChange(state, cb) { - if (this.callbacks[state] === undefined) { - this.callbacks[state] = [cb]; - } else { - this.callbacks[state].push(cb); - } - } - - _changeState(state, data) { - [state, "*"].map((key) => { - const callbacks = this.callbacks[key]; - if (callbacks) { - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](data); - } - } - }); - } } diff --git a/js/packages/binderhub-client/package.json b/js/packages/binderhub-client/package.json index e8c60b232..d6e13b911 100644 --- a/js/packages/binderhub-client/package.json +++ b/js/packages/binderhub-client/package.json @@ -14,6 +14,7 @@ }, "homepage": "https://github.com/jupyterhub/binderhub#readme", "dependencies": { - "event-source-polyfill": "^1.0.31" + "event-source-polyfill": "^1.0.31", + "event-iterator": "^2.0.0" } } diff --git a/js/packages/binderhub-client/tests/fixtures/fullbuild.eventsource b/js/packages/binderhub-client/tests/fixtures/fullbuild.eventsource new file mode 100644 index 000000000..fc134297e --- /dev/null +++ b/js/packages/binderhub-client/tests/fixtures/fullbuild.eventsource @@ -0,0 +1,736 @@ +data: {"phase":"waiting","message":"Waiting for build to start...\n"} +data: {"message":"Picked Git content provider.\n"} +data: {"message":"Cloning into '/tmp/repo2dockern6amo21f'...\n","phase":"fetching"} +data: {"message":"HEAD is now at 1479e02 Merge pull request #2 from binder-examples/betatim-patch-1\n","phase":"fetching"} +data: {"phase":"unknown","message":"/usr/lib/python3.10/site-packages/repo2docker/app.py:268: UserWarning: Building for linux/arm64 is experimental. To use the recommended platform set --Repo2Docker.platform=linux/amd64. To silence this warning set --Repo2Docker.platform=linux/arm64.\n"} +data: {"phase":"unknown","message":" warnings.warn(\n"} +data: {"message":"Python version unspecified, using current default Python version 3.10. This will change in the future."} +data: {"message":"Building conda environment for python=3.10\n"} +data: {"message":"Using CondaBuildPack builder\n","phase":"building"} +data: {"message":"Step 1/51 : FROM docker.io/library/buildpack-deps:bionic","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":"Fetching base image...\r","phase":"building"} +data: {"message":"Fetching base image...\r","phase":"building"} +data: {"message":"Fetching base image...\r","phase":"building"} +data: {"message":" ---> 0707eec19ac4\n","phase":"building"} +data: {"message":"Step 2/51 : ENV DEBIAN_FRONTEND=noninteractive","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 66b3afffd3b7\n","phase":"building"} +data: {"message":"Step 3/51 : RUN apt-get -qq update && apt-get -qq install --yes --no-install-recommends locales > /dev/null && apt-get -qq purge && apt-get -qq clean && rm -rf /var/lib/apt/lists/*","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 781cf147fe59\n","phase":"building"} +data: {"message":"Step 4/51 : RUN echo \"en_US.UTF-8 UTF-8\" > /etc/locale.gen && locale-gen","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 6c545659c6b3\n","phase":"building"} +data: {"message":"Step 5/51 : ENV LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 09938ce1b249\n","phase":"building"} +data: {"message":"Step 6/51 : ENV SHELL=/bin/bash","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 0c5abd3db2bc\n","phase":"building"} +data: {"message":"Step 7/51 : ARG NB_USER","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 2aa20881663a\n","phase":"building"} +data: {"message":"Step 8/51 : ARG NB_UID","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 8dd97aeefd07\n","phase":"building"} +data: {"message":"Step 9/51 : ENV USER=${NB_USER} HOME=/home/${NB_USER}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> ef40fdc6eb91\n","phase":"building"} +data: {"message":"Step 10/51 : RUN groupadd --gid ${NB_UID} ${NB_USER} && useradd --comment \"Default user\" --create-home --gid ${NB_UID} --no-log-init --shell /bin/bash --uid ${NB_UID} ${NB_USER}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 7cb44a9a28b7\n","phase":"building"} +data: {"message":"Step 11/51 : RUN apt-get -qq update && apt-get -qq install --yes --no-install-recommends gettext-base less unzip > /dev/null && apt-get -qq purge && apt-get -qq clean && rm -rf /var/lib/apt/lists/*","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 08decbd768b9\n","phase":"building"} +data: {"message":"Step 12/51 : EXPOSE 8888","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 3bc7304dd086\n","phase":"building"} +data: {"message":"Step 13/51 : ENV APP_BASE=/srv","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 31aea037615e\n","phase":"building"} +data: {"message":"Step 14/51 : ENV CONDA_DIR=${APP_BASE}/conda","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 71c42b08c9d7\n","phase":"building"} +data: {"message":"Step 15/51 : ENV NB_PYTHON_PREFIX=${CONDA_DIR}/envs/notebook","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 79557ac9fb88\n","phase":"building"} +data: {"message":"Step 16/51 : ENV NPM_DIR=${APP_BASE}/npm","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> fe2cb5c566cf\n","phase":"building"} +data: {"message":"Step 17/51 : ENV NPM_CONFIG_GLOBALCONFIG=${NPM_DIR}/npmrc","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> cf08cabfe351\n","phase":"building"} +data: {"message":"Step 18/51 : ENV NB_ENVIRONMENT_FILE=/tmp/env/environment.lock","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> ea809a584201\n","phase":"building"} +data: {"message":"Step 19/51 : ENV MAMBA_ROOT_PREFIX=${CONDA_DIR}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 8a2cbf4ba45b\n","phase":"building"} +data: {"message":"Step 20/51 : ENV MAMBA_EXE=${CONDA_DIR}/bin/mamba","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 008b234371dc\n","phase":"building"} +data: {"message":"Step 21/51 : ENV CONDA_PLATFORM=linux-aarch64","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 471eca34fd79\n","phase":"building"} +data: {"message":"Step 22/51 : ENV KERNEL_PYTHON_PREFIX=${NB_PYTHON_PREFIX}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 7513f4c33ca9\n","phase":"building"} +data: {"message":"Step 23/51 : ENV PATH=${NB_PYTHON_PREFIX}/bin:${CONDA_DIR}/bin:${NPM_DIR}/bin:${PATH}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 9c05e2ffba4e\n","phase":"building"} +data: {"message":"Step 24/51 : COPY --chown=1000:1000 build_script_files/-2fusr-2flib-2fpython3-2e10-2fsite-2dpackages-2frepo2docker-2fbuildpacks-2fconda-2factivate-2dconda-2esh-44e764 /etc/profile.d/activate-conda.sh","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 67f798e0256e\n","phase":"building"} +data: {"message":"Step 25/51 : COPY --chown=1000:1000 build_script_files/-2fusr-2flib-2fpython3-2e10-2fsite-2dpackages-2frepo2docker-2fbuildpacks-2fconda-2fenvironment-2epy-2d3-2e10-2dlinux-2daarch64-2elock-c8df09 /tmp/env/environment.lock","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 7ed2544e1161\n","phase":"building"} +data: {"message":"Step 26/51 : COPY --chown=1000:1000 build_script_files/-2fusr-2flib-2fpython3-2e10-2fsite-2dpackages-2frepo2docker-2fbuildpacks-2fconda-2finstall-2dbase-2denv-2ebash-e5509f /tmp/install-base-env.bash","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 6def06bb384d\n","phase":"building"} +data: {"message":"Step 27/51 : RUN TIMEFORMAT='time: %3R' bash -c 'time /tmp/install-base-env.bash' && rm -rf /tmp/install-base-env.bash /tmp/env","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 868562294f2c\n","phase":"building"} +data: {"message":"Step 28/51 : RUN mkdir -p ${NPM_DIR} && chown -R ${NB_USER}:${NB_USER} ${NPM_DIR}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 70c093a1060d\n","phase":"building"} +data: {"message":"Step 29/51 : USER root","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 58d990bc3ece\n","phase":"building"} +data: {"message":"Step 30/51 : ARG REPO_DIR=${HOME}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 50c380286059\n","phase":"building"} +data: {"message":"Step 31/51 : ENV REPO_DIR=${REPO_DIR}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 7c02be884b1a\n","phase":"building"} +data: {"message":"Step 32/51 : RUN if [ ! -d \"${REPO_DIR}\" ]; then /usr/bin/install -o ${NB_USER} -g ${NB_USER} -d \"${REPO_DIR}\"; fi","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> a0c5530b8b32\n","phase":"building"} +data: {"message":"Step 33/51 : WORKDIR ${REPO_DIR}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 19a94ed107dd\n","phase":"building"} +data: {"message":"Step 34/51 : RUN chown ${NB_USER}:${NB_USER} ${REPO_DIR}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 2e5a901f33d0\n","phase":"building"} +data: {"message":"Step 35/51 : ENV PATH=${HOME}/.local/bin:${REPO_DIR}/.local/bin:${PATH}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> c33e84dd8f2d\n","phase":"building"} +data: {"message":"Step 36/51 : ENV CONDA_DEFAULT_ENV=${KERNEL_PYTHON_PREFIX}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Using cache\n","phase":"building"} +data: {"message":" ---> 0581fa4c7fec\n","phase":"building"} +data: {"message":"Step 37/51 : COPY --chown=1000:1000 src/environment.yml ${REPO_DIR}/environment.yml","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> 500bebd2b0b5\n","phase":"building"} +data: {"message":"Step 38/51 : RUN apt-get -qq update && apt-get install --yes --no-install-recommends ghostscript gnuplot && apt-get -qq purge && apt-get -qq clean && rm -rf /var/lib/apt/lists/*","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 63fe4c697783\n","phase":"building"} +data: {"message":"Reading package lists...","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":"Building dependency tree...","phase":"building"} +data: {"message":"\nReading state information...","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":"The following additional packages will be installed:\n adwaita-icon-theme aglfn gnuplot-data gnuplot-qt gtk-update-icon-cache\n humanity-icon-theme libatk1.0-0 libatk1.0-data libavahi-client3\n libavahi-common-data libavahi-common3 libcups2 libcupsimage2 libdbus-1-3\n libdouble-conversion1 libdrm-amdgpu1 libdrm-common libdrm-nouveau2\n libdrm-radeon1 libdrm2 libegl-mesa0 libegl1 libevdev2 libgbm1 libgd3 libgl1\n libgl1-mesa-dri libglapi-mesa libgles2 libglvnd0 libglx-mesa0 libglx0 libgs9\n libgs9-common libgtk2.0-0 libgtk2.0-common libgudev-1.0-0 libidn11\n libijs-0.35 libinput-bin libinput10 libjbig2dec0 libllvm10 liblua5.3-0\n libmtdev1 libnotify4 libpaper1 libqt5core5a libqt5dbus5 libqt5gui5\n libqt5network5 libqt5printsupport5 libqt5svg5 libqt5widgets5 libsensors4\n libwacom-common libwacom2 libwayland-client0 libwayland-server0\n libwxbase3.0-0v5 libwxgtk3.0-0v5 libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0\n libxcb-glx0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-present0\n libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-sync1 libxcb-util1\n libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxcomposite1 libxcursor1\n libxdamage1 libxfixes3 libxi6 libxinerama1 libxkbcommon-x11-0 libxkbcommon0\n","phase":"building"} +data: {"message":" libxpm4 libxrandr2 libxshmfence1 libxxf86vm1 poppler-data ubuntu-mono\n xkb-data\n","phase":"building"} +data: {"message":"Suggested packages:\n ghostscript-x gnuplot-doc cups-common libgd-tools gvfs\n qt5-image-formats-plugins qtwayland5 lm-sensors poppler-utils\n fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic\n | fonts-ipafont-gothic fonts-arphic-ukai fonts-arphic-uming fonts-nanum\nRecommended packages:\n gsfonts libcupsfilters1 dbus fonts-droid-fallback libgail-common\n libgtk2.0-bin notification-daemon libpaper-utils qttranslations5-l10n\n qt5-gtk-platformtheme libwacom-bin\n","phase":"building"} +data: {"message":"The following NEW packages will be installed:\n adwaita-icon-theme aglfn ghostscript gnuplot gnuplot-data gnuplot-qt\n gtk-update-icon-cache humanity-icon-theme libatk1.0-0 libatk1.0-data\n libavahi-client3 libavahi-common-data libavahi-common3 libcups2\n libcupsimage2 libdbus-1-3 libdouble-conversion1 libdrm-amdgpu1 libdrm-common\n libdrm-nouveau2 libdrm-radeon1 libdrm2 libegl-mesa0 libegl1 libevdev2\n libgbm1 libgd3 libgl1 libgl1-mesa-dri libglapi-mesa libgles2 libglvnd0\n libglx-mesa0 libglx0 libgs9 libgs9-common libgtk2.0-0 libgtk2.0-common\n libgudev-1.0-0 libidn11 libijs-0.35 libinput-bin libinput10 libjbig2dec0\n libllvm10 liblua5.3-0 libmtdev1 libnotify4 libpaper1 libqt5core5a\n libqt5dbus5 libqt5gui5 libqt5network5 libqt5printsupport5 libqt5svg5\n","phase":"building"} +data: {"message":" libqt5widgets5 libsensors4 libwacom-common libwacom2 libwayland-client0\n libwayland-server0 libwxbase3.0-0v5 libwxgtk3.0-0v5 libx11-xcb1\n libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-icccm4 libxcb-image0\n libxcb-keysyms1 libxcb-present0 libxcb-randr0 libxcb-render-util0\n libxcb-shape0 libxcb-sync1 libxcb-util1 libxcb-xfixes0 libxcb-xinerama0\n libxcb-xkb1 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6\n libxinerama1 libxkbcommon-x11-0 libxkbcommon0 libxpm4 libxrandr2\n libxshmfence1 libxxf86vm1 poppler-data ubuntu-mono xkb-data\n","phase":"building"} +data: {"message":"0 upgraded, 94 newly installed, 0 to remove and 1 not upgraded.\nNeed to get 48.4 MB of archives.\nAfter this operation, 740 MB of additional disk space will be used.\nGet:1 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libdouble-conversion1 arm64 2.0.1-4ubuntu1 [29.6 kB]\n","phase":"building"} +data: {"message":"Get:2 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5core5a arm64 5.9.5+dfsg-0ubuntu2.6 [1,934 kB]\n","phase":"building"} +data: {"message":"Get:3 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdrm-common all 2.4.101-2~18.04.1 [5,560 B]\nGet:4 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdrm2 arm64 2.4.101-2~18.04.1 [28.4 kB]\n","phase":"building"} +data: {"message":"Get:5 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libglvnd0 arm64 1.0.0-2ubuntu2.3 [39.8 kB]\n","phase":"building"} +data: {"message":"Get:6 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libwayland-server0 arm64 1.16.0-1ubuntu1.1~18.04.4 [25.6 kB]\n","phase":"building"} +data: {"message":"Get:7 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgbm1 arm64 20.0.8-0ubuntu1~18.04.1 [24.8 kB]\n","phase":"building"} +data: {"message":"Get:8 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libglapi-mesa arm64 20.0.8-0ubuntu1~18.04.1 [30.4 kB]\n","phase":"building"} +data: {"message":"Get:9 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libwayland-client0 arm64 1.16.0-1ubuntu1.1~18.04.4 [20.6 kB]\n","phase":"building"} +data: {"message":"Get:10 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libx11-xcb1 arm64 2:1.6.4-3ubuntu0.4 [9,680 B]\n","phase":"building"} +data: {"message":"Get:11 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-dri2-0 arm64 1.13-2~ubuntu18.04 [6,256 B]\n","phase":"building"} +data: {"message":"Get:12 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-dri3-0 arm64 1.13-2~ubuntu18.04 [6,044 B]\n","phase":"building"} +data: {"message":"Get:13 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-present0 arm64 1.13-2~ubuntu18.04 [5,216 B]\n","phase":"building"} +data: {"message":"Get:14 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-sync1 arm64 1.13-2~ubuntu18.04 [7,912 B]\n","phase":"building"} +data: {"message":"Get:15 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-xfixes0 arm64 1.13-2~ubuntu18.04 [8,200 B]\n","phase":"building"} +data: {"message":"Get:16 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxshmfence1 arm64 1.3-1 [4,868 B]\n","phase":"building"} +data: {"message":"Get:17 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libegl-mesa0 arm64 20.0.8-0ubuntu1~18.04.1 [80.7 kB]\n","phase":"building"} +data: {"message":"Get:18 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libegl1 arm64 1.0.0-2ubuntu2.3 [27.4 kB]\n","phase":"building"} +data: {"message":"Get:19 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgles2 arm64 1.0.0-2ubuntu2.3 [17.3 kB]\n","phase":"building"} +data: {"message":"Get:20 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libevdev2 arm64 1.5.8+dfsg-1ubuntu0.2 [25.6 kB]\n","phase":"building"} +data: {"message":"Get:21 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libmtdev1 arm64 1.1.5-1ubuntu3 [12.9 kB]\n","phase":"building"} +data: {"message":"Get:22 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libgudev-1.0-0 arm64 1:232-2 [11.5 kB]\n","phase":"building"} +data: {"message":"Get:23 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libwacom-common all 0.29-1 [36.9 kB]\n","phase":"building"} +data: {"message":"Get:24 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libwacom2 arm64 0.29-1 [15.8 kB]\n","phase":"building"} +data: {"message":"Get:25 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libinput-bin arm64 1.10.4-1ubuntu0.18.04.3 [11.0 kB]\n","phase":"building"} +data: {"message":"Get:26 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libinput10 arm64 1.10.4-1ubuntu0.18.04.3 [71.9 kB]\n","phase":"building"} +data: {"message":"Get:27 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdbus-1-3 arm64 1.12.2-1ubuntu1.4 [152 kB]\n","phase":"building"} +data: {"message":"Get:28 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5dbus5 arm64 5.9.5+dfsg-0ubuntu2.6 [167 kB]\n","phase":"building"} +data: {"message":"Get:29 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5network5 arm64 5.9.5+dfsg-0ubuntu2.6 [534 kB]\n","phase":"building"} +data: {"message":"Get:30 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcb-icccm4 arm64 0.4.1-1ubuntu1 [9,554 B]\n","phase":"building"} +data: {"message":"Get:31 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcb-util1 arm64 0.4.0-0ubuntu3 [10.5 kB]\n","phase":"building"} +data: {"message":"Get:32 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcb-image0 arm64 0.4.0-1build1 [11.1 kB]\nGet:33 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcb-keysyms1 arm64 0.4.0-1 [8,002 B]\n","phase":"building"} +data: {"message":"Get:34 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-randr0 arm64 1.13-2~ubuntu18.04 [13.7 kB]\n","phase":"building"} +data: {"message":"Get:35 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcb-render-util0 arm64 0.3.9-1 [9,060 B]\n","phase":"building"} +data: {"message":"Get:36 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-shape0 arm64 1.13-2~ubuntu18.04 [5,532 B]\n","phase":"building"} +data: {"message":"Get:37 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-xinerama0 arm64 1.13-2~ubuntu18.04 [5,068 B]\n","phase":"building"} +data: {"message":"Get:38 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-xkb1 arm64 1.13-2~ubuntu18.04 [24.9 kB]\n","phase":"building"} +data: {"message":"Get:39 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxi6 arm64 2:1.7.9-1 [25.4 kB]\n","phase":"building"} +data: {"message":"Get:40 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 xkb-data all 2.23.1-1ubuntu1.18.04.1 [325 kB]\n","phase":"building"} +data: {"message":"Get:41 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxkbcommon0 arm64 0.8.2-1~ubuntu18.04.1 [86.7 kB]\nGet:42 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxkbcommon-x11-0 arm64 0.8.2-1~ubuntu18.04.1 [12.2 kB]\nGet:43 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5gui5 arm64 5.9.5+dfsg-0ubuntu2.6 [2,093 kB]\n","phase":"building"} +data: {"message":"Get:44 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5widgets5 arm64 5.9.5+dfsg-0ubuntu2.6 [1,914 kB]\n","phase":"building"} +data: {"message":"Get:45 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5svg5 arm64 5.9.5-0ubuntu1.1 [109 kB]\n","phase":"building"} +data: {"message":"Get:46 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxinerama1 arm64 2:1.1.3-1 [7,438 B]\n","phase":"building"} +data: {"message":"Get:47 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxxf86vm1 arm64 1:1.1.4-1 [9,492 B]\n","phase":"building"} +data: {"message":"Get:48 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 poppler-data all 0.4.8-2 [1,479 kB]\n","phase":"building"} +data: {"message":"Get:49 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libidn11 arm64 1.33-2.1ubuntu1.2 [44.0 kB]\n","phase":"building"} +data: {"message":"Get:50 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 gtk-update-icon-cache arm64 3.22.30-1ubuntu4 [27.0 kB]\n","phase":"building"} +data: {"message":"Get:51 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 humanity-icon-theme all 0.6.15 [1,250 kB]\n","phase":"building"} +data: {"message":"Get:52 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 ubuntu-mono all 16.10+18.04.20181005-0ubuntu1 [149 kB]\n","phase":"building"} +data: {"message":"Get:53 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 adwaita-icon-theme all 3.28.0-1ubuntu1 [3,306 kB]\n","phase":"building"} +data: {"message":"Get:54 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libavahi-common-data arm64 0.7-3.1ubuntu1.3 [22.2 kB]\nGet:55 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libavahi-common3 arm64 0.7-3.1ubuntu1.3 [18.4 kB]\n","phase":"building"} +data: {"message":"Get:56 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libavahi-client3 arm64 0.7-3.1ubuntu1.3 [21.9 kB]\n","phase":"building"} +data: {"message":"Get:57 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libcups2 arm64 2.2.7-1ubuntu2.10 [180 kB]\n","phase":"building"} +data: {"message":"Get:58 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libcupsimage2 arm64 2.2.7-1ubuntu2.10 [16.7 kB]\n","phase":"building"} +data: {"message":"Get:59 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libijs-0.35 arm64 0.35-13 [14.2 kB]\n","phase":"building"} +data: {"message":"Get:60 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libjbig2dec0 arm64 0.13-6 [50.1 kB]\n","phase":"building"} +data: {"message":"Get:61 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libpaper1 arm64 1.1.24+nmu5ubuntu1 [13.0 kB]\n","phase":"building"} +data: {"message":"Get:62 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgs9-common all 9.26~dfsg+0-0ubuntu0.18.04.18 [5,092 kB]\n","phase":"building"} +data: {"message":"Get:63 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgs9 arm64 9.26~dfsg+0-0ubuntu0.18.04.18 [1,943 kB]\n","phase":"building"} +data: {"message":"Get:64 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 ghostscript arm64 9.26~dfsg+0-0ubuntu0.18.04.18 [51.0 kB]\n","phase":"building"} +data: {"message":"Get:65 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 aglfn all 1.7-3 [29.4 kB]\nGet:66 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 gnuplot-data all 5.2.2+dfsg1-2ubuntu1 [56.7 kB]\n","phase":"building"} +data: {"message":"Get:67 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxpm4 arm64 1:3.5.12-1ubuntu0.18.04.2 [30.1 kB]\n","phase":"building"} +data: {"message":"Get:68 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgd3 arm64 2.2.5-4ubuntu0.5 [99.9 kB]\n","phase":"building"} +data: {"message":"Get:69 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 liblua5.3-0 arm64 5.3.3-1ubuntu0.18.04.1 [105 kB]\n","phase":"building"} +data: {"message":"Get:70 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libqt5printsupport5 arm64 5.9.5+dfsg-0ubuntu2.6 [159 kB]\n","phase":"building"} +data: {"message":"Get:71 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libwxbase3.0-0v5 arm64 3.0.4+dfsg-3 [849 kB]\n","phase":"building"} +data: {"message":"Get:72 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libxcb-glx0 arm64 1.13-2~ubuntu18.04 [18.3 kB]\n","phase":"building"} +data: {"message":"Get:73 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxdamage1 arm64 1:1.1.4-3 [6,668 B]\nGet:74 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxfixes3 arm64 1:5.0.3-1 [9,844 B]\n","phase":"building"} +data: {"message":"Get:75 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdrm-amdgpu1 arm64 2.4.101-2~18.04.1 [15.8 kB]\n","phase":"building"} +data: {"message":"Get:76 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdrm-nouveau2 arm64 2.4.101-2~18.04.1 [14.5 kB]\n","phase":"building"} +data: {"message":"Get:77 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libdrm-radeon1 arm64 2.4.101-2~18.04.1 [19.2 kB]\n","phase":"building"} +data: {"message":"Get:78 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libllvm10 arm64 1:10.0.0-4ubuntu1~18.04.2 [12.7 MB]\n","phase":"building"} +data: {"message":"Get:79 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libsensors4 arm64 1:3.4.0-4ubuntu0.1 [25.4 kB]\n","phase":"building"} +data: {"message":"Get:80 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgl1-mesa-dri arm64 20.0.8-0ubuntu1~18.04.1 [5,840 kB]\n","phase":"building"} +data: {"message":"Get:81 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libglx-mesa0 arm64 20.0.8-0ubuntu1~18.04.1 [119 kB]\n","phase":"building"} +data: {"message":"Get:82 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libglx0 arm64 1.0.0-2ubuntu2.3 [24.0 kB]\nGet:83 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libgl1 arm64 1.0.0-2ubuntu2.3 [86.0 kB]\n","phase":"building"} +data: {"message":"Get:84 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libgtk2.0-common all 2.24.32-1ubuntu1 [125 kB]\n","phase":"building"} +data: {"message":"Get:85 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libatk1.0-data all 2.28.1-1 [2,992 B]\n","phase":"building"} +data: {"message":"Get:86 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libatk1.0-0 arm64 2.28.1-1 [37.0 kB]\n","phase":"building"} +data: {"message":"Get:87 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcomposite1 arm64 1:0.4.4-2 [6,646 B]\nGet:88 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxcursor1 arm64 1:1.1.15-1 [17.4 kB]\n","phase":"building"} +data: {"message":"Get:89 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libxrandr2 arm64 2:1.5.1-1 [16.0 kB]\n","phase":"building"} +data: {"message":"Get:90 http://ports.ubuntu.com/ubuntu-ports bionic/main arm64 libgtk2.0-0 arm64 2.24.32-1ubuntu1 [1,454 kB]\n","phase":"building"} +data: {"message":"Get:91 http://ports.ubuntu.com/ubuntu-ports bionic-updates/main arm64 libnotify4 arm64 0.7.7-3ubuntu0.18.04.1 [16.8 kB]\n","phase":"building"} +data: {"message":"Get:92 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 libwxgtk3.0-0v5 arm64 3.0.4+dfsg-3 [3,836 kB]\n","phase":"building"} +data: {"message":"Get:93 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 gnuplot-qt arm64 5.2.2+dfsg1-2ubuntu1 [897 kB]\n","phase":"building"} +data: {"message":"Get:94 http://ports.ubuntu.com/ubuntu-ports bionic/universe arm64 gnuplot all 5.2.2+dfsg1-2ubuntu1 [3,816 B]\n","phase":"building"} +data: {"message":"\u001b[91mdebconf: delaying package configuration, since apt-utils is not installed\n\u001b[0m","phase":"building"} +data: {"message":"Fetched 48.4 MB in 20s (2,454 kB/s)\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdouble-conversion1:arm64.\r\n(Reading database ... \r(Reading database ... 5%\r(Reading database ... 10%\r(Reading database ... 15%\r(Reading database ... 20%\r(Reading database ... 25%\r(Reading database ... 30%\r(Reading database ... 35%\r(Reading database ... 40%\r(Reading database ... 45%\r(Reading database ... 50%\r(Reading database ... 55%\r(Reading database ... 60%\r(Reading database ... 65%\r","phase":"building"} +data: {"message":"(Reading database ... 70%\r","phase":"building"} +data: {"message":"(Reading database ... 75%\r","phase":"building"} +data: {"message":"(Reading database ... 80%\r","phase":"building"} +data: {"message":"(Reading database ... 85%\r","phase":"building"} +data: {"message":"(Reading database ... 90%\r","phase":"building"} +data: {"message":"(Reading database ... 95%\r","phase":"building"} +data: {"message":"(Reading database ... 100%\r(Reading database ... 22814 files and directories currently installed.)\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../00-libdouble-conversion1_2.0.1-4ubuntu1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdouble-conversion1:arm64 (2.0.1-4ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5core5a:arm64.\r\nPreparing to unpack .../01-libqt5core5a_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5core5a:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdrm-common.\r\nPreparing to unpack .../02-libdrm-common_2.4.101-2~18.04.1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdrm-common (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdrm2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../03-libdrm2_2.4.101-2~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdrm2:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libglvnd0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../04-libglvnd0_1.0.0-2ubuntu2.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libglvnd0:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwayland-server0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../05-libwayland-server0_1.16.0-1ubuntu1.1~18.04.4_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwayland-server0:arm64 (1.16.0-1ubuntu1.1~18.04.4) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgbm1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../06-libgbm1_20.0.8-0ubuntu1~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgbm1:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libglapi-mesa:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../07-libglapi-mesa_20.0.8-0ubuntu1~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libglapi-mesa:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwayland-client0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../08-libwayland-client0_1.16.0-1ubuntu1.1~18.04.4_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwayland-client0:arm64 (1.16.0-1ubuntu1.1~18.04.4) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libx11-xcb1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../09-libx11-xcb1_2%3a1.6.4-3ubuntu0.4_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libx11-xcb1:arm64 (2:1.6.4-3ubuntu0.4) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-dri2-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../10-libxcb-dri2-0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-dri2-0:arm64 (1.13-2~ubuntu18.04) ...","phase":"building"} +data: {"message":"\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-dri3-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../11-libxcb-dri3-0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-dri3-0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-present0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../12-libxcb-present0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-present0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-sync1:arm64.\r\nPreparing to unpack .../13-libxcb-sync1_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-sync1:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-xfixes0:arm64.\r\nPreparing to unpack .../14-libxcb-xfixes0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-xfixes0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxshmfence1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../15-libxshmfence1_1.3-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxshmfence1:arm64 (1.3-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libegl-mesa0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../16-libegl-mesa0_20.0.8-0ubuntu1~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libegl-mesa0:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libegl1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../17-libegl1_1.0.0-2ubuntu2.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libegl1:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgles2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../18-libgles2_1.0.0-2ubuntu2.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgles2:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libevdev2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../19-libevdev2_1.5.8+dfsg-1ubuntu0.2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libevdev2:arm64 (1.5.8+dfsg-1ubuntu0.2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libmtdev1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../20-libmtdev1_1.1.5-1ubuntu3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libmtdev1:arm64 (1.1.5-1ubuntu3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgudev-1.0-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../21-libgudev-1.0-0_1%3a232-2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgudev-1.0-0:arm64 (1:232-2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwacom-common.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../22-libwacom-common_0.29-1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwacom-common (0.29-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwacom2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../23-libwacom2_0.29-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwacom2:arm64 (0.29-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libinput-bin.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../24-libinput-bin_1.10.4-1ubuntu0.18.04.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libinput-bin (1.10.4-1ubuntu0.18.04.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libinput10:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../25-libinput10_1.10.4-1ubuntu0.18.04.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libinput10:arm64 (1.10.4-1ubuntu0.18.04.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdbus-1-3:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../26-libdbus-1-3_1.12.2-1ubuntu1.4_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdbus-1-3:arm64 (1.12.2-1ubuntu1.4) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5dbus5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../27-libqt5dbus5_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5dbus5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5network5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../28-libqt5network5_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5network5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-icccm4:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../29-libxcb-icccm4_0.4.1-1ubuntu1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-icccm4:arm64 (0.4.1-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-util1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../30-libxcb-util1_0.4.0-0ubuntu3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-util1:arm64 (0.4.0-0ubuntu3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-image0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../31-libxcb-image0_0.4.0-1build1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-image0:arm64 (0.4.0-1build1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-keysyms1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../32-libxcb-keysyms1_0.4.0-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-keysyms1:arm64 (0.4.0-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-randr0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../33-libxcb-randr0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-randr0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-render-util0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../34-libxcb-render-util0_0.3.9-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-render-util0:arm64 (0.3.9-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-shape0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../35-libxcb-shape0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-shape0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-xinerama0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../36-libxcb-xinerama0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-xinerama0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-xkb1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../37-libxcb-xkb1_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-xkb1:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxi6:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../38-libxi6_2%3a1.7.9-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxi6:arm64 (2:1.7.9-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package xkb-data.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../39-xkb-data_2.23.1-1ubuntu1.18.04.1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking xkb-data (2.23.1-1ubuntu1.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxkbcommon0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../40-libxkbcommon0_0.8.2-1~ubuntu18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxkbcommon0:arm64 (0.8.2-1~ubuntu18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxkbcommon-x11-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../41-libxkbcommon-x11-0_0.8.2-1~ubuntu18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxkbcommon-x11-0:arm64 (0.8.2-1~ubuntu18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5gui5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../42-libqt5gui5_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5gui5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5widgets5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../43-libqt5widgets5_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5widgets5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5svg5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../44-libqt5svg5_5.9.5-0ubuntu1.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5svg5:arm64 (5.9.5-0ubuntu1.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxinerama1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../45-libxinerama1_2%3a1.1.3-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxinerama1:arm64 (2:1.1.3-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxxf86vm1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../46-libxxf86vm1_1%3a1.1.4-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxxf86vm1:arm64 (1:1.1.4-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package poppler-data.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../47-poppler-data_0.4.8-2_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking poppler-data (0.4.8-2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libidn11:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../48-libidn11_1.33-2.1ubuntu1.2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libidn11:arm64 (1.33-2.1ubuntu1.2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package gtk-update-icon-cache.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../49-gtk-update-icon-cache_3.22.30-1ubuntu4_arm64.deb ...\r\n","phase":"building"} +data: {"message":"No diversion 'diversion of /usr/sbin/update-icon-caches to /usr/sbin/update-icon-caches.gtk2 by libgtk-3-bin', none removed.\r\n","phase":"building"} +data: {"message":"No diversion 'diversion of /usr/share/man/man8/update-icon-caches.8.gz to /usr/share/man/man8/update-icon-caches.gtk2.8.gz by libgtk-3-bin', none removed.\r\n","phase":"building"} +data: {"message":"Unpacking gtk-update-icon-cache (3.22.30-1ubuntu4) ...","phase":"building"} +data: {"message":"\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package humanity-icon-theme.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../50-humanity-icon-theme_0.6.15_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking humanity-icon-theme (0.6.15) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package ubuntu-mono.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../51-ubuntu-mono_16.10+18.04.20181005-0ubuntu1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking ubuntu-mono (16.10+18.04.20181005-0ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package adwaita-icon-theme.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../52-adwaita-icon-theme_3.28.0-1ubuntu1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking adwaita-icon-theme (3.28.0-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libavahi-common-data:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../53-libavahi-common-data_0.7-3.1ubuntu1.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libavahi-common-data:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libavahi-common3:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../54-libavahi-common3_0.7-3.1ubuntu1.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libavahi-common3:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libavahi-client3:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../55-libavahi-client3_0.7-3.1ubuntu1.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libavahi-client3:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libcups2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../56-libcups2_2.2.7-1ubuntu2.10_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libcups2:arm64 (2.2.7-1ubuntu2.10) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libcupsimage2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../57-libcupsimage2_2.2.7-1ubuntu2.10_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libcupsimage2:arm64 (2.2.7-1ubuntu2.10) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libijs-0.35:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../58-libijs-0.35_0.35-13_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libijs-0.35:arm64 (0.35-13) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libjbig2dec0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../59-libjbig2dec0_0.13-6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libjbig2dec0:arm64 (0.13-6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libpaper1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../60-libpaper1_1.1.24+nmu5ubuntu1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libpaper1:arm64 (1.1.24+nmu5ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgs9-common.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../61-libgs9-common_9.26~dfsg+0-0ubuntu0.18.04.18_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgs9-common (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgs9:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../62-libgs9_9.26~dfsg+0-0ubuntu0.18.04.18_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgs9:arm64 (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package ghostscript.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../63-ghostscript_9.26~dfsg+0-0ubuntu0.18.04.18_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking ghostscript (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package aglfn.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../64-aglfn_1.7-3_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking aglfn (1.7-3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package gnuplot-data.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../65-gnuplot-data_5.2.2+dfsg1-2ubuntu1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking gnuplot-data (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxpm4:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../66-libxpm4_1%3a3.5.12-1ubuntu0.18.04.2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxpm4:arm64 (1:3.5.12-1ubuntu0.18.04.2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgd3:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../67-libgd3_2.2.5-4ubuntu0.5_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgd3:arm64 (2.2.5-4ubuntu0.5) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package liblua5.3-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../68-liblua5.3-0_5.3.3-1ubuntu0.18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking liblua5.3-0:arm64 (5.3.3-1ubuntu0.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libqt5printsupport5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../69-libqt5printsupport5_5.9.5+dfsg-0ubuntu2.6_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libqt5printsupport5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwxbase3.0-0v5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../70-libwxbase3.0-0v5_3.0.4+dfsg-3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwxbase3.0-0v5:arm64 (3.0.4+dfsg-3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcb-glx0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../71-libxcb-glx0_1.13-2~ubuntu18.04_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcb-glx0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxdamage1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../72-libxdamage1_1%3a1.1.4-3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxdamage1:arm64 (1:1.1.4-3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxfixes3:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../73-libxfixes3_1%3a5.0.3-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxfixes3:arm64 (1:5.0.3-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdrm-amdgpu1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../74-libdrm-amdgpu1_2.4.101-2~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdrm-amdgpu1:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdrm-nouveau2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../75-libdrm-nouveau2_2.4.101-2~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdrm-nouveau2:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libdrm-radeon1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../76-libdrm-radeon1_2.4.101-2~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libdrm-radeon1:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libllvm10:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../77-libllvm10_1%3a10.0.0-4ubuntu1~18.04.2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libllvm10:arm64 (1:10.0.0-4ubuntu1~18.04.2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libsensors4:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../78-libsensors4_1%3a3.4.0-4ubuntu0.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libsensors4:arm64 (1:3.4.0-4ubuntu0.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgl1-mesa-dri:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../79-libgl1-mesa-dri_20.0.8-0ubuntu1~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgl1-mesa-dri:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libglx-mesa0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../80-libglx-mesa0_20.0.8-0ubuntu1~18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libglx-mesa0:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libglx0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../81-libglx0_1.0.0-2ubuntu2.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libglx0:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgl1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../82-libgl1_1.0.0-2ubuntu2.3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgl1:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgtk2.0-common.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../83-libgtk2.0-common_2.24.32-1ubuntu1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgtk2.0-common (2.24.32-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libatk1.0-data.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../84-libatk1.0-data_2.28.1-1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libatk1.0-data (2.28.1-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libatk1.0-0:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../85-libatk1.0-0_2.28.1-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libatk1.0-0:arm64 (2.28.1-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcomposite1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../86-libxcomposite1_1%3a0.4.4-2_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcomposite1:arm64 (1:0.4.4-2) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxcursor1:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../87-libxcursor1_1%3a1.1.15-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxcursor1:arm64 (1:1.1.15-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libxrandr2:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../88-libxrandr2_2%3a1.5.1-1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libxrandr2:arm64 (2:1.5.1-1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libgtk2.0-0:arm64.\r\nPreparing to unpack .../89-libgtk2.0-0_2.24.32-1ubuntu1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libgtk2.0-0:arm64 (2.24.32-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libnotify4:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../90-libnotify4_0.7.7-3ubuntu0.18.04.1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libnotify4:arm64 (0.7.7-3ubuntu0.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package libwxgtk3.0-0v5:arm64.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../91-libwxgtk3.0-0v5_3.0.4+dfsg-3_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking libwxgtk3.0-0v5:arm64 (3.0.4+dfsg-3) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package gnuplot-qt.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../92-gnuplot-qt_5.2.2+dfsg1-2ubuntu1_arm64.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking gnuplot-qt (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Selecting previously unselected package gnuplot.\r\n","phase":"building"} +data: {"message":"Preparing to unpack .../93-gnuplot_5.2.2+dfsg1-2ubuntu1_all.deb ...\r\n","phase":"building"} +data: {"message":"Unpacking gnuplot (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgs9-common (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Setting up libxi6:arm64 (2:1.7.9-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-xinerama0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libpaper1:arm64 (1.1.24+nmu5ubuntu1) ...\r\n","phase":"building"} +data: {"message":"\r\nCreating config file /etc/papersize with new version\r\n","phase":"building"} +data: {"message":"Setting up libxcb-present0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libglvnd0:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libnotify4:arm64 (0.7.7-3ubuntu0.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxinerama1:arm64 (2:1.1.3-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-dri2-0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-dri3-0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-render-util0:arm64 (0.3.9-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-glx0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-randr0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-xfixes0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-icccm4:arm64 (0.4.1-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgtk2.0-common (2.24.32-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libllvm10:arm64 (1:10.0.0-4ubuntu1~18.04.2) ...\r\n","phase":"building"} +data: {"message":"Setting up libwacom-common (0.29-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxdamage1:arm64 (1:1.1.4-3) ...\r\n","phase":"building"} +data: {"message":"Setting up libdouble-conversion1:arm64 (2.0.1-4ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxfixes3:arm64 (1:5.0.3-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libevdev2:arm64 (1.5.8+dfsg-1ubuntu0.2) ...\r\n","phase":"building"} +data: {"message":"Setting up poppler-data (0.4.8-2) ...\r\n","phase":"building"} +data: {"message":"Setting up libxshmfence1:arm64 (1.3-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libwayland-client0:arm64 (1.16.0-1ubuntu1.1~18.04.4) ...\r\n","phase":"building"} +data: {"message":"Setting up xkb-data (2.23.1-1ubuntu1.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libglapi-mesa:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-util1:arm64 (0.4.0-0ubuntu3) ...\r\n","phase":"building"} +data: {"message":"Setting up libwxbase3.0-0v5:arm64 (3.0.4+dfsg-3) ...\r\n","phase":"building"} +data: {"message":"Setting up libdrm-common (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-sync1:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libatk1.0-data (2.28.1-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libjbig2dec0:arm64 (0.13-6) ...\r\n","phase":"building"} +data: {"message":"Setting up libx11-xcb1:arm64 (2:1.6.4-3ubuntu0.4) ...\r\n","phase":"building"} +data: {"message":"Setting up gtk-update-icon-cache (3.22.30-1ubuntu4) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcursor1:arm64 (1:1.1.15-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libatk1.0-0:arm64 (2.28.1-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libmtdev1:arm64 (1.1.5-1ubuntu3) ...\r\n","phase":"building"} +data: {"message":"Setting up libijs-0.35:arm64 (0.35-13) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcomposite1:arm64 (1:0.4.4-2) ...\r\n","phase":"building"} +data: {"message":"Setting up libxpm4:arm64 (1:3.5.12-1ubuntu0.18.04.2) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-shape0:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libsensors4:arm64 (1:3.4.0-4ubuntu0.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgles2:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libxkbcommon0:arm64 (0.8.2-1~ubuntu18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgudev-1.0-0:arm64 (1:232-2) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-keysyms1:arm64 (0.4.0-1) ...\r\n","phase":"building"} +data: {"message":"Setting up aglfn (1.7-3) ...\r\n","phase":"building"} +data: {"message":"Setting up libxxf86vm1:arm64 (1:1.1.4-1) ...\r\n","phase":"building"} +data: {"message":"Setting up liblua5.3-0:arm64 (5.3.3-1ubuntu0.18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libidn11:arm64 (1.33-2.1ubuntu1.2) ...\r\n","phase":"building"} +data: {"message":"Setting up libxrandr2:arm64 (2:1.5.1-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libdbus-1-3:arm64 (1.12.2-1ubuntu1.4) ...\r\n","phase":"building"} +data: {"message":"Setting up libavahi-common-data:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libwayland-server0:arm64 (1.16.0-1ubuntu1.1~18.04.4) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-xkb1:arm64 (1.13-2~ubuntu18.04) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5core5a:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5dbus5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5network5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up libwacom2:arm64 (0.29-1) ...\r\n","phase":"building"} +data: {"message":"Setting up libxcb-image0:arm64 (0.4.0-1build1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgd3:arm64 (2.2.5-4ubuntu0.5) ...\r\n","phase":"building"} +data: {"message":"Setting up gnuplot-data (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libinput-bin (1.10.4-1ubuntu0.18.04.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libxkbcommon-x11-0:arm64 (0.8.2-1~ubuntu18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libdrm2:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libavahi-common3:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libdrm-radeon1:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libdrm-nouveau2:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libdrm-amdgpu1:arm64 (2.4.101-2~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgbm1:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libinput10:arm64 (1.10.4-1ubuntu0.18.04.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libgl1-mesa-dri:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libavahi-client3:arm64 (0.7-3.1ubuntu1.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libegl-mesa0:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libglx-mesa0:arm64 (20.0.8-0ubuntu1~18.04.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libcups2:arm64 (2.2.7-1ubuntu2.10) ...\r\n","phase":"building"} +data: {"message":"Setting up libcupsimage2:arm64 (2.2.7-1ubuntu2.10) ...\r\n","phase":"building"} +data: {"message":"Setting up libegl1:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5gui5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up libglx0:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Setting up libgs9:arm64 (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5widgets5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up ghostscript (9.26~dfsg+0-0ubuntu0.18.04.18) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5printsupport5:arm64 (5.9.5+dfsg-0ubuntu2.6) ...\r\n","phase":"building"} +data: {"message":"Setting up libqt5svg5:arm64 (5.9.5-0ubuntu1.1) ...\r\n","phase":"building"} +data: {"message":"Setting up libgl1:arm64 (1.0.0-2ubuntu2.3) ...\r\n","phase":"building"} +data: {"message":"Setting up adwaita-icon-theme (3.28.0-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"update-alternatives: using /usr/share/icons/Adwaita/cursor.theme to provide /usr/share/icons/default/index.theme (x-cursor-theme) in auto mode\r\n","phase":"building"} +data: {"message":"Setting up libgtk2.0-0:arm64 (2.24.32-1ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up libwxgtk3.0-0v5:arm64 (3.0.4+dfsg-3) ...\r\n","phase":"building"} +data: {"message":"Setting up humanity-icon-theme (0.6.15) ...\r\n","phase":"building"} +data: {"message":"Setting up ubuntu-mono (16.10+18.04.20181005-0ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Setting up gnuplot-qt (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"update-alternatives: using /usr/bin/gnuplot-qt to provide /usr/bin/gnuplot (gnuplot) in auto mode\r\n","phase":"building"} +data: {"message":"update-alternatives: warning: skip creation of /usr/share/man/man1/gnuplot.1.gz because associated file /usr/share/man/man1/gnuplot-qt.1.gz (of link group gnuplot) doesn't exist\r\n","phase":"building"} +data: {"message":"Setting up gnuplot (5.2.2+dfsg1-2ubuntu1) ...\r\n","phase":"building"} +data: {"message":"Processing triggers for libc-bin (2.27-3ubuntu1.6) ...\r\n","phase":"building"} +data: {"message":"Processing triggers for fontconfig (2.12.6-0ubuntu2) ...\r\n","phase":"building"} +data: {"message":"Removing intermediate container 63fe4c697783\n","phase":"building"} +data: {"message":" ---> eedb0f1fa21a\n","phase":"building"} +data: {"message":"Step 39/51 : USER ${NB_USER}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 2513587e3713\n","phase":"building"} +data: {"message":"Removing intermediate container 2513587e3713\n","phase":"building"} +data: {"message":" ---> c0bb1203c9bf\n","phase":"building"} +data: {"message":"Step 40/51 : RUN TIMEFORMAT='time: %3R' bash -c 'time ${MAMBA_EXE} env update -p ${NB_PYTHON_PREFIX} --file \"environment.yml\" && time ${MAMBA_EXE} clean --all -f -y && ${MAMBA_EXE} list -p ${NB_PYTHON_PREFIX} '","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 597c980456b5\n","phase":"building"} +data: {"message":"\n\nLooking for: ['octave_kernel', 'octave']\n\n\n","phase":"building"} +data: {"message":"Transaction\n\n Prefix: /srv/conda/envs/notebook\n\n Updating specs:\n\n - octave_kernel\n - octave\n\n\n","phase":"building"} +data: {"message":" Package Version Build Channel Size\n────────────────────────────────────────────────────────────────────────────────────────────────────────────\n Install:\n────────────────────────────────────────────────────────────────────────────────────────────────────────────\n\n + alsa-lib 1.2.10 h31becfc_0 conda-forge/linux-aarch64 584kB\n + arpack 3.7.0 hf862f49_2 conda-forge/linux-aarch64 193kB\n + atk-1.0 2.38.0 hf4e84e4_1 conda-forge/linux-aarch64 538kB\n + attr 2.5.1 h4e544f5_1 conda-forge/linux-aarch64 75kB\n + c-ares 1.19.1 h31becfc_0 conda-forge/linux-aarch64 117kB\n + cairo 1.16.0 hd7f43fd_1017 conda-forge/linux-aarch64 1MB\n + chrpath 0.16 hf897c2e_1002 conda-forge/linux-aarch64 29kB\n + colorama 0.4.6 pyhd8ed1ab_0 conda-forge/noarch 25kB\n + curl 8.3.0 h4e8248e_0 conda-forge/linux-aarch64 96kB\n + dbus 1.13.6 h12b9eeb_3 conda-forge/linux-aarch64 673kB\n + expat 2.5.0 hd600fc2_1 conda-forge/linux-aarch64 126kB\n + fftw 3.3.10 nompi_h2dcef8e_108 conda-forge/linux-aarch64 2MB\n + fltk 1.3.8 he871f2f_2 conda-forge/linux-aarch64 1MB\n + font-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge/noarch 397kB\n + font-ttf-inconsolata 3.000 h77eed37_0 conda-forge/noarch 97kB\n + font-ttf-source-code-pro 2.038 h77eed37_0 conda-forge/noarch 701kB\n + font-ttf-ubuntu 0.83 hab24e00_0 conda-forge/noarch 2MB\n + fontconfig 2.14.2 ha9a116f_0 conda-forge/linux-aarch64 280kB\n + fonts-conda-ecosystem 1 0 conda-forge/noarch 4kB\n + fonts-conda-forge 1 0 conda-forge/noarch 4kB\n + freetype 2.12.1 hf0a5ef3_2 conda-forge/linux-aarch64 642kB\n + fribidi 1.0.10 hb9de7d4_0 conda-forge/linux-aarch64 116kB\n + gdk-pixbuf 2.42.10 ha28a4fe_3 conda-forge/linux-aarch64 582kB\n + gettext 0.21.1 ha18d298_0 conda-forge/linux-aarch64 5MB\n + ghostscript 10.02.0 h2f0025b_0 conda-forge/linux-aarch64 64MB\n + giflib 5.2.1 hb4cce97_3 conda-forge/linux-aarch64 82kB\n + gl2ps 1.4.2 hdf53a3c_0 conda-forge/linux-aarch64 143kB\n + glib 2.78.0 hd84c7bf_0 conda-forge/linux-aarch64 501kB\n + glib-tools 2.78.0 hd84c7bf_0 conda-forge/linux-aarch64 122kB\n + glpk 5.0 h66325d0_0 conda-forge/linux-aarch64 1MB\n + gmp 6.2.1 h7fd3ca4_0 conda-forge/linux-aarch64 755kB\n + gnuplot 5.4.8 h1fafa18_0 conda-forge/linux-aarch64 1MB\n + graphicsmagick 1.3.40 h8d545bc_3 conda-forge/linux-aarch64 4MB\n + graphite2 1.3.13 h7fd3ca4_1001 conda-forge/linux-aarch64 107kB\n + gst-plugins-base 1.22.6 h6d82d15_2 conda-forge/linux-aarch64 3MB\n + gstreamer 1.22.6 hed71854_2 conda-forge/linux-aarch64 2MB\n + gtk2 2.24.33 h49e3f37_2 conda-forge/linux-aarch64 8MB\n + harfbuzz 8.2.1 hebeb849_0 conda-forge/linux-aarch64 2MB\n + hdf5 1.14.2 nompi_ha486f32_100 conda-forge/linux-aarch64 4MB\n + ipyparallel 8.6.1 pyhd8ed1ab_0 conda-forge/noarch 208kB\n + keyutils 1.6.1 h4e544f5_0 conda-forge/linux-aarch64 112kB\n + krb5 1.21.2 hc419048_0 conda-forge/linux-aarch64 1MB\n + lame 3.100 h4e544f5_1003 conda-forge/linux-aarch64 605kB\n + lerc 4.0.0 h4de3ea5_0 conda-forge/linux-aarch64 262kB\n + libaec 1.1.2 h2f0025b_1 conda-forge/linux-aarch64 35kB\n + libblas 3.9.0 17_linuxaarch64_openblas conda-forge/linux-aarch64 15kB\n + libcap 2.69 h883460d_0 conda-forge/linux-aarch64 103kB\n + libcblas 3.9.0 17_linuxaarch64_openblas conda-forge/linux-aarch64 14kB\n + libclang 15.0.7 default_hdf9a116_3 conda-forge/linux-aarch64 133kB\n + libclang13 15.0.7 default_hc086480_3 conda-forge/linux-aarch64 9MB\n + libcups 2.3.3 h405e4a8_4 conda-forge/linux-aarch64 5MB\n + libcurl 8.3.0 h4e8248e_0 conda-forge/linux-aarch64 397kB\n + libdeflate 1.19 h31becfc_0 conda-forge/linux-aarch64 68kB\n + libedit 3.1.20191231 he28a2e2_2 conda-forge/linux-aarch64 134kB\n + libev 4.33 h516909a_1 conda-forge/linux-aarch64 106kB\n + libevent 2.1.12 h4ba1bb4_1 conda-forge/linux-aarch64 439kB\n + libexpat 2.5.0 hd600fc2_1 conda-forge/linux-aarch64 77kB\n + libflac 1.4.3 h2f0025b_0 conda-forge/linux-aarch64 372kB\n + libgcrypt 1.10.1 h4e544f5_0 conda-forge/linux-aarch64 701kB\n + libgd 2.3.3 h71b7332_8 conda-forge/linux-aarch64 228kB\n + libgfortran-ng 13.2.0 he9431aa_0 conda-forge/linux-aarch64 23kB\n + libgfortran5 13.2.0 h582850c_0 conda-forge/linux-aarch64 1MB\n + libglib 2.78.0 h0464669_0 conda-forge/linux-aarch64 3MB\n + libglu 9.0.0 hf4b6fbe_1003 conda-forge/linux-aarch64 318kB\n + libgpg-error 1.47 h5ce24db_0 conda-forge/linux-aarch64 273kB\n + libhwloc 2.9.3 default_hda148da_1009 conda-forge/linux-aarch64 3MB\n + libiconv 1.17 h9cdd2b7_0 conda-forge/linux-aarch64 1MB\n + libjpeg-turbo 2.1.5.1 h31becfc_1 conda-forge/linux-aarch64 509kB\n + liblapack 3.9.0 17_linuxaarch64_openblas conda-forge/linux-aarch64 15kB\n + liblapacke 3.9.0 17_linuxaarch64_openblas conda-forge/linux-aarch64 15kB\n + libllvm15 15.0.7 hc720cd8_3 conda-forge/linux-aarch64 33MB\n + libnghttp2 1.52.0 h250e5c5_0 conda-forge/linux-aarch64 673kB\n + libogg 1.3.4 h3557bc0_1 conda-forge/linux-aarch64 214kB\n + libopenblas 0.3.23 pthreads_hd703e6f_0 conda-forge/linux-aarch64 4MB\n + libopus 1.3.1 hf897c2e_1 conda-forge/linux-aarch64 329kB\n + libpng 1.6.39 hf9034f9_0 conda-forge/linux-aarch64 299kB\n + libpq 15.4 h04b8c23_2 conda-forge/linux-aarch64 2MB\n + libsndfile 1.2.2 h79657aa_1 conda-forge/linux-aarch64 397kB\n + libssh2 1.11.0 h492db2e_0 conda-forge/linux-aarch64 284kB\n + libsystemd0 254 h91e93f8_0 conda-forge/linux-aarch64 421kB\n + libtiff 4.6.0 hffba272_1 conda-forge/linux-aarch64 308kB\n + libvorbis 1.3.7 h01db608_0 conda-forge/linux-aarch64 292kB\n + libwebp 1.3.2 h850206a_0 conda-forge/linux-aarch64 95kB\n + libwebp-base 1.3.2 h31becfc_0 conda-forge/linux-aarch64 363kB\n + libxcb 1.15 h2a766a3_0 conda-forge/linux-aarch64 389kB\n + libxkbcommon 1.6.0 h307e02a_0 conda-forge/linux-aarch64 578kB\n + libxml2 2.11.5 h3091e33_1 conda-forge/linux-aarch64 748kB\n + lz4-c 1.9.4 hd600fc2_0 conda-forge/linux-aarch64 164kB\n + metakernel 0.30.1 pyhd8ed1ab_0 conda-forge/noarch 187kB\n + metis 5.1.0 h2f0025b_1007 conda-forge/linux-aarch64 4MB\n + mpfr 4.2.0 h96f194b_0 conda-forge/linux-aarch64 420kB\n + mpg123 1.32.3 h2f0025b_0 conda-forge/linux-aarch64 561kB\n + mysql-common 8.0.33 hb6794ad_5 conda-forge/linux-aarch64 760kB\n + mysql-libs 8.0.33 hf629957_5 conda-forge/linux-aarch64 2MB\n + nspr 4.35 h4de3ea5_0 conda-forge/linux-aarch64 233kB\n + nss 3.94 hc5a5cc2_0 conda-forge/linux-aarch64 2MB\n + octave 8.3.0 hcc7940c_1 conda-forge/linux-aarch64 20MB\n + octave_kernel 0.35.1 pyhd8ed1ab_0 conda-forge/noarch 29kB\n + pango 1.50.14 h11ef544_2 conda-forge/linux-aarch64 454kB\n + pcre 8.45 h01db608_0 conda-forge/linux-aarch64 250kB\n + pcre2 10.40 he7b27c6_0 conda-forge/linux-aarch64 2MB\n + perl 5.32.1 4_h31becfc_perl5 conda-forge/linux-aarch64 13MB\n + pixman 0.42.2 h2f0025b_0 conda-forge/linux-aarch64 293kB\n + ply 3.11 py_1 conda-forge/noarch 45kB\n + portalocker 2.8.2 py310hbbe02a8_1 conda-forge/linux-aarch64 36kB\n + portaudio 19.6.0 h5c6c0ed_9 conda-forge/linux-aarch64 118kB\n + pthread-stubs 0.4 hb9de7d4_1001 conda-forge/linux-aarch64 6kB\n + pulseaudio-client 16.1 h729494f_5 conda-forge/linux-aarch64 758kB\n + pyqt 5.15.9 py310h948ff9b_5 conda-forge/linux-aarch64 5MB\n + pyqt5-sip 12.12.2 py310hbb3657e_5 conda-forge/linux-aarch64 89kB\n + qhull 2020.2 hd62202e_2 conda-forge/linux-aarch64 2MB\n + qscintilla2 2.14.1 py310h752ed23_0 conda-forge/linux-aarch64 2MB\n + qt-main 5.15.8 h8e8b9a1_16 conda-forge/linux-aarch64 60MB\n + sip 6.7.11 py310h0d1d2ea_1 conda-forge/linux-aarch64 489kB\n + suitesparse 5.10.1 h1404dd6_1 conda-forge/linux-aarch64 2MB\n + sundials 6.6.1 haeb97ba_0 conda-forge/linux-aarch64 896kB\n + tbb 2021.10.0 h2a328a1_1 conda-forge/linux-aarch64 155kB\n + texinfo 7.0 pl5321h17f021e_0 conda-forge/linux-aarch64 2MB\n + toml 0.10.2 pyhd8ed1ab_0 conda-forge/noarch 18kB\n + tqdm 4.66.1 pyhd8ed1ab_0 conda-forge/noarch 89kB\n + xcb-util 0.4.0 h31becfc_1 conda-forge/linux-aarch64 21kB\n + xcb-util-image 0.4.0 hcb25cf1_1 conda-forge/linux-aarch64 25kB\n + xcb-util-keysyms 0.4.0 hcb25cf1_1 conda-forge/linux-aarch64 14kB\n + xcb-util-renderutil 0.3.9 h31becfc_1 conda-forge/linux-aarch64 18kB\n + xcb-util-wm 0.4.1 hcb25cf1_1 conda-forge/linux-aarch64 50kB\n + xkeyboard-config 2.40 h31becfc_0 conda-forge/linux-aarch64 889kB\n + xorg-fixesproto 5.0 h3557bc0_1002 conda-forge/linux-aarch64 9kB\n + xorg-kbproto 1.0.7 h3557bc0_1002 conda-forge/linux-aarch64 27kB\n + xorg-libice 1.1.1 h7935292_0 conda-forge/linux-aarch64 60kB\n + xorg-libsm 1.2.4 h5a01bc2_0 conda-forge/linux-aarch64 29kB\n + xorg-libx11 1.8.6 h055a233_0 conda-forge/linux-aarch64 850kB\n + xorg-libxau 1.0.11 h31becfc_0 conda-forge/linux-aarch64 15kB\n + xorg-libxdmcp 1.1.3 h3557bc0_0 conda-forge/linux-aarch64 20kB\n + xorg-libxext 1.3.4 h2a766a3_2 conda-forge/linux-aarch64 51kB\n + xorg-libxfixes 5.0.3 h3557bc0_1004 conda-forge/linux-aarch64 19kB\n + xorg-libxrender 0.9.11 h7935292_0 conda-forge/linux-aarch64 37kB\n + xorg-libxt 1.3.0 h7935292_1 conda-forge/linux-aarch64 384kB\n + xorg-renderproto 0.11.1 h3557bc0_1002 conda-forge/linux-aarch64 10kB\n + xorg-xextproto 7.3.0 h2a766a3_1003 conda-forge/linux-aarch64 30kB\n + xorg-xf86vidmodeproto 2.3.1 hf897c2e_1002 conda-forge/linux-aarch64 24kB\n + xorg-xproto 7.0.31 h3557bc0_1007 conda-forge/linux-aarch64 75kB\n + zstd 1.5.5 h4c53e97_0 conda-forge/linux-aarch64 529kB\n\n Upgrade:\n────────────────────────────────────────────────────────────────────────────────────────────────────────────\n\n - icu 72.1 hcf00150_0 conda-forge \n + icu 73.2 h787c7f5_0 conda-forge/linux-aarch64 12MB\n - libsqlite 3.42.0 h194ca79_0 conda-forge \n + libsqlite 3.43.0 h194ca79_0 conda-forge/linux-aarch64 1MB\n - nodejs 18.15.0 hcab9400_1 conda-forge \n + nodejs 20.5.1 hc1f8a26_1 conda-forge/linux-aarch64 17MB\n - openssl 3.1.1 h31becfc_1 conda-forge \n + openssl 3.1.3 h31becfc_0 conda-forge/linux-aarch64 3MB\n\n Summary:\n\n Install: 142 packages\n Upgrade: 4 packages\n\n Total download: 338MB\n\n────────────────────────────────────────────────────────────────────────────────────────────────────────────\n\n\n","phase":"building"} +data: {"message":"\nDownloading and Extracting Packages\n\r\nPreparing transaction: ...working... ","phase":"building"} +data: {"message":"done\n","phase":"building"} +data: {"message":"Verifying transaction: ...working... ","phase":"building"} +data: {"message":"done\n","phase":"building"} +data: {"message":"Executing transaction: ...working... ","phase":"building"} +data: {"message":"\ndone\n","phase":"building"} +data: {"message":"#\n# To activate this environment, use\n#\n# $ conda activate /srv/conda/envs/notebook\n#\n# To deactivate an active environment, use\n#\n# $ conda deactivate\n\n","phase":"building"} +data: {"message":"\u001b[91mtime: 34.494\n\u001b[0m","phase":"building"} +data: {"message":"Will remove 1 package cache(s).\n","phase":"building"} +data: {"message":"\u001b[91mtime: 0.628\n\u001b[0m","phase":"building"} +data: {"message":"# packages in environment at /srv/conda/envs/notebook:\n#\n# Name Version Build Channel\n_openmp_mutex 4.5 2_gnu conda-forge\naiofiles 22.1.0 pyhd8ed1ab_0 conda-forge\naiosqlite 0.19.0 pyhd8ed1ab_0 conda-forge\nalembic 1.11.1 pyhd8ed1ab_0 conda-forge\nalsa-lib 1.2.10 h31becfc_0 conda-forge\nanyio 3.7.0 pyhd8ed1ab_1 conda-forge\nargon2-cffi 21.3.0 pyhd8ed1ab_0 conda-forge\nargon2-cffi-bindings 21.2.0 py310h761cc84_3 conda-forge\narpack 3.7.0 hf862f49_2 conda-forge\nasttokens 2.2.1 pyhd8ed1ab_0 conda-forge\nasync_generator 1.10 py_0 conda-forge\natk-1.0 2.38.0 hf4e84e4_1 conda-forge\nattr 2.5.1 h4e544f5_1 conda-forge\nattrs 23.1.0 pyh71513ae_1 conda-forge\nbabel 2.12.1 pyhd8ed1ab_1 conda-forge\nbackcall 0.2.0 pyh9f0ad1d_0 conda-forge\nbackports 1.0 pyhd8ed1ab_3 conda-forge\nbackports.functools_lru_cache 1.6.4 pyhd8ed1ab_0 conda-forge\nbeautifulsoup4 4.12.2 pyha770c72_0 conda-forge\nbleach 6.0.0 pyhd8ed1ab_0 conda-forge\nblinker 1.6.2 pyhd8ed1ab_0 conda-forge\nbrotli 1.0.9 h4e544f5_8 conda-forge\nbrotli-bin 1.0.9 h4e544f5_8 conda-forge\nbzip2 1.0.8 hf897c2e_4 conda-forge\nc-ares 1.19.1 h31becfc_0 conda-forge\nca-certificates 2023.5.7 hcefe29a_0 conda-forge\ncairo 1.16.0 hd7f43fd_1017 conda-forge\ncertifi 2023.5.7 pyhd8ed1ab_0 conda-forge\ncertipy 0.1.3 py_0 conda-forge\ncffi 1.15.1 py310hf0c4615_3 conda-forge\ncharset-normalizer 3.1.0 pyhd8ed1ab_0 conda-forge\nchrpath 0.16 hf897c2e_1002 conda-forge\ncolorama 0.4.6 pyhd8ed1ab_0 conda-forge\ncomm 0.1.3 pyhd8ed1ab_0 conda-forge\ncryptography 41.0.1 py310h34e2850_0 conda-forge\ncurl 8.3.0 h4e8248e_0 conda-forge\ndbus 1.13.6 h12b9eeb_3 conda-forge\ndebugpy 1.6.7 py310hbc44c02_0 conda-forge\ndecorator 5.1.1 pyhd8ed1ab_0 conda-forge\ndefusedxml 0.7.1 pyhd8ed1ab_0 conda-forge\nentrypoints 0.4 pyhd8ed1ab_0 conda-forge\nexceptiongroup 1.1.1 pyhd8ed1ab_0 conda-forge\nexecuting 1.2.0 pyhd8ed1ab_0 conda-forge\nexpat 2.5.0 hd600fc2_1 conda-forge\nfftw 3.3.10 nompi_h2dcef8e_108 conda-forge\nflit-core 3.9.0 pyhd8ed1ab_0 conda-forge\nfltk 1.3.8 he871f2f_2 conda-forge\nfont-ttf-dejavu-sans-mono 2.37 hab24e00_0 conda-forge\nfont-ttf-inconsolata 3.000 h77eed37_0 conda-forge\nfont-ttf-source-code-pro 2.038 h77eed37_0 conda-forge\nfont-ttf-ubuntu 0.83 hab24e00_0 conda-forge\nfontconfig 2.14.2 ha9a116f_0 conda-forge\nfonts-conda-ecosystem 1 0 conda-forge\nfonts-conda-forge 1 0 conda-forge\nfreetype 2.12.1 hf0a5ef3_2 conda-forge\nfribidi 1.0.10 hb9de7d4_0 conda-forge\ngdk-pixbuf 2.42.10 ha28a4fe_3 conda-forge\ngettext 0.21.1 ha18d298_0 conda-forge\nghostscript 10.02.0 h2f0025b_0 conda-forge\ngiflib 5.2.1 hb4cce97_3 conda-forge\ngl2ps 1.4.2 hdf53a3c_0 conda-forge\nglib 2.78.0 hd84c7bf_0 conda-forge\nglib-tools 2.78.0 hd84c7bf_0 conda-forge\nglpk 5.0 h66325d0_0 conda-forge\ngmp 6.2.1 h7fd3ca4_0 conda-forge\ngnuplot 5.4.8 h1fafa18_0 conda-forge\ngraphicsmagick 1.3.40 h8d545bc_3 conda-forge\ngraphite2 1.3.13 h7fd3ca4_1001 conda-forge\ngreenlet 2.0.2 py310hbb3657e_1 conda-forge\ngst-plugins-base 1.22.6 h6d82d15_2 conda-forge\ngstreamer 1.22.6 hed71854_2 conda-forge\ngtk2 2.24.33 h49e3f37_2 conda-forge\nharfbuzz 8.2.1 hebeb849_0 conda-forge\nhdf5 1.14.2 nompi_ha486f32_100 conda-forge\nicu 73.2 h787c7f5_0 conda-forge\nidna 3.4 pyhd8ed1ab_0 conda-forge\nimportlib-metadata 6.6.0 pyha770c72_0 conda-forge\nimportlib_metadata 6.6.0 hd8ed1ab_0 conda-forge\nimportlib_resources 5.12.0 pyhd8ed1ab_0 conda-forge\nipykernel 6.23.1 pyh210e3f2_0 conda-forge\nipyparallel 8.6.1 pyhd8ed1ab_0 conda-forge\nipython 8.14.0 pyh41d4057_0 conda-forge\nipython_genutils 0.2.0 py_1 conda-forge\nipywidgets 8.0.6 pyhd8ed1ab_0 conda-forge\njedi 0.18.2 pyhd8ed1ab_0 conda-forge\njinja2 3.1.2 pyhd8ed1ab_1 conda-forge\njson5 0.9.5 pyh9f0ad1d_0 conda-forge\njsonschema 4.17.3 pyhd8ed1ab_0 conda-forge\njupyter-offlinenotebook 0.2.2 pyh1d7be83_0 conda-forge\njupyter-resource-usage 0.7.1 pyhd8ed1ab_0 conda-forge\njupyter_client 8.2.0 pyhd8ed1ab_0 conda-forge\njupyter_core 5.3.0 py310h4c7bcd0_0 conda-forge\njupyter_events 0.6.3 pyhd8ed1ab_0 conda-forge\njupyter_server 1.23.6 pyhd8ed1ab_0 conda-forge\njupyter_server_fileid 0.9.0 pyhd8ed1ab_0 conda-forge\njupyter_server_ydoc 0.8.0 pyhd8ed1ab_0 conda-forge\njupyter_telemetry 0.1.0 pyhd8ed1ab_1 conda-forge\njupyter_ydoc 0.2.4 pyhd8ed1ab_0 conda-forge\njupyterhub-base 3.1.1 pyh2a2186d_0 conda-forge\njupyterhub-singleuser 3.1.1 pyh2a2186d_0 conda-forge\njupyterlab 3.6.4 pyhd8ed1ab_0 conda-forge\njupyterlab_pygments 0.2.2 pyhd8ed1ab_0 conda-forge\njupyterlab_server 2.22.1 pyhd8ed1ab_0 conda-forge\njupyterlab_widgets 3.0.7 pyhd8ed1ab_1 conda-forge\nkeyutils 1.6.1 h4e544f5_0 conda-forge\nkrb5 1.21.2 hc419048_0 conda-forge\nlame 3.100 h4e544f5_1003 conda-forge\nld_impl_linux-aarch64 2.40 h2d8c526_0 conda-forge\nlerc 4.0.0 h4de3ea5_0 conda-forge\nlibaec 1.1.2 h2f0025b_1 conda-forge\nlibblas 3.9.0 17_linuxaarch64_openblas conda-forge\nlibbrotlicommon 1.0.9 h4e544f5_8 conda-forge\nlibbrotlidec 1.0.9 h4e544f5_8 conda-forge\nlibbrotlienc 1.0.9 h4e544f5_8 conda-forge\nlibcap 2.69 h883460d_0 conda-forge\nlibcblas 3.9.0 17_linuxaarch64_openblas conda-forge\nlibclang 15.0.7 default_hdf9a116_3 conda-forge\nlibclang13 15.0.7 default_hc086480_3 conda-forge\nlibcups 2.3.3 h405e4a8_4 conda-forge\nlibcurl 8.3.0 h4e8248e_0 conda-forge\nlibdeflate 1.19 h31becfc_0 conda-forge\nlibedit 3.1.20191231 he28a2e2_2 conda-forge\nlibev 4.33 h516909a_1 conda-forge\nlibevent 2.1.12 h4ba1bb4_1 conda-forge\nlibexpat 2.5.0 hd600fc2_1 conda-forge\nlibffi 3.4.2 h3557bc0_5 conda-forge\nlibflac 1.4.3 h2f0025b_0 conda-forge\nlibgcc-ng 13.1.0 h2b4548d_0 conda-forge\nlibgcrypt 1.10.1 h4e544f5_0 conda-forge\nlibgd 2.3.3 h71b7332_8 conda-forge\nlibgfortran-ng 13.2.0 he9431aa_0 conda-forge\nlibgfortran5 13.2.0 h582850c_0 conda-forge\nlibglib 2.78.0 h0464669_0 conda-forge\nlibglu 9.0.0 hf4b6fbe_1003 conda-forge\nlibgomp 13.1.0 h2b4548d_0 conda-forge\nlibgpg-error 1.47 h5ce24db_0 conda-forge\nlibhwloc 2.9.3 default_hda148da_1009 conda-forge\nlibiconv 1.17 h9cdd2b7_0 conda-forge\nlibjpeg-turbo 2.1.5.1 h31becfc_1 conda-forge\nliblapack 3.9.0 17_linuxaarch64_openblas conda-forge\nliblapacke 3.9.0 17_linuxaarch64_openblas conda-forge\nlibllvm15 15.0.7 hc720cd8_3 conda-forge\nlibnghttp2 1.52.0 h250e5c5_0 conda-forge\nlibnsl 2.0.0 hf897c2e_0 conda-forge\nlibogg 1.3.4 h3557bc0_1 conda-forge\nlibopenblas 0.3.23 pthreads_hd703e6f_0 conda-forge\nlibopus 1.3.1 hf897c2e_1 conda-forge\nlibpng 1.6.39 hf9034f9_0 conda-forge\nlibpq 15.4 h04b8c23_2 conda-forge\nlibsndfile 1.2.2 h79657aa_1 conda-forge\nlibsodium 1.0.18 hb9de7d4_1 conda-forge\nlibsqlite 3.43.0 h194ca79_0 conda-forge\nlibssh2 1.11.0 h492db2e_0 conda-forge\nlibstdcxx-ng 13.1.0 h452befe_0 conda-forge\nlibsystemd0 254 h91e93f8_0 conda-forge\nlibtiff 4.6.0 hffba272_1 conda-forge\nlibuuid 2.38.1 hb4cce97_0 conda-forge\nlibuv 1.44.2 h4e544f5_0 conda-forge\nlibvorbis 1.3.7 h01db608_0 conda-forge\nlibwebp 1.3.2 h850206a_0 conda-forge\nlibwebp-base 1.3.2 h31becfc_0 conda-forge\nlibxcb 1.15 h2a766a3_0 conda-forge\nlibxkbcommon 1.6.0 h307e02a_0 conda-forge\nlibxml2 2.11.5 h3091e33_1 conda-forge\nlibzlib 1.2.13 h4e544f5_4 conda-forge\nlz4-c 1.9.4 hd600fc2_0 conda-forge\nmako 1.2.4 pyhd8ed1ab_0 conda-forge\nmarkupsafe 2.1.3 py310h7c1f4a2_0 conda-forge\nmatplotlib-inline 0.1.6 pyhd8ed1ab_0 conda-forge\nmetakernel 0.30.1 pyhd8ed1ab_0 conda-forge\nmetis 5.1.0 h2f0025b_1007 conda-forge\nmistune 2.0.5 pyhd8ed1ab_0 conda-forge\nmpfr 4.2.0 h96f194b_0 conda-forge\nmpg123 1.32.3 h2f0025b_0 conda-forge\nmysql-common 8.0.33 hb6794ad_5 conda-forge\nmysql-libs 8.0.33 hf629957_5 conda-forge\nnbclassic 1.0.0 pyhb4ecaf3_1 conda-forge\nnbclient 0.8.0 pyhd8ed1ab_0 conda-forge\nnbconvert 7.4.0 pyhd8ed1ab_0 conda-forge\nnbconvert-core 7.4.0 pyhd8ed1ab_0 conda-forge\nnbconvert-pandoc 7.4.0 pyhd8ed1ab_0 conda-forge\nnbformat 5.9.0 pyhd8ed1ab_0 conda-forge\nncurses 6.4 h2e1726e_0 conda-forge\nnest-asyncio 1.5.6 pyhd8ed1ab_0 conda-forge\nnodejs 20.5.1 hc1f8a26_1 conda-forge\nnotebook 6.5.4 pyha770c72_0 conda-forge\nnotebook-shim 0.2.3 pyhd8ed1ab_0 conda-forge\nnspr 4.35 h4de3ea5_0 conda-forge\nnss 3.94 hc5a5cc2_0 conda-forge\noauthlib 3.2.2 pyhd8ed1ab_0 conda-forge\noctave 8.3.0 hcc7940c_1 conda-forge\noctave_kernel 0.35.1 pyhd8ed1ab_0 conda-forge\nopenssl 3.1.3 h31becfc_0 conda-forge\npackaging 23.1 pyhd8ed1ab_0 conda-forge\npamela 1.0.0 py_0 conda-forge\npandoc 2.19.2 h8af1aa0_2 conda-forge\npandocfilters 1.5.0 pyhd8ed1ab_0 conda-forge\npango 1.50.14 h11ef544_2 conda-forge\nparso 0.8.3 pyhd8ed1ab_0 conda-forge\npcre 8.45 h01db608_0 conda-forge\npcre2 10.40 he7b27c6_0 conda-forge\nperl 5.32.1 4_h31becfc_perl5 conda-forge\npexpect 4.8.0 pyh1a96a4e_2 conda-forge\npickleshare 0.7.5 py_1003 conda-forge\npip 23.1.2 pyhd8ed1ab_0 conda-forge\npixman 0.42.2 h2f0025b_0 conda-forge\npkgutil-resolve-name 1.3.10 pyhd8ed1ab_0 conda-forge\nplatformdirs 3.5.1 pyhd8ed1ab_0 conda-forge\nply 3.11 py_1 conda-forge\nportalocker 2.8.2 py310hbbe02a8_1 conda-forge\nportaudio 19.6.0 h5c6c0ed_9 conda-forge\nprometheus_client 0.17.0 pyhd8ed1ab_0 conda-forge\nprompt-toolkit 3.0.38 pyha770c72_0 conda-forge\nprompt_toolkit 3.0.38 hd8ed1ab_0 conda-forge\npsutil 5.9.5 py310hb89b984_0 conda-forge\npthread-stubs 0.4 hb9de7d4_1001 conda-forge\nptyprocess 0.7.0 pyhd3deb0d_0 conda-forge\npulseaudio-client 16.1 h729494f_5 conda-forge\npure_eval 0.2.2 pyhd8ed1ab_0 conda-forge\npycparser 2.21 pyhd8ed1ab_0 conda-forge\npygments 2.15.1 pyhd8ed1ab_0 conda-forge\npyjwt 2.7.0 pyhd8ed1ab_0 conda-forge\npyopenssl 23.2.0 pyhd8ed1ab_1 conda-forge\npyqt 5.15.9 py310h948ff9b_5 conda-forge\npyqt5-sip 12.12.2 py310hbb3657e_5 conda-forge\npyrsistent 0.19.3 py310h734f5e8_0 conda-forge\npysocks 1.7.1 pyha2e5f31_6 conda-forge\npython 3.10.11 ha43d526_0_cpython conda-forge\npython-dateutil 2.8.2 pyhd8ed1ab_0 conda-forge\npython-fastjsonschema 2.17.1 pyhd8ed1ab_0 conda-forge\npython-json-logger 2.0.7 pyhd8ed1ab_0 conda-forge\npython_abi 3.10 3_cp310 conda-forge\npytz 2023.3 pyhd8ed1ab_0 conda-forge\npyyaml 6.0 py310h761cc84_5 conda-forge\npyzmq 25.1.0 py310hdaec954_0 conda-forge\nqhull 2020.2 hd62202e_2 conda-forge\nqscintilla2 2.14.1 py310h752ed23_0 conda-forge\nqt-main 5.15.8 h8e8b9a1_16 conda-forge\nreadline 8.2 h8fc344f_1 conda-forge\nrequests 2.31.0 pyhd8ed1ab_0 conda-forge\nrfc3339-validator 0.1.4 pyhd8ed1ab_0 conda-forge\nrfc3986-validator 0.1.1 pyh9f0ad1d_0 conda-forge\nruamel.yaml 0.17.31 py310hb299538_0 conda-forge\nruamel.yaml.clib 0.2.7 py310hb89b984_1 conda-forge\nsend2trash 1.8.2 pyh41d4057_0 conda-forge\nsetuptools 67.7.2 pyhd8ed1ab_0 conda-forge\nsip 6.7.11 py310h0d1d2ea_1 conda-forge\nsix 1.16.0 pyh6c4a22f_0 conda-forge\nsniffio 1.3.0 pyhd8ed1ab_0 conda-forge\nsoupsieve 2.3.2.post1 pyhd8ed1ab_0 conda-forge\nsqlalchemy 2.0.15 py310h7c1f4a2_0 conda-forge\nstack_data 0.6.2 pyhd8ed1ab_0 conda-forge\nsuitesparse 5.10.1 h1404dd6_1 conda-forge\nsundials 6.6.1 haeb97ba_0 conda-forge\ntbb 2021.10.0 h2a328a1_1 conda-forge\nterminado 0.17.1 pyh41d4057_0 conda-forge\ntexinfo 7.0 pl5321h17f021e_0 conda-forge\ntinycss2 1.2.1 pyhd8ed1ab_0 conda-forge\ntk 8.6.12 hd8af866_0 conda-forge\ntoml 0.10.2 pyhd8ed1ab_0 conda-forge\ntomli 2.0.1 pyhd8ed1ab_0 conda-forge\ntornado 6.3.2 py310h7c1f4a2_0 conda-forge\ntqdm 4.66.1 pyhd8ed1ab_0 conda-forge\ntraitlets 5.9.0 pyhd8ed1ab_0 conda-forge\ntyping-extensions 4.6.3 hd8ed1ab_0 conda-forge\ntyping_extensions 4.6.3 pyha770c72_0 conda-forge\ntzdata 2023c h71feb2d_0 conda-forge\nurllib3 2.0.3 pyhd8ed1ab_0 conda-forge\nwcwidth 0.2.6 pyhd8ed1ab_0 conda-forge\nwebencodings 0.5.1 py_1 conda-forge\nwebsocket-client 1.5.2 pyhd8ed1ab_0 conda-forge\nwheel 0.40.0 pyhd8ed1ab_0 conda-forge\nwidgetsnbextension 4.0.7 pyhd8ed1ab_0 conda-forge\nxcb-util 0.4.0 h31becfc_1 conda-forge\nxcb-util-image 0.4.0 hcb25cf1_1 conda-forge\nxcb-util-keysyms 0.4.0 hcb25cf1_1 conda-forge\nxcb-util-renderutil 0.3.9 h31becfc_1 conda-forge\nxcb-util-wm 0.4.1 hcb25cf1_1 conda-forge\nxkeyboard-config 2.40 h31becfc_0 conda-forge\nxorg-fixesproto 5.0 h3557bc0_1002 conda-forge\nxorg-kbproto 1.0.7 h3557bc0_1002 conda-forge\nxorg-libice 1.1.1 h7935292_0 conda-forge\nxorg-libsm 1.2.4 h5a01bc2_0 conda-forge\nxorg-libx11 1.8.6 h055a233_0 conda-forge\nxorg-libxau 1.0.11 h31becfc_0 conda-forge\nxorg-libxdmcp 1.1.3 h3557bc0_0 conda-forge\nxorg-libxext 1.3.4 h2a766a3_2 conda-forge\nxorg-libxfixes 5.0.3 h3557bc0_1004 conda-forge\nxorg-libxrender 0.9.11 h7935292_0 conda-forge\nxorg-libxt 1.3.0 h7935292_1 conda-forge\nxorg-renderproto 0.11.1 h3557bc0_1002 conda-forge\nxorg-xextproto 7.3.0 h2a766a3_1003 conda-forge\nxorg-xf86vidmodeproto 2.3.1 hf897c2e_1002 conda-forge\nxorg-xproto 7.0.31 h3557bc0_1007 conda-forge\nxz 5.2.6 h9cdd2b7_0 conda-forge\ny-py 0.5.9 py310hf87a4cc_0 conda-forge\nyaml 0.2.5 hf897c2e_2 conda-forge\nypy-websocket 0.8.2 pyhd8ed1ab_0 conda-forge\nzeromq 4.3.4 h01db608_1 conda-forge\nzipp 3.15.0 pyhd8ed1ab_0 conda-forge\nzlib 1.2.13 h4e544f5_4 conda-forge\nzstd 1.5.5 h4c53e97_0 conda-forge\n","phase":"building"} +data: {"message":"Removing intermediate container 597c980456b5\n","phase":"building"} +data: {"message":" ---> e11e9c0da4f5\n","phase":"building"} +data: {"message":"Step 41/51 : USER root","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 7903472f1a31\n","phase":"building"} +data: {"message":"Removing intermediate container 7903472f1a31\n","phase":"building"} +data: {"message":" ---> 70bb5cdbc848\n","phase":"building"} +data: {"message":"Step 42/51 : COPY --chown=1000:1000 src/ ${REPO_DIR}/","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> 709dd0afcbc6\n","phase":"building"} +data: {"message":"Step 43/51 : LABEL repo2docker.ref=\"1479e0252b2e648bb755ee913292b79495931717\"","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in d37b1731f87c\n","phase":"building"} +data: {"message":"Removing intermediate container d37b1731f87c\n","phase":"building"} +data: {"message":" ---> 9d2c4a904a66\n","phase":"building"} +data: {"message":"Step 44/51 : LABEL repo2docker.repo=\"https://github.com/binder-examples/octave\"","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 1920e64534fb\n","phase":"building"} +data: {"message":"Removing intermediate container 1920e64534fb\n","phase":"building"} +data: {"message":" ---> ea6076e720e9\n","phase":"building"} +data: {"message":"Step 45/51 : LABEL repo2docker.version=\"2023.06.0\"","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in fd2f221b727a\n","phase":"building"} +data: {"message":"Removing intermediate container fd2f221b727a\n","phase":"building"} +data: {"message":" ---> f5e76530de72\n","phase":"building"} +data: {"message":"Step 46/51 : USER ${NB_USER}","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in ebe3cd790278\n","phase":"building"} +data: {"message":"Removing intermediate container ebe3cd790278\n","phase":"building"} +data: {"message":" ---> e215e12c0502\n","phase":"building"} +data: {"message":"Step 47/51 : ENV PYTHONUNBUFFERED=1","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 705ceab0d3cb\n","phase":"building"} +data: {"message":"Removing intermediate container 705ceab0d3cb\n","phase":"building"} +data: {"message":" ---> f2fccbfd8918\n","phase":"building"} +data: {"message":"Step 48/51 : COPY /python3-login /usr/local/bin/python3-login","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> 9eda69f3f391\n","phase":"building"} +data: {"message":"Step 49/51 : COPY /repo2docker-entrypoint /usr/local/bin/repo2docker-entrypoint","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> 579b73a4f26d\n","phase":"building"} +data: {"message":"Step 50/51 : ENTRYPOINT [\"/usr/local/bin/repo2docker-entrypoint\"]","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in f7150e769210\n","phase":"building"} +data: {"message":"Removing intermediate container f7150e769210\n","phase":"building"} +data: {"message":" ---> 0bea9a282c20\n","phase":"building"} +data: {"message":"Step 51/51 : CMD [\"jupyter\", \"notebook\", \"--ip\", \"0.0.0.0\"]","phase":"building"} +data: {"message":"\n","phase":"building"} +data: {"message":" ---> Running in 42bdce0d8db0\n","phase":"building"} +data: {"message":"Removing intermediate container 42bdce0d8db0\n","phase":"building"} +data: {"message":" ---> 4abce9060522\n","phase":"building"} +data: {"message":"{\"aux\": {\"ID\": \"sha256:4abce90605228bf00e4b42ea83644ca0c909299d322d1dc08c6c1ab882a64286\"}}","phase":"building"} +data: {"message":"Successfully built 4abce9060522\n","phase":"building"} +data: {"message":"Successfully tagged binder-2dexamples-2doctave-03025a:1479e0252b2e648bb755ee913292b79495931717\n","phase":"building"} +data: {"phase":"built","message":"Built image, launching...\n","imageName":"binder-2dexamples-2doctave-03025a:1479e0252b2e648bb755ee913292b79495931717"} +data: {"phase":"launching","message":"Launching server...\n"} +data: {"phase":"launching","message":"Server requested\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:53.262879Z [Normal] Successfully assigned default/jupyter-binder-2dexamples-2doctave-2d3ilc7xl2 to minikube\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:53Z [Normal] Container image \"jupyterhub/k8s-network-tools:3.1.0\" already present on machine\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:53Z [Normal] Created container block-cloud-metadata\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:53Z [Normal] Started container block-cloud-metadata\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:54Z [Normal] Container image \"binder-2dexamples-2doctave-03025a:1479e0252b2e648bb755ee913292b79495931717\" already present on machine\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:54Z [Normal] Created container notebook\n"} +data: {"phase":"launching","message":"2023-10-09T06:46:54Z [Normal] Started container notebook\n"} +data: {"phase":"launching","message":"Server ready at /user/binder-examples-octave-3ilc7xl2/\n"} +data: {"phase":"ready","message":"server running at http://192.168.105.2:30902/user/binder-examples-octave-3ilc7xl2/\n","image":"binder-2dexamples-2doctave-03025a:1479e0252b2e648bb755ee913292b79495931717","repo_url":"https://github.com/binder-examples/octave","token":"tY_U1yMSSeKyCKPMg6GVIg","binder_ref_url":"https://github.com/binder-examples/octave/tree/1479e0252b2e648bb755ee913292b79495931717","binder_launch_host":"http://127.0.0.1:8585/","binder_request":"v2/gh/binder-examples/octave/HEAD","binder_persistent_request":"v2/gh/binder-examples/octave/1479e0252b2e648bb755ee913292b79495931717","url":"http://192.168.105.2:30902/user/binder-examples-octave-3ilc7xl2/"} diff --git a/js/packages/binderhub-client/lib/index.test.js b/js/packages/binderhub-client/tests/index.test.js similarity index 72% rename from js/packages/binderhub-client/lib/index.test.js rename to js/packages/binderhub-client/tests/index.test.js index dd03daab3..dc1362c03 100644 --- a/js/packages/binderhub-client/lib/index.test.js +++ b/js/packages/binderhub-client/tests/index.test.js @@ -1,4 +1,6 @@ -import { BinderRepository } from "."; +import { BinderRepository } from "@jupyterhub/binderhub-client"; +import { parseEventSource, simpleEventSourceServer } from "./utils"; +import fs from "node:fs"; test("Passed in URL object is not modified", () => { const buildEndpointUrl = new URL("https://test-binder.org/build"); @@ -163,3 +165,63 @@ test("Get full redirect URL and deal with excessive slashes (with pathType=file) "https://hub.test-binder.org/user/something/tree/directory/index.ipynb?token=token", ); }); + +describe( + "Iterate over full output from calling the binderhub API", + () => { + let closeServer, serverUrl; + + let responseContents = fs.readFileSync( + `${__dirname}/fixtures/fullbuild.eventsource`, + { encoding: "utf-8" }, + ); + beforeEach(async () => { + [serverUrl, closeServer] = await simpleEventSourceServer({ + "/build/gh/test/test": responseContents, + }); + console.log(serverUrl); + }); + + afterEach(() => closeServer()); + test("Iterate over full output from fetch", async () => { + let i = 0; + const buildEndpointUrl = new URL(`${serverUrl}/build`); + const br = new BinderRepository("gh/test/test", buildEndpointUrl); + const messages = parseEventSource(responseContents); + for await (const item of br.fetch()) { + expect(item).toStrictEqual(messages[i]); + i += 1; + if (item.phase && item.phase === "ready") { + br.close(); + } + } + }); + }, + 10 * 1000, +); + +describe( + "Invalid eventsource response causes failure", + () => { + let closeServer, serverUrl; + + beforeEach(async () => { + [serverUrl, closeServer] = await simpleEventSourceServer({ + "/build/gh/test/test": "invalid", + }); + }); + + afterEach(() => closeServer()); + test("Invalid eventsource response should cause failure", async () => { + const buildEndpointUrl = new URL(`${serverUrl}/build`); + const br = new BinderRepository("gh/test/test", buildEndpointUrl); + for await (const item of br.fetch()) { + expect(item).toStrictEqual({ + phase: "failed", + message: "Failed to connect to event stream\n", + }); + } + }); + }, + 10 * 1000, +); diff --git a/js/packages/binderhub-client/tests/utils.js b/js/packages/binderhub-client/tests/utils.js new file mode 100644 index 000000000..8616b8d0e --- /dev/null +++ b/js/packages/binderhub-client/tests/utils.js @@ -0,0 +1,52 @@ +import http from "node:http"; + +/** + * + * @param {string} rawData Full text of the response to parse as EventSource formatted data + */ +export function parseEventSource(rawData) { + let messages = []; + for (const line of rawData.split("\n")) { + const part = line.slice("data: ".length - 1); + if (part.trim() !== "") { + messages.push(JSON.parse(part)); + } + } + return messages; +} + +/** + * + * @param {object} payloads + * @returns {Promise} + */ +export async function simpleEventSourceServer(payloads) { + return new Promise((resolve) => { + const server = http.createServer(async (req, res) => { + if (payloads[req.url]) { + res.statusCode = 200; + res.setHeader("Content-Type", "text/event-stream"); + // Setup CORS so jest can actually read the data + res.setHeader("Access-Control-Allow-Origin", "*"); + res.flushHeaders(); + for (const line of payloads[req.url].split("\n")) { + // Eventsource format requires newlines between each line of message + res.write(line + "\n\n"); + // Wait at least 1ms between lines, to simulate all the data not arriving at once + await new Promise((resolve) => setTimeout(resolve, 1)); + } + res.end(); + } else { + res.statusCode = 404; + res.end(); + } + }); + + server.listen(0, "127.0.0.1", () => { + resolve([ + `http://${server.address().address}:${server.address().port}`, + () => server.close(), + ]); + }); + }); +} From 192c332124dfe9134dad9dd1286fe1168ebd8166 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 10 Oct 2023 00:34:35 -0700 Subject: [PATCH 2/4] Add some more jsdoc types --- js/packages/binderhub-client/tests/utils.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/js/packages/binderhub-client/tests/utils.js b/js/packages/binderhub-client/tests/utils.js index 8616b8d0e..2925a416c 100644 --- a/js/packages/binderhub-client/tests/utils.js +++ b/js/packages/binderhub-client/tests/utils.js @@ -1,12 +1,13 @@ import http from "node:http"; /** + * Parse an existing stored EventSource response body into an array of JSON objects * - * @param {string} rawData Full text of the response to parse as EventSource formatted data + * @param {string} responseBody Full text of the response to parse as EventSource formatted data */ -export function parseEventSource(rawData) { +export function parseEventSource(responseBody) { let messages = []; - for (const line of rawData.split("\n")) { + for (const line of responseBody.split("\n")) { const part = line.slice("data: ".length - 1); if (part.trim() !== "") { messages.push(JSON.parse(part)); @@ -16,20 +17,26 @@ export function parseEventSource(rawData) { } /** + * Temporarily start a HTTP server to serve EventSource resources * - * @param {object} payloads + * Returns the serverURL (including the protocol) where the server is listening, as well + * as a function that can be used to stop the server. + * + * @param {object} fakeResponses Mapping of paths to response bodies (in EventSource format) + * the server should respond with when those paths are requested. All + * other paths will get a 404 response. * @returns {Promise} */ -export async function simpleEventSourceServer(payloads) { +export async function simpleEventSourceServer(fakeResponses) { return new Promise((resolve) => { const server = http.createServer(async (req, res) => { - if (payloads[req.url]) { + if (fakeResponses[req.url]) { res.statusCode = 200; res.setHeader("Content-Type", "text/event-stream"); // Setup CORS so jest can actually read the data res.setHeader("Access-Control-Allow-Origin", "*"); res.flushHeaders(); - for (const line of payloads[req.url].split("\n")) { + for (const line of fakeResponses[req.url].split("\n")) { // Eventsource format requires newlines between each line of message res.write(line + "\n\n"); // Wait at least 1ms between lines, to simulate all the data not arriving at once From 07e6133509857024c0dc4d48be96f5c5b709551d Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Tue, 10 Oct 2023 00:36:46 -0700 Subject: [PATCH 3/4] Put case statements in their own variable scope --- binderhub/static/js/index.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/binderhub/static/js/index.js b/binderhub/static/js/index.js index f118eca16..6e192dadb 100644 --- a/binderhub/static/js/index.js +++ b/binderhub/static/js/index.js @@ -62,17 +62,20 @@ async function build(providerSpec, log, fitAddon, path, pathType) { } switch (data.phase) { - case "waiting": + case "waiting": { $("#phase-waiting").removeClass("hidden"); break; - case "building": + } + case "building": { $("#phase-building").removeClass("hidden"); log.show(); break; - case "pushing": + } + case "pushing": { $("#phase-pushing").removeClass("hidden"); break; - case "failed": + } + case "failed": { $("#build-progress .progress-bar").addClass("hidden"); $("#phase-failed").removeClass("hidden"); @@ -89,12 +92,14 @@ async function build(providerSpec, log, fitAddon, path, pathType) { } image.close(); break; - case "built": + } + case "built": { $("#phase-already-built").removeClass("hidden"); $("#phase-launching").removeClass("hidden"); updateFavicon(BASE_URL + "favicon_success.ico"); break; - case "ready": + } + case "ready": { image.close(); // If data.url is an absolute URL, it'll be used. Else, it'll be interpreted // relative to current page's URL. @@ -107,10 +112,12 @@ async function build(providerSpec, log, fitAddon, path, pathType) { pathType, ); break; - default: + } + default: { console.log("Unknown phase in response from server"); console.log(data); break; + } } } return image; From aafc3b37738909770a712ddd27da2b2261d5b251 Mon Sep 17 00:00:00 2001 From: YuviPanda Date: Thu, 12 Oct 2023 06:44:48 -0700 Subject: [PATCH 4/4] Add jsdoc for fetch method --- js/packages/binderhub-client/lib/index.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/js/packages/binderhub-client/lib/index.js b/js/packages/binderhub-client/lib/index.js index 65f2c0ca8..37e05a5d0 100644 --- a/js/packages/binderhub-client/lib/index.js +++ b/js/packages/binderhub-client/lib/index.js @@ -5,7 +5,7 @@ import { EventIterator } from "event-iterator"; const EventSource = NativeEventSource || EventSourcePolyfill; /** - * Build and launch a repository by talking to a BinderHub API endpoint + * Build (and optionally launch) a repository by talking to a BinderHub API endpoint */ export class BinderRepository { /** @@ -44,6 +44,22 @@ export class BinderRepository { * * Returns an Async Generator yielding each item returned by the * server API. + * + * @typedef Line + * @prop {[string]} phase The phase the build is currently in. One of: building, built, fetching, launching, ready, unknown, waiting + * @prop {[string]} message Human readable message to display to the user. Extra newlines must *not* be added + * @prop {[string]} imageName (only with built) Full name of the image that has been built + * @prop {[string]} binder_launch_host (only with phase=ready) The host this binderhub API request was serviced by. + * Could be different than the host the request was made to in federated cases + * @prop {[string]} binder_request (only with phase=ready) Request used to construct this image, of form v2/// + * @prop {[string]} binder_persistent_request (only with phase=ready) Same as binder_request, but is fully resolved + * @prop {[string]} binder_ref_url (only with phase=ready) A URL to the repo provider where the repo can be browsed + * @prop {[string]} image (only with phase=ready) Full name of the image that has been built + * @prop {[string]} token (only with phase=ready) Token to use to authenticate with jupyter server at url + * @prop {[string]} url (only with phase=ready) URL where a jupyter server has been started + * @prop {[string]} repo_url (only with phase=ready) URL of the repository that is ready to be launched + * + * @returns {AsyncGenerator} An async generator yielding responses from the API as they come in */ fetch() { this.eventSource = new EventSource(this.buildUrl);