@@ -145,13 +145,28 @@ poly_user_id_get() {
145145 dsclattr " /Users/$1 " " UniqueID"
146146}
147147
148+ dscl_create () {
149+ # workaround a bug in dscl where it sometimes fails with eNotYetImplemented:
150+ # https://github.com/NixOS/nix/issues/12140
151+ while ! _sudo " $1 " /usr/bin/dscl . -create " $2 " " $3 " " $4 " 2> " $SCRATCH /dscl.err" ; do
152+ local err=$?
153+ if [[ $err -eq 140 ]] && grep -q " -14988 (eNotYetImplemented)" " $SCRATCH /dscl.err" ; then
154+ echo " dscl failed with eNotYetImplemented, retrying..."
155+ sleep 1
156+ continue
157+ fi
158+ cat " $SCRATCH /dscl.err"
159+ return $err
160+ done
161+ }
162+
148163poly_user_hidden_get () {
149164 dsclattr " /Users/$1 " " IsHidden"
150165}
151166
152167poly_user_hidden_set () {
153- _sudo " in order to make $1 a hidden user" \
154- /usr/bin/dscl . -create " /Users/$1 " " IsHidden" " 1"
168+ dscl_create " in order to make $1 a hidden user" \
169+ " /Users/$1 " " IsHidden" " 1"
155170}
156171
157172poly_user_home_get () {
@@ -161,26 +176,26 @@ poly_user_home_get() {
161176poly_user_home_set () {
162177 # This can trigger a permission prompt now:
163178 # "Terminal" would like to administer your computer. Administration can include modifying passwords, networking, and system settings.
164- _sudo " in order to give $1 a safe home directory" \
165- /usr/bin/dscl . -create " /Users/$1 " " NFSHomeDirectory" " $2 "
179+ dscl_create " in order to give $1 a safe home directory" \
180+ " /Users/$1 " " NFSHomeDirectory" " $2 "
166181}
167182
168183poly_user_note_get () {
169184 dsclattr " /Users/$1 " " RealName"
170185}
171186
172187poly_user_note_set () {
173- _sudo " in order to give $username a useful note" \
174- /usr/bin/dscl . -create " /Users/$1 " " RealName" " $2 "
188+ dscl_create " in order to give $1 a useful note" \
189+ " /Users/$1 " " RealName" " $2 "
175190}
176191
177192poly_user_shell_get () {
178193 dsclattr " /Users/$1 " " UserShell"
179194}
180195
181196poly_user_shell_set () {
182- _sudo " in order to give $1 a safe shell" \
183- /usr/bin/dscl . -create " /Users/$1 " " UserShell" " $2 "
197+ dscl_create " in order to give $1 a safe shell" \
198+ " /Users/$1 " " UserShell" " $2 "
184199}
185200
186201poly_user_in_group_check () {
0 commit comments