Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,957 changes: 2,957 additions & 0 deletions pkgs/applications/office/activitywatch/Cargo.lock

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions pkgs/applications/office/activitywatch/commit-hash.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
diff --git a/vue.config.js b/vue.config.js
index 02c0699..0c4a014 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -4,10 +4,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');
const { argv } = require('yargs');

// get git info from command line
-const _COMMIT_HASH = require('child_process')
- .execSync('git rev-parse --short HEAD')
- .toString()
- .trim();
+const _COMMIT_HASH = "@commit_hash@";
console.info('Commit hash:', _COMMIT_HASH);

module.exports = {
238 changes: 238 additions & 0 deletions pkgs/applications/office/activitywatch/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
{ lib
, fetchFromGitHub
, rustPlatform
, makeWrapper
, pkg-config
, perl
, openssl
, python3
, wrapQtAppsHook
, qtbase
, qtsvg
, xdg-utils
, substituteAll
, buildNpmPackage
}:

let
version = "0.12.2";
sources = fetchFromGitHub {
owner = "ActivityWatch";
repo = "activitywatch";
rev = "v${version}";
sha256 = "sha256-IvRXfxTOSgBVlxy4SVij+POr7KgvXTEjGN3lSozhHkY=";
fetchSubmodules = true;
};
in
rec {
aw-watcher-afk = python3.pkgs.buildPythonApplication {
pname = "aw-watcher-afk";
inherit version;

format = "pyproject";

src = "${sources}/aw-watcher-afk";

nativeBuildInputs = [
python3.pkgs.poetry-core
];

propagatedBuildInputs = with python3.pkgs; [
aw-client
xlib
pynput
];

pythonImportsCheck = [ "aw_watcher_afk" ];

meta = with lib; {
description = "Watches keyboard and mouse activity to determine if you are AFK or not (for use with ActivityWatch)";
homepage = "https://github.com/ActivityWatch/aw-watcher-afk";
maintainers = with maintainers; [ huantian ];
license = licenses.mpl20;
};
};

aw-watcher-window = python3.pkgs.buildPythonApplication {
pname = "aw-watcher-window";
inherit version;

format = "pyproject";

src = "${sources}/aw-watcher-window";

nativeBuildInputs = [
python3.pkgs.poetry-core
];

propagatedBuildInputs = with python3.pkgs; [
aw-client
xlib
];

pythonImportsCheck = [ "aw_watcher_window" ];

meta = with lib; {
description = "Cross-platform window watcher (for use with ActivityWatch)";
homepage = "https://github.com/ActivityWatch/aw-watcher-window";
maintainers = with maintainers; [ huantian ];
license = licenses.mpl20;
};
};

aw-qt = python3.pkgs.buildPythonApplication {
pname = "aw-qt";
inherit version;

format = "pyproject";

src = "${sources}/aw-qt";

nativeBuildInputs = [
python3.pkgs.poetry-core
wrapQtAppsHook
];

propagatedBuildInputs = with python3.pkgs; [
aw-core
qtbase
qtsvg # Rendering icons in the trayicon menu
pyqt6
click
];

# Prevent double wrapping
dontWrapQtApps = true;

makeWrapperArgs = [
"--suffix PATH : ${lib.makeBinPath [ xdg-utils ]}"
];

postPatch = ''
sed -E 's#PyQt6 = "6.3.1"#PyQt6 = "^6.4.0"#g' -i pyproject.toml
'';

postInstall = ''
install -D resources/aw-qt.desktop $out/share/applications/aw-qt.desktop

# For the actual tray icon, see
# https://github.com/ActivityWatch/aw-qt/blob/8ec5db941ede0923bfe26631acf241a4a5353108/aw_qt/trayicon.py#L211-L218
install -D media/logo/logo.png $out/${python3.sitePackages}/media/logo/logo.png

# For .desktop file and your desktop environment
install -D media/logo/logo.svg $out/share/icons/hicolor/scalable/apps/activitywatch.svg
install -D media/logo/logo.png $out/share/icons/hicolor/512x512/apps/activitywatch.png
install -D media/logo/logo-128.png $out/share/icons/hicolor/128x128/apps/activitywatch.png
'';

preFixup = ''
makeWrapperArgs+=(
"''${qtWrapperArgs[@]}"
)
'';

pythonImportsCheck = [ "aw_qt" ];

meta = with lib; {
description = "Tray icon that manages ActivityWatch processes, built with Qt";
homepage = "https://github.com/ActivityWatch/aw-qt";
maintainers = with maintainers; [ huantian ];
license = licenses.mpl20;
};
};

aw-server-rust = rustPlatform.buildRustPackage {
pname = "aw-server-rust";
inherit version;

src = "${sources}/aw-server-rust";

cargoLock = {
lockFile = ./Cargo.lock;
outputHashes = {
"rocket_cors-0.6.0-alpha1" = "sha256-GuMekgnsyuOg6lMiVvi4TwMba4sAFJ/zkgrdzSeBrv0=";
};
};

# Bypass rust nightly features not being available on rust stable
RUSTC_BOOTSTRAP = 1;

patches = [
# Override version string with hardcoded value as it may be outdated upstream.
(substituteAll {
src = ./override-version.patch;
version = sources.rev;
})
];

nativeBuildInputs = [
makeWrapper
pkg-config
perl
];

buildInputs = [
openssl
];

postFixup = ''
wrapProgram "$out/bin/aw-server" \
--prefix XDG_DATA_DIRS : "$out/share"

mkdir -p "$out/share/aw-server"
ln -s "${aw-webui}" "$out/share/aw-server/static"
'';

preCheck = ''
# Fake home folder for tests that use ~/.cache and ~/.local/share
export HOME="$TMPDIR"
'';

meta = with lib; {
description = "High-performance implementation of the ActivityWatch server, written in Rust";
homepage = "https://github.com/ActivityWatch/aw-server-rust";
maintainers = with maintainers; [ huantian ];
mainProgram = "aw-server";
platforms = platforms.linux;
license = licenses.mpl20;
};
};

aw-webui = buildNpmPackage {
pname = "aw-webui";
inherit version;

src = "${sources}/aw-server-rust/aw-webui";

npmDepsHash = "sha256-yds2P2PKfTB6yUGnc+P73InV5+MZP9kmz2ZS4CRqlmA=";

patches = [
# Hardcode version to avoid the need to have the Git repo available at build time.
(substituteAll {
src = ./commit-hash.patch;
commit_hash = sources.rev;
})
];

installPhase = ''
runHook preInstall
mv dist $out
cp media/logo/logo.{png,svg} $out/static/
runHook postInstall
'';

doCheck = true;
checkPhase = ''
runHook preCheck
npm test
runHook postCheck
'';

meta = with lib; {
description = "A web-based UI for ActivityWatch, built with Vue.js";
homepage = "https://github.com/ActivityWatch/aw-webui/";
maintainers = with maintainers; [ huantian ];
license = licenses.mpl20;
};
};
}
17 changes: 17 additions & 0 deletions pkgs/applications/office/activitywatch/override-version.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
diff --git a/aw-server/src/endpoints/mod.rs b/aw-server/src/endpoints/mod.rs
index a080d2a..0411d1e 100644
--- a/aw-server/src/endpoints/mod.rs
+++ b/aw-server/src/endpoints/mod.rs
@@ -76,11 +76,10 @@ async fn root_favicon(state: &State<ServerState>) -> Option<NamedFile> {
fn server_info(config: &State<AWConfig>, state: &State<ServerState>) -> Json<Info> {
#[allow(clippy::or_fun_call)]
let hostname = gethostname().into_string().unwrap_or("unknown".to_string());
- const VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

Json(Info {
hostname,
- version: format!("v{} (rust)", VERSION.unwrap_or("(unknown)")),
+ version: String::from("@version@ (rust)"),
testing: config.testing,
device_id: state.device_id.clone(),
})
18 changes: 18 additions & 0 deletions pkgs/applications/office/activitywatch/wrapper.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{ lib
, symlinkJoin
, aw-server-rust
, aw-qt
, aw-watcher-afk
, aw-watcher-window
, extraWatchers ? [ ]
}:

symlinkJoin {
name = "activitywatch-${aw-server-rust.version}";
paths = [
aw-server-rust.out
aw-qt.out
aw-watcher-afk.out
aw-watcher-window.out
] ++ (lib.forEach extraWatchers (p: p.out));
Comment thread
SuperSandro2000 marked this conversation as resolved.
Outdated
}
65 changes: 65 additions & 0 deletions pkgs/development/python-modules/aw-client/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
{ lib
, buildPythonPackage
, fetchFromGitHub
, pythonOlder
, poetry-core
, aw-core
, requests
, persist-queue
, click
, tabulate
, typing-extensions
, pytestCheckHook
}:

buildPythonPackage rec {
pname = "aw-client";
version = "0.5.11";

format = "pyproject";

# pypi distribution doesn't include tests, so build from source instead
src = fetchFromGitHub {
owner = "ActivityWatch";
repo = "aw-client";
rev = "v${version}";
sha256 = "sha256-5WKGRoZGY+QnnB1Jzlju5OmCJreYMD8am2kW3Wcjhlw=";
};

disabled = pythonOlder "3.8";

nativeBuildInputs = [
poetry-core
];

propagatedBuildInputs = [
aw-core
requests
persist-queue
click
tabulate
typing-extensions
];

nativeCheckInputs = [
pytestCheckHook
];

# Only run this test, the others are integration tests that require
# an instance of aw-server running in order to function.
pytestFlagsArray = [ "tests/test_requestqueue.py" ];

preCheck = ''
# Fake home folder for tests that write to $HOME
export HOME="$TMPDIR"
'';

pythonImportsCheck = [ "aw_client" ];

meta = with lib; {
description = "Client library for ActivityWatch";
homepage = "https://github.com/ActivityWatch/aw-client";
maintainers = with maintainers; [ huantian ];
license = licenses.mpl20;
};
}
Loading