Skip to content

Commit 5637834

Browse files
authored
feat: add external storage management and UI integration (#56)
* feat: add external storage management and UI integration - Introduced ExternalStorageModel to handle external storage candidates and entries. - Implemented selection logic for external storage entries based on various criteria. - Added UI components to display external storage icons in the dock. - Integrated settings management to show/hide external storage icons based on user preferences. - Updated styles for the new UI components. - Added unit tests for external storage selection logic. - Enhanced low battery percentage module to manage battery percentage visibility based on settings. * feat(dock): inject fake external storage icons for testing
1 parent 94863a2 commit 5637834

19 files changed

Lines changed: 1306 additions & 300 deletions
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Package Extension
2+
description: Install system dependencies, setup Yarn, and package the extension ZIP.
3+
4+
inputs:
5+
node-version:
6+
description: Node.js version to install.
7+
required: false
8+
default: '22'
9+
apt-packages:
10+
description: Ubuntu packages needed to build the extension.
11+
required: false
12+
default: gettext zip gnome-shell python3-gi gir1.2-glib-2.0
13+
14+
runs:
15+
using: composite
16+
steps:
17+
- name: Install just
18+
uses: extractions/setup-just@v4
19+
20+
- name: Install system dependencies
21+
shell: bash
22+
run: |
23+
sudo apt-get update
24+
sudo apt-get install -y ${{ inputs.apt-packages }}
25+
26+
- name: Setup Yarn
27+
uses: ./.github/actions/setup-yarn
28+
with:
29+
node-version: ${{ inputs.node-version }}
30+
31+
- name: Build extension zip
32+
shell: bash
33+
run: just package
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: Setup Yarn
2+
description: Enable Corepack, setup Node.js, and install Yarn dependencies.
3+
4+
inputs:
5+
node-version:
6+
description: Node.js version to install.
7+
required: false
8+
default: '22'
9+
10+
runs:
11+
using: composite
12+
steps:
13+
- name: Enable Corepack
14+
shell: bash
15+
run: corepack enable
16+
17+
- name: Setup Node.js
18+
uses: actions/setup-node@v6
19+
with:
20+
node-version: ${{ inputs.node-version }}
21+
cache: yarn
22+
23+
- name: Install dependencies
24+
shell: bash
25+
run: yarn install --immutable

.github/workflows/ci.yml

Lines changed: 11 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,13 @@ jobs:
1414
name: Validate
1515
runs-on: ubuntu-latest
1616
steps:
17-
- uses: actions/checkout@v4
17+
- uses: actions/checkout@v7
1818

19-
- name: Enable Corepack
20-
run: corepack enable
21-
22-
- name: Setup Node.js
23-
uses: actions/setup-node@v4
24-
with:
25-
node-version: 22
26-
cache: yarn
27-
28-
- name: Install dependencies
29-
run: yarn install --immutable
19+
- name: Setup Yarn
20+
uses: ./.github/actions/setup-yarn
3021

3122
- name: Install just
32-
run: |
33-
sudo apt-get update
34-
sudo apt-get install -y just
23+
uses: extractions/setup-just@v4
3524

3625
- name: Validate
3726
run: just validate
@@ -40,19 +29,10 @@ jobs:
4029
name: Unit & regression tests
4130
runs-on: ubuntu-latest
4231
steps:
43-
- uses: actions/checkout@v4
44-
45-
- name: Enable Corepack
46-
run: corepack enable
47-
48-
- name: Setup Node.js
49-
uses: actions/setup-node@v4
50-
with:
51-
node-version: 22
52-
cache: yarn
32+
- uses: actions/checkout@v7
5333

54-
- name: Install dependencies
55-
run: yarn install --immutable
34+
- name: Setup Yarn
35+
uses: ./.github/actions/setup-yarn
5636

5737
- name: Run unit tests
5838
run: yarn test:unit
@@ -62,27 +42,10 @@ jobs:
6242
runs-on: ubuntu-latest
6343
needs: [lint]
6444
steps:
65-
- uses: actions/checkout@v4
66-
67-
- name: Install system dependencies
68-
run: |
69-
sudo apt-get update
70-
sudo apt-get install -y just gettext zip gnome-shell python3-gi gir1.2-glib-2.0
71-
72-
- name: Enable Corepack
73-
run: corepack enable
74-
75-
- name: Setup Node.js
76-
uses: actions/setup-node@v4
77-
with:
78-
node-version: 22
79-
cache: yarn
80-
81-
- name: Install dependencies
82-
run: yarn install --immutable
45+
- uses: actions/checkout@v7
8346

84-
- name: Build & package
85-
run: just package
47+
- name: Package extension
48+
uses: ./.github/actions/package-extension
8649

8750
- name: Upload extension zip
8851
uses: actions/upload-artifact@v4
@@ -105,7 +68,7 @@ jobs:
10568
image: ${{ matrix.container }}
10669
options: --privileged
10770
steps:
108-
- uses: actions/checkout@v4
71+
- uses: actions/checkout@v7
10972

11073
- name: Download extension zip
11174
uses: actions/download-artifact@v4

.github/workflows/pre-release.yml

Lines changed: 34 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -13,81 +13,44 @@ concurrency:
1313

1414
jobs:
1515
pre-release:
16-
name: Create daily pre-release
16+
name: Create nightly pre-release
1717
runs-on: ubuntu-latest
1818
steps:
19-
- uses: actions/checkout@v4
19+
- uses: actions/checkout@v7
2020

21-
- name: Install system dependencies
22-
run: |
23-
sudo apt-get update
24-
sudo apt-get install -y just gettext zip gnome-shell python3-gi gir1.2-glib-2.0
25-
26-
- name: Enable Corepack
27-
run: corepack enable
28-
29-
- name: Setup Node.js
30-
uses: actions/setup-node@v4
31-
with:
32-
node-version: 22
33-
cache: yarn
34-
35-
- name: Install dependencies
36-
run: yarn install --immutable
37-
38-
- name: Build extension zip
39-
run: just package
21+
- name: Package extension
22+
uses: ./.github/actions/package-extension
4023

4124
- name: Read version metadata
4225
id: metadata
4326
run: |
4427
set -euo pipefail
4528
4629
VERSION_NAME="$(node -e 'const fs = require("fs"); const metadata = JSON.parse(fs.readFileSync("metadata.json", "utf8")); process.stdout.write(metadata["version-name"]);')"
47-
RELEASE_DATE="$(date -u +%Y%m%d)"
48-
RELEASE_NAME="${VERSION_NAME}-${RELEASE_DATE}"
30+
TAG_PREFIX="refs/tags/v${VERSION_NAME}-nightly"
31+
LAST_NIGHTLY="$(
32+
git ls-remote --tags origin "v${VERSION_NAME}-nightly*" |
33+
awk -v prefix="$TAG_PREFIX" '
34+
{
35+
tag = $2
36+
sub(/\^\{\}$/, "", tag)
37+
if (index(tag, prefix) == 1) {
38+
number = substr(tag, length(prefix) + 1)
39+
if (number ~ /^[0-9]+$/) print number
40+
}
41+
}
42+
' |
43+
sort -n |
44+
tail -n 1
45+
)"
46+
NEXT_NIGHTLY=$(( ${LAST_NIGHTLY:-0} + 1 ))
47+
RELEASE_NAME="v${VERSION_NAME}-nightly${NEXT_NIGHTLY}"
4948
5049
echo "version_name=${VERSION_NAME}" >> "$GITHUB_OUTPUT"
5150
echo "release_name=${RELEASE_NAME}" >> "$GITHUB_OUTPUT"
52-
echo "tag_name=v${RELEASE_NAME}" >> "$GITHUB_OUTPUT"
53-
54-
- name: Configure Git
55-
run: |
56-
git config user.name "github-actions[bot]"
57-
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
51+
echo "tag_name=${RELEASE_NAME}" >> "$GITHUB_OUTPUT"
5852
59-
- name: Remove stale daily pre-releases
60-
env:
61-
GH_TOKEN: ${{ github.token }}
62-
CURRENT_TAG: ${{ steps.metadata.outputs.tag_name }}
63-
run: |
64-
set -euo pipefail
65-
66-
gh release list --limit 100 --json tagName,isPrerelease --jq '
67-
.[]
68-
| select(.isPrerelease == true)
69-
| .tagName
70-
' | while read -r tag; do
71-
if [ -z "$tag" ] || [ "$tag" = "$CURRENT_TAG" ]; then
72-
continue
73-
fi
74-
75-
if [[ "$tag" =~ ^v[0-9]+\.[0-9]+-[0-9]{8}$ ]]; then
76-
gh release delete "$tag" --yes --cleanup-tag
77-
fi
78-
done
79-
80-
git fetch --tags --force
81-
git tag -l 'v*.*-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' | while read -r tag; do
82-
if [ -z "$tag" ] || [ "$tag" = "$CURRENT_TAG" ]; then
83-
continue
84-
fi
85-
86-
git push --delete origin "$tag" || true
87-
git tag --delete "$tag" || true
88-
done
89-
90-
- name: Move daily pre-release tag
53+
- name: Create nightly pre-release tag
9154
run: |
9255
set -euo pipefail
9356
git tag --force "${{ steps.metadata.outputs.tag_name }}" "$GITHUB_SHA"
@@ -104,3 +67,13 @@ jobs:
10467
prerelease: true
10568
make_latest: false
10669
overwrite_files: true
70+
71+
- name: Delete old pre-releases
72+
uses: Nats-ji/delete-old-releases@v1
73+
with:
74+
token: ${{ github.token }}
75+
keep-count: 3
76+
keep-old-minor-releases: true
77+
include-prerelease: true
78+
semver-loose: true
79+
remove-tags: true

