mirror of
https://github.com/coderaiser/cloudcmd.git
synced 2026-07-21 10:38:26 +00:00
Compare commits
7 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0a5c1ab85 | ||
|
|
9d97343b15 | ||
|
|
46a88cfade | ||
|
|
631b9e46f3 | ||
|
|
85ddf43f7b | ||
|
|
b78cb7208f | ||
|
|
1c263c18da |
14 changed files with 82 additions and 29 deletions
15
ChangeLog
15
ChangeLog
|
|
@ -1,3 +1,18 @@
|
||||||
|
2026.04.28, v19.15.0
|
||||||
|
|
||||||
|
feature:
|
||||||
|
- 9d97343b cloudcmd: operation: rm useless checks
|
||||||
|
- 46a88cfa cloudcmd: client: key: vim: cc, mm
|
||||||
|
|
||||||
|
2026.04.28, v19.14.0
|
||||||
|
|
||||||
|
feature:
|
||||||
|
- 36a8b641 cloudcmd: ponse v8.0.0
|
||||||
|
- 1c263c18 docker: io: /usr/src/cloudcmd -> /usr/local/share/cloudcmd
|
||||||
|
- ea7b828c docker: io: ubuntu: resolute
|
||||||
|
- cd6c11ac docker: io: far2l
|
||||||
|
- c4beeec6 docker: io: gdu: add
|
||||||
|
|
||||||
2026.04.21, v19.13.1
|
2026.04.21, v19.13.1
|
||||||
|
|
||||||
feature:
|
feature:
|
||||||
|
|
|
||||||
6
HELP.md
6
HELP.md
|
|
@ -1,4 +1,4 @@
|
||||||
# Cloud Commander v19.13.1
|
# Cloud Commander v19.15.0
|
||||||
|
|
||||||
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
|
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
|
||||||
|
|
||||||
|
|
@ -232,6 +232,8 @@ When the `--vim` option is provided, or the configuration parameter `vim` is set
|
||||||
| `mf` | make file
|
| `mf` | make file
|
||||||
| `tt` | show terminal
|
| `tt` | show terminal
|
||||||
| `e` | edit file
|
| `e` | edit file
|
||||||
|
| `cc` | copy
|
||||||
|
| `mm` | move
|
||||||
|
|
||||||
Commands can be joined, for example:
|
Commands can be joined, for example:
|
||||||
|
|
||||||
|
|
@ -1115,6 +1117,8 @@ There are a lot of ways to be involved in `Cloud Commander` development:
|
||||||
|
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
|
- *2026.04.28*, **[v19.15.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.15.0)**
|
||||||
|
- *2026.04.28*, **[v19.14.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.14.0)**
|
||||||
- *2026.04.21*, **[v19.13.1](//github.com/coderaiser/cloudcmd/releases/tag/v19.13.1)**
|
- *2026.04.21*, **[v19.13.1](//github.com/coderaiser/cloudcmd/releases/tag/v19.13.1)**
|
||||||
- *2026.04.15*, **[v19.13.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.13.0)**
|
- *2026.04.15*, **[v19.13.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.13.0)**
|
||||||
- *2026.04.12*, **[v19.12.5](//github.com/coderaiser/cloudcmd/releases/tag/v19.12.5)**
|
- *2026.04.12*, **[v19.12.5](//github.com/coderaiser/cloudcmd/releases/tag/v19.12.5)**
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Cloud Commander v19.13.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
|
# Cloud Commander v19.15.0 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL]
|
||||||
|
|
||||||
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
|
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -60,6 +60,14 @@ const getOperations = (event, deps) => {
|
||||||
remove: () => {
|
remove: () => {
|
||||||
Operation.show('delete');
|
Operation.show('delete');
|
||||||
},
|
},
|
||||||
|
operationCopy: () => {
|
||||||
|
event.preventDefault();
|
||||||
|
Operation.show('copy');
|
||||||
|
},
|
||||||
|
operationMove: () => {
|
||||||
|
event.preventDefault();
|
||||||
|
Operation.show('move');
|
||||||
|
},
|
||||||
|
|
||||||
makeDirectory: () => {
|
makeDirectory: () => {
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,8 @@ export default (key, operations = {}) => {
|
||||||
makeDirectory = noop,
|
makeDirectory = noop,
|
||||||
terminal = noop,
|
terminal = noop,
|
||||||
edit = noop,
|
edit = noop,
|
||||||
|
operationCopy = noop,
|
||||||
|
operationMove = noop,
|
||||||
} = operations;
|
} = operations;
|
||||||
|
|
||||||
if (key === 'Enter')
|
if (key === 'Enter')
|
||||||
|
|
@ -111,6 +113,16 @@ export default (key, operations = {}) => {
|
||||||
return end();
|
return end();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (value === 'cc') {
|
||||||
|
operationCopy();
|
||||||
|
return end();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value === 'mm') {
|
||||||
|
operationMove();
|
||||||
|
return end();
|
||||||
|
}
|
||||||
|
|
||||||
if (value === 'mf') {
|
if (value === 'mf') {
|
||||||
makeFile();
|
makeFile();
|
||||||
return end();
|
return end();
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,28 @@ test('vim: ^', (t) => {
|
||||||
t.end();
|
t.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('vim: cc', (t) => {
|
||||||
|
const operationCopy = stub();
|
||||||
|
|
||||||
|
vim('cc', {
|
||||||
|
operationCopy,
|
||||||
|
});
|
||||||
|
|
||||||
|
t.calledWithNoArgs(operationCopy);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('vim: mm', (t) => {
|
||||||
|
const operationMove = stub();
|
||||||
|
|
||||||
|
vim('mm', {
|
||||||
|
operationMove,
|
||||||
|
});
|
||||||
|
|
||||||
|
t.calledWithNoArgs(operationMove);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
test('vim: w', (t) => {
|
test('vim: w', (t) => {
|
||||||
const moveNext = stub();
|
const moveNext = stub();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,15 +15,12 @@ export const setListeners = (options) => (emitter) => {
|
||||||
} = options;
|
} = options;
|
||||||
|
|
||||||
let done;
|
let done;
|
||||||
let lastError;
|
|
||||||
|
|
||||||
const onAbort = wraptile(({emitter, operation}) => {
|
const onAbort = wraptile(({emitter, operation}) => {
|
||||||
emitter.abort();
|
emitter.abort();
|
||||||
|
|
||||||
const msg = `${operation} aborted`;
|
const msg = `${operation} aborted`;
|
||||||
|
|
||||||
lastError = true;
|
|
||||||
|
|
||||||
Dialog.alert(msg, {
|
Dialog.alert(msg, {
|
||||||
cancel: false,
|
cancel: false,
|
||||||
});
|
});
|
||||||
|
|
@ -40,13 +37,10 @@ export const setListeners = (options) => (emitter) => {
|
||||||
operation,
|
operation,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let noProgress = true;
|
|
||||||
|
|
||||||
const listeners = {
|
const listeners = {
|
||||||
progress: (value) => {
|
progress: (value) => {
|
||||||
done = value === 100;
|
done = value === 100;
|
||||||
progress.setProgress(value);
|
progress.setProgress(value);
|
||||||
noProgress = false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
end: () => {
|
end: () => {
|
||||||
|
|
@ -54,13 +48,10 @@ export const setListeners = (options) => (emitter) => {
|
||||||
forEachKey(removeListener, listeners);
|
forEachKey(removeListener, listeners);
|
||||||
progress.remove();
|
progress.remove();
|
||||||
|
|
||||||
if (lastError || done || noProgress)
|
callback();
|
||||||
callback();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
error: async (error) => {
|
error: async (error) => {
|
||||||
lastError = error;
|
|
||||||
|
|
||||||
if (noContinue) {
|
if (noContinue) {
|
||||||
listeners.end(error);
|
listeners.end(error);
|
||||||
Dialog.alert(error);
|
Dialog.alert(error);
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@ FROM ubuntu:resolute
|
||||||
LABEL maintainer="Coderaiser"
|
LABEL maintainer="Coderaiser"
|
||||||
LABEL org.opencontainers.image.source="https://github.com/coderaiser/cloudcmd"
|
LABEL org.opencontainers.image.source="https://github.com/coderaiser/cloudcmd"
|
||||||
|
|
||||||
RUN mkdir -p /usr/src/cloudcmd
|
RUN mkdir -p /usr/local/share/cloudcmd
|
||||||
|
|
||||||
WORKDIR /usr/src/cloudcmd
|
WORKDIR /usr/local/share/cloudcmd
|
||||||
|
|
||||||
COPY package.json /usr/src/cloudcmd/
|
COPY package.json /usr/local/share/cloudcmd/
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive \
|
ENV DEBIAN_FRONTEND=noninteractive \
|
||||||
NVM_DIR=/usr/local/share/nvm \
|
NVM_DIR=/usr/local/share/nvm \
|
||||||
|
|
@ -58,6 +58,8 @@ RUN echo "> remove user" && \
|
||||||
bun r gritty --omit dev && \
|
bun r gritty --omit dev && \
|
||||||
bun i gritty --omit dev && \
|
bun i gritty --omit dev && \
|
||||||
bun pm cache rm && \
|
bun pm cache rm && \
|
||||||
|
echo "> setup cloudcmd" && \
|
||||||
|
ln -s /usr/local/share/cloudcmd/bin/cloudcmd.js /usr/local/bin/cloudcmd && \
|
||||||
echo "> setup git" && \
|
echo "> setup git" && \
|
||||||
git config --global core.whitespace -trailing-space && \
|
git config --global core.whitespace -trailing-space && \
|
||||||
git config --global pull.rebase true && \
|
git config --global pull.rebase true && \
|
||||||
|
|
@ -81,12 +83,13 @@ RUN echo "> remove user" && \
|
||||||
echo "el_GR.UTF-8 UTF-8" >> /etc/locale.gen && \
|
echo "el_GR.UTF-8 UTF-8" >> /etc/locale.gen && \
|
||||||
locale-gen
|
locale-gen
|
||||||
|
|
||||||
COPY . /usr/src/cloudcmd
|
COPY . /usr/local/share/cloudcmd
|
||||||
|
|
||||||
WORKDIR /
|
WORKDIR /
|
||||||
|
|
||||||
ENV cloudcmd_terminal=true \
|
ENV cloudcmd_terminal=true \
|
||||||
cloudcmd_terminal_path=gritty \
|
cloudcmd_terminal_path=gritty \
|
||||||
|
cloudcmd_vim=true \
|
||||||
cloudcmd_open=false \
|
cloudcmd_open=false \
|
||||||
PATH=node_modules/.bin:$PATH \
|
PATH=node_modules/.bin:$PATH \
|
||||||
PATH=~/.local/bin:$PATH \
|
PATH=~/.local/bin:$PATH \
|
||||||
|
|
@ -97,8 +100,6 @@ ENV cloudcmd_terminal=true \
|
||||||
LC_ALL=en_US.UTF-8 \
|
LC_ALL=en_US.UTF-8 \
|
||||||
TERM=xterm-256color \
|
TERM=xterm-256color \
|
||||||
XDG_CACHE_HOME=/tmp \
|
XDG_CACHE_HOME=/tmp \
|
||||||
XDG_DATA_HOME=/usr/local/share
|
XDG_DATA_HOME=/usr/local/share EXPOSE 8000
|
||||||
|
|
||||||
EXPOSE 8000
|
ENTRYPOINT ["/usr/local/share/cloudcmd/bin/cloudcmd.js"]
|
||||||
|
|
||||||
ENTRYPOINT ["/usr/src/cloudcmd/bin/cloudcmd.js"]
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "cloudcmd",
|
"name": "cloudcmd",
|
||||||
"version": "19.13.1",
|
"version": "19.15.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
|
"author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
|
||||||
"description": "File manager for the web with console and editor",
|
"description": "File manager for the web with console and editor",
|
||||||
|
|
@ -127,7 +127,7 @@
|
||||||
"open": "^11.0.0",
|
"open": "^11.0.0",
|
||||||
"package-json": "^10.0.0",
|
"package-json": "^10.0.0",
|
||||||
"pipe-io": "^4.0.1",
|
"pipe-io": "^4.0.1",
|
||||||
"ponse": "^7.0.0",
|
"ponse": "^8.0.0",
|
||||||
"pullout": "^5.0.0",
|
"pullout": "^5.0.0",
|
||||||
"putout": "^42.0.5",
|
"putout": "^42.0.5",
|
||||||
"redzip": "^4.6.1",
|
"redzip": "^4.6.1",
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import fs from 'node:fs';
|
||||||
import {fullstore} from 'fullstore';
|
import {fullstore} from 'fullstore';
|
||||||
import currify from 'currify';
|
import currify from 'currify';
|
||||||
import apart from 'apart';
|
import apart from 'apart';
|
||||||
import ponse from 'ponse';
|
import * as ponse from 'ponse';
|
||||||
import {restafary} from 'restafary';
|
import {restafary} from 'restafary';
|
||||||
import restbox from 'restbox';
|
import restbox from 'restbox';
|
||||||
import {konsole} from 'console-io';
|
import {konsole} from 'console-io';
|
||||||
|
|
@ -186,7 +186,7 @@ function cloudcmdMiddle({modules, config}) {
|
||||||
const zip = apart(config, 'zip');
|
const zip = apart(config, 'zip');
|
||||||
const root = apart(config, 'root');
|
const root = apart(config, 'root');
|
||||||
|
|
||||||
const ponseStatic = ponse.static({
|
const ponseStatic = ponse.createStatic({
|
||||||
cache,
|
cache,
|
||||||
root: DIR_ROOT,
|
root: DIR_ROOT,
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ import currify from 'currify';
|
||||||
import wraptile from 'wraptile';
|
import wraptile from 'wraptile';
|
||||||
import {tryToCatch} from 'try-to-catch';
|
import {tryToCatch} from 'try-to-catch';
|
||||||
import pullout from 'pullout';
|
import pullout from 'pullout';
|
||||||
import ponse from 'ponse';
|
import * as ponse from 'ponse';
|
||||||
import jonny from 'jonny';
|
import jonny from 'jonny';
|
||||||
import jju from 'jju';
|
import jju from 'jju';
|
||||||
import writejson from 'writejson';
|
import writejson from 'writejson';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import {callbackify} from 'node:util';
|
||||||
import {fileURLToPath} from 'node:url';
|
import {fileURLToPath} from 'node:url';
|
||||||
import {dirname} from 'node:path';
|
import {dirname} from 'node:path';
|
||||||
import pullout from 'pullout';
|
import pullout from 'pullout';
|
||||||
import ponse from 'ponse';
|
import {getQuery} from 'ponse';
|
||||||
import {read} from 'redzip';
|
import {read} from 'redzip';
|
||||||
import root from '../root.js';
|
import root from '../root.js';
|
||||||
import parse from './worker.js';
|
import parse from './worker.js';
|
||||||
|
|
@ -40,7 +40,7 @@ function parseName(query, name, rootDir) {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onGET(request, name, root) {
|
async function onGET(request, name, root) {
|
||||||
const query = ponse.getQuery(request);
|
const query = getQuery(request);
|
||||||
const fileName = parseName(query, name, root);
|
const fileName = parseName(query, name, root);
|
||||||
const stream = await read(fileName);
|
const stream = await read(fileName);
|
||||||
const data = await pullout(stream);
|
const data = await pullout(stream);
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import wraptile from 'wraptile';
|
||||||
import currify from 'currify';
|
import currify from 'currify';
|
||||||
import pullout from 'pullout';
|
import pullout from 'pullout';
|
||||||
import json from 'jonny';
|
import json from 'jonny';
|
||||||
import ponse from 'ponse';
|
import * as ponse from 'ponse';
|
||||||
import {copymitter} from 'copymitter';
|
import {copymitter} from 'copymitter';
|
||||||
import _moveFiles from '@cloudcmd/move-files';
|
import _moveFiles from '@cloudcmd/move-files';
|
||||||
import * as CloudFunc from '#common/cloudfunc';
|
import * as CloudFunc from '#common/cloudfunc';
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import {createRequire} from 'node:module';
|
import {createRequire} from 'node:module';
|
||||||
import {extname} from 'node:path';
|
import {extname} from 'node:path';
|
||||||
import * as _win32 from 'win32';
|
import * as _win32 from 'win32';
|
||||||
import ponse from 'ponse';
|
import * as ponse from 'ponse';
|
||||||
import {rendy} from 'rendy';
|
import {rendy} from 'rendy';
|
||||||
import format from 'format-io';
|
import format from 'format-io';
|
||||||
import currify from 'currify';
|
import currify from 'currify';
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue