aboutsummaryrefslogtreecommitdiff
path: root/modules/installScript.nix
blob: 1e5e355a4c1216ae25d2342069375a55b867be38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
{ writeShellApplication
, coreutils
, util-linux
, lib

, koboInput
, koboLabel ? "KOBOeReader"
, koboManifest ? {}
, ... }:
with builtins // lib;
let
  manValues = attrValues koboManifest;
  createMergeTool = local: remote: name: mergeTool: {
    inherit name;
    value = mergeTool "${local}/${name}" "${remote}/${name}";
  };
  collectMergeTools = local: remote: xs: listToAttrs (concatMap (v: map (name: createMergeTool local remote name v.mergeTool) v.targets) xs);
  onDevManifest = local: remote: collectMergeTools local remote (filter (v: v.remoteOnly) manValues;
  manifest = local: remote: collectMergeTools local remote (filter (v: ! v.remoteOnly) manValues);

  execApp = writeShellApplication {
    name = "kobo-exec";
    runtimeInputs = [
      coreutils
    ];
    text = ''
      REMOTE_OR_LOCAL="''${1-}"
      KOBO_DIR="''${2-}"
      FILE="''${3-}"

      if [[ "$REMOTE_OR_LOCAL" == "REMOTE" ]]; then
        ${toShellVar "MANIFEST" (onDevManifest ${koboInput} "$KOBO_DIR")}
        FILEBASE="''${FILE/#$KOBO_DIR}"
      else
        ${toShellVar "MANIFEST" (manifest ${koboInput} "$KOBO_DIR")}
        FILEBASE="''${FILE/#${koboInput}}"
      fi

      ACTION="''${MANIFEST["$FILEBASE"]}"

      if [[ -n "$ACTION" ]]; then
        eval "$ACTION"
      elif [[ "$REMOTE_OR_LOCAL" == "LOCAL" ]]; then
        if [[ -d "$FILE" ]]; then
          mkdir -p "$KOBO_DIR/$FILEBASE"
        else
          cp -v "$FILE" "$KOBO_DIR/$FILEBASE"
        fi
      fi
    '';
  };
in writeShellApplication {
  name = "KoboInstaller";
  runtimeInputs = [
    coreutils
    util-linux
  ];
  text = ''
    KOBO_MOUNTPOINT="$(findmnt -nlo TARGET LABEL="${koboLabel}")"
    if [[ -z "$KOBO_MOUNTPOINT" ]]; then
      echo "Couldn't find a Kobo eReader volume with label ${koboLabel}. Are you sure one is actually mounted?"
      exit 255
    fi

    KOBO_DIR="$KOBO_MOUNTPOINT/.kobo"
    if [[ ! -d "$KOBO_DIR" ]]; then
      echo "It doesn't seem like $KOBO_MOUNTPOINT actually points to a Kobo eReader since it doesn't contain a .kobo directory . . . "
      exit 255
    fi

    find "$KOBO_DIR/" -not -path "$KOBO_DIR/" -exec ${execApp}/bin/kobo-exec "REMOTE" "$KOBO_DIR" {} \;

    find "${koboInput}/" -not -path "${koboInput}/" -exec ${execApp}/bin/kobo-exec "LOCAL" "$KOBO_DIR" {} \;
  '';
}