.github/workflows/release.yml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,24 @@ jobs:
1919
runs-on: ubuntu-latest
2020
needs: [ci]
2121
steps:
22-
- uses: actions/checkout@v4
22+
- uses: actions/checkout@v7
2323

2424
- name: Download extension zip
2525
uses: actions/download-artifact@v4
2626
with:
2727
name: extension-zip
2828
path: dist/target/
2929

30-
- name: Detect pre-release
31-
id: check
32-
run: |
33-
if [[ "${{ github.ref_name }}" == *"-"* ]]; then
34-
echo "prerelease=true" >> $GITHUB_OUTPUT
35-
else
36-
echo "prerelease=false" >> $GITHUB_OUTPUT
37-
fi
38-
3930
- name: Create GitHub Release
4031
uses: softprops/action-gh-release@v2
4132
with:
4233
name: ${{ github.ref_name }}
4334
files: dist/target/aurora-shell@luminusos.github.io.shell-extension.zip
4435
generate_release_notes: true
45-
prerelease: ${{ steps.check.outputs.prerelease }}
36+
prerelease: ${{ contains(github.ref_name, '-') }}
4637

4738
- name: Create maintenance branch
48-
if: steps.check.outputs.prerelease == 'false'
39+
if: ${{ !contains(github.ref_name, '-') }}
4940
run: |
5041
MAJOR=$(echo "${{ github.ref_name }}" | sed 's/^v//' | grep -oP '^\d+')
5142
BRANCH="release/v${MAJOR}.x"

