1
+ #! /usr/bin/env bash
2
+
3
+ set -e -o pipefail
4
+
5
+ function echo () {
6
+ printf " $1 \n"
7
+ }
8
+
9
+ # Turns an attr path specified like "nixos.profiles.profile" into
10
+ # it's proper devos structured filesystem path
11
+ function parse_attrpath () {
12
+ attr_origpath=" $1 "
13
+
14
+ if [[ $attr_origpath == " nixos." * ]]; then
15
+ attr_path=" ${attr_origpath/ nixos./ } "
16
+ attr_path=" ${attr_path// ./ \/ } "
17
+ elif [[ $attr_origpath == " hm." * ]]; then
18
+ attr_path=" ${attr_origpath/ hm./ } "
19
+ attr_path=" users/${attr_path// ./ \/ } "
20
+ else
21
+ echo " Please make sure your profile path starts with either 'nixos.' or 'hm.'!"
22
+ exit 1
23
+ fi
24
+
25
+ printf " $attr_path "
26
+ }
27
+
28
+ # Parses source URLs like "owner/repo" or "gitlab:owner/repo"
29
+ # and turns them into a proper URL
30
+ function parse_sourceurl () {
31
+ url=" $1 "
32
+
33
+ if [[ $url == " github:" * ]]; then
34
+ url=" ${url/ " github:" / } "
35
+ url=" https://github.com/$url "
36
+ elif [[ $url == " gitlab:" * ]]; then
37
+ url=" ${url/ " gitlab:" / } "
38
+ url=" https://gitlab.com/$url "
39
+ elif [[ $url != " http" * ]]; then
40
+ url=" https://github.com/$url "
41
+ fi
42
+
43
+ printf " $url "
44
+ }
45
+
46
+ # Creates a repository path in the cache from an URL
47
+ function make_repo_path () {
48
+ url=" $1 "
49
+
50
+ repo_name=" ${url##*/ } "
51
+ repo_tmp=" ${url/ \/ $repo_name / } "
52
+ repo_owner=" ${repo_tmp##*/ } "
53
+
54
+ printf " $GIT_CACHE /$repo_owner -$repo_name "
55
+ }
56
+
57
+ # Clones a repository into cache if it does not exist
58
+ # otherwise update the repository
59
+ function fetch_repo () {
60
+ url=" $1 "
61
+ repo_path=" $2 "
62
+
63
+ mkdir -p " $repo_path "
64
+ git clone --depth 1 " $url " " $repo_path " \
65
+ || git --git-dir " $repo_path /.git" --work-tree " $repo_path " pull
66
+
67
+ if [[ $? != 0 ]]; then
68
+ echo " Failed to fetch '$url ' with git, error code: $? "
69
+ exit 2
70
+ fi
71
+ }
72
+
73
+ function print_source_help () {
74
+ echo " 'source' can be either a git repository URL, 'github:owner/repo' or 'gitlab:owner/repo'"
75
+ echo " if 'source' is given as 'owner/repo', it will default to 'github:owner/repo'"
76
+ }
77
+
78
+ GIT_CACHE=" $HOME /.cache/bud/git"
79
+
80
+ case " $1 " in
81
+ " show" )
82
+ shift 1
83
+
84
+ url=" $1 "
85
+
86
+ if [[ -z " $url " ]]; then
87
+ echo " Show profiles available in the specified source\n"
88
+ echo " Usage: show source\n"
89
+ print_source_help
90
+ echo " if 'source' is '.', it will show your own profiles"
91
+ exit 1
92
+ fi
93
+
94
+ if [[ " $url " == " ." ]]; then
95
+ repo_path=" ."
96
+ else
97
+ url=$( parse_sourceurl " $url " )
98
+ repo_path=$( make_repo_path " $url " )
99
+
100
+ fetch_repo " $url " " $repo_path " || exit $?
101
+ fi
102
+
103
+ echo " nixos profiles:"
104
+ exa -Th " $repo_path /profiles" | grep -v " default.nix" | tail -n +2 || echo " no nixos profiles found"
105
+ echo " home-manager profiles:"
106
+ exa -Th " $repo_path /users/profiles" | grep -v " default.nix" | tail -n +2 || echo " no home-manager profiles found"
107
+ ;;
108
+ " remove" )
109
+ shift 1
110
+
111
+ attr_origpath=$1
112
+
113
+ if [[ -z " $attr_origpath " ]]; then
114
+ echo " Remove a profile from your config\n"
115
+ echo " Usage: remove (nixos|hm).profiles.[PROFILE]"
116
+ exit 1
117
+ fi
118
+
119
+ attr_path=$( parse_attrpath " $attr_origpath " ) || exit $?
120
+
121
+ if [[ -e " $attr_path " ]]; then
122
+ rm -r " $attr_path "
123
+ echo " deleted cfg '$attr_origpath '"
124
+ else
125
+ echo " cfg '$attr_origpath ' does not exist in your config"
126
+ exit 1
127
+ fi
128
+ ;;
129
+ " add" )
130
+ shift 1
131
+
132
+ url=$1
133
+ attr_origpath=$2
134
+
135
+ if [[ -z " $url " || -z " $attr_origpath " ]]; then
136
+ echo " Add a profile from the specified source\n"
137
+ echo " Usage: add source (nixos|hm).profiles.[PROFILE]\n"
138
+ print_source_help
139
+ exit 1
140
+ fi
141
+
142
+ attr_path=$( parse_attrpath " $attr_origpath " ) || exit $?
143
+ url=$( parse_sourceurl " $url " )
144
+ repo_path=$( make_repo_path " $url " )
145
+ repo_attr_path=" $repo_path /$attr_path "
146
+
147
+ fetch_repo " $url " " $repo_path " || exit $?
148
+
149
+ if [[ -e " $repo_attr_path " ]]; then
150
+ mkdir -p " $attr_path "
151
+ cp -r " $repo_attr_path " /* " $attr_path /"
152
+ echo " Added profile '$attr_origpath '!"
153
+ else
154
+ echo " Profile '$attr_origpath ' does not exist in user repository!"
155
+ exit 3
156
+ fi
157
+ ;;
158
+ * )
159
+ echo " Available subcommands are:"
160
+ echo " - 'add': Add a profile from the specified source"
161
+ echo " - 'show': Show profiles available in the specified source"
162
+ echo " - 'remove': Remove a profile from your config\n"
163
+ echo " run 'bud cfg command' for more info about a command"
164
+ exit 1
165
+ ;;
166
+ esac
0 commit comments