use proper Promise syntax instead of hacky awaits

This commit is contained in:
joshuaboud 2021-06-07 10:50:59 -03:00
parent 42711e0166
commit d5ec087874
No known key found for this signature in database
GPG Key ID: 17EFB59E2A8BF50E

View File

@ -284,60 +284,77 @@ class NavEntry {
/** /**
* *
* @param {number} new_perms * @param {number} new_perms
* @returns {Promise<void>}
*/ */
async chmod(new_perms) { chmod(new_perms) {
var proc = cockpit.spawn( return new Promise((resolve, reject) => {
["chmod", (new_perms & 0o777).toString(8), this.path_str()], var proc = cockpit.spawn(
{superuser: "try", err: "out"} ["chmod", (new_perms & 0o777).toString(8), this.path_str()],
); {superuser: "try", err: "out"}
proc.fail((e, data) => { );
window.alert(data); proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc;
} }
/** /**
* *
* @param {string} new_owner * @param {string} new_owner
* @param {string} new_group * @param {string} new_group
* @returns {Promise<void>}
*/ */
async chown(new_owner, new_group) { chown(new_owner, new_group) {
if (!new_owner && !new_group) return new Promise((resolve, reject) => {
return; if (!new_owner && !new_group) {
var cmd = ""; resolve();
var arg = ""; return;
if (new_group && !new_owner) { }
cmd = "chgrp"; var cmd = "";
arg = new_group; var arg = "";
} else { if (new_group && !new_owner) {
cmd = "chown"; cmd = "chgrp";
arg = new_owner; arg = new_group;
if (new_group) } else {
arg += ":" + new_group; cmd = "chown";
} arg = new_owner;
var proc = cockpit.spawn( if (new_group)
[cmd, arg, this.path_str()], arg += ":" + new_group;
{superuser: "try", err: "out"} }
); var proc = cockpit.spawn(
proc.fail((e, data) => { [cmd, arg, this.path_str()],
window.alert(data); {superuser: "try", err: "out"}
);
proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc;
} }
/** /**
* *
* @param {string} new_path * @param {string} new_path
* @returns {Promise<void>}
*/ */
async mv(new_path) { mv(new_path) {
var proc = cockpit.spawn( return new Promise((resolve, reject) => {
["mv", "-n", this.path_str(), [this.nav_window_ref.pwd().path_str(), new_path].join("/")], var proc = cockpit.spawn(
{superuser: "try", err: "out"} ["mv", "-n", this.path_str(), [this.nav_window_ref.pwd().path_str(), new_path].join("/")],
); {superuser: "try", err: "out"}
proc.fail((e, data) => { );
window.alert(data); proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc;
} }
/** /**
@ -422,25 +439,34 @@ class NavFile extends NavEntry {
super.handleEvent(e); super.handleEvent(e);
} }
async rm() { /**
var proc = cockpit.spawn( *
["rm", "-f", this.path_str()], * @returns {Promise<void>}
{superuser: "try", err: "out"} */
); rm() {
proc.fail((e, data) => { return new Promise((resolve, reject) => {
window.alert(data); var proc = cockpit.spawn(
["rm", "-f", this.path_str()],
{superuser: "try", err: "out"}
);
proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc;
} }
async open() { async open() {
var proc_output = await cockpit.spawn(["file", "--mime-type", this.path_str()], {superuser: "try"}); var proc_output = await cockpit.spawn(["file", "--mime-type", this.path_str()], {superuser: "try"});
var fields = proc_output.split(':'); var fields = proc_output.split(/:(?=[^:]+$)/); // ensure it's the last : with lookahead
var type = fields[1].trim(); var type = fields[1].trim();
if ((/^text/.test(type) || /^inode\/x-empty$/.test(type) || this.stat["size"] === 0)) { if ((/^text/.test(type) || /^inode\/x-empty$/.test(type) || this.stat["size"] === 0)) {
this.show_edit_file_contents(); this.show_edit_file_contents();
} else { } else {
console.log("Unknown mimetype: " + type);
if (window.confirm("Can't open " + this.filename() + " for editing. Download?")) { if (window.confirm("Can't open " + this.filename() + " for editing. Download?")) {
var download = new NavDownloader(this); var download = new NavDownloader(this);
download.download(); download.download();
@ -609,10 +635,9 @@ class NavDir extends NavEntry {
/** /**
* *
* @param {NavWindow} nav_window_ref * @param {NavWindow} nav_window_ref
* @param {boolean} no_alert
* @returns {Promise<NavEntry[]>} * @returns {Promise<NavEntry[]>}
*/ */
get_children(nav_window_ref, no_alert = false) { get_children(nav_window_ref) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
var children = []; var children = [];
var proc = cockpit.spawn( var proc = cockpit.spawn(
@ -620,11 +645,15 @@ class NavDir extends NavEntry {
{err:"out", superuser: "try"} {err:"out", superuser: "try"}
); );
proc.fail((e, data) => { proc.fail((e, data) => {
if(!no_alert) reject(data);
window.alert(data);
reject(e);
}); });
var data = await proc; var data;
try {
data = await proc;
} catch(e) {
reject(e);
return;
}
var response = JSON.parse(data); var response = JSON.parse(data);
this.stat = response["."]["stat"]; this.stat = response["."]["stat"];
var entries = response["children"]; var entries = response["children"];
@ -651,30 +680,46 @@ class NavDir extends NavEntry {
}); });
} }
async rm() { /**
var proc = cockpit.spawn( *
["rmdir", this.path_str()], * @returns {Promise<void>}
{superuser: "try", err: "out"} */
); rm() {
proc.fail((e, data) => {cannot return new Promise(async (resolve, reject) => {
console.log(data); var proc = cockpit.spawn(
if (/^rmdir: failed to remove .*: Directory not empty\n?$/.test(data)) { ["rmdir", this.path_str()],
if (window.confirm("WARNING: '" + this.path_str() + "' is not empty. Delete recursively? This can NOT be undone.")) { {superuser: "try", err: "out"}
this.rm_recursive(); );
proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
if (/^rmdir: failed to remove .*: Directory not empty\n?$/.test(data)) {
if (window.confirm("WARNING: '" + this.path_str() + "' is not empty. Delete recursively? This can NOT be undone.")) {
this.rm_recursive(resolve, reject);
}
} else {
reject(data);
} }
} else { });
window.alert(data);
}
}); });
} }
async rm_recursive() { /**
*
* @param {Function} resolve
* @param {Function} reject
*/
rm_recursive(resolve, reject) {
var proc = cockpit.spawn( var proc = cockpit.spawn(
["rm", "-rf", this.path_str()], ["rm", "-rf", this.path_str()],
{superuser: "try", err: "out"} {superuser: "try", err: "out"}
); );
proc.done((data) => {
resolve();
});
proc.fail((e, data) => { proc.fail((e, data) => {
window.alert(data); reject(data);
}); });
} }
@ -760,15 +805,23 @@ class NavDirLink extends NavDir{
this.dom_element.nav_item_title.style.fontStyle = "italic"; this.dom_element.nav_item_title.style.fontStyle = "italic";
} }
async rm() { /**
var proc = cockpit.spawn( *
["rm", "-f", this.path_str()], * @returns {Promise<void>}
{superuser: "try", err: "out"} */
); rm() {
proc.fail((e, data) => { return new Promise((resolve, reject) => {
window.alert(data); var proc = cockpit.spawn(
["rm", "-f", this.path_str()],
{superuser: "try", err: "out"}
);
proc.done((data) => {
resolve();
})
proc.fail((e, data) => {
reject(data);
});
}); });
await proc;
} }
show_properties() { show_properties() {
@ -844,7 +897,7 @@ class NavContextMenu {
this.nav_window_ref.paste(); this.nav_window_ref.paste();
} }
rename() { async rename() {
this.hide(); this.hide();
var new_name = window.prompt("New Name: ", this.target.filename()); var new_name = window.prompt("New Name: ", this.target.filename());
if (new_name === null) if (new_name === null)
@ -853,7 +906,12 @@ class NavContextMenu {
window.alert("File name can't contain `/`."); window.alert("File name can't contain `/`.");
return; return;
} }
this.target.mv(new_name); try {
await this.target.mv(new_name);
} catch(e) {
window.alert(e);
return;
}
this.nav_window_ref.refresh(); this.nav_window_ref.refresh();
} }
@ -886,7 +944,9 @@ class NavContextMenu {
try { try {
result = await this.zip_for_download(); result = await this.zip_for_download();
} catch(e) { } catch(e) {
this.nav_window_ref.stop_load();
window.alert(e.message); window.alert(e.message);
return;
} }
this.nav_window_ref.stop_load(); this.nav_window_ref.stop_load();
download_target = new NavFile(result["archive-path"], result["stat"], this.nav_window_ref); download_target = new NavFile(result["archive-path"], result["stat"], this.nav_window_ref);
@ -1202,6 +1262,8 @@ class NavWindow {
var files = await this.pwd().get_children(this); var files = await this.pwd().get_children(this);
} catch(e) { } catch(e) {
this.up(); this.up();
window.alert(e);
return;
} }
while (this.entries.length) { while (this.entries.length) {
var entry = this.entries.pop(); var entry = this.entries.pop();
@ -1460,10 +1522,18 @@ class NavWindow {
new_owner !== entry.stat["owner"] || new_owner !== entry.stat["owner"] ||
new_group !== entry.stat["group"] new_group !== entry.stat["group"]
) { ) {
await entry.chown(new_owner, new_group).catch(/*ignore, caught in chown*/); try {
await entry.chown(new_owner, new_group);
} catch(e) {
window.alert(e);
}
} }
if (this.changed_mode && (new_perms & 0o777) !== (entry.stat["mode"] & 0o777)) { if (this.changed_mode && (new_perms & 0o777) !== (entry.stat["mode"] & 0o777)) {
await entry.chmod(new_perms).catch(/*ignore, caught in chmod*/); try {
await entry.chmod(new_perms);
} catch(e) {
window.alert(e);
}
} }
} }
this.refresh(); this.refresh();
@ -1481,7 +1551,11 @@ class NavWindow {
return; return;
} }
for (let target of this.selected_entries) { for (let target of this.selected_entries) {
await target.rm().catch(/*ignore, caught in rm*/); try {
await target.rm();
} catch(e) {
window.alert(e);
}
} }
this.refresh(); this.refresh();
} }
@ -1494,14 +1568,23 @@ class NavWindow {
window.alert("Directory name can't contain `/`."); window.alert("Directory name can't contain `/`.");
return; return;
} }
var proc = cockpit.spawn( var promise = new Promise((resolve, reject) => {
["mkdir", this.pwd().path_str() + "/" + new_dir_name], var proc = cockpit.spawn(
{superuser: "try", err: "out"} ["mkdir", this.pwd().path_str() + "/" + new_dir_name],
); {superuser: "try", err: "out"}
proc.fail((e, data) => { );
window.alert(data); proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc; try {
await promise;
} catch(e) {
window.alert(e);
}
this.refresh(); this.refresh();
} }
@ -1513,14 +1596,23 @@ class NavWindow {
window.alert("File name can't contain `/`."); window.alert("File name can't contain `/`.");
return; return;
} }
var proc = cockpit.spawn( var promise = new Promise((resolve, reject) => {
["/usr/share/cockpit/navigator/scripts/touch.py", this.pwd().path_str() + "/" + new_file_name], var proc = cockpit.spawn(
{superuser: "try", err: "out"} ["/usr/share/cockpit/navigator/scripts/touch.py", this.pwd().path_str() + "/" + new_file_name],
); {superuser: "try", err: "out"}
proc.fail((e, data) => { );
window.alert(data); proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc; try {
await promise;
} catch(e) {
window.alert(e);
}
this.refresh(); this.refresh();
} }
@ -1536,14 +1628,23 @@ class NavWindow {
return; return;
} }
var link_path = this.pwd().path_str() + "/" + link_name; var link_path = this.pwd().path_str() + "/" + link_name;
var proc = cockpit.spawn( var promise = new Promise((resolve, reject) => {
["ln", "-sn", link_target, link_path], var proc = cockpit.spawn(
{superuser: "try", err: "out"} ["ln", "-sn", link_target, link_path],
); {superuser: "try", err: "out"}
proc.fail((e, data) => { );
window.alert(data); proc.done((data) => {
resolve();
});
proc.fail((e, data) => {
reject(data);
});
}); });
await proc; try {
await promise;
} catch(e) {
window.alert(e);
}
this.refresh(); this.refresh();
} }
@ -1579,26 +1680,34 @@ class NavWindow {
cmd.push(item.path_str()); cmd.push(item.path_str());
} }
cmd.push(dest); cmd.push(dest);
var proc = cockpit.spawn( var promise = new Promise((resolve, reject) => {
cmd, var proc = cockpit.spawn(
{superuser: "try", err: "ignore"} cmd,
); {superuser: "try", err: "ignore"}
proc.stream((data) => { );
var payload = JSON.parse(data); proc.stream((data) => {
if (payload["wants-response"]) { var payload = JSON.parse(data);
var user_response = window.confirm(payload["message"]); if (payload["wants-response"]) {
proc.input(JSON.stringify(user_response) + "\n", true); var user_response = window.confirm(payload["message"]);
} else { proc.input(JSON.stringify(user_response) + "\n", true);
window.alert(payload["message"]); } else {
} window.alert(payload["message"]);
}); }
proc.fail((e, data) => { });
window.alert("Paste failed."); proc.done((data) => {
}); resolve();
proc.always(() => { });
this.stop_load(); proc.fail((e, data) => {
this.refresh(); reject("Paste failed.");
});
}); });
try {
await promise;
} catch(e) {
window.alert(e);
}
this.stop_load();
this.refresh();
} }
/** /**
@ -1633,10 +1742,12 @@ class NavWindow {
return; return;
this.nav_bar_last_parent_path_str = parent_path_str; this.nav_bar_last_parent_path_str = parent_path_str;
var parent_dir = new NavDir(parent_path_str); var parent_dir = new NavDir(parent_path_str);
var error = false; var objs;
var objs = await parent_dir.get_children(this, true).catch(() => {error = true}); try {
if(error) objs = await parent_dir.get_children(this);
} catch(e) {
return; return;
}
objs = objs.filter((child) => {return child.nav_type === "dir"}); objs = objs.filter((child) => {return child.nav_type === "dir"});
while(list.firstChild) while(list.firstChild)
list.removeChild(list.firstChild); list.removeChild(list.firstChild);
@ -1681,38 +1792,70 @@ class NavWindow {
this.refresh(); this.refresh();
} }
async get_system_users() { /**
var proc = cockpit.spawn(["getent", "passwd"], {err: "ignore", superuser: "try"}); *
var list = document.getElementById("possible-owners"); * @returns {Promise<void>}
while(list.firstChild) { */
list.removeChild(list.firstChild); get_system_users() {
} return new Promise(async (resolve, reject) => {
var passwd = await proc; var proc = cockpit.spawn(["getent", "passwd"], {err: "ignore", superuser: "try"});
var passwd_entries = passwd.split("\n"); proc.fail((e, data) => {
for (let entry of passwd_entries) { reject(data);
var cols = entry.split(":"); });
var username = cols[0]; var list = document.getElementById("possible-owners");
var option = document.createElement("option"); while(list.firstChild) {
option.value = username; list.removeChild(list.firstChild);
list.appendChild(option); }
} var passwd;
try {
passwd = await proc;
} catch(e) {
reject(e);
return;
}
var passwd_entries = passwd.split("\n");
for (let entry of passwd_entries) {
var cols = entry.split(":");
var username = cols[0];
var option = document.createElement("option");
option.value = username;
list.appendChild(option);
}
resolve();
});
} }
async get_system_groups() { /**
var proc = cockpit.spawn(["getent", "group"], {err: "ignore", superuser: "try"}); *
var list = document.getElementById("possible-groups"); * @returns {Promise<void>}
while(list.firstChild) { */
list.removeChild(list.firstChild); get_system_groups() {
} return new Promise(async (resolve, reject) => {
var group = await proc; var proc = cockpit.spawn(["getent", "group"], {err: "ignore", superuser: "try"});
var group_entries = group.split("\n"); proc.fail((e, data) => {
for (let entry of group_entries) { reject(data);
var cols = entry.split(":"); });
var groupname = cols[0]; var list = document.getElementById("possible-groups");
var option = document.createElement("option"); while(list.firstChild) {
option.value = groupname; list.removeChild(list.firstChild);
list.appendChild(option); }
} var group
try {
group = await proc;
} catch(e) {
reject(e);
return;
}
var group_entries = group.split("\n");
for (let entry of group_entries) {
var cols = entry.split(":");
var groupname = cols[0];
var option = document.createElement("option");
option.value = groupname;
list.appendChild(option);
}
resolve();
});
} }
disable_buttons_for_editing() { disable_buttons_for_editing() {