README.md

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,34 @@ Aurora is split into independent modules, so you can enable only what you want.
1616

1717
### Dock & Panel
1818

19-
| Module | Description |
20-
|--------|-------------|
21-
| **Dock** | Replaces the stock dash with a smart per-monitor dock with intellihide and edge reveal |
22-
| **Volume Mixer** | Adds per-application volume sliders to Quick Settings with fast access to Sound Settings |
23-
| **Bluetooth Menu** | Shows battery level and animated icons in the Bluetooth Quick Settings panel |
24-
| **Weather Clock** | Shows GNOME Weather next to the panel clock |
25-
| **Meeting Clock** | Shows upcoming calendar events next to the panel clock and notifies when meetings are about to start |
26-
| **Tray Icons** | System tray in the panel that shows SNI app icons and GNOME background apps, with configurable icon limit, icon size, attention notifications, and smart SNI/background-app deduplication |
19+
- **Dock** - replaces the stock dash with a smart per-monitor dock with intellihide, edge reveal, optional always-visible mode, Trash, and removable drive shortcuts.
20+
- **Aurora Menu** - adds an Aurora panel menu with recent items, useful shortcuts, configurable panel icon, optional Activities button hiding, and a custom command slot.
21+
- **Volume Mixer** - adds per-application volume sliders to Quick Settings with fast access to Sound Settings.
22+
- **Low Battery Percentage** - uses GNOME's native battery percentage setting while the battery is discharging below 20%, without overriding users who already enabled it.
23+
- **Lock Key Indicators** - shows Caps Lock and Num Lock indicators in the top panel.
24+
- **Bluetooth Menu** - shows battery level and animated icons in the Bluetooth Quick Settings panel.
25+
- **Weather Clock** - shows GNOME Weather next to the panel clock, with configurable placement before or after the clock.
26+
- **Meeting Clock** - shows upcoming calendar events next to the panel clock, supports meeting alerts, snooze timing, lookahead controls, all-day event filtering, and events without join links.
27+
- **Tray Icons** - adds a system tray for SNI app icons and GNOME background apps, with configurable icon limit, icon size, attention timeout, symbolic icon recoloring, background-app deduplication, and optional Quick Settings background-app hiding.
2728

