Unverified Commit bc71ecaa authored by Sandro Jäckel's avatar Sandro Jäckel Committed by GitHub
Browse files

Merge pull request #202935 from huantianad/activitywatch

parents e1d48b89 0cb9e0c3
Loading
Loading
Loading
Loading
+2957 −0

File added.

Preview size limit exceeded, changes collapsed.

+16 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
{ 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 −0
Original line number Diff line number Diff line
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 −0
Original line number Diff line number Diff line
{ 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));
}
Loading