Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9125579
D5866.id21031.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
68 KB
Subscribers
None
D5866.id21031.diff
View Options
diff --git a/assets/src/bundles/admin/origin-save.js b/assets/src/bundles/admin/origin-save.js
--- a/assets/src/bundles/admin/origin-save.js
+++ b/assets/src/bundles/admin/origin-save.js
@@ -222,7 +222,7 @@
$('body').on('click', e => {
if ($(e.target).parents('.popover').length > 0) {
- event.stopPropagation();
+ e.stopPropagation();
} else if ($(e.target).parents('.swh-save-request-info').length === 0) {
$('.swh-save-request-info').popover('dispose');
}
@@ -231,78 +231,72 @@
});
}
-export function addAuthorizedOriginUrl() {
- let originUrl = $('#swh-authorized-url-prefix').val();
- let addOriginUrl = Urls.admin_origin_save_add_authorized_url(originUrl);
- csrfPost(addOriginUrl)
- .then(handleFetchError)
- .then(() => {
- authorizedOriginTable.row.add({'url': originUrl}).draw();
- $('.swh-add-authorized-origin-status').html(
- htmlAlert('success', 'The origin url prefix has been successfully added in the authorized list.', true)
- );
- })
- .catch(response => {
- $('.swh-add-authorized-origin-status').html(
- htmlAlert('warning', 'The provided origin url prefix is already registered in the authorized list.', true)
- );
- });
+export async function addAuthorizedOriginUrl() {
+ const originUrl = $('#swh-authorized-url-prefix').val();
+ const addOriginUrl = Urls.admin_origin_save_add_authorized_url(originUrl);
+ try {
+ const response = await csrfPost(addOriginUrl);
+ handleFetchError(response);
+ authorizedOriginTable.row.add({'url': originUrl}).draw();
+ $('.swh-add-authorized-origin-status').html(
+ htmlAlert('success', 'The origin url prefix has been successfully added in the authorized list.', true)
+ );
+ } catch (_) {
+ $('.swh-add-authorized-origin-status').html(
+ htmlAlert('warning', 'The provided origin url prefix is already registered in the authorized list.', true)
+ );
+ }
}
-export function removeAuthorizedOriginUrl() {
- let originUrl = $('#swh-authorized-origin-urls tr.selected').text();
+export async function removeAuthorizedOriginUrl() {
+ const originUrl = $('#swh-authorized-origin-urls tr.selected').text();
if (originUrl) {
- let removeOriginUrl = Urls.admin_origin_save_remove_authorized_url(originUrl);
- csrfPost(removeOriginUrl)
- .then(handleFetchError)
- .then(() => {
- authorizedOriginTable.row('.selected').remove().draw();
- })
- .catch(() => {});
+ const removeOriginUrl = Urls.admin_origin_save_remove_authorized_url(originUrl);
+ try {
+ const response = await csrfPost(removeOriginUrl);
+ handleFetchError(response);
+ authorizedOriginTable.row('.selected').remove().draw();
+ } catch (_) {}
}
}
-export function addUnauthorizedOriginUrl() {
- let originUrl = $('#swh-unauthorized-url-prefix').val();
- let addOriginUrl = Urls.admin_origin_save_add_unauthorized_url(originUrl);
- csrfPost(addOriginUrl)
- .then(handleFetchError)
- .then(() => {
- unauthorizedOriginTable.row.add({'url': originUrl}).draw();
- $('.swh-add-unauthorized-origin-status').html(
- htmlAlert('success', 'The origin url prefix has been successfully added in the unauthorized list.', true)
- );
- })
- .catch(() => {
- $('.swh-add-unauthorized-origin-status').html(
- htmlAlert('warning', 'The provided origin url prefix is already registered in the unauthorized list.', true)
- );
- });
+export async function addUnauthorizedOriginUrl() {
+ const originUrl = $('#swh-unauthorized-url-prefix').val();
+ const addOriginUrl = Urls.admin_origin_save_add_unauthorized_url(originUrl);
+ try {
+ const response = await csrfPost(addOriginUrl);
+ handleFetchError(response);
+ unauthorizedOriginTable.row.add({'url': originUrl}).draw();
+ $('.swh-add-unauthorized-origin-status').html(
+ htmlAlert('success', 'The origin url prefix has been successfully added in the unauthorized list.', true)
+ );
+ } catch (_) {
+ $('.swh-add-unauthorized-origin-status').html(
+ htmlAlert('warning', 'The provided origin url prefix is already registered in the unauthorized list.', true)
+ );
+ }
}
-export function removeUnauthorizedOriginUrl() {
- let originUrl = $('#swh-unauthorized-origin-urls tr.selected').text();
+export async function removeUnauthorizedOriginUrl() {
+ const originUrl = $('#swh-unauthorized-origin-urls tr.selected').text();
if (originUrl) {
- let removeOriginUrl = Urls.admin_origin_save_remove_unauthorized_url(originUrl);
- csrfPost(removeOriginUrl)
- .then(handleFetchError)
- .then(() => {
- unauthorizedOriginTable.row('.selected').remove().draw();
- })
- .catch(() => {});
+ const removeOriginUrl = Urls.admin_origin_save_remove_unauthorized_url(originUrl);
+ try {
+ const response = await csrfPost(removeOriginUrl);
+ handleFetchError(response);
+ unauthorizedOriginTable.row('.selected').remove().draw();
+ } catch (_) {};
}
}
export function acceptOriginSaveRequest() {
- let selectedRow = pendingSaveRequestsTable.row('.selected');
+ const selectedRow = pendingSaveRequestsTable.row('.selected');
if (selectedRow.length) {
- let acceptOriginSaveRequestCallback = () => {
- let rowData = selectedRow.data();
- let acceptSaveRequestUrl = Urls.admin_origin_save_request_accept(rowData['visit_type'], rowData['origin_url']);
- csrfPost(acceptSaveRequestUrl)
- .then(() => {
- pendingSaveRequestsTable.ajax.reload(null, false);
- });
+ const acceptOriginSaveRequestCallback = async() => {
+ const rowData = selectedRow.data();
+ const acceptSaveRequestUrl = Urls.admin_origin_save_request_accept(rowData['visit_type'], rowData['origin_url']);
+ await csrfPost(acceptSaveRequestUrl);
+ pendingSaveRequestsTable.ajax.reload(null, false);
};
swh.webapp.showModalConfirm(
@@ -313,15 +307,13 @@
}
export function rejectOriginSaveRequest() {
- let selectedRow = pendingSaveRequestsTable.row('.selected');
+ const selectedRow = pendingSaveRequestsTable.row('.selected');
if (selectedRow.length) {
- let rejectOriginSaveRequestCallback = () => {
- let rowData = selectedRow.data();
- let rejectSaveRequestUrl = Urls.admin_origin_save_request_reject(rowData['visit_type'], rowData['origin_url']);
- csrfPost(rejectSaveRequestUrl)
- .then(() => {
- pendingSaveRequestsTable.ajax.reload(null, false);
- });
+ let rejectOriginSaveRequestCallback = async() => {
+ const rowData = selectedRow.data();
+ const rejectSaveRequestUrl = Urls.admin_origin_save_request_reject(rowData['visit_type'], rowData['origin_url']);
+ await csrfPost(rejectSaveRequestUrl);
+ pendingSaveRequestsTable.ajax.reload(null, false);
};
swh.webapp.showModalConfirm(
@@ -335,12 +327,10 @@
let selectedRow = requestTable.row('.selected');
if (selectedRow.length) {
let requestId = selectedRow.data()['id'];
- let removeOriginSaveRequestCallback = () => {
- let removeSaveRequestUrl = Urls.admin_origin_save_request_remove(requestId);
- csrfPost(removeSaveRequestUrl)
- .then(() => {
- requestTable.ajax.reload(null, false);
- });
+ let removeOriginSaveRequestCallback = async() => {
+ const removeSaveRequestUrl = Urls.admin_origin_save_request_remove(requestId);
+ await csrfPost(removeSaveRequestUrl);
+ requestTable.ajax.reload(null, false);
};
swh.webapp.showModalConfirm(
diff --git a/assets/src/bundles/auth/index.js b/assets/src/bundles/auth/index.js
--- a/assets/src/bundles/auth/index.js
+++ b/assets/src/bundles/auth/index.js
@@ -36,45 +36,42 @@
window.location = Urls.oidc_generate_bearer_token();
}
-function displayToken(tokenId) {
+async function displayToken(tokenId) {
const postData = {
token_id: tokenId
};
- csrfPost(Urls.oidc_get_bearer_token(), {}, JSON.stringify(postData))
- .then(handleFetchError)
- .then(response => response.text())
- .then(token => {
- const tokenHtml =
- `<p>Below is your token.</p>
- <pre id="swh-bearer-token" class="mt-3">${token}</pre>`;
- swh.webapp.showModalHtml('Display bearer token', tokenHtml);
- })
- .catch(response => {
- response.text().then(responseText => {
- let errorMsg = 'Internal server error.';
- if (response.status === 400) {
- errorMsg = responseText;
- }
- swh.webapp.showModalHtml('Display bearer token', errorMessage(errorMsg));
- });
- });
+ try {
+ const response = await csrfPost(Urls.oidc_get_bearer_token(), {}, JSON.stringify(postData));
+ handleFetchError(response);
+ const token = await response.text();
+ const tokenHtml =
+ `<p>Below is your token.</p>
+ <pre id="swh-bearer-token" class="mt-3">${token}</pre>`;
+ swh.webapp.showModalHtml('Display bearer token', tokenHtml);
+ } catch (response) {
+ const responseText = await response.text();
+ let errorMsg = 'Internal server error.';
+ if (response.status === 400) {
+ errorMsg = responseText;
+ }
+ swh.webapp.showModalHtml('Display bearer token', errorMessage(errorMsg));
+ }
}
-function revokeTokens(tokenIds) {
+async function revokeTokens(tokenIds) {
const postData = {
token_ids: tokenIds
};
- csrfPost(Urls.oidc_revoke_bearer_tokens(), {}, JSON.stringify(postData))
- .then(handleFetchError)
- .then(() => {
- disableSubmitButton();
- $('#swh-token-form-message').html(
- successMessage(`Bearer token${tokenIds.length > 1 ? 's' : ''} successfully revoked.`));
- apiTokensTable.draw();
- })
- .catch(() => {
- $('#swh-token-form-message').html(errorMessage('Internal server error.'));
- });
+ try {
+ const response = await csrfPost(Urls.oidc_revoke_bearer_tokens(), {}, JSON.stringify(postData));
+ handleFetchError(response);
+ disableSubmitButton();
+ $('#swh-token-form-message').html(
+ successMessage(`Bearer token${tokenIds.length > 1 ? 's' : ''} successfully revoked.`));
+ apiTokensTable.draw();
+ } catch (_) {
+ $('#swh-token-form-message').html(errorMessage('Internal server error.'));
+ }
}
function revokeToken(tokenId) {
diff --git a/assets/src/bundles/browse/origin-search.js b/assets/src/bundles/browse/origin-search.js
--- a/assets/src/bundles/browse/origin-search.js
+++ b/assets/src/bundles/browse/origin-search.js
@@ -28,12 +28,13 @@
$('#origin-search-results tbody tr').remove();
}
-function populateOriginSearchResultsTable(origins) {
+async function populateOriginSearchResultsTable(origins) {
if (origins.length > 0) {
$('#swh-origin-search-results').show();
$('#swh-no-result').hide();
clearOriginSearchResultsTable();
let table = $('#origin-search-results tbody');
+ let promises = [];
for (let [i, origin] of origins.entries()) {
let browseUrl = `${Urls.browse_origin()}?origin_url=${encodeURIComponent(origin.url)}`;
let tableRow =
@@ -54,32 +55,27 @@
// get async latest visit snapshot and update visit status icon
let latestSnapshotUrl = Urls.api_1_origin_visit_latest(origin.url);
latestSnapshotUrl += '?require_snapshot=true';
- fetch(latestSnapshotUrl)
- .then(response => {
- if (response.status === 404) {
- throw new Error();
- }
- return response.json();
- })
- .then(data => {
- if (data.type) {
- $(`#visit-type-origin-${i}`).html(data.type);
- $(`#visit-status-origin-${i}`).html(
- '<i title="Software origin has been archived by Software Heritage" ' +
- 'class="mdi mdi-check-bold mdi-fw"></i>Archived');
- } else {
- throw new Error();
- }
- })
- .catch(() => {
- $(`#visit-type-origin-${i}`).html('unknown');
- $(`#visit-status-origin-${i}`).html(
- '<i title="Software origin archival by Software Heritage is pending" ' +
- 'class="mdi mdi-close-thick mdi-fw"></i>Pending archival');
- if ($('#swh-filter-empty-visits').prop('checked')) {
- $(`#origin-${i}`).remove();
- }
- });
+ promises.push(fetch(latestSnapshotUrl));
+ }
+ const responses = await Promise.all(promises);
+ const responsesData = await Promise.all(responses.map(r => r.json()));
+ for (let i = 0; i < responses.length; ++i) {
+ const response = responses[i];
+ const data = responsesData[i];
+ if (response.status !== 404 && data.type) {
+ $(`#visit-type-origin-${i}`).html(data.type);
+ $(`#visit-status-origin-${i}`).html(
+ '<i title="Software origin has been archived by Software Heritage" ' +
+ 'class="mdi mdi-check-bold mdi-fw"></i>Archived');
+ } else {
+ $(`#visit-type-origin-${i}`).html('unknown');
+ $(`#visit-status-origin-${i}`).html(
+ '<i title="Software origin archival by Software Heritage is pending" ' +
+ 'class="mdi mdi-close-thick mdi-fw"></i>Pending archival');
+ if ($('#swh-filter-empty-visits').prop('checked')) {
+ $(`#origin-${i}`).remove();
+ }
+ }
}
fixTableRowsStyle();
} else {
@@ -127,66 +123,60 @@
searchOrigins(searchUrl);
}
-function searchOrigins(searchUrl) {
+async function searchOrigins(searchUrl) {
clearOriginSearchResultsTable();
$('.swh-loading').addClass('show');
- let response = fetch(searchUrl)
- .then(handleFetchError)
- .then(resp => {
- response = resp;
- return response.json();
- })
- .then(data => {
- // Save link to the current results page
- linkCurrent = searchUrl;
- // Save link to the next results page.
- linkNext = null;
- if (response.headers.has('Link')) {
- let parsedLink = parseLinkHeader(response.headers.get('Link'));
- if (parsedLink !== undefined) {
- linkNext = parsedLink;
- }
+ try {
+ const response = await fetch(searchUrl);
+ handleFetchError(response);
+ const data = await response.json();
+ // Save link to the current results page
+ linkCurrent = searchUrl;
+ // Save link to the next results page.
+ linkNext = null;
+ if (response.headers.has('Link')) {
+ let parsedLink = parseLinkHeader(response.headers.get('Link'));
+ if (parsedLink !== undefined) {
+ linkNext = parsedLink;
}
- // prevLinks is updated by the caller, which is the one to know if
- // we're going forward or backward in the pages.
+ }
+ // prevLinks is updated by the caller, which is the one to know if
+ // we're going forward or backward in the pages.
- $('.swh-loading').removeClass('show');
- populateOriginSearchResultsTable(data);
- })
- .catch(response => {
- $('.swh-loading').removeClass('show');
- inSearch = false;
- $('#swh-origin-search-results').hide();
- $('#swh-no-result').text(`Error ${response.status}: ${response.statusText}`);
- $('#swh-no-result').show();
- });
+ $('.swh-loading').removeClass('show');
+ populateOriginSearchResultsTable(data);
+ } catch (response) {
+ $('.swh-loading').removeClass('show');
+ inSearch = false;
+ $('#swh-origin-search-results').hide();
+ $('#swh-no-result').text(`Error ${response.status}: ${response.statusText}`);
+ $('#swh-no-result').show();
+ }
}
async function doSearch() {
$('#swh-no-result').hide();
- let searchQueryText = $('#swh-origins-url-patterns').val();
+ const searchQueryText = $('#swh-origins-url-patterns').val();
inSearch = true;
if (searchQueryText.startsWith('swh:')) {
- // searchQueryText may be a PID so sending search queries to PID resolve endpoint
- let resolveSWHIDUrl = Urls.api_1_resolve_swhid(searchQueryText);
- fetch(resolveSWHIDUrl)
- .then(handleFetchError)
- .then(response => response.json())
- .then(data => {
- // SWHID has been successfully resolved,
- // so redirect to browse page
- window.location = data.browse_url;
- })
- .catch(response => {
- // display a useful error message if the input
- // looks like a SWHID
- response.json().then(data => {
- $('#swh-origin-search-results').hide();
- $('.swh-search-pagination').hide();
- $('#swh-no-result').text(data.reason);
- $('#swh-no-result').show();
- });
- });
+ try {
+ // searchQueryText may be a PID so sending search queries to PID resolve endpoint
+ const resolveSWHIDUrl = Urls.api_1_resolve_swhid(searchQueryText);
+ const response = await fetch(resolveSWHIDUrl);
+ handleFetchError(response);
+ const data = await response.json();
+ // SWHID has been successfully resolved,
+ // so redirect to browse page
+ window.location = data.browse_url;
+ } catch (response) {
+ // display a useful error message if the input
+ // looks like a SWHID
+ const data = await response.json();
+ $('#swh-origin-search-results').hide();
+ $('.swh-search-pagination').hide();
+ $('#swh-no-result').text(data.reason);
+ $('#swh-no-result').show();
+ }
} else if (await isArchivedOrigin(searchQueryText)) {
// redirect to the browse origin
window.location.href =
diff --git a/assets/src/bundles/revision/diff-utils.js b/assets/src/bundles/revision/diff-utils.js
--- a/assets/src/bundles/revision/diff-utils.js
+++ b/assets/src/bundles/revision/diff-utils.js
@@ -315,7 +315,7 @@
}
// to compute diff and process it for display
-export function computeDiff(diffUrl, diffId) {
+export async function computeDiff(diffUrl, diffId) {
// force diff computation ?
let force = diffUrl.indexOf('force=true') !== -1;
@@ -341,214 +341,214 @@
$(`#${diffId}-highlightjs`).css('display', 'none');
// request diff computation and process it
- fetch(diffUrl)
- .then(response => response.json())
- .then(data => {
- // increment number of computed diffs
- ++nbDiffsComputed;
- // toggle the 'Compute all diffs' button if all diffs have been computed
- if (nbDiffsComputed === changes.length) {
- $('#swh-compute-all-diffs').addClass('active');
- }
+ const response = await fetch(diffUrl);
+ const data = await response.json();
+
+ // increment number of computed diffs
+ ++nbDiffsComputed;
+ // toggle the 'Compute all diffs' button if all diffs have been computed
+ if (nbDiffsComputed === changes.length) {
+ $('#swh-compute-all-diffs').addClass('active');
+ }
- // Large diff (> threshold) are not automatically computed,
- // add a button to force its computation
- if (data.diff_str.indexOf('Large diff') === 0) {
- $(`#${diffId}`)[0].innerHTML = data.diff_str +
+ // Large diff (> threshold) are not automatically computed,
+ // add a button to force its computation
+ if (data.diff_str.indexOf('Large diff') === 0) {
+ $(`#${diffId}`)[0].innerHTML = data.diff_str +
`<br/><button class="btn btn-default btn-sm" type="button"
onclick="swh.revision.computeDiff('${diffUrl}&force=true', '${diffId}')">` +
'Request diff</button>';
- setDiffVisible(diffId);
- } else if (data.diff_str.indexOf('@@') !== 0) {
- $(`#${diffId}`).text(data.diff_str);
- setDiffVisible(diffId);
- } else {
+ setDiffVisible(diffId);
+ } else if (data.diff_str.indexOf('@@') !== 0) {
+ $(`#${diffId}`).text(data.diff_str);
+ setDiffVisible(diffId);
+ } else {
- // prepare code highlighting
- $(`.${diffId}`).removeClass('nohighlight');
- $(`.${diffId}`).addClass(data.language);
+ // prepare code highlighting
+ $(`.${diffId}`).removeClass('nohighlight');
+ $(`.${diffId}`).addClass(data.language);
- // set unified diff text
- $(`#${diffId}`).text(data.diff_str);
+ // set unified diff text
+ $(`#${diffId}`).text(data.diff_str);
- // code highlighting for unified diff
- $(`#${diffId}`).each((i, elt) => {
- hljs.highlightElement(elt);
- hljs.lineNumbersElementSync(elt);
- });
+ // code highlighting for unified diff
+ $(`#${diffId}`).each((i, elt) => {
+ hljs.highlightElement(elt);
+ hljs.lineNumbersElementSync(elt);
+ });
- // process unified diff lines in order to generate side-by-side diffs text
- // but also compute line numbers for unified and side-by-side diffs
- let baseFromLine = '';
- let baseToLine = '';
- let fromToLines = [];
- let fromLines = [];
- let toLines = [];
- let maxNumberChars = 0;
- let diffFromStr = '';
- let diffToStr = '';
- let linesOffset = 0;
-
- $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
- let lnText = lnElt.nextSibling.innerText;
- let linesInfo = parseDiffHunkRangeIfAny(lnText);
- let fromLine = '';
- let toLine = '';
- // parsed lines info from the diff output
- if (linesInfo) {
- baseFromLine = linesInfo[0];
- baseToLine = linesInfo[1];
- linesOffset = 0;
- diffFromStr += (lnText + '\n');
- diffToStr += (lnText + '\n');
- fromLines.push('');
+ // process unified diff lines in order to generate side-by-side diffs text
+ // but also compute line numbers for unified and side-by-side diffs
+ let baseFromLine = '';
+ let baseToLine = '';
+ let fromToLines = [];
+ let fromLines = [];
+ let toLines = [];
+ let maxNumberChars = 0;
+ let diffFromStr = '';
+ let diffToStr = '';
+ let linesOffset = 0;
+
+ $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
+ let lnText = lnElt.nextSibling.innerText;
+ let linesInfo = parseDiffHunkRangeIfAny(lnText);
+ let fromLine = '';
+ let toLine = '';
+ // parsed lines info from the diff output
+ if (linesInfo) {
+ baseFromLine = linesInfo[0];
+ baseToLine = linesInfo[1];
+ linesOffset = 0;
+ diffFromStr += (lnText + '\n');
+ diffToStr += (lnText + '\n');
+ fromLines.push('');
+ toLines.push('');
+ // line removed in the from file
+ } else if (lnText.length > 0 && lnText[0] === '-') {
+ baseFromLine = baseFromLine + 1;
+ fromLine = baseFromLine.toString();
+ fromLines.push(fromLine);
+ ++nbDeletions;
+ diffFromStr += (lnText + '\n');
+ ++linesOffset;
+ // line added in the to file
+ } else if (lnText.length > 0 && lnText[0] === '+') {
+ baseToLine = baseToLine + 1;
+ toLine = baseToLine.toString();
+ toLines.push(toLine);
+ ++nbAdditions;
+ diffToStr += (lnText + '\n');
+ --linesOffset;
+ // line present in both files
+ } else {
+ baseFromLine = baseFromLine + 1;
+ baseToLine = baseToLine + 1;
+ fromLine = baseFromLine.toString();
+ toLine = baseToLine.toString();
+ for (let j = 0; j < Math.abs(linesOffset); ++j) {
+ if (linesOffset > 0) {
+ diffToStr += '\n';
toLines.push('');
- // line removed in the from file
- } else if (lnText.length > 0 && lnText[0] === '-') {
- baseFromLine = baseFromLine + 1;
- fromLine = baseFromLine.toString();
- fromLines.push(fromLine);
- ++nbDeletions;
- diffFromStr += (lnText + '\n');
- ++linesOffset;
- // line added in the to file
- } else if (lnText.length > 0 && lnText[0] === '+') {
- baseToLine = baseToLine + 1;
- toLine = baseToLine.toString();
- toLines.push(toLine);
- ++nbAdditions;
- diffToStr += (lnText + '\n');
- --linesOffset;
- // line present in both files
} else {
- baseFromLine = baseFromLine + 1;
- baseToLine = baseToLine + 1;
- fromLine = baseFromLine.toString();
- toLine = baseToLine.toString();
- for (let j = 0; j < Math.abs(linesOffset); ++j) {
- if (linesOffset > 0) {
- diffToStr += '\n';
- toLines.push('');
- } else {
- diffFromStr += '\n';
- fromLines.push('');
- }
- }
- linesOffset = 0;
- diffFromStr += (lnText + '\n');
- diffToStr += (lnText + '\n');
- toLines.push(toLine);
- fromLines.push(fromLine);
- }
- if (!baseFromLine) {
- fromLine = '';
- }
- if (!baseToLine) {
- toLine = '';
+ diffFromStr += '\n';
+ fromLines.push('');
}
- fromToLines[i] = [fromLine, toLine];
- maxNumberChars = Math.max(maxNumberChars, fromLine.length);
- maxNumberChars = Math.max(maxNumberChars, toLine.length);
- });
+ }
+ linesOffset = 0;
+ diffFromStr += (lnText + '\n');
+ diffToStr += (lnText + '\n');
+ toLines.push(toLine);
+ fromLines.push(fromLine);
+ }
+ if (!baseFromLine) {
+ fromLine = '';
+ }
+ if (!baseToLine) {
+ toLine = '';
+ }
+ fromToLines[i] = [fromLine, toLine];
+ maxNumberChars = Math.max(maxNumberChars, fromLine.length);
+ maxNumberChars = Math.max(maxNumberChars, toLine.length);
+ });
- diffMaxNumberChars[diffId] = maxNumberChars;
+ diffMaxNumberChars[diffId] = maxNumberChars;
- // set side-by-side diffs text
- $(`#${diffId}-from`).text(diffFromStr);
- $(`#${diffId}-to`).text(diffToStr);
+ // set side-by-side diffs text
+ $(`#${diffId}-from`).text(diffFromStr);
+ $(`#${diffId}-to`).text(diffToStr);
- // code highlighting for side-by-side diffs
- $(`#${diffId}-from, #${diffId}-to`).each((i, elt) => {
- hljs.highlightElement(elt);
- hljs.lineNumbersElementSync(elt);
- });
+ // code highlighting for side-by-side diffs
+ $(`#${diffId}-from, #${diffId}-to`).each((i, elt) => {
+ hljs.highlightElement(elt);
+ hljs.lineNumbersElementSync(elt);
+ });
- // diff highlighting for added/removed lines on top of code highlighting
- $(`.${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
- let lnText = lnElt.nextSibling.innerText;
- if (lnText.startsWith('@@')) {
- $(lnElt).parent().addClass('swh-diff-lines-info');
- let linesInfoText = $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text();
- $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').children().remove();
- $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text('');
- $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').append(`<span class="hljs-meta">${linesInfoText}</span>`);
- } else if (lnText.length > 0 && lnText[0] === '-') {
- $(lnElt).parent().addClass('swh-diff-removed-line');
- } else if (lnText.length > 0 && lnText[0] === '+') {
- $(lnElt).parent().addClass('swh-diff-added-line');
- }
- });
+ // diff highlighting for added/removed lines on top of code highlighting
+ $(`.${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
+ let lnText = lnElt.nextSibling.innerText;
+ if (lnText.startsWith('@@')) {
+ $(lnElt).parent().addClass('swh-diff-lines-info');
+ let linesInfoText = $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text();
+ $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').children().remove();
+ $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').text('');
+ $(lnElt).parent().find('.hljs-ln-code .hljs-ln-line').append(`<span class="hljs-meta">${linesInfoText}</span>`);
+ } else if (lnText.length > 0 && lnText[0] === '-') {
+ $(lnElt).parent().addClass('swh-diff-removed-line');
+ } else if (lnText.length > 0 && lnText[0] === '+') {
+ $(lnElt).parent().addClass('swh-diff-added-line');
+ }
+ });
- // set line numbers for unified diff
- $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
- const lineNumbers = formatDiffLineNumbers(diffId, fromToLines[i][0], fromToLines[i][1]);
- setLineNumbers(lnElt, lineNumbers);
- });
+ // set line numbers for unified diff
+ $(`#${diffId} .hljs-ln-numbers`).each((i, lnElt) => {
+ const lineNumbers = formatDiffLineNumbers(diffId, fromToLines[i][0], fromToLines[i][1]);
+ setLineNumbers(lnElt, lineNumbers);
+ });
- // set line numbers for the from side-by-side diff
- $(`#${diffId}-from .hljs-ln-numbers`).each((i, lnElt) => {
- setLineNumbers(lnElt, fromLines[i]);
- });
+ // set line numbers for the from side-by-side diff
+ $(`#${diffId}-from .hljs-ln-numbers`).each((i, lnElt) => {
+ setLineNumbers(lnElt, fromLines[i]);
+ });
- // set line numbers for the to side-by-side diff
- $(`#${diffId}-to .hljs-ln-numbers`).each((i, lnElt) => {
- setLineNumbers(lnElt, toLines[i]);
- });
+ // set line numbers for the to side-by-side diff
+ $(`#${diffId}-to .hljs-ln-numbers`).each((i, lnElt) => {
+ setLineNumbers(lnElt, toLines[i]);
+ });
- // last processing:
- // - remove the '+' and '-' at the beginning of the diff lines
- // from code highlighting
- // - add the "no new line at end of file marker" if needed
- $(`.${diffId} .hljs-ln-code`).each((i, lnElt) => {
- if (lnElt.firstChild) {
- if (lnElt.firstChild.nodeName !== '#text') {
- let lineText = lnElt.firstChild.innerHTML;
- if (lineText[0] === '-' || lineText[0] === '+') {
- lnElt.firstChild.innerHTML = lineText.substr(1);
- let newTextNode = document.createTextNode(lineText[0]);
- $(lnElt).prepend(newTextNode);
- }
- }
- $(lnElt).contents().filter((i, elt) => {
- return elt.nodeType === 3; // Node.TEXT_NODE
- }).each((i, textNode) => {
- let swhNoNewLineMarker = '[swh-no-nl-marker]';
- if (textNode.textContent.indexOf(swhNoNewLineMarker) !== -1) {
- textNode.textContent = textNode.textContent.replace(swhNoNewLineMarker, '');
- $(lnElt).append($(noNewLineMarker));
- }
- });
+ // last processing:
+ // - remove the '+' and '-' at the beginning of the diff lines
+ // from code highlighting
+ // - add the "no new line at end of file marker" if needed
+ $(`.${diffId} .hljs-ln-code`).each((i, lnElt) => {
+ if (lnElt.firstChild) {
+ if (lnElt.firstChild.nodeName !== '#text') {
+ let lineText = lnElt.firstChild.innerHTML;
+ if (lineText[0] === '-' || lineText[0] === '+') {
+ lnElt.firstChild.innerHTML = lineText.substr(1);
+ let newTextNode = document.createTextNode(lineText[0]);
+ $(lnElt).prepend(newTextNode);
+ }
+ }
+ $(lnElt).contents().filter((i, elt) => {
+ return elt.nodeType === 3; // Node.TEXT_NODE
+ }).each((i, textNode) => {
+ let swhNoNewLineMarker = '[swh-no-nl-marker]';
+ if (textNode.textContent.indexOf(swhNoNewLineMarker) !== -1) {
+ textNode.textContent = textNode.textContent.replace(swhNoNewLineMarker, '');
+ $(lnElt).append($(noNewLineMarker));
}
});
+ }
+ });
- // hide the diff mode switch button in case of not generated diffs
- if (data.diff_str.indexOf('Diffs are not generated for non textual content') !== 0) {
- $(`#diff_${diffId} .diff-styles`).css('visibility', 'visible');
- }
+ // hide the diff mode switch button in case of not generated diffs
+ if (data.diff_str.indexOf('Diffs are not generated for non textual content') !== 0) {
+ $(`#diff_${diffId} .diff-styles`).css('visibility', 'visible');
+ }
- setDiffVisible(diffId);
+ setDiffVisible(diffId);
- // highlight diff lines if provided in URL fragment
- if (selectedDiffLinesInfo &&
+ // highlight diff lines if provided in URL fragment
+ if (selectedDiffLinesInfo &&
selectedDiffLinesInfo.diffPanelId.indexOf(diffId) !== -1) {
- if (!selectedDiffLinesInfo.unified) {
- showSplitDiff(diffId);
- }
- const firstHighlightedLine = highlightDiffLines(
- diffId, selectedDiffLinesInfo.startLines,
- selectedDiffLinesInfo.endLines, selectedDiffLinesInfo.unified);
-
- $('html, body').animate(
- {
- scrollTop: firstHighlightedLine.offset().top - 50
- },
- {
- duration: 500
- }
- );
- }
+ if (!selectedDiffLinesInfo.unified) {
+ showSplitDiff(diffId);
}
- });
+ const firstHighlightedLine = highlightDiffLines(
+ diffId, selectedDiffLinesInfo.startLines,
+ selectedDiffLinesInfo.endLines, selectedDiffLinesInfo.unified);
+
+ $('html, body').animate(
+ {
+ scrollTop: firstHighlightedLine.offset().top - 50
+ },
+ {
+ duration: 500
+ }
+ );
+ }
+ }
+
}
function setDiffVisible(diffId) {
@@ -664,7 +664,7 @@
await import(/* webpackChunkName: "highlightjs" */ 'utils/highlightjs');
// callback when the 'Changes' tab is activated
- $(document).on('shown.bs.tab', 'a[data-toggle="tab"]', e => {
+ $(document).on('shown.bs.tab', 'a[data-toggle="tab"]', async e => {
currentTabName = e.currentTarget.text.trim();
if (currentTabName === 'Changes') {
window.location.hash = changesUrlFragment;
@@ -677,43 +677,42 @@
// request computation of revision file changes list
// when navigating to the 'Changes' tab and add diff panels
// to the DOM when receiving the result
- fetch(diffRevisionUrl)
- .then(response => response.json())
- .then(data => {
- changes = data.changes;
- nbChangedFiles = data.total_nb_changes;
- let changedFilesText = `${nbChangedFiles} changed file`;
- if (nbChangedFiles !== 1) {
- changedFilesText += 's';
- }
- $('#swh-revision-changed-files').text(changedFilesText);
- $('#swh-total-nb-diffs').text(changes.length);
- $('#swh-revision-changes-list pre')[0].innerHTML = data.changes_msg;
-
- $('#swh-revision-changes-loading').css('display', 'none');
- $('#swh-revision-changes-list pre').css('display', 'block');
- $('#swh-compute-all-diffs').css('visibility', 'visible');
- $('#swh-revision-changes-list').removeClass('in');
-
- if (nbChangedFiles > changes.length) {
- $('#swh-too-large-revision-diff').css('display', 'block');
- $('#swh-nb-loaded-diffs').text(changes.length);
- }
+ const response = await fetch(diffRevisionUrl);
+ const data = await response.json();
+
+ changes = data.changes;
+ nbChangedFiles = data.total_nb_changes;
+ let changedFilesText = `${nbChangedFiles} changed file`;
+ if (nbChangedFiles !== 1) {
+ changedFilesText += 's';
+ }
+ $('#swh-revision-changed-files').text(changedFilesText);
+ $('#swh-total-nb-diffs').text(changes.length);
+ $('#swh-revision-changes-list pre')[0].innerHTML = data.changes_msg;
+
+ $('#swh-revision-changes-loading').css('display', 'none');
+ $('#swh-revision-changes-list pre').css('display', 'block');
+ $('#swh-compute-all-diffs').css('visibility', 'visible');
+ $('#swh-revision-changes-list').removeClass('in');
+
+ if (nbChangedFiles > changes.length) {
+ $('#swh-too-large-revision-diff').css('display', 'block');
+ $('#swh-nb-loaded-diffs').text(changes.length);
+ }
- for (let i = 0; i < changes.length; ++i) {
- let diffData = changes[i];
- diffsUrls[diffData.id] = diffData.diff_url;
- $('#swh-revision-diffs').append(genDiffPanel(diffData));
- }
+ for (let i = 0; i < changes.length; ++i) {
+ let diffData = changes[i];
+ diffsUrls[diffData.id] = diffData.diff_url;
+ $('#swh-revision-diffs').append(genDiffPanel(diffData));
+ }
- setupWaypoints();
- computeVisibleDiffs();
+ setupWaypoints();
+ computeVisibleDiffs();
- if (selectedDiffLinesInfo) {
- scrollToDiffPanel(selectedDiffLinesInfo.diffPanelId, false);
- }
+ if (selectedDiffLinesInfo) {
+ scrollToDiffPanel(selectedDiffLinesInfo.diffPanelId, false);
+ }
- });
} else if (currentTabName === 'Files') {
removeUrlFragment();
$('#readme-panel').css('display', 'block');
diff --git a/assets/src/bundles/save/index.js b/assets/src/bundles/save/index.js
--- a/assets/src/bundles/save/index.js
+++ b/assets/src/bundles/save/index.js
@@ -11,7 +11,7 @@
let saveRequestsTable;
-function originSaveRequest(
+async function originSaveRequest(
originType, originUrl, extraData,
acceptedCallback, pendingCallback, errorCallback
) {
@@ -27,23 +27,21 @@
};
};
- csrfPost(addSaveOriginRequestUrl, headers, body)
- .then(handleFetchError)
- .then(response => response.json())
- .then(data => {
- $('.swh-processing-save-request').css('display', 'none');
- if (data.save_request_status === 'accepted') {
- acceptedCallback();
- } else {
- pendingCallback();
- }
- })
- .catch(response => {
- $('.swh-processing-save-request').css('display', 'none');
- response.json().then(errorData => {
- errorCallback(response.status, errorData);
- });
- });
+ try {
+ const response = await csrfPost(addSaveOriginRequestUrl, headers, body);
+ handleFetchError(response);
+ const data = await response.json();
+ $('.swh-processing-save-request').css('display', 'none');
+ if (data.save_request_status === 'accepted') {
+ acceptedCallback();
+ } else {
+ pendingCallback();
+ }
+ } catch (response) {
+ $('.swh-processing-save-request').css('display', 'none');
+ const errorData = await response.json();
+ errorCallback(response.status, errorData);
+ };
}
function addArtifactVersionAutofillHandler(formId) {
@@ -116,19 +114,18 @@
export function initOriginSave() {
- $(document).ready(() => {
+ $(document).ready(async() => {
$.fn.dataTable.ext.errMode = 'none';
- fetch(Urls.origin_save_types_list())
- .then(response => response.json())
- .then(data => {
- for (let originType of data) {
- $('#swh-input-visit-type').append(`<option value="${originType}">${originType}</option>`);
- }
- // set git as the default value as before
- $('#swh-input-visit-type').val('git');
- });
+ const response = await fetch(Urls.origin_save_types_list());
+ const data = await response.json();
+
+ for (let originType of data) {
+ $('#swh-input-visit-type').append(`<option value="${originType}">${originType}</option>`);
+ }
+ // set git as the default value as before
+ $('#swh-input-visit-type').val('git');
saveRequestsTable = $('#swh-origin-save-requests')
.on('error.dt', (e, settings, techNote, message) => {
@@ -464,7 +461,7 @@
return value === null ? null : mapFormatPerTypeFn[type](value);
}
-export function displaySaveRequestInfo(event, saveRequestId) {
+export async function displaySaveRequestInfo(event, saveRequestId) {
event.stopPropagation();
const saveRequestTaskInfoUrl = Urls.origin_save_task_info(saveRequestId);
// close popover when clicking again on the info icon
@@ -499,50 +496,49 @@
});
$(event.target).popover('show');
- fetch(saveRequestTaskInfoUrl)
- .then(response => response.json())
- .then(saveRequestTaskInfo => {
- let content;
- if ($.isEmptyObject(saveRequestTaskInfo)) {
- content = 'Not available';
- } else {
- let saveRequestInfo = [];
- const taskData = {
- 'Type': ['raw', 'type'],
- 'Visit status': ['raw', 'visit_status'],
- 'Arguments': ['json', 'arguments'],
- 'Id': ['raw', 'id'],
- 'Backend id': ['raw', 'backend_id'],
- 'Scheduling date': ['date', 'scheduled'],
- 'Start date': ['date', 'started'],
- 'Completion date': ['date', 'ended'],
- 'Duration': ['duration', 'duration'],
- 'Runner': ['raw', 'worker'],
- 'Log': ['raw', 'message']
- };
- for (const [title, [type, property]] of Object.entries(taskData)) {
- if (saveRequestTaskInfo.hasOwnProperty(property)) {
- saveRequestInfo.push({
- key: title,
- value: formatValuePerType(type, saveRequestTaskInfo[property])
- });
- }
- }
- content = '<table class="table"><tbody>';
- for (let info of saveRequestInfo) {
- content +=
+ const response = await fetch(saveRequestTaskInfoUrl);
+ const saveRequestTaskInfo = await response.json();
+
+ let content;
+ if ($.isEmptyObject(saveRequestTaskInfo)) {
+ content = 'Not available';
+ } else {
+ let saveRequestInfo = [];
+ const taskData = {
+ 'Type': ['raw', 'type'],
+ 'Visit status': ['raw', 'visit_status'],
+ 'Arguments': ['json', 'arguments'],
+ 'Id': ['raw', 'id'],
+ 'Backend id': ['raw', 'backend_id'],
+ 'Scheduling date': ['date', 'scheduled'],
+ 'Start date': ['date', 'started'],
+ 'Completion date': ['date', 'ended'],
+ 'Duration': ['duration', 'duration'],
+ 'Runner': ['raw', 'worker'],
+ 'Log': ['raw', 'message']
+ };
+ for (const [title, [type, property]] of Object.entries(taskData)) {
+ if (saveRequestTaskInfo.hasOwnProperty(property)) {
+ saveRequestInfo.push({
+ key: title,
+ value: formatValuePerType(type, saveRequestTaskInfo[property])
+ });
+ }
+ }
+ content = '<table class="table"><tbody>';
+ for (let info of saveRequestInfo) {
+ content +=
`<tr>
<th class="swh-metadata-table-row swh-metadata-table-key">${info.key}</th>
<td class="swh-metadata-table-row swh-metadata-table-value">
<pre>${info.value}</pre>
</td>
</tr>`;
- }
- content += '</tbody></table>';
- }
- $('.swh-popover').html(content);
- $(event.target).popover('update');
- });
+ }
+ content += '</tbody></table>';
+ }
+ $('.swh-popover').html(content);
+ $(event.target).popover('update');
}
export function fillSaveRequestFormAndScroll(visitType, originUrl) {
diff --git a/assets/src/bundles/vault/vault-create-tasks.js b/assets/src/bundles/vault/vault-create-tasks.js
--- a/assets/src/bundles/vault/vault-create-tasks.js
+++ b/assets/src/bundles/vault/vault-create-tasks.js
@@ -14,7 +14,7 @@
'z-index': '100000'
};
-export function vaultRequest(objectType, objectId) {
+export async function vaultRequest(objectType, objectId) {
let vaultUrl;
if (objectType === 'directory') {
vaultUrl = Urls.api_1_vault_cook_directory(objectId);
@@ -22,32 +22,31 @@
vaultUrl = Urls.api_1_vault_cook_revision_gitfast(objectId);
}
// check if object has already been cooked
- fetch(vaultUrl)
- .then(response => response.json())
- .then(data => {
- // object needs to be cooked
- if (data.exception === 'NotFoundExc' || data.status === 'failed') {
- // if last cooking has failed, remove previous task info from localStorage
- // in order to force the recooking of the object
- swh.vault.removeCookingTaskInfo([objectId]);
- $(`#vault-cook-${objectType}-modal`).modal('show');
- // object has been cooked and should be in the vault cache,
- // it will be asked to cook it again if it is not
- } else if (data.status === 'done') {
- $(`#vault-fetch-${objectType}-modal`).modal('show');
- } else {
- const cookingServiceDownAlert =
+ const response = await fetch(vaultUrl);
+ const data = await response.json();
+
+ // object needs to be cooked
+ if (data.exception === 'NotFoundExc' || data.status === 'failed') {
+ // if last cooking has failed, remove previous task info from localStorage
+ // in order to force the recooking of the object
+ swh.vault.removeCookingTaskInfo([objectId]);
+ $(`#vault-cook-${objectType}-modal`).modal('show');
+ // object has been cooked and should be in the vault cache,
+ // it will be asked to cook it again if it is not
+ } else if (data.status === 'done') {
+ $(`#vault-fetch-${objectType}-modal`).modal('show');
+ } else {
+ const cookingServiceDownAlert =
$(htmlAlert('danger',
'Archive cooking service is currently experiencing issues.<br/>' +
'Please try again later.',
true));
- cookingServiceDownAlert.css(alertStyle);
- $('body').append(cookingServiceDownAlert);
- }
- });
+ cookingServiceDownAlert.css(alertStyle);
+ $('body').append(cookingServiceDownAlert);
+ }
}
-function addVaultCookingTask(cookingTask) {
+async function addVaultCookingTask(cookingTask) {
const swhidsContext = swh.webapp.getSwhIdsContext();
cookingTask.origin = swhidsContext[cookingTask.object_type].context.origin;
@@ -75,32 +74,31 @@
cookingUrl += '?email=' + cookingTask.email;
}
- csrfPost(cookingUrl)
- .then(handleFetchError)
- .then(() => {
- vaultCookingTasks.push(cookingTask);
- localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
- $('#vault-cook-directory-modal').modal('hide');
- $('#vault-cook-revision-modal').modal('hide');
- const cookingTaskCreatedAlert =
+ try {
+ const response = await csrfPost(cookingUrl);
+ handleFetchError(response);
+ vaultCookingTasks.push(cookingTask);
+ localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
+ $('#vault-cook-directory-modal').modal('hide');
+ $('#vault-cook-revision-modal').modal('hide');
+ const cookingTaskCreatedAlert =
$(htmlAlert('success',
'Archive cooking request successfully submitted.<br/>' +
`Go to the <a href="${Urls.browse_vault()}">Downloads</a> page ` +
'to get the download link once it is ready.',
true));
- cookingTaskCreatedAlert.css(alertStyle);
- $('body').append(cookingTaskCreatedAlert);
- })
- .catch(() => {
- $('#vault-cook-directory-modal').modal('hide');
- $('#vault-cook-revision-modal').modal('hide');
- const cookingTaskFailedAlert =
+ cookingTaskCreatedAlert.css(alertStyle);
+ $('body').append(cookingTaskCreatedAlert);
+ } catch (_) {
+ $('#vault-cook-directory-modal').modal('hide');
+ $('#vault-cook-revision-modal').modal('hide');
+ const cookingTaskFailedAlert =
$(htmlAlert('danger',
'Archive cooking request submission failed.',
true));
- cookingTaskFailedAlert.css(alertStyle);
- $('body').append(cookingTaskFailedAlert);
- });
+ cookingTaskFailedAlert.css(alertStyle);
+ $('body').append(cookingTaskFailedAlert);
+ }
}
}
@@ -125,14 +123,12 @@
}
}
-export function fetchDirectoryArchive(directoryId) {
+export async function fetchDirectoryArchive(directoryId) {
$('#vault-fetch-directory-modal').modal('hide');
const vaultUrl = Urls.api_1_vault_cook_directory(directoryId);
- fetch(vaultUrl)
- .then(response => response.json())
- .then(data => {
- swh.vault.fetchCookedObject(data.fetch_url);
- });
+ const response = await fetch(vaultUrl);
+ const data = await response.json();
+ swh.vault.fetchCookedObject(data.fetch_url);
}
export function cookRevisionArchive(revisionId) {
@@ -150,12 +146,10 @@
}
}
-export function fetchRevisionArchive(revisionId) {
+export async function fetchRevisionArchive(revisionId) {
$('#vault-fetch-directory-modal').modal('hide');
const vaultUrl = Urls.api_1_vault_cook_revision_gitfast(revisionId);
- fetch(vaultUrl)
- .then(response => response.json())
- .then(data => {
- swh.vault.fetchCookedObject(data.fetch_url);
- });
+ const response = await fetch(vaultUrl);
+ const data = await response.json();
+ swh.vault.fetchCookedObject(data.fetch_url);
}
diff --git a/assets/src/bundles/vault/vault-ui.js b/assets/src/bundles/vault/vault-ui.js
--- a/assets/src/bundles/vault/vault-ui.js
+++ b/assets/src/bundles/vault/vault-ui.js
@@ -41,33 +41,32 @@
let recookTask;
// called when the user wants to download a cooked archive
-export function fetchCookedObject(fetchUrl) {
+export async function fetchCookedObject(fetchUrl) {
recookTask = null;
// first, check if the link is still available from the vault
- fetch(fetchUrl)
- .then(response => {
- // link is still alive, proceed to download
- if (response.ok) {
- $('#vault-fetch-iframe').attr('src', fetchUrl);
- // link is dead
- } else {
- // get the associated cooking task
- let vaultCookingTasks = JSON.parse(localStorage.getItem('swh-vault-cooking-tasks'));
- for (let i = 0; i < vaultCookingTasks.length; ++i) {
- if (vaultCookingTasks[i].fetch_url === fetchUrl) {
- recookTask = vaultCookingTasks[i];
- break;
- }
- }
- // display a modal asking the user if he wants to recook the archive
- $('#vault-recook-object-modal').modal('show');
+ const response = await fetch(fetchUrl);
+
+ // link is still alive, proceed to download
+ if (response.ok) {
+ $('#vault-fetch-iframe').attr('src', fetchUrl);
+ // link is dead
+ } else {
+ // get the associated cooking task
+ let vaultCookingTasks = JSON.parse(localStorage.getItem('swh-vault-cooking-tasks'));
+ for (let i = 0; i < vaultCookingTasks.length; ++i) {
+ if (vaultCookingTasks[i].fetch_url === fetchUrl) {
+ recookTask = vaultCookingTasks[i];
+ break;
}
- });
+ }
+ // display a modal asking the user if he wants to recook the archive
+ $('#vault-recook-object-modal').modal('show');
+ }
}
// called when the user wants to recook an archive
// for which the download link is not available anymore
-export function recookObject() {
+export async function recookObject() {
if (recookTask) {
// stop cooking tasks status polling
clearTimeout(checkVaultId);
@@ -81,35 +80,35 @@
if (recookTask.email) {
cookingUrl += '?email=' + recookTask.email;
}
+ try {
// request archive cooking
- csrfPost(cookingUrl)
- .then(handleFetchError)
- .then(() => {
- // update task status
- recookTask.status = 'new';
- let vaultCookingTasks = JSON.parse(localStorage.getItem('swh-vault-cooking-tasks'));
- for (let i = 0; i < vaultCookingTasks.length; ++i) {
- if (vaultCookingTasks[i].object_id === recookTask.object_id) {
- vaultCookingTasks[i] = recookTask;
- break;
- }
+ const response = await csrfPost(cookingUrl);
+ handleFetchError(response);
+
+ // update task status
+ recookTask.status = 'new';
+ let vaultCookingTasks = JSON.parse(localStorage.getItem('swh-vault-cooking-tasks'));
+ for (let i = 0; i < vaultCookingTasks.length; ++i) {
+ if (vaultCookingTasks[i].object_id === recookTask.object_id) {
+ vaultCookingTasks[i] = recookTask;
+ break;
}
- // save updated tasks to local storage
- localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
- // restart cooking tasks status polling
- checkVaultCookingTasks();
- // hide recook archive modal
- $('#vault-recook-object-modal').modal('hide');
- })
+ }
+ // save updated tasks to local storage
+ localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
+ // restart cooking tasks status polling
+ checkVaultCookingTasks();
+ // hide recook archive modal
+ $('#vault-recook-object-modal').modal('hide');
+ } catch (_) {
// something went wrong
- .catch(() => {
- checkVaultCookingTasks();
- $('#vault-recook-object-modal').modal('hide');
- });
+ checkVaultCookingTasks();
+ $('#vault-recook-object-modal').modal('hide');
+ }
}
}
-function checkVaultCookingTasks() {
+async function checkVaultCookingTasks() {
let vaultCookingTasks = JSON.parse(localStorage.getItem('swh-vault-cooking-tasks'));
if (!vaultCookingTasks || vaultCookingTasks.length === 0) {
$('.swh-vault-table tbody tr').remove();
@@ -140,62 +139,63 @@
$(row).remove();
}
});
- Promise.all(cookingTaskRequests)
- .then(handleFetchErrors)
- .then(responses => Promise.all(responses.map(r => r.json())))
- .then(cookingTasks => {
- let table = $('#vault-cooking-tasks tbody');
- for (let i = 0; i < cookingTasks.length; ++i) {
- let cookingTask = tasks[cookingTasks[i].obj_id];
- cookingTask.status = cookingTasks[i].status;
- cookingTask.fetch_url = cookingTasks[i].fetch_url;
- cookingTask.progress_message = cookingTasks[i].progress_message;
- }
- for (let i = 0; i < vaultCookingTasks.length; ++i) {
- let cookingTask = vaultCookingTasks[i];
- let rowTask = $(`#vault-task-${cookingTask.object_id}`);
-
- if (!rowTask.length) {
-
- let browseUrl = cookingTask.browse_url;
- if (!browseUrl) {
- if (cookingTask.object_type === 'directory') {
- browseUrl = Urls.browse_directory(cookingTask.object_id);
- } else {
- browseUrl = Urls.browse_revision(cookingTask.object_id);
- }
+ try {
+ const responses = await Promise.all(cookingTaskRequests);
+ handleFetchErrors(responses);
+ const cookingTasks = await Promise.all(responses.map(r => r.json()));
+
+ let table = $('#vault-cooking-tasks tbody');
+ for (let i = 0; i < cookingTasks.length; ++i) {
+ let cookingTask = tasks[cookingTasks[i].obj_id];
+ cookingTask.status = cookingTasks[i].status;
+ cookingTask.fetch_url = cookingTasks[i].fetch_url;
+ cookingTask.progress_message = cookingTasks[i].progress_message;
+ }
+ for (let i = 0; i < vaultCookingTasks.length; ++i) {
+ let cookingTask = vaultCookingTasks[i];
+ let rowTask = $(`#vault-task-${cookingTask.object_id}`);
+
+ if (!rowTask.length) {
+
+ let browseUrl = cookingTask.browse_url;
+ if (!browseUrl) {
+ if (cookingTask.object_type === 'directory') {
+ browseUrl = Urls.browse_directory(cookingTask.object_id);
+ } else {
+ browseUrl = Urls.browse_revision(cookingTask.object_id);
}
+ }
- let progressBar = $.parseHTML(progress)[0];
- let progressBarContent = $(progressBar).find('.progress-bar');
- updateProgressBar(progressBarContent, cookingTask);
- table.prepend(vaultTableRowTemplate({
- browseUrl: browseUrl,
- cookingTask: cookingTask,
- progressBar: progressBar,
- Urls: Urls,
- swh: swh
- }));
- } else {
- let progressBar = rowTask.find('.progress-bar');
- updateProgressBar(progressBar, cookingTask);
- let downloadLink = rowTask.find('.vault-dl-link');
- if (cookingTask.status === 'done') {
- downloadLink[0].innerHTML =
+ let progressBar = $.parseHTML(progress)[0];
+ let progressBarContent = $(progressBar).find('.progress-bar');
+ updateProgressBar(progressBarContent, cookingTask);
+ table.prepend(vaultTableRowTemplate({
+ browseUrl: browseUrl,
+ cookingTask: cookingTask,
+ progressBar: progressBar,
+ Urls: Urls,
+ swh: swh
+ }));
+ } else {
+ let progressBar = rowTask.find('.progress-bar');
+ updateProgressBar(progressBar, cookingTask);
+ let downloadLink = rowTask.find('.vault-dl-link');
+ if (cookingTask.status === 'done') {
+ downloadLink[0].innerHTML =
'<button class="btn btn-default btn-sm" ' +
`onclick="swh.vault.fetchCookedObject('${cookingTask.fetch_url}')">` +
'<i class="mdi mdi-download mdi-fw" aria-hidden="true"></i>Download</button>';
- } else {
- downloadLink[0].innerHTML = '';
- }
+ } else {
+ downloadLink[0].innerHTML = '';
}
}
- localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
- checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval);
- })
- .catch(error => {
- console.log('Error when fetching vault cooking tasks:', error);
- });
+ }
+ localStorage.setItem('swh-vault-cooking-tasks', JSON.stringify(vaultCookingTasks));
+ checkVaultId = setTimeout(checkVaultCookingTasks, pollingInterval);
+
+ } catch (error) {
+ console.log('Error when fetching vault cooking tasks:', error);
+ }
}
export function removeCookingTaskInfo(tasksToRemove) {
diff --git a/assets/src/bundles/webapp/notebook-rendering.js b/assets/src/bundles/webapp/notebook-rendering.js
--- a/assets/src/bundles/webapp/notebook-rendering.js
+++ b/assets/src/bundles/webapp/notebook-rendering.js
@@ -120,18 +120,17 @@
nb.highlighter = highlightCode;
nb.ansi = renderAnsi;
- fetch(nbJsonUrl)
- .then(response => response.json())
- .then(nbJson => {
- // parse the notebook
- let notebook = nb.parse(nbJson);
- // render it to HTML and apply XSS filtering
- let rendered = swh.webapp.filterXSS(notebook.render());
- // insert rendered notebook in the DOM
- $(domElt).append(rendered);
- // set light red background color for stderr output cells
- $('pre.nb-stderr').parent().css('background', '#fdd');
- // load MathJax library for math typesetting
- swh.webapp.typesetMath();
- });
+ const response = await fetch(nbJsonUrl);
+ const nbJson = await response.json();
+
+ // parse the notebook
+ let notebook = nb.parse(nbJson);
+ // render it to HTML and apply XSS filtering
+ let rendered = swh.webapp.filterXSS(notebook.render());
+ // insert rendered notebook in the DOM
+ $(domElt).append(rendered);
+ // set light red background color for stderr output cells
+ $('pre.nb-stderr').parent().css('background', '#fdd');
+ // load MathJax library for math typesetting
+ swh.webapp.typesetMath();
}
diff --git a/assets/src/bundles/webapp/pdf-rendering.js b/assets/src/bundles/webapp/pdf-rendering.js
--- a/assets/src/bundles/webapp/pdf-rendering.js
+++ b/assets/src/bundles/webapp/pdf-rendering.js
@@ -20,34 +20,33 @@
let ctx = canvas.getContext('2d');
// Get page info from document, resize canvas accordingly, and render page.
- function renderPage(num) {
+ async function renderPage(num) {
pageRendering = true;
// Using promise to fetch the page
- pdfDoc.getPage(num).then(page => {
- let divWidth = $('.swh-content').width();
- let scale = Math.min(defaultScale, divWidth / page.getViewport({scale: 1.0}).width);
-
- let viewport = page.getViewport({scale: scale});
- canvas.width = viewport.width;
- canvas.height = viewport.height;
-
- // Render PDF page into canvas context
- let renderContext = {
- canvasContext: ctx,
- viewport: viewport
- };
- let renderTask = page.render(renderContext);
-
- // Wait for rendering to finish
- renderTask.promise.then(() => {
- pageRendering = false;
- if (pageNumPending !== null) {
- // New page rendering is pending
- renderPage(pageNumPending);
- pageNumPending = null;
- }
- });
- });
+ const page = await pdfDoc.getPage(num);
+
+ let divWidth = $('.swh-content').width();
+ let scale = Math.min(defaultScale, divWidth / page.getViewport({scale: 1.0}).width);
+
+ let viewport = page.getViewport({scale: scale});
+ canvas.width = viewport.width;
+ canvas.height = viewport.height;
+
+ // Render PDF page into canvas context
+ const renderContext = {
+ canvasContext: ctx,
+ viewport: viewport
+ };
+
+ // Wait for rendering to finish
+ await page.render(renderContext);
+
+ pageRendering = false;
+ if (pageNumPending !== null) {
+ // New page rendering is pending
+ renderPage(pageNumPending);
+ pageNumPending = null;
+ }
// Update page counters
$('#pdf-page-num').text(num);
@@ -85,19 +84,19 @@
pdfjs.GlobalWorkerOptions.workerSrc = staticAsset('js/pdf.worker.min.js');
- $(document).ready(() => {
+ $(document).ready(async() => {
$('#pdf-prev').click(onPrevPage);
$('#pdf-next').click(onNextPage);
- let loadingTask = pdfjs.getDocument(pdfUrl);
- loadingTask.promise.then(pdf => {
+ try {
+ const pdf = await pdfjs.getDocument(pdfUrl).promise;
pdfDoc = pdf;
$('#pdf-page-count').text(pdfDoc.numPages);
// Initial/first page rendering
renderPage(pageNum);
- }, function(reason) {
+ } catch (reason) {
// PDF loading error
console.error(reason);
- });
+ }
// Render PDF on resize
$(window).on('resize', function() {
diff --git a/assets/src/bundles/webapp/readme-rendering.js b/assets/src/bundles/webapp/readme-rendering.js
--- a/assets/src/bundles/webapp/readme-rendering.js
+++ b/assets/src/bundles/webapp/readme-rendering.js
@@ -1,5 +1,5 @@
/**
- * Copyright (C) 2018-2019 The Software Heritage developers
+ * Copyright (C) 2018-2021 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
@@ -47,21 +47,21 @@
}];
}
- $(document).ready(() => {
+ $(document).ready(async() => {
let converter = new showdown.Converter({
tables: true,
extensions: [showdownHighlight]
});
- fetch(markdownDocUrl)
- .then(handleFetchError)
- .then(response => response.text())
- .then(data => {
- $(domElt).addClass('swh-showdown');
- $(domElt).html(swh.webapp.filterXSS(converter.makeHtml(data)));
- })
- .catch(() => {
- $(domElt).text('Readme bytes are not available');
- });
+
+ try {
+ const response = await fetch(markdownDocUrl);
+ handleFetchError(response);
+ const data = await response.text();
+ $(domElt).addClass('swh-showdown');
+ $(domElt).html(swh.webapp.filterXSS(converter.makeHtml(data)));
+ } catch (_) {
+ $(domElt).text('Readme bytes are not available');
+ }
});
}
@@ -83,41 +83,36 @@
}
export function renderOrg(domElt, orgDocUrl) {
-
- $(document).ready(() => {
- fetch(orgDocUrl)
- .then(handleFetchError)
- .then(response => response.text())
- .then(data => {
- renderOrgData(domElt, data);
- })
- .catch(() => {
- $(domElt).text('Readme bytes are not available');
- });
+ $(document).ready(async() => {
+ try {
+ const response = await fetch(orgDocUrl);
+ handleFetchError(response);
+ const data = await response.text();
+ renderOrgData(domElt, data);
+ } catch (_) {
+ $(domElt).text('Readme bytes are not available');
+ }
});
-
}
export function renderTxt(domElt, txtDocUrl) {
-
- $(document).ready(() => {
- fetch(txtDocUrl)
- .then(handleFetchError)
- .then(response => response.text())
- .then(data => {
- let orgMode = '-*- mode: org -*-';
- if (data.indexOf(orgMode) !== -1) {
- renderOrgData(domElt, data.replace(orgMode, ''));
- } else {
- $(domElt).addClass('swh-readme-txt');
- $(domElt)
+ $(document).ready(async() => {
+ try {
+ const response = await fetch(txtDocUrl);
+ handleFetchError(response);
+ const data = await response.text();
+
+ let orgMode = '-*- mode: org -*-';
+ if (data.indexOf(orgMode) !== -1) {
+ renderOrgData(domElt, data.replace(orgMode, ''));
+ } else {
+ $(domElt).addClass('swh-readme-txt');
+ $(domElt)
.html('')
.append($('<pre></pre>').text(data));
- }
- })
- .catch(() => {
- $(domElt).text('Readme bytes are not available');
- });
+ }
+ } catch (_) {
+ $(domElt).text('Readme bytes are not available');
+ }
});
-
}
diff --git a/assets/src/bundles/webapp/status-widget.js b/assets/src/bundles/webapp/status-widget.js
--- a/assets/src/bundles/webapp/status-widget.js
+++ b/assets/src/bundles/webapp/status-widget.js
@@ -17,34 +17,34 @@
};
export function initStatusWidget(statusDataURL) {
- $('.swh-current-status-indicator').ready(() => {
+ $('.swh-current-status-indicator').ready(async() => {
let maxStatusCode = '';
let maxStatusDescription = '';
let sc = '';
let sd = '';
- fetch(statusDataURL)
- .then(resp => resp.json())
- .then(data => {
- for (let s of data.result.status) {
- sc = s.status_code;
- sd = s.status;
- if (maxStatusCode < sc) {
- maxStatusCode = sc;
- maxStatusDescription = sd;
- }
- }
- if (maxStatusCode === '') {
- $('.swh-current-status').remove();
- return;
+ try {
+ const response = await fetch(statusDataURL);
+ const data = await response.json();
+
+ for (let s of data.result.status) {
+ sc = s.status_code;
+ sd = s.status;
+ if (maxStatusCode < sc) {
+ maxStatusCode = sc;
+ maxStatusDescription = sd;
}
- $('.swh-current-status-indicator').removeClass('green');
- $('.swh-current-status-indicator').addClass(statusCodeColor[maxStatusCode]);
- $('#swh-current-status-description').text(maxStatusDescription);
- })
- .catch(e => {
- console.log(e);
+ }
+ if (maxStatusCode === '') {
$('.swh-current-status').remove();
- });
+ return;
+ }
+ $('.swh-current-status-indicator').removeClass('green');
+ $('.swh-current-status-indicator').addClass(statusCodeColor[maxStatusCode]);
+ $('#swh-current-status-description').text(maxStatusDescription);
+ } catch (e) {
+ console.log(e);
+ $('.swh-current-status').remove();
+ }
});
}
diff --git a/assets/src/bundles/webapp/webapp-utils.js b/assets/src/bundles/webapp/webapp-utils.js
--- a/assets/src/bundles/webapp/webapp-utils.js
+++ b/assets/src/bundles/webapp/webapp-utils.js
@@ -200,37 +200,36 @@
}
export function initHomePage() {
- $(document).ready(() => {
+ $(document).ready(async() => {
$('.swh-coverage-list').iFrameResize({heightCalculationMethod: 'taggedElement'});
- fetch(Urls.stat_counters())
- .then(response => response.json())
- .then(data => {
- if (data.stat_counters && !$.isEmptyObject(data.stat_counters)) {
- for (let objectType of ['content', 'revision', 'origin', 'directory', 'person', 'release']) {
- const count = data.stat_counters[objectType];
- if (count !== undefined) {
- $(`#swh-${objectType}-count`).html(count.toLocaleString());
- } else {
- $(`#swh-${objectType}-count`).closest('.swh-counter-container').hide();
- }
- }
+ const response = await fetch(Urls.stat_counters());
+ const data = await response.json();
+
+ if (data.stat_counters && !$.isEmptyObject(data.stat_counters)) {
+ for (let objectType of ['content', 'revision', 'origin', 'directory', 'person', 'release']) {
+ const count = data.stat_counters[objectType];
+ if (count !== undefined) {
+ $(`#swh-${objectType}-count`).html(count.toLocaleString());
} else {
- $('.swh-counter').html('0');
+ $(`#swh-${objectType}-count`).closest('.swh-counter-container').hide();
}
- if (data.stat_counters_history && !$.isEmptyObject(data.stat_counters_history)) {
- for (let objectType of ['content', 'revision', 'origin']) {
- const history = data.stat_counters_history[objectType];
- if (history) {
- swh.webapp.drawHistoryCounterGraph(`#swh-${objectType}-count-history`, history);
- } else {
- $(`#swh-${objectType}-count-history`).hide();
- }
-
- }
+ }
+ } else {
+ $('.swh-counter').html('0');
+ }
+ if (data.stat_counters_history && !$.isEmptyObject(data.stat_counters_history)) {
+ for (let objectType of ['content', 'revision', 'origin']) {
+ const history = data.stat_counters_history[objectType];
+ if (history) {
+ swh.webapp.drawHistoryCounterGraph(`#swh-${objectType}-count-history`, history);
} else {
- $('.swh-counter-history').hide();
+ $(`#swh-${objectType}-count-history`).hide();
}
- });
+
+ }
+ } else {
+ $('.swh-counter-history').hide();
+ }
});
initPage('home');
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jun 20, 9:04 PM (4 w, 1 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3228665
Attached To
D5866: assets: Simplify promises handling with js async/await syntax
Event Timeline
Log In to Comment