2829
### Appearance
2930

30-
| Module | Description |
31-
|--------|-------------|
32-
| **Theme Changer** | Keeps GNOME light/dark color scheme behavior consistent |
33-
| **Icon Weave** | Automatically fixes missing app icons by matching untracked windows to their apps in-memory |
34-
| **App Search Tooltip** | Shows app names on hover in the overview search results |
35-
| **Auto Theme Switcher** | Automatically switches between light and dark theme based on time |
31+
- **Theme Changer** - keeps GNOME light/dark color scheme behavior consistent.
32+
- **Icon Weave** - automatically fixes missing app icons by matching untracked windows to their apps in memory.
33+
- **App Search Tooltip** - shows app names on hover in the overview search results.
34+
- **Auto Theme Switcher** - automatically switches between light and dark theme based on configured times.
3635

3736
### Behavior
3837

39-
| Module | Description |
40-
|--------|-------------|
41-
| **No Overview** | Skips the overview on startup so you land directly on your desktop |
42-
| **Pip On Top** | Keeps Picture-in-Picture windows above other windows automatically |
43-
| **XWayland Indicator** | Adds an X11 badge to XWayland apps in the Alt+Tab switcher |
38+
- **Skip Overview on Login** - skips the overview on startup so GNOME Shell opens directly to the desktop.
39+
- **Pip On Top** - keeps Picture-in-Picture windows above other windows automatically.
40+
- **Focus Launched Windows** - focuses newly launched windows instead of showing window-ready notifications.
41+
- **XWayland Indicator** - adds an X11 badge to XWayland apps in the Alt+Tab switcher.
4442

4543
### Privacy & Clipboard
4644

47-
| Module | Description |
48-
|--------|-------------|
49-
| **Privacy** | Adds screen sharing privacy features, including automatic Do Not Disturb and panel content hiding |
50-
| **Clipboard History** | Adds searchable clipboard history with pinning and keyboard navigation |
45+
- **Privacy** - adds screen sharing privacy features, including automatic Do Not Disturb and panel content hiding.
46+
- **Clipboard History** - adds searchable clipboard history with pinning, keyboard navigation, configurable polling, and a user-assigned shortcut.
5147

5248
All modules can be toggled independently from the extension preferences.
5349

0 commit comments

Comments
 (0)