Date: Sat, 13 May 2023 13:27:32 +0300
Subject: [PATCH 08/86] fix(README.md): fix discord invite link
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c2e101b..bbd9c19 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
Websurfx
Readme |
- Discord |
+ Discord |
GitHub |
Documentation
From 3be13d0ab61bcbe8352e493542eafadfe89743db Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 19:16:15 +0300
Subject: [PATCH 09/86] ci: add rust specific ci and auto-gen oss standard
labels
---
.github/workflows/clippy.yml | 16 ++++++++++++++++
.github/workflows/labels.yml | 21 +++++++++++++++++++++
.github/workflows/releases.yml | 2 +-
.github/workflows/rust_cache.yml | 8 ++++++++
.github/workflows/rustfmt.yml | 15 +++++++++++++++
.github/workflows/stale.yml | 27 +++++++++++++++++++++++++++
README.md | 5 +----
7 files changed, 89 insertions(+), 5 deletions(-)
create mode 100644 .github/workflows/clippy.yml
create mode 100644 .github/workflows/labels.yml
create mode 100644 .github/workflows/rust_cache.yml
create mode 100644 .github/workflows/rustfmt.yml
create mode 100644 .github/workflows/stale.yml
diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml
new file mode 100644
index 0000000..aa387aa
--- /dev/null
+++ b/.github/workflows/clippy.yml
@@ -0,0 +1,16 @@
+name: Clippy check
+on:
+ push:
+ branches:
+ - rolling
+
+jobs:
+ clippy_check:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - run: rustup component add clippy
+ - uses: actions-rs/clippy-check@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ args: --all-features
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
new file mode 100644
index 0000000..ce60759
--- /dev/null
+++ b/.github/workflows/labels.yml
@@ -0,0 +1,21 @@
+name: Import open source standard labels
+
+on:
+ push:
+ branches: [ main ]
+
+jobs:
+ labels:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/setup-node@v2
+ with:
+ node-version: '14'
+ - uses: EddieHubCommunity/gh-action-open-source-labels@main
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ owner-name: ${{ github.repository_owner }}
+ repository-name: ${{ github.event.repository.name }}
+ force: true # optional to clear existing labels, default to true
diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml
index 88c78fb..446ee9b 100644
--- a/.github/workflows/releases.yml
+++ b/.github/workflows/releases.yml
@@ -67,7 +67,7 @@ jobs:
uses: actions/create-release@v1
if: steps.changelog.outputs.skipped == 'false'
env:
- GITHUB_TOKEN: ${{ secrets.CHANGELOG_RELEASE }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.changelog.outputs.tag }}
release_name: ${{ steps.changelog.outputs.tag }}
diff --git a/.github/workflows/rust_cache.yml b/.github/workflows/rust_cache.yml
new file mode 100644
index 0000000..ff3c06f
--- /dev/null
+++ b/.github/workflows/rust_cache.yml
@@ -0,0 +1,8 @@
+- name: Cache Rust compilation
+ uses: metalbear-co/sccache-action@v1
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ # Optional, default is `sccache-`
+ cache-from: sccache-${{ runner.os }}-
+ # Optional, default is `sccache-latest`
+ cache-to: sccache-${{ runner.os }}-${{ github.sha }}
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
new file mode 100644
index 0000000..eb4e5c0
--- /dev/null
+++ b/.github/workflows/rustfmt.yml
@@ -0,0 +1,15 @@
+name: Rustfmt
+on:
+ push:
+ branches:
+ - rolling
+
+jobs:
+ format:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: dtolnay/rust-toolchain@stable
+ - uses: mbrobbel/rustfmt-check@master
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 0000000..1e1e6f0
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,27 @@
+# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
+#
+# You can adjust the behavior by modifying this file.
+# For more information, see:
+# https://github.com/actions/stale
+name: Mark stale issues and pull requests
+
+on:
+ schedule:
+ - cron: '30 1 * * *'
+
+jobs:
+ stale:
+
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+
+ steps:
+ - uses: actions/stale@v5
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ stale-issue-message: 'Stale issue message'
+ stale-pr-message: 'Stale pull request message'
+ stale-issue-label: 'no-issue-activity'
+ stale-pr-label: 'no-pr-activity'
diff --git a/README.md b/README.md
index bbd9c19..feda1ae 100644
--- a/README.md
+++ b/README.md
@@ -126,9 +126,6 @@
- 🔐 Fast, private and secure
- 🆓 100% free and open source
- 🧹 Ad free and clean results
-- 🧠 AI integration (coming soon)
-- ⛔ Proper NSFW blocking (coming soon)
-- 🔍 Advanced image search (coming soon)
- 🌈 and lots more...
**[⬆️ Back to Top](#websurfx)**
@@ -209,7 +206,7 @@ We are looking for more willing contributors to help grow this project.For more
> For full details and other ways you can help out, see: [**Contributing**]()
-If you're using Dashy and would like to help support its development, then that would be awesome! Contributions of any type, any size, are always very much appreciated, and we will appropriately credit you for your effort.
+If you're using Websurfx and would like to help support its development, then that would be awesome! Contributions of any type, any size, are always very much appreciated, and we will appropriately credit you for your effort.
Several areas that we need a bit of help with at the moment are:
- **Better and more colorchemes** - Help fix colorchemes and add other famous colorchemes.
From c2262cc38a839bb567067baa219046d99b4cd2f6 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 19:24:45 +0300
Subject: [PATCH 10/86] fix: fix rust.yml and add caching to it
---
.github/workflows/rust.yml | 8 ++++++++
.github/workflows/rust_cache.yml | 8 --------
2 files changed, 8 insertions(+), 8 deletions(-)
delete mode 100644 .github/workflows/rust_cache.yml
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index af47bad..dd48c6d 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -20,6 +20,14 @@ jobs:
- stable
steps:
+ - name: Cache Rust compilation
+ uses: metalbear-co/sccache-action@v1
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ # Optional, default is `sccache-`
+ cache-from: sccache-${{ runner.os }}-
+ # Optional, default is `sccache-latest`
+ cache-to: sccache-${{ runner.os }}-${{ github.sha }}
- uses: actions/checkout@v3
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
- name: Build
diff --git a/.github/workflows/rust_cache.yml b/.github/workflows/rust_cache.yml
deleted file mode 100644
index ff3c06f..0000000
--- a/.github/workflows/rust_cache.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-- name: Cache Rust compilation
- uses: metalbear-co/sccache-action@v1
- with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- # Optional, default is `sccache-`
- cache-from: sccache-${{ runner.os }}-
- # Optional, default is `sccache-latest`
- cache-to: sccache-${{ runner.os }}-${{ github.sha }}
From ed82943702f3a93a1fa2cc381f1eb9b28f3fa299 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 19:31:37 +0300
Subject: [PATCH 11/86] fix: fix rust.yml caching
---
.github/workflows/rust.yml | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index dd48c6d..bc62ede 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -20,14 +20,20 @@ jobs:
- stable
steps:
- - name: Cache Rust compilation
- uses: metalbear-co/sccache-action@v1
+ - uses: actions/checkout@v3
+ - run: rustup toolchain install stable --profile minimal
+ - uses: Swatinem/rust-cache@v2
with:
- github-token: ${{ secrets.GITHUB_TOKEN }}
- # Optional, default is `sccache-`
- cache-from: sccache-${{ runner.os }}-
- # Optional, default is `sccache-latest`
- cache-to: sccache-${{ runner.os }}-${{ github.sha }}
+ prefix-key: ""
+ shared-key: ""
+ key: ""
+ env-vars: ""
+ workspaces: ""
+ cache-directories: ""
+ cache-targets: ""
+ cache-on-failure: ""
+ cache-all-crates: ""
+ save-if: ""
- uses: actions/checkout@v3
- run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }}
- name: Build
From a569f077cb8a641c2f3dd355a6d078c5347b7d8d Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 19:36:11 +0300
Subject: [PATCH 12/86] ci: updating github cis
---
.github/workflows/clippy.yml | 5 ++++-
.github/workflows/labels.yml | 3 ++-
.github/workflows/rustfmt.yml | 5 ++++-
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml
index aa387aa..c5e9d2e 100644
--- a/.github/workflows/clippy.yml
+++ b/.github/workflows/clippy.yml
@@ -2,7 +2,10 @@ name: Clippy check
on:
push:
branches:
- - rolling
+ - "**"
+ pull_request:
+ branches:
+ - "rolling"
jobs:
clippy_check:
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index ce60759..7cae050 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -2,7 +2,8 @@ name: Import open source standard labels
on:
push:
- branches: [ main ]
+ branches:
+ - main
jobs:
labels:
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
index eb4e5c0..cf605bc 100644
--- a/.github/workflows/rustfmt.yml
+++ b/.github/workflows/rustfmt.yml
@@ -2,7 +2,10 @@ name: Rustfmt
on:
push:
branches:
- - rolling
+ - "**"
+ pull_request:
+ branches:
+ - "rolling"
jobs:
format:
From 36aa2f9e8699ed783368333a434418a7ad3fcb8a Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 19:45:59 +0300
Subject: [PATCH 13/86] ci: updating github cis
---
.github/workflows/labels.yml | 2 +-
.github/workflows/releases.yml | 2 +-
.github/workflows/rustfmt.yml | 19 ++++++++++++++-----
3 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index 7cae050..f90801a 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -3,7 +3,7 @@ name: Import open source standard labels
on:
push:
branches:
- - main
+ - master
jobs:
labels:
diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml
index 446ee9b..e46c5aa 100644
--- a/.github/workflows/releases.yml
+++ b/.github/workflows/releases.yml
@@ -2,7 +2,7 @@ name: Releases
on:
push:
branches:
- - rolling
+ - "rolling"
concurrency:
group: "rolling-branch"
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
index cf605bc..7570f8d 100644
--- a/.github/workflows/rustfmt.yml
+++ b/.github/workflows/rustfmt.yml
@@ -9,10 +9,19 @@ on:
jobs:
format:
+ name: rustfmt
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: dtolnay/rust-toolchain@stable
- - uses: mbrobbel/rustfmt-check@master
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
+ - uses: actions/checkout@v2
+ - uses: actions-rs/toolchain@v1
+ with:
+ toolchain: nightly
+ components: rustfmt
+ override: true
+ - uses: LoliGothick/rustfmt-check@master
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ flags: --all
+ options: --manifest-path=Cargo.toml
+ args: --config-path=rustfmt.toml
+ working-directory: my_crate
From b4a05bc940e9e7da1a8284d63fb5cc787f55aa69 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 20:03:07 +0300
Subject: [PATCH 14/86] ci: fix clippy.yml
---
.github/workflows/clippy.yml | 4 ++--
.github/workflows/rustfmt.yml | 26 +++++++++++---------------
2 files changed, 13 insertions(+), 17 deletions(-)
diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml
index c5e9d2e..51b9666 100644
--- a/.github/workflows/clippy.yml
+++ b/.github/workflows/clippy.yml
@@ -15,5 +15,5 @@ jobs:
- run: rustup component add clippy
- uses: actions-rs/clippy-check@v1
with:
- token: ${{ secrets.GITHUB_TOKEN }}
- args: --all-features
+ token: ${{ secrets.GITHUB_TOKEN }}
+ args: --all-targets --all-features -- -D warnings
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
index 7570f8d..3d43305 100644
--- a/.github/workflows/rustfmt.yml
+++ b/.github/workflows/rustfmt.yml
@@ -8,20 +8,16 @@ on:
- "rolling"
jobs:
- format:
- name: rustfmt
+ formatting:
+ name: cargo fmt
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions-rs/toolchain@v1
- with:
- toolchain: nightly
- components: rustfmt
- override: true
- - uses: LoliGothick/rustfmt-check@master
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- flags: --all
- options: --manifest-path=Cargo.toml
- args: --config-path=rustfmt.toml
- working-directory: my_crate
+ - uses: actions/checkout@v3
+ # Ensure rustfmt is installed and setup problem matcher
+ - uses: actions-rust-lang/setup-rust-toolchain@v1
+ with:
+ components: rustfmt
+ - name: Rustfmt Check
+ uses: Syndelis/rustfmt-action@v1
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
From a7229b5ee4d7c29ff1ea824340963c4546779ce6 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 17:07:22 +0000
Subject: [PATCH 15/86] Update rustfmt.yml
---
.github/workflows/rustfmt.yml | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
index 3d43305..7f5d33a 100644
--- a/.github/workflows/rustfmt.yml
+++ b/.github/workflows/rustfmt.yml
@@ -18,6 +18,4 @@ jobs:
with:
components: rustfmt
- name: Rustfmt Check
- uses: Syndelis/rustfmt-action@v1
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
+ uses: actions-rust-lang/rustfmt@v1
From 0dedddf8af9353cf72b039351caf40d03ebc62be Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 17:10:26 +0000
Subject: [PATCH 16/86] Update rustfmt.yml
---
.github/workflows/rustfmt.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
index 7f5d33a..5f184a9 100644
--- a/.github/workflows/rustfmt.yml
+++ b/.github/workflows/rustfmt.yml
@@ -8,7 +8,7 @@ on:
- "rolling"
jobs:
- formatting:
+ formatting:
name: cargo fmt
runs-on: ubuntu-latest
steps:
From 0b56a7aa630fd0d565387c401a2fd33b0677e511 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 20:32:33 +0300
Subject: [PATCH 17/86] ci: fix github cis
---
.github/workflows/clippy.yml | 19 -------------------
.github/workflows/rust_format.yml | 26 ++++++++++++++++++++++++++
.github/workflows/rustfmt.yml | 23 -----------------------
3 files changed, 26 insertions(+), 42 deletions(-)
delete mode 100644 .github/workflows/clippy.yml
create mode 100644 .github/workflows/rust_format.yml
delete mode 100644 .github/workflows/rustfmt.yml
diff --git a/.github/workflows/clippy.yml b/.github/workflows/clippy.yml
deleted file mode 100644
index 51b9666..0000000
--- a/.github/workflows/clippy.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-name: Clippy check
-on:
- push:
- branches:
- - "**"
- pull_request:
- branches:
- - "rolling"
-
-jobs:
- clippy_check:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - run: rustup component add clippy
- - uses: actions-rs/clippy-check@v1
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
- args: --all-targets --all-features -- -D warnings
diff --git a/.github/workflows/rust_format.yml b/.github/workflows/rust_format.yml
new file mode 100644
index 0000000..d865c8c
--- /dev/null
+++ b/.github/workflows/rust_format.yml
@@ -0,0 +1,26 @@
+name: Rust format and clippy checks
+on:
+ push:
+ branches:
+ - "**"
+ pull_request:
+ branches:
+ - "rolling"
+
+jobs:
+ check:
+ name: Rust project
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install minimal stable with clippy and rustfmt
+ uses: actions-rs/toolchain@v1
+ with:
+ profile: minimal
+ toolchain: stable
+ components: rustfmt, clippy
+
+ - name: Run cargo check
+ uses: actions-rs/cargo@v1
+ with:
+ command: check
diff --git a/.github/workflows/rustfmt.yml b/.github/workflows/rustfmt.yml
deleted file mode 100644
index 3d43305..0000000
--- a/.github/workflows/rustfmt.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: Rustfmt
-on:
- push:
- branches:
- - "**"
- pull_request:
- branches:
- - "rolling"
-
-jobs:
- formatting:
- name: cargo fmt
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v3
- # Ensure rustfmt is installed and setup problem matcher
- - uses: actions-rust-lang/setup-rust-toolchain@v1
- with:
- components: rustfmt
- - name: Rustfmt Check
- uses: Syndelis/rustfmt-action@v1
- with:
- github_token: ${{ secrets.GITHUB_TOKEN }}
From 6b76619bf59ca57e652762e4d51c0ce10483bfd9 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 20:48:57 +0300
Subject: [PATCH 18/86] ci: add merge gatekeeper github ci
---
.github/workflows/merge-gatekeeper.yml | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
create mode 100644 .github/workflows/merge-gatekeeper.yml
diff --git a/.github/workflows/merge-gatekeeper.yml b/.github/workflows/merge-gatekeeper.yml
new file mode 100644
index 0000000..3596370
--- /dev/null
+++ b/.github/workflows/merge-gatekeeper.yml
@@ -0,0 +1,20 @@
+---
+name: Merge Gatekeeper
+
+on:
+ pull_request:
+ branches:
+ - main
+ - master
+
+jobs:
+ merge-gatekeeper:
+ runs-on: ubuntu-latest
+ permissions:
+ checks: read
+ statuses: read
+ steps:
+ - name: Run Merge Gatekeeper
+ uses: upsidr/merge-gatekeeper@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
From 29c2702467dc479cd23acfbdf02abfc3b572e4d6 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 17:52:33 +0000
Subject: [PATCH 19/86] Update merge-gatekeeper.yml
---
.github/workflows/merge-gatekeeper.yml | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/.github/workflows/merge-gatekeeper.yml b/.github/workflows/merge-gatekeeper.yml
index 3596370..6de750c 100644
--- a/.github/workflows/merge-gatekeeper.yml
+++ b/.github/workflows/merge-gatekeeper.yml
@@ -4,8 +4,7 @@ name: Merge Gatekeeper
on:
pull_request:
branches:
- - main
- - master
+ - rolling
jobs:
merge-gatekeeper:
From 09e4395861db37f085a6666af2be49fcf8325935 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sat, 13 May 2023 21:07:12 +0300
Subject: [PATCH 20/86] ci: remove merge gatekeeper github ci
---
.github/workflows/merge-gatekeeper.yml | 20 --------------------
1 file changed, 20 deletions(-)
delete mode 100644 .github/workflows/merge-gatekeeper.yml
diff --git a/.github/workflows/merge-gatekeeper.yml b/.github/workflows/merge-gatekeeper.yml
deleted file mode 100644
index 3596370..0000000
--- a/.github/workflows/merge-gatekeeper.yml
+++ /dev/null
@@ -1,20 +0,0 @@
----
-name: Merge Gatekeeper
-
-on:
- pull_request:
- branches:
- - main
- - master
-
-jobs:
- merge-gatekeeper:
- runs-on: ubuntu-latest
- permissions:
- checks: read
- statuses: read
- steps:
- - name: Run Merge Gatekeeper
- uses: upsidr/merge-gatekeeper@v1
- with:
- token: ${{ secrets.GITHUB_TOKEN }}
From b0578c456795cddea5fc77838e85797a210b9942 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sun, 14 May 2023 13:24:36 +0300
Subject: [PATCH 21/86] ci: fix labels autogeneration github ci
---
.github/workflows/labels.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index f90801a..996862f 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -19,4 +19,4 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
owner-name: ${{ github.repository_owner }}
repository-name: ${{ github.event.repository.name }}
- force: true # optional to clear existing labels, default to true
+ # force: true # optional to clear existing labels, default to true
From 2d218d6ebc73505c4f9b27cf7be3afdba6095b8e Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Sun, 14 May 2023 13:32:41 +0300
Subject: [PATCH 22/86] ci: fix labels/tags auto-generation on oss standards
github ci
---
.github/workflows/labels.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index 996862f..f90801a 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -19,4 +19,4 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
owner-name: ${{ github.repository_owner }}
repository-name: ${{ github.event.repository.name }}
- # force: true # optional to clear existing labels, default to true
+ force: true # optional to clear existing labels, default to true
From 3c7edb80d0663365c5828b95bf909af87bad857d Mon Sep 17 00:00:00 2001
From: XFFXFF <1247714429@qq.com>
Date: Mon, 15 May 2023 00:20:43 +0000
Subject: [PATCH 23/86] refactor: reduce connections created with RedisCache
---
.gitignore | 2 ++
src/cache/cacher.rs | 36 ++++++++++++++++--------------------
src/server/routes.rs | 12 +++++-------
3 files changed, 23 insertions(+), 27 deletions(-)
diff --git a/.gitignore b/.gitignore
index ea8c4bf..c39800b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
/target
+
+dump.rdb
\ No newline at end of file
diff --git a/src/cache/cacher.rs b/src/cache/cacher.rs
index 54d9a48..87a6c6d 100644
--- a/src/cache/cacher.rs
+++ b/src/cache/cacher.rs
@@ -10,9 +10,8 @@ use redis::{Client, Commands, Connection};
/// # Fields
///
/// * `redis_connection_url` - It stores the redis Connection url address.
-#[derive(Clone)]
pub struct RedisCache {
- redis_connection_url: String,
+ connection: Connection,
}
impl RedisCache {
@@ -21,10 +20,11 @@ impl RedisCache {
/// # Arguments
///
/// * `redis_connection_url` - It stores the redis Connection url address.
- pub fn new(redis_connection_url: String) -> Self {
- RedisCache {
- redis_connection_url,
- }
+ pub fn new(redis_connection_url: String) -> Result> {
+ let client = Client::open(redis_connection_url)?;
+ let connection = client.get_connection()?;
+ let redis_cache = RedisCache { connection };
+ Ok(redis_cache)
}
/// A helper function which computes the hash of the url and formats and returns it as string.
@@ -32,7 +32,7 @@ impl RedisCache {
/// # Arguments
///
/// * `url` - It takes an url as string.
- fn compute_url_hash(self, url: &str) -> String {
+ fn compute_url_hash(url: &str) -> String {
format!("{:?}", compute(url))
}
@@ -41,11 +41,9 @@ impl RedisCache {
/// # Arguments
///
/// * `url` - It takes an url as a string.
- pub fn cached_results_json(self, url: String) -> Result> {
- let hashed_url_string = self.clone().compute_url_hash(&url);
- let mut redis_connection: Connection =
- Client::open(self.redis_connection_url)?.get_connection()?;
- Ok(redis_connection.get(hashed_url_string)?)
+ pub fn cached_results_json(&mut self, url: &str) -> Result> {
+ let hashed_url_string = Self::compute_url_hash(url);
+ Ok(self.connection.get(hashed_url_string)?)
}
/// A function which caches the results by using the hashed `url` as the key and
@@ -57,20 +55,18 @@ impl RedisCache {
/// * `json_results` - It takes the json results string as an argument.
/// * `url` - It takes the url as a String.
pub fn cache_results(
- self,
+ &mut self,
json_results: String,
- url: String,
+ url: &str,
) -> Result<(), Box> {
- let hashed_url_string = self.clone().compute_url_hash(&url);
- let mut redis_connection: Connection =
- Client::open(self.redis_connection_url)?.get_connection()?;
+ let hashed_url_string = Self::compute_url_hash(url);
// put results_json into cache
- redis_connection.set(hashed_url_string.clone(), json_results)?;
+ self.connection.set(&hashed_url_string, json_results)?;
// Set the TTL for the key to 60 seconds
- redis_connection
- .expire::(hashed_url_string.clone(), 60)
+ self.connection
+ .expire::(hashed_url_string, 60)
.unwrap();
Ok(())
diff --git a/src/server/routes.rs b/src/server/routes.rs
index 1ee9f35..e97bc2b 100644
--- a/src/server/routes.rs
+++ b/src/server/routes.rs
@@ -73,7 +73,7 @@ pub async fn search(
let params = web::Query::::from_query(req.query_string())?;
//Initialize redis cache connection struct
- let redis_cache = RedisCache::new(config.redis_connection_url.clone());
+ let mut redis_cache = RedisCache::new(config.redis_connection_url.clone())?;
match ¶ms.q {
Some(query) => {
if query.trim().is_empty() {
@@ -117,7 +117,7 @@ pub async fn search(
};
// fetch the cached results json.
- let cached_results_json = redis_cache.clone().cached_results_json(page_url.clone());
+ let cached_results_json = redis_cache.cached_results_json(&page_url);
// check if fetched results was indeed fetched or it was an error and if so
// handle the data accordingly.
match cached_results_json {
@@ -128,12 +128,10 @@ pub async fn search(
}
Err(_) => {
let mut results_json: crate::search_results_handler::aggregation_models::SearchResults =
- aggregate(query, page).await?;
+ aggregate(query, page).await?;
results_json.add_style(config.style.clone());
- redis_cache.clone().cache_results(
- serde_json::to_string(&results_json)?,
- page_url.clone(),
- )?;
+ redis_cache
+ .cache_results(serde_json::to_string(&results_json)?, &page_url)?;
let page_content: String = hbs.render("search", &results_json)?;
Ok(HttpResponse::Ok().body(page_content))
}
From 0b196ed3f2b40d19d401abe293a9fda972169292 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Mon, 15 May 2023 09:34:39 +0000
Subject: [PATCH 24/86] ci: fix automatic releases ci using conventional
commits
---
.github/workflows/releases.yml | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/releases.yml b/.github/workflows/releases.yml
index e46c5aa..8e1e46b 100644
--- a/.github/workflows/releases.yml
+++ b/.github/workflows/releases.yml
@@ -31,11 +31,15 @@ jobs:
run: git fetch --all && git checkout --track origin/release-from-${{ github.sha }}
# update app config with version
- - name: get-npm-version
- id: package-version
- uses: martinbeentjes/npm-get-version-action@master
- - name: update app config
- run: sed -i 's/0.0.0/${{ steps.package-version.outputs.current-version}}/g' config/app.json
+ - name: Get current rust app version from its Cargo.toml.
+ id: foo
+ uses: dante-signal31/rust-app-version@v1.2.0
+ with:
+ cargo_toml_folder: rust_app_folder/
+
+ - name: Use the version to update the Cargo.toml version.
+ shell: bash
+ run: sed -i "3s/version = \"[0-9]*.[0-9]*.[0-9]*\"/version = \"${{ steps.foo.outputs.app_version }}\"/g" Cargo.toml
# create release info and push it upstream
- name: conventional Changelog Action
From 22638b88ca57497b7bfe5495cf5fabfb0e6d126e Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Tue, 16 May 2023 19:30:25 +0300
Subject: [PATCH 25/86] chore: restructure and rewrite contributing.md to make
it more clear
---
CONTRIBUTING.md | 68 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 45 insertions(+), 23 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 040801e..e7cc141 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,34 +1,56 @@
-# Things to Consider Before Contributing
+# What You Can Contribute To?
-## Knowledge Required
+## Documentation/Wiki
-- Rust basics
-- Actix-web crate basics
-- Tokio crate and async/await
-- Reqwest crate basics
-- Serde and serde~json~ crate basics
-- fake~useragent~ crate basics
-- pyo3/hlua/rlua crates basics
+Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Edit the [wiki](https://github.com/neon-mmd/websurfx/wiki) to add to or improve the documentation. This will help future users get Websurfx up and running more easily.
+
+## Readme
+
+Found a typo, or the Readme is not very clear as it should be?. Consider Submitting a Pull request to the [Readme](https://github.com/neon-mmd/websurfx/blob/master/README.md) to add to or improve the Readme. This will help future users to better understand the project more clearly.
+
+## Source Code
+
+You should know atleast one of the things below to start contributing:
+
+- Rust basics
+- Actix-web crate basics
+- Tokio crate and async/await
+- Reqwest crate basics
+- Serde and serde_json crate basics
+- Scraper crate basics
+- Frontend (handlebars, css and js).
+- Fake useragent crate basics
+- pyo3/hlua/rlua crates basics
+
+## Report a Bug/Issue
+
+If you've found a bug, then please consider raising it as an issue [here](https://github.com/neon-mmd/websurfx/issues). This will help me know if there's something that needs fixing. Try and include as much detail as possible, such as your environment, steps to reproduce, any console output and maybe an example screenshot or recording if necessary.
+
+## Spread the word
+
+Websurfx is still a relatively young project, and as such not many people know of it. It would be great to see more users, and so it would be awesome if you could consider sharing with your friends or on social platforms.
## Guidelines
-- Please be patient.
+- Please be patient.
+- Treat everyone with respect -- \"give respect and take respect.\"
+- Document your code properly with Rust coding conventions in mind.
+- Provide a brief description of the changes you made in the pull request.
+- Provide an appropriate header for the pull request.
-- Treat everyone with respect -- \"give respect and take respect.\"
+## Join the discussion
-- Document your code properly with Rust coding conventions in mind.
+We have a [Discord](https://discord.gg/SWnda7Mw5u) channel, feel free to join and share your ideas and ask questions about the project, we would be glad to hear you out.
-- Provide a brief description of the changes you made in the pull
- request.
+# Where To Contribute?
-- Provide an appropriate header for the pull request.
+## For Source Code Contributions
+
+The _rolling branch_ is where we intend all source code contributions should go.
- **NOTE:** The rolling branch is where all contributions should go.
- In other words, it is the working branch for this project.
+## For Readme Contributions
-We appreciate any contributions and suggestions to help improve the
-Websurfx project. Please keep in mind the above requirements and
-guidelines before submitting a pull request and also if you have any
-doubts/concerns/questions about the project, its source code or anything
-related to the project than feel free to ask by opening an
-\[issue\]().
+The _master branch_ is where we intend all source code contributions should go.
+
+
+We appreciate any contributions whether be of any size or topic and suggestions to help improve the Websurfx project. Please keep in mind the above requirements and guidelines before submitting a pull request and also if you have any doubts/concerns/questions about the project, its source code or anything related to the project than feel free to ask by opening an [issue](https://github.com/neon-mmd/websurfx/issues) or by asking us on our [Discord](https://discord.gg/SWnda7Mw5u) channel.
From 30102cc6f9e43a993f1763902bc7c1c70e3a5861 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Tue, 16 May 2023 16:37:33 +0000
Subject: [PATCH 26/86] ci: remove force flag to not clear existing tags/labels
---
.github/workflows/labels.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml
index f90801a..64ae655 100644
--- a/.github/workflows/labels.yml
+++ b/.github/workflows/labels.yml
@@ -19,4 +19,3 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
owner-name: ${{ github.repository_owner }}
repository-name: ${{ github.event.repository.name }}
- force: true # optional to clear existing labels, default to true
From 96f93e8074d57f9cd1487debd36a74bb33529408 Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Tue, 16 May 2023 19:42:10 +0300
Subject: [PATCH 27/86] chore: add github actions
---
CONTRIBUTING.md | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e7cc141..26dc8dc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,23 +1,27 @@
# What You Can Contribute To?
-## Documentation/Wiki
+## Documentation/Wiki
Found a typo, or something that isn't as clear as it could be? Maybe I've missed something off altogether, or you hit a roadblock that took you a while to figure out. Edit the [wiki](https://github.com/neon-mmd/websurfx/wiki) to add to or improve the documentation. This will help future users get Websurfx up and running more easily.
-## Readme
+## Readme
Found a typo, or the Readme is not very clear as it should be?. Consider Submitting a Pull request to the [Readme](https://github.com/neon-mmd/websurfx/blob/master/README.md) to add to or improve the Readme. This will help future users to better understand the project more clearly.
-## Source Code
+## Help Improve Github Actions
+
+Know how to fix or improve a github action?. Consider Submitting a Pull request to help make automation and testing better.
+
+## Source Code
+
+You should know atleast one of the things below to start contributing:
-You should know atleast one of the things below to start contributing:
-
- Rust basics
- Actix-web crate basics
- Tokio crate and async/await
- Reqwest crate basics
- Serde and serde_json crate basics
-- Scraper crate basics
+- Scraper crate basics
- Frontend (handlebars, css and js).
- Fake useragent crate basics
- pyo3/hlua/rlua crates basics
@@ -45,12 +49,11 @@ We have a [Discord](https://discord.gg/SWnda7Mw5u) channel, feel free to join an
# Where To Contribute?
## For Source Code Contributions
-
+
The _rolling branch_ is where we intend all source code contributions should go.
## For Readme Contributions
The _master branch_ is where we intend all source code contributions should go.
-
We appreciate any contributions whether be of any size or topic and suggestions to help improve the Websurfx project. Please keep in mind the above requirements and guidelines before submitting a pull request and also if you have any doubts/concerns/questions about the project, its source code or anything related to the project than feel free to ask by opening an [issue](https://github.com/neon-mmd/websurfx/issues) or by asking us on our [Discord](https://discord.gg/SWnda7Mw5u) channel.
From 5d6f50a109b3a536e96063d0786c87bd7e3432af Mon Sep 17 00:00:00 2001
From: neon_arch
Date: Wed, 17 May 2023 16:31:39 +0300
Subject: [PATCH 28/86] chore: add how to fork section and add some images to
explain it
---
CONTRIBUTING.md | 11 +++++++++++
images/create_fork_button.png | Bin 0 -> 64982 bytes
images/fork_button.png | Bin 0 -> 44599 bytes
images/fork_options_page.png | Bin 0 -> 64778 bytes
4 files changed, 11 insertions(+)
create mode 100644 images/create_fork_button.png
create mode 100644 images/fork_button.png
create mode 100644 images/fork_options_page.png
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 26dc8dc..d630e2a 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -56,4 +56,15 @@ The _rolling branch_ is where we intend all source code contributions should go.
The _master branch_ is where we intend all source code contributions should go.
+# How To Fork
+
+
+
+
+
+Please make sure to leave the `Copy the master branch only` option ticked off.
+
+
+
+
We appreciate any contributions whether be of any size or topic and suggestions to help improve the Websurfx project. Please keep in mind the above requirements and guidelines before submitting a pull request and also if you have any doubts/concerns/questions about the project, its source code or anything related to the project than feel free to ask by opening an [issue](https://github.com/neon-mmd/websurfx/issues) or by asking us on our [Discord](https://discord.gg/SWnda7Mw5u) channel.
diff --git a/images/create_fork_button.png b/images/create_fork_button.png
new file mode 100644
index 0000000000000000000000000000000000000000..c060fd484b2ea5fd619d0c0423ac9145820c9864
GIT binary patch
literal 64982
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