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" {} \;
'';
}
|