From d772cdf13c60756eaa06273804156b59aec910de Mon Sep 17 00:00:00 2001 From: Paul Date: Mon, 18 Nov 2024 13:53:29 +0100 Subject: [PATCH 1/4] Improve robustness of GitHub repo URL parsing For example this works now: https://github.com/MichaelAquilina/zsh-auto-notify/pull/67/files Previously `67` was taken as the repo owner and `files` as the repo name. --- website/src/queries-init.js | 10 +++++++++- website/src/queries-logic.js | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/website/src/queries-init.js b/website/src/queries-init.js index 5b977a47..53cdfc49 100644 --- a/website/src/queries-init.js +++ b/website/src/queries-init.js @@ -166,7 +166,15 @@ function getQueryOrDefault(defaultVal) { if (!JQ_REPO_FIELD.val()) { JQ_REPO_FIELD.val(defaultVal); } - return JQ_REPO_FIELD.val(); + + const val = JQ_REPO_FIELD.val(); + + const isShorthand = /^[\w\.-]+\/[\w\.-]+$/; + if (isShorthand.test(val)) { + return val; + } else { + return new URL(val).pathname; + } } function hideFilterContainer() { diff --git a/website/src/queries-logic.js b/website/src/queries-logic.js index c5599a96..43484c6a 100644 --- a/website/src/queries-logic.js +++ b/website/src/queries-logic.js @@ -471,11 +471,11 @@ function initiate_search() { clear_old_data(); let queryString = getQueryOrDefault("payne911/PieMenu"); - let queryValues = queryString.split('/').filter(Boolean); + let queryValues = queryString.split('/').filter(s => s.length > 0); let len = queryValues.length; if (len < 2) { - setMsg('Please enter a valid query: it should contain two strings separated by a "/"'); + setMsg('Please enter a valid query: it should contain two strings separated by a "/", or the full URL to a GitHub repo'); ga_faultyQuery(queryString); return; // abort } @@ -486,8 +486,8 @@ function initiate_search() { hideFilterContainer(); setMsg(UF_MSG_SCANNING); - const user = queryValues[len - 2]; - const repo = queryValues[len - 1]; + const user = queryValues[0]; + const repo = queryValues[1]; if (history.replaceState) { history.replaceState({}, document.title, `?repo=${user}/${repo}`); // replace current URL param } From a845ae469c57e45068fdb712a13a0b318ad8fd76 Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 3 Dec 2024 23:09:21 +0100 Subject: [PATCH 2/4] Add comment about the `user/repo` input format Co-authored-by: payne911 <38117856+payne911@users.noreply.github.com> --- website/src/queries-init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/queries-init.js b/website/src/queries-init.js index 53cdfc49..41b12206 100644 --- a/website/src/queries-init.js +++ b/website/src/queries-init.js @@ -171,7 +171,7 @@ function getQueryOrDefault(defaultVal) { const isShorthand = /^[\w\.-]+\/[\w\.-]+$/; if (isShorthand.test(val)) { - return val; + return val; // we are dealing with "user/repo" input format } else { return new URL(val).pathname; } From 396cc36077b312c333937452867daaeba9fb1efe Mon Sep 17 00:00:00 2001 From: Paul Date: Tue, 3 Dec 2024 23:51:47 +0100 Subject: [PATCH 3/4] Refactor GitHub repo URL parsing --- website/src/queries-init.js | 10 +--------- website/src/queries-logic.js | 35 +++++++++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/website/src/queries-init.js b/website/src/queries-init.js index 41b12206..5b977a47 100644 --- a/website/src/queries-init.js +++ b/website/src/queries-init.js @@ -166,15 +166,7 @@ function getQueryOrDefault(defaultVal) { if (!JQ_REPO_FIELD.val()) { JQ_REPO_FIELD.val(defaultVal); } - - const val = JQ_REPO_FIELD.val(); - - const isShorthand = /^[\w\.-]+\/[\w\.-]+$/; - if (isShorthand.test(val)) { - return val; // we are dealing with "user/repo" input format - } else { - return new URL(val).pathname; - } + return JQ_REPO_FIELD.val(); } function hideFilterContainer() { diff --git a/website/src/queries-logic.js b/website/src/queries-logic.js index 43484c6a..ff5a2bb2 100644 --- a/website/src/queries-logic.js +++ b/website/src/queries-logic.js @@ -462,8 +462,32 @@ function initial_request(user, repo) { } /** Extracts and sanitizes 'user' and 'repo' values from potential inputs. */ -function initiate_search() { +function parse_query(queryString) { + const shorthand = /^(?[\w.-]+)\/(?[\w.-]+)$/; + const shorthandMatch = shorthand.exec(queryString); + + if (shorthandMatch) { // we are dealing with "user/repo" input format + const {user, repo} = shorthandMatch.groups; + return {user, repo}; + } + + let pathname; + try { + pathname = new URL(queryString).pathname; + } catch { + return null; + } + + const values = pathname.split('/').filter(s => s.length > 0); + if (values.length < 2) + return null; + const [user, repo] = values; + return {user, repo}; +} + + +function initiate_search() { /* Checking if search is allowed. */ if (searchNotAllowed()) return; // abort @@ -471,23 +495,22 @@ function initiate_search() { clear_old_data(); let queryString = getQueryOrDefault("payne911/PieMenu"); - let queryValues = queryString.split('/').filter(s => s.length > 0); + const queryValues = parse_query(queryString); - let len = queryValues.length; - if (len < 2) { + if (!queryValues) { setMsg('Please enter a valid query: it should contain two strings separated by a "/", or the full URL to a GitHub repo'); ga_faultyQuery(queryString); return; // abort } + const {user, repo} = queryValues; + setUpOctokitWithLatestToken(); setQueryFieldsAsLoading(); hideFilterContainer(); setMsg(UF_MSG_SCANNING); - const user = queryValues[0]; - const repo = queryValues[1]; if (history.replaceState) { history.replaceState({}, document.title, `?repo=${user}/${repo}`); // replace current URL param } From 6fb7c1d02e1d2ee7045594bf56a2acb6f2e19571 Mon Sep 17 00:00:00 2001 From: Paul Date: Wed, 4 Dec 2024 00:09:11 +0100 Subject: [PATCH 4/4] Update user query with the parsed GitHub user/repo --- website/src/queries-init.js | 4 ++++ website/src/queries-logic.js | 1 + 2 files changed, 5 insertions(+) diff --git a/website/src/queries-init.js b/website/src/queries-init.js index 5b977a47..7c104e47 100644 --- a/website/src/queries-init.js +++ b/website/src/queries-init.js @@ -169,6 +169,10 @@ function getQueryOrDefault(defaultVal) { return JQ_REPO_FIELD.val(); } +function setQuery(query) { + JQ_REPO_FIELD.val(query); +} + function hideFilterContainer() { JQ_FILTER_CONTAINER.hide(); } diff --git a/website/src/queries-logic.js b/website/src/queries-logic.js index ff5a2bb2..733ff2ca 100644 --- a/website/src/queries-logic.js +++ b/website/src/queries-logic.js @@ -507,6 +507,7 @@ function initiate_search() { setUpOctokitWithLatestToken(); + setQuery(`${user}/${repo}`); setQueryFieldsAsLoading(); hideFilterContainer(); setMsg(UF_MSG_SCANNING);