Compare commits

..

102 Commits

Author SHA1 Message Date
Brooke Kuhlmann
6e1f3e8b5a Updated version 2025-07-15 19:53:37 -06:00
Brooke Kuhlmann
25431a3b59 Updated to Ruby 3.4.5
link:https://www.ruby-lang.org/en/news/2025/07/15/ruby-3-4-5-released/[Details].

Milestone: patch
2025-07-15 17:08:36 -06:00
Brooke Kuhlmann
ec47e569cf Updated to Caliber 0.82.0
link:https://alchemists.io/projects/caliber[Details].

Milestone: minor
2025-07-04 09:55:27 -06:00
Brooke Kuhlmann
c33faa6218 Updated to Debug 1.11.0
link:https://github.com/ruby/debug/releases/tag/v1.11.0[Details].

Milestone: minor
2025-06-20 10:37:30 -06:00
Brooke Kuhlmann
5e7f8268b5 Updated to Rake 13.3.0
[Details](https://github.com/ruby/rake/releases/v13.3.0).

Milestone: minor
2025-06-16 17:43:30 -06:00
Brooke Kuhlmann
a3bdc15f8a Updated to Ruby 3.4.4
link:https://www.ruby-lang.org/en/news/2025/05/14/ruby-3-4-4-released[Details].

Milestone: patch
2025-05-14 13:48:38 -06:00
Brooke Kuhlmann
1f3e89bc9c Updated version 2025-04-18 11:50:07 -06:00
Brooke Kuhlmann
eaf15d9e16 Updated to Ruby 3.4.3
link:https://www.ruby-lang.org/en/news/2025/04/14/ruby-3-4-3-released[Details].

Milestone: patch
2025-04-14 12:37:46 -06:00
Brooke Kuhlmann
4ab07b1a88 Updated to Caliber 0.79.0
link:https://alchemists.io/projects/caliber/versions/0.79.0/[Details].

Milestone: minor
2025-04-13 11:50:01 -06:00
Brooke Kuhlmann
615b61457f Added The Eclectic Light Company's troubleshooting guide
Provides a wealth of additional information that might be of aid to folks.

Milestone: patch
2025-02-25 14:48:28 -07:00
Brooke Kuhlmann
19002faa1b Updated version 2025-02-22 10:23:54 -07:00
Brooke Kuhlmann
6d02b9a2f5 Updated to Caliber 0.74.0
link:https://alchemists.io/projects/caliber/versions/0.74.0/[Details].

Milestone: minor
2025-02-22 07:21:06 -07:00
Brooke Kuhlmann
105d381b11 Updated to Ruby 3.4.2
link:https://www.ruby-lang.org/en/news/2025/02/14/ruby-3-4-2-released/[Details].

Milestone: patch
2025-02-14 15:49:57 -07:00
Brooke Kuhlmann
d557b2a7f7 Removed versions documentation
No longer necessary to maintain since all of this is fully automated via link:https://alchemists.io/projects/milestoner[Milestoner]. Complete interactive version history can be viewed via any link:https://alchemists.io/projects[project] now.

Milestone: patch
2025-02-02 09:17:24 -07:00
Brooke Kuhlmann
3b85ceba85 Updated to Debug 1.10.0
link:https://github.com/ruby/debug/releases/tag/v1.10.0[Details].

Milestone: patch
2024-12-29 14:42:59 -07:00
Brooke Kuhlmann
6598ff4584 Added version release notes 2024-12-27 15:30:07 -07:00
Brooke Kuhlmann
e6db4a2270 Updated to Git Lint 9.0.0
link:https://alchemists.io/projects/git-lint/versions[Details].

Milestone: patch
2024-12-27 14:07:32 -07:00
Brooke Kuhlmann
8ce6c3fc2d Updated to Caliber 0.68.0
link:https://alchemists.io/projects/caliber/versions[Details].

Milestone: minor
2024-12-27 08:40:18 -07:00
Brooke Kuhlmann
3b8adb89c1 Updated to Ruby 3.4.0
link:https://www.ruby-lang.org/en/news/2024/12/25/ruby-3-4-0-released[Details].

Milestone: major
2024-12-27 08:35:13 -07:00
Brooke Kuhlmann
f0fded3d1e Added version release notes 2024-11-11 08:06:26 -07:00
Brooke Kuhlmann
ee28395f66 Fixed library install order
Necessary to ensure Rust libraries are installed first especially in regards to Ruby since Ruby needs `rustc` for YJIT support.

Milestone: patch
2024-11-10 11:23:57 -07:00
Brooke Kuhlmann
4c01cfa323 Added version release notes 2024-11-09 08:25:19 -07:00
Brooke Kuhlmann
d4ff286f90 Updated to Git Lint 8.7.0
link:https://alchemists.io/projects/git-lint/versions[Details].

Milestone: minor
2024-11-09 07:19:10 -07:00
Brooke Kuhlmann
def1e57fad Updated to Caliber 0.64.0
link:https://alchemists.io/projects/caliber[Details].

Milestone: minor
2024-11-09 07:05:00 -07:00
Brooke Kuhlmann
bf9bed3fdf Added version release notes 2024-11-05 18:43:13 -07:00
Brooke Kuhlmann
780c225c1f Updated to Ruby 3.3.6
link:https://www.ruby-lang.org/en/news/2024/11/05/ruby-3-3-6-released[Details].

Milestone: patch
2024-11-05 08:25:33 -07:00
Brooke Kuhlmann
fb5f547e00 Added macOS Defaults documentation link
Necessary to provide additional learning and directly link to what the defaults are and how to configure them further.

Milestone: patch
2024-10-18 08:20:23 -06:00
Brooke Kuhlmann
50bf6178b9 Added version release notes 2024-09-19 07:33:35 -06:00
Brooke Kuhlmann
53bdca4fc9 Updated to macOS 15.0.0 (Sequoia)
link:https://www.apple.com/macos/macos-sequoia[Details].

Milestone: major
2024-09-19 07:28:03 -06:00
Brooke Kuhlmann
005ea19d1c Updated install root to use XDG binary path
Necessary to ensure user installed binaries are owned by the user that installs rather than default to root access.

Milestone: major
2024-09-03 07:20:42 -06:00
Brooke Kuhlmann
ecd5ed49a4 Added version release notes 2024-09-03 07:20:29 -06:00
Brooke Kuhlmann
d9df365afb Updated to Ruby 3.3.5
See link:https://www.ruby-lang.org/en/news/2024/09/03/3-3-5-released[details].

Milestone: patch
2024-09-03 07:19:38 -06:00
Brooke Kuhlmann
b176823378 Added README Developer Certificate of Origin documentation
Necessary to document what is expected of contributions in terms of legalities, licensing, and attribution.

Milestone: patch
2024-08-18 15:34:17 -06:00
Brooke Kuhlmann
5f7bd0d925 Added version release notes 2024-08-17 15:14:43 -06:00
Brooke Kuhlmann
6f7e47cdeb Updated to Ruby 3.3.4
See link:https://www.ruby-lang.org/en/news/2024/07/09/ruby-3-3-4-released/[details].

Milestone: patch
2024-07-09 07:21:26 -06:00
Brooke Kuhlmann
4bb16b5b7c Added version release notes 2024-07-08 17:24:00 -06:00
Brooke Kuhlmann
95297426aa Updated to Git Lint 8.0.0
See link:https://alchemists.io/projects/git-lint/versions[details]. Even though this is a major upgrade, I'm marking this as a _patch_ because none of the Git Lint changes effect this project.

Milestone: patch
2024-07-06 15:08:03 -06:00
Brooke Kuhlmann
494bd26be9 Updated to Ruby 3.3.3
See link:https://www.ruby-lang.org/en/news/2024/06/12/ruby-3-3-3-released[details].

Milestone: patch
2024-06-12 07:09:06 -06:00
Brooke Kuhlmann
c85015f116 Updated to Caliber 0.58.0
See link:https://alchemists.io/projects/caliber/versions[details].

Milestone: minor
2024-06-11 13:09:13 -06:00
Brooke Kuhlmann
31a3d3be86 Added version release notes 2024-06-01 11:07:13 -06:00
Brooke Kuhlmann
f76086bbf0 Updated to Ruby 3.3.2
See link:https://www.ruby-lang.org/en/news/2024/05/30/ruby-3-3-2-released/[details].

Milestone: patch
2024-05-30 07:52:04 -06:00
Brooke Kuhlmann
f4f803296e Updated citation URLs
Necessary to add the home page URL via the `url` key and update the `repository-code` key sto point to the source code repository. link:https://github.com/citation-file-format/citation-file-format/blob/main/schema-guide.md#url[Details].

Milestone: patch
2024-05-27 17:00:01 -06:00
Brooke Kuhlmann
f393d8181f Added version release notes 2024-05-02 13:30:36 -06:00
Brooke Kuhlmann
a7b479f716 Updated to Ruby 3.3.1
See link:https://www.ruby-lang.org/en/news/2024/04/23/ruby-3-3-1-released[details].

Milestone: patch
2024-04-23 06:55:56 -06:00
Brooke Kuhlmann
4f37a67353 Added version release notes 2024-04-21 09:57:48 -06:00
Brooke Kuhlmann
0c5e66b605 Updated to Git Lint 7.3.0
See link:https://alchemists.io/projects/git-lint/versions[details].

Milestone: minor
2024-04-21 09:09:06 -06:00
Brooke Kuhlmann
fd112d373e Updated to Rake 13.2.0
See link:https://github.com/ruby/rake/releases/tag/v13.2.0[details].

Milestone: minor
2024-04-21 09:02:33 -06:00
Brooke Kuhlmann
1da7437342 Updated to Git Lint 7.1.0
See link:https://alchemists.io/projects/git-lint/versions[details].

Milestone: minor
2024-03-03 10:08:17 -07:00
Brooke Kuhlmann
91df57a36b Updated to Caliber 0.51.0
See link:https://alchemists.io/projects/caliber/versions[version release notes].

Milestone: patch
2024-03-02 10:38:55 -07:00
Brooke Kuhlmann
982663a9ee Updated RuboCop to use XDG local configuration
Necessary to leverage the new XDG local configuration support added in Version 1.61.0.

Milestone: patch
2024-03-02 10:25:17 -07:00
Brooke Kuhlmann
dd8d7f7de5 Added version release notes 2024-02-25 09:19:36 -07:00
Brooke Kuhlmann
76b193dede Refactored bin script printing
Necessary to have consistent use of `printf` especially with formatting strings and new lines.

Milestone: patch
2024-02-25 08:41:48 -07:00
Brooke Kuhlmann
75d2c93e89 Refactored library functions
Minor cleanup to documentation, syntax, and consistency in general.

Milestone: patch
2024-02-25 08:41:40 -07:00
Brooke Kuhlmann
b4faa2e919 Updated to Caliber 0.50.0
See link:https://alchemists.io/projects/caliber/versions[release notes] for details.

Milestone: minor
2024-01-28 07:23:54 -07:00
Brooke Kuhlmann
920b111ef4 Fixed version release notes
Forgot to publish on the first when these updates were first made so am fixing this now with dates updated accordingly.

Milestone: patch
2024-01-06 12:24:03 -07:00
Brooke Kuhlmann
6553f9be6d Added version release notes 2024-01-01 14:09:49 -07:00
Brooke Kuhlmann
24fe1edefd Updated gem dependencies
Necessary to update all dependencies to latest versions now that we are using Ruby 3.3.0. Details:

* link:https://alchemists.io/projects/caliber[Caliber].
* link:https://github.com/ruby/debug[Debug].
* link:https://alchemists.io/projects/git-lint[Git Lint]: Temporarily disabled until next major release.

Milestone: major
2024-01-01 14:08:37 -07:00
Brooke Kuhlmann
9933eee1cd Updated to Ruby 3.3.0
Details [here](https://www.ruby-lang.org/en/news/2023/12/25/ruby-3-3-0-released).

Milestone: major
2023-12-27 16:46:39 -07:00
Brooke Kuhlmann
4fa7380216 Updated Circle CI step names
Necessary to be consistent with link:https://alchemists.io/projects/rubysmith[Rubysmith].

Milestone: patch
2023-12-27 16:46:39 -07:00
Brooke Kuhlmann
179b4f05a3 Added Rakefile quality task
Necessary to be consistent with other projects so it is always possible to run code quality checks.

Milestone: minor
2023-11-24 13:47:31 -07:00
Brooke Kuhlmann
91acff4756 Updated to Caliber 0.42.0
Necessary to update to recent code quality changes. link:https://alchemists.io/projects/caliber/versions[Details].

Milestone: patch
2023-10-15 11:40:21 -06:00
Brooke Kuhlmann
b0b4d51e2c Refactored Gemfile to use ruby file syntax
Necessary to leverage syntax first provided in Bundler 2.4.19 and reduce the need for a custom implementation.

Milestone: patch
2023-10-09 17:34:35 -06:00
Brooke Kuhlmann
c17a132408 Updated GitHub issue template with simplified sections
Necessary to simplify and streamline the process.
2023-09-30 18:58:31 -06:00
Brooke Kuhlmann
33fe1c7003 Added version release notes 2023-09-28 19:49:27 -06:00
Brooke Kuhlmann
605b1e4c3f Updated to macOS Sonoma
Necessary to install and make use of the latest Apple Operating System.

Milestone: major
2023-09-28 19:42:25 -06:00
Brooke Kuhlmann
2170941383 Added Debug gem
Necessary for debugging purposes but also for running global health scripts across all projects (including this one).
2023-06-22 09:49:02 -06:00
Brooke Kuhlmann
63ef52185b Added version release notes 2023-06-19 16:59:56 -06:00
Brooke Kuhlmann
74da03bc07 Updated to Caliber 0.35.0
[Caliber](https://alchemists.io/projects/caliber/versions).
2023-06-16 14:58:38 -06:00
Brooke Kuhlmann
ada1b73c13 Updated to Git Lint 6.0.0
[Details](https://alchemists.io/projects/git-lint/versions).
2023-06-16 13:06:42 -06:00
Brooke Kuhlmann
d196d18641 Updated to Refinements 11.0.0
[Details](https://alchemists.io/projects/refinements/versions).
2023-06-13 10:00:14 -06:00
Brooke Kuhlmann
a360bf535a Added version release notes 2023-05-18 08:22:37 -05:00
Brooke Kuhlmann
f5c6b6d40e Updated to Caliber 0.30.0
[Details](https://alchemists.io/projects/caliber/versions).
2023-04-12 06:40:26 -06:00
Brooke Kuhlmann
bd3caab3fc Added version release notes 2023-04-02 10:50:32 -06:00
Brooke Kuhlmann
2f0fa77831 Fixed programs without extensions to install to user directory
Necessary to ensure the Homebrew directory remains clean and is *only* managed by Homebrew. All other programs are downloaded straight from the provider and placed in the `/usr/local/bin` instead.
2023-03-30 14:50:26 -06:00
Brooke Kuhlmann
017f79442b Updated to Ruby 3.2.2
[Details](https://www.ruby-lang.org/en/news/2023/03/30/ruby-3-2-2-released).
2023-03-30 14:50:20 -06:00
Brooke Kuhlmann
cf648adae7 Updated site URLs to use bare domain
Necessary to point to `https://alchemists.io` instead of `https://www.alchemists.io` for short URL convenience. Both URLs work but use of `https://alchemists.io` is now preferred.
2023-02-19 11:22:36 -07:00
Brooke Kuhlmann
af7aa4d0d0 Updated to Ruby 3.2.1
[Details](https://www.ruby-lang.org/en/news/2023/02/08/ruby-3-2-1-released).
2023-02-08 12:29:22 -07:00
Brooke Kuhlmann
0bafd0ea25 Added version release notes 2023-02-05 10:43:52 -07:00
Brooke Kuhlmann
045a254219 Updated to Caliber 0.25.0
[Details](https://www.alchemists.io/projects/caliber/versions).
2023-02-05 10:28:38 -07:00
Brooke Kuhlmann
113f3b88f5 Added Rake binstub
Necessary to reduce typing and be consistent with existing binstub use.
2023-01-22 09:31:11 -07:00
Brooke Kuhlmann
4b77ecefd5 Updated to Git Lint 5.0.0
[Details](https://www.alchemists.io/projects/git-lint/versions).
2022-12-27 17:50:49 -07:00
Brooke Kuhlmann
fc2cca07cf Updated to Caliber 0.21.0
[Details](https://www.alchemists.io/projects/caliber/versions).
2022-12-27 17:32:46 -07:00
Brooke Kuhlmann
24bf3a7e62 Added version release notes 2022-12-25 19:37:00 -07:00
Brooke Kuhlmann
4159fbce71 Updated run script to distinquish between applications and libraries
Necessary to improve the install reliability of software and
associated libraries (extensions). There is now a split between core
installation of applications and associated libraries. This is a loose
split since everything in the *Install* category is mostly
applications but also contains related setup while the *Libraries*
category requires a machine reboot so the fully configured environment
is loaded to ensure all libraries install properly.

The specifics of these changes will be handled in the corresponding
macOS Configuration project.
2022-12-25 08:42:43 -07:00
Brooke Kuhlmann
1ef42c9040 Updated installs for basic, default, and shell scripts
Improves name consistency by using the same `install_` prefix for all
install scripts.

The dotfiles script was renamed as a shell script since this is now a
dedicated shell configuration script so people can configure their
default shell as they like. Use of this new shell script will be
configured in a future commit.
2022-12-25 08:42:43 -07:00
Brooke Kuhlmann
a6e170cead Removed system update from Ruby install
Necessary to reduce duplicated effort found in the macOS Configuration
project plus this allows people to customize their Ruby gem install
further in case they don't want this stipulation.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
691d87d0f1 Removed mention of Intel CPUs from boot disk instructions
Only Silicon machines are supported now.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
5e5ad4100e Removed configure software script
No longer necessary as this was originally meant to be a catch all for
any final software setup which has proven to not be all that useful.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
93151ac7d2 Removed uninstallers and reinstallers
These are seldom used and native support via Homebrew, for example, is
better than what these scripts can do. This also reduces additional
maintenance burden on this project.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
966b1596be Fixed Node installer to detect Node and version
Ensures the latest version of Node is installed as managed by Fast
Node Manager (FNM). Behavior is similar to using Frum to manage Ruby
versions except FNM has the additional feature of computing latest
version instead.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
5991bd6da6 Refactored download file function to use multi-line curl command
Improves readability so the command isn't word wrapped.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
b3f799acfc Fixed Ruby installer to pass configuration options
Necessary to ensure Ruby installs with the correct version of OpenSSL
with a few other options that helps with the successful install of
Ruby.
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
ea4027714a Updated to Ruby 3.2.0
Necessary to pick up latest version with new features, bug fixes, new
Data primitive, Web Assembly support, and much more.

https: //www.ruby-lang.org/en/news/2022/12/06/ruby-3-2-0-rc1-released
2022-12-25 08:42:42 -07:00
Brooke Kuhlmann
4f599099a1 Updated to Ruby 3.1.3
Necessary to address the following security issue:

    CVE-2021-33621: HTTP response splitting in CGI

This also fixes a build failure with Xcode 14 and macOS 13 (Ventura).
2022-11-24 08:07:44 -07:00
Brooke Kuhlmann
c161493c32 Updated to macOS Ventura
Necessary to be compatible with the latest version of the macOS
operating system.
2022-10-24 18:43:09 -06:00
Brooke Kuhlmann
387241227a Updated to Caliber 0.16.0
Necessary to pick up latest RuboCop changes.
2022-10-22 08:11:36 -06:00
Brooke Kuhlmann
ecf85b4526 Updated README sections
Necessary to clean up wording and be more consistent with other
projects.
2022-09-16 11:32:51 -06:00
Brooke Kuhlmann
06f6302b9a Updated to Caliber 0.11.0
[Details](https://www.alchemists.io/projects/caliber).
2022-07-14 19:46:13 -06:00
Brooke Kuhlmann
7a9bb00877 Added version release notes 2022-05-07 10:19:46 -06:00
Brooke Kuhlmann
2a01bac2b0 Updated to Caliber 0.8.0
Necessary to pick up latest RuboCop changes.
2022-05-07 09:01:36 -06:00
Brooke Kuhlmann
b2b4d49c52 Updated to Caliber 0.7.0
Necessary to pick up RuboCop 1.28.0 changes.
2022-04-21 16:43:02 -06:00
Brooke Kuhlmann
0945809dc4 Updated to Caliber 0.6.0
Necessary to pick up latest RuboCop RSpec enhancements and fixes.
2022-04-19 09:24:54 -06:00
36 changed files with 455 additions and 768 deletions

View File

@@ -8,24 +8,24 @@ jobs:
- checkout
- restore_cache:
name: Bundler Restore
name: Gems Restore
keys:
- gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
- gem-cache-
- run:
name: Bundler Install
name: Gems Install
command: |
gem update --system
bundle config set path "vendor/bundle"
bundle install
- save_cache:
name: Bundler Store
name: Gems Store
key: gem-cache-{{.Branch}}-{{checksum "Gemfile"}}
paths:
- vendor/bundle
- run:
name: Build
name: Rake
command: bundle exec rake

View File

@@ -1,11 +1,8 @@
## Overview
<!-- Required. Describe, briefly, the behavior experienced and desired. -->
## Why
<!-- Required. Describe, briefly, why this issue is important. -->
## Screenshots/Screencasts
<!-- Optional. Attach screenshot(s) and/or screencast(s) that demo the behavior. -->
## How
<!-- Optional. List exact steps (numbered) to implement or reproduce behavior. Screen shots/casts are welcome. -->
## Steps to Recreate
<!-- Required. List exact steps (numbered list) to reproduce errant behavior. -->
## Environment
<!-- Required. What is your operating system, software version(s), etc. -->
## Notes
<!-- Optional. Provide additional details (i.e operating system, software version(s), stack dump, etc.) -->

View File

@@ -1 +1 @@
3.1.2
3.4.5

View File

@@ -1,10 +1,10 @@
cff-version: 1.2.0
message: Please use the following metadata when citing this project in your work.
title: macOS
abstract: Provides a shell based framework for automating the setup of a macOS machine.
version: 15.0.4
abstract: Shell scripts for automated macOS machine setup.
version: 20.3.0
license: Hippocratic-2.1
date-released: 2022-04-17
date-released: 2025-07-15
authors:
- family-names: Kuhlmann
given-names: Brooke
@@ -17,5 +17,6 @@ keywords:
- automation
- setup
- recovery
repository-code: https://www.alchemists.io/projects/mac_os
repository-artifact: https://www.alchemists.io/projects/mac_os
repository-code: https://github.com/bkuhlmann/mac_os
repository-artifact: https://alchemists.io/projects/mac_os
url: https://alchemists.io/projects/mac_os

View File

@@ -1,9 +1,10 @@
# frozen_string_literal: true
ruby File.read(".ruby-version").strip
ruby file: ".ruby-version"
source "https://rubygems.org"
gem "caliber", "~> 0.5"
gem "git-lint", "~> 4.0"
gem "rake", "~> 13.0"
gem "caliber", "~> 0.82"
gem "debug", "~> 1.11"
gem "git-lint", "~> 9.0"
gem "rake", "~> 13.3"

View File

@@ -2,19 +2,21 @@
:toclevels: 5
:figure-caption!:
:mac_os_defaults_link: link:https://macos-defaults.com[macOS Defaults]
= macOS
Shell scripts for automated macOS machine setup.
This project is a framework for automating the setup of a macOS machine. In order to illustrate the
potential of what this project can do, please see the companion
link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for details. The _macOS
link:https://alchemists.io/projects/mac_os-config[macOS Config] project for details. The _macOS
Config_ project is an opinionated configuration which meets the needs of my development environment
but is also meant to serve as an example and guide for building your own personalized setup. Here is
how the two projects are meant to be used:
* *macOS* (this project) - The foundational framework for building custom macOS machine setups.
* *link:https://www.alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
* *link:https://alchemists.io/projects/mac_os-config[macOS Configuration]* - The layer on top of
this _macOS_ project which defines a custom machine implementation. The project is meant to be
forked for as many custom machine setups as needed.
@@ -34,18 +36,13 @@ toc::[]
* Installs link:https://nodejs.org[Node] link:https://www.npmjs.com[packages].
* Installs link:https://www.ruby-lang.org[Ruby] link:https://rubygems.org[gems].
* Installs link:https://www.rust-lang.org[Rust] link:https://crates.io[crates].
* Applies basic default software settings.
* Applies {mac_os_defaults_link}.
* Configures installed software.
* Supports restoration of machine backups.
== Screencast
[link=https://www.alchemists.io/screencasts/mac_os]
image::https://www.alchemists.io/images/screencasts/mac_os/cover.svg[Screencast,600,240,role=focal_point]
== Requirements
. link:https://www.apple.com/macos/monterey[macOS Monterey]
. link:https://www.apple.com/macos/macos-sequoia[macOS 15.0.0 (Sequoia)]
. link:https://developer.apple.com/xcode[Xcode]
== Setup
@@ -56,7 +53,7 @@ To install, run:
----
git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os
git checkout 15.0.4
git checkout 20.3.0
----
== Usage
@@ -121,23 +118,25 @@ When attempting to create a boot disk via `bin/run B`, youll be presented wit
documentation (provided here for reference):
....
macOS Boot Disk Tips
- Use a USB drive (8GB or higher).
- Use Disk Utility to format the USB drive as "Mac OS Extended (Journaled)".
- Use Disk Utility to label the USB drive as "Untitled".
macOS Boot Disk Setup
1. Insert a USB drive (8GB or higher).
2. Use Disk Utility to format as "Mac OS Extended (Journaled)".
3. Use Disk Utility to set the schema, if available, as "GUID Partition Map".
4. Use Disk Utility to label as "Untitled".
5. Run this script to install the OS and create a bootable USB drive.
macOS Boot Disk Usage:
1. Insert the USB boot disk into the machine to be upgraded.
1. Insert the USB drive, created above, into the machine to be upgraded.
2. Reboot the machine.
3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.
3. Press and hold the POWER key before the Apple logo appears.
4. Select the USB boot disk from the menu.
5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.
6. Use Disk Utility to create a single "APFS" drive as a "GUID Partition Table".
6. Use Disk Utility to create a single "APFS" drive.
7. Install the new operating system.
macOS Boot Disk Recovery:
1. Start/restart the machine.
2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.
2. Press and hold the POWER key before the Apple logo appears.
3. Wait for the macOS installer to load from the recovery partition.
4. Use the dialog options to launch Disk Utility, reinstall the system, etc.
....
@@ -148,8 +147,7 @@ All executable scripts can be found in the `bin` folder:
* `bin/apply_basic_settings` (optional, customizable): Applies basic and initial settings for
setting up a machine.
* `bin/apply_default_settings` (optional, customizable): Applies bare minimum system and application
defaults.
* `bin/apply_default_settings` (optional, customizable): Applies {mac_os_defaults_link}.
* `bin/configure_software` (optional, customizable): Configures installed software as part of the
post install process.
* `bin/create_boot_disk` (optional): Creates a macOS boot disk.
@@ -172,13 +170,13 @@ All executable scripts can be found in the `bin` folder:
* `bin/run` (required): The main script and interface for macOS setup.
The `lib` folder provides the base framework for installing, re-installing, and uninstalling
software. Everything provided via the link:https://www.alchemists.io/projects/mac_os-config[macOS
software. Everything provided via the link:https://alchemists.io/projects/mac_os-config[macOS
Config] project is built upon the functions found in the `lib` folder. See the
link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for further details.
link:https://alchemists.io/projects/mac_os-config[macOS Config] project for further details.
* `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
== Troubleshooting
=== Troubleshooting
* *Pi-hole*: When using link:https://pi-hole.net[Pi-hole], you might need to temporarily disable
prior to upgrading as you might experience various errors with Apple not being able to detect an
@@ -205,6 +203,7 @@ link:https://www.alchemists.io/projects/mac_os-config[macOS Config] project for
** After seven seconds, hold down the Power button as well.
** Release all keys after another seven seconds.
** Turn on your Mac.
** For more troubleshooting tips, check out The Eclectic Light Company's link:https://eclecticlight.co/mac-troubleshooting-summary/[Mac Troubleshooting Summary].
== Development
@@ -216,18 +215,20 @@ git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os
----
== link:https://www.alchemists.io/policies/license[License]
== link:https://alchemists.io/policies/license[License]
== link:https://www.alchemists.io/policies/security[Security]
== link:https://alchemists.io/policies/security[Security]
== link:https://www.alchemists.io/policies/code_of_conduct[Code of Conduct]
== link:https://alchemists.io/policies/code_of_conduct[Code of Conduct]
== link:https://www.alchemists.io/policies/contributions[Contributions]
== link:https://alchemists.io/policies/contributions[Contributions]
== link:https://www.alchemists.io/projects/mac_os/versions[Versions]
== link:https://alchemists.io/policies/developer_certificate_of_origin[Developer Certificate of Origin]
== link:https://www.alchemists.io/community[Community]
== link:https://alchemists.io/projects/mac_os/versions[Versions]
== link:https://alchemists.io/community[Community]
== Credits
Engineered by link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
Engineered by link:https://alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].

View File

@@ -1,8 +1,12 @@
# frozen_string_literal: true
require "git/lint/rake/setup"
require "git/lint/rake/register"
require "rubocop/rake_task"
Git::Lint::Rake::Register.call
RuboCop::RakeTask.new
task default: %i[git_lint rubocop]
desc "Run code quality checks"
task quality: %i[git_lint rubocop]
task default: :quality

View File

@@ -1,308 +0,0 @@
= Versions
== 15.0.4 (2022-04-17)
* Added GitHub sponsorship configuration - Brooke Kuhlmann
* Updated to Caliber 0.4.0 - Brooke Kuhlmann
* Updated to Caliber 0.5.0 - Brooke Kuhlmann
* Updated to Git Lint 4.0.0 - Brooke Kuhlmann
* Updated to Ruby 3.1.2 - Brooke Kuhlmann
== 15.0.3 (2022-03-16)
* Fixed Homebrew install to initially default to ZSH - Brooke Kuhlmann
== 15.0.2 (2022-03-03)
* Fixed Hippocratic License to be 2.1.0 version - Brooke Kuhlmann
* Added Caliber gem - Brooke Kuhlmann
* Added Ruby version to Gemfile - Brooke Kuhlmann
* Updated default Rake task to include Git Lint and Rubocop - Brooke Kuhlmann
* Updated to Git Lint 3.2.0 - Brooke Kuhlmann
* Updated to Ruby 3.1.1 - Brooke Kuhlmann
* Removed README badges - Brooke Kuhlmann
== 15.0.1 (2022-01-01)
* Updated README policy section links - Brooke Kuhlmann
* Updated changes as versions documentation - Brooke Kuhlmann
* Updated to Git Lint 3.0.0 - Brooke Kuhlmann
* Removed code of conduct and contributing files - Brooke Kuhlmann
== 15.0.0 (2021-12-27)
* Fixed Hippocratic license structure - Brooke Kuhlmann
* Fixed README changes and credits sections - Brooke Kuhlmann
* Fixed Rubocop Bundler/OrderedGems issue - Brooke Kuhlmann
* Fixed contributing documentation - Brooke Kuhlmann
* Added README community link - Brooke Kuhlmann
* Added README troubleshooting guide for SMC reset - Brooke Kuhlmann
* Added project citation information - Brooke Kuhlmann
* Updated GitHub issue template - Brooke Kuhlmann
* Updated to Hippocratic License 3.0.0 - Brooke Kuhlmann
* Updated to Ruby 3.0.3 - Brooke Kuhlmann
* Updated to Ruby 3.1.0 - Brooke Kuhlmann
== 14.0.0 (2021-10-25)
* Updated to macOS Monterey - Brooke Kuhlmann
* Removed notes from pull request template - Brooke Kuhlmann
== 13.0.0 (2021-08-01)
* Added install Node function - Brooke Kuhlmann
* Updated Node package install script to use NPM - Brooke Kuhlmann
* Updated Ruby installer to use Frum - Brooke Kuhlmann
* Updated shell option help text - Brooke Kuhlmann
* Removed NPM install check function - Brooke Kuhlmann
== 12.0.1 (2021-07-17)
* Updated to Ruby 3.0.1 - Brooke Kuhlmann
* Updated to Ruby 3.0.2 - Brooke Kuhlmann
== 12.0.0 (2021-03-16)
* Fixed environment configuration to source Bash resource - Brooke Kuhlmann
* Added Homebrew installation to Homebrew sripts - Brooke Kuhlmann
* Added Node packages script - Brooke Kuhlmann
* Added Ruby gems script - Brooke Kuhlmann
* Added Rust crates script - Brooke Kuhlmann
* Added bare package installer - Brooke Kuhlmann
* Added dotfiles script - Brooke Kuhlmann
* Added mas check to App Store install script - Brooke Kuhlmann
* Added version release notes - Brooke Kuhlmann
* Updated dev tools installer to agree to Rosetta license - Brooke Kuhlmann
* Updated install root detection to support Elm - Brooke Kuhlmann
* Updated setup software as configure software script - Brooke Kuhlmann
* Removed CPU detection in favor of architecture detection - Brooke Kuhlmann
* Refactored install scripts to separate script paths - Brooke Kuhlmann
== 11.2.0 (2021-02-27)
* Added Apple Silicon instructions - Brooke Kuhlmann
* Added CPU utility function - Brooke Kuhlmann
* Added Homebrew install function - Brooke Kuhlmann
* Added Homebrew utility path functions - Brooke Kuhlmann
* Added Rosetta to development tools install script - Brooke Kuhlmann
* Added environment configuration for scripts - Brooke Kuhlmann
* Updated to Circle CI 2.1.0 - Brooke Kuhlmann
* Updated to Docker Alpine Ruby image - Brooke Kuhlmann
* Refactored installer functions to be alphabetically sorted - Brooke Kuhlmann
* Refactored utility functions to be alphabetically sorted - Brooke Kuhlmann
* Refactored verifier functions to be alphabetically sorted - Brooke Kuhlmann
== 11.1.1 (2021-01-10)
* Fixed brew formulae list error - Brooke Kuhlmann
* Updated boot disk recovery documentation - Brooke Kuhlmann
== 11.1.0 (2021-01-03)
* Added caffeination to restore process - Brooke Kuhlmann
* Updated boot disk instructions for main disk format - Brooke Kuhlmann
* Updated troubleshooting documentation - Brooke Kuhlmann
* Removed README Startup Security Utility documentation - Brooke Kuhlmann
== 11.0.0 (2020-12-30)
* Fixed Circle CI configuration for Bundler config path - Brooke Kuhlmann
* Added Circle CI explicit Bundle install configuration - Brooke Kuhlmann
* Updated to Git Lint 2.0.0 - Brooke Kuhlmann
* Updated to Ruby 3.0.0 - Brooke Kuhlmann
== 10.0.0 (2020-11-15)
* Added macOS Big Sur support
* Updated project documentation to conform to Rubysmith template
* Updated to Git Lint 1.3.0
* Updated to Ruby 2.7.2
== 9.0.0 (2020-09-12)
* Fixed Homebrew cask verifier deprecation warning
* Removed Homebrew Mecurial formula verification check
* Removed unnecessary verifier code comments
* Refactored utility basename and extension utilities
== 8.2.0 (2020-07-22)
* Fixed project requirements
* Fixed screencast image URL
* Updated GitHub templates
* Updated README credit URL
* Updated README screencast URL
* Updated README screencast cover to SVG format
* Updated to Git Lint 1.0.0
* Refactored Rakefile requirements
== 8.1.0 (2020-04-01)
* Added README production and development setup instructions
* Updated Circle CI build label
* Updated README screencast to use larger image
* Updated documentation to ASCII Doc format
* Updated to Code of Conduct 2.0.0
* Updated to Git Cop 4.0.0
* Updated to Ruby 2.7.1
* Removed README images
== 8.0.1 (2020-01-01)
* Added Startup Security Utility to README.
* Updated README screencast.
* Updated to Ruby 2.7.0.
* Refactored caffeinate machine function to process grep.
== 8.0.0 (2019-10-12)
* Updated to Rake 13.0.0.
* Updated to Ruby 2.6.5.
* Updated to macOS Catalina.
== 7.2.1 (2019-09-01)
* Updated README screencast tutorial.
* Updated to Ruby 2.6.4.
== 7.2.0 (2019-08-01)
* Added file install function.
== 7.1.2 (2019-06-01)
* Updated contributing documentation.
* Updated to Git Cop 3.5.0.
== 7.1.1 (2019-05-01)
* Added project icon to README.
* Updated to Ruby 2.6.3.
== 7.1.0 (2019-04-01)
* Added XCode installer fix to troubleshooting section.
* Updated to Ruby 2.6.1.
* Updated to Ruby 2.6.2.
== 7.0.0 (2019-01-01)
* Fixed Circle CI cache for Ruby version.
* Fixed installation of apps with no extension.
* Fixed program installs.
* Added Circle CI Bundler cache.
* Added README boot disk documentation.
* Added README troubleshooting section.
* Updated to Git Cop 3.0.0.
* Updated to Ruby 2.6.0.
* Removed Java development tools from setup.
* Removed download file function.
== 6.1.0 (2018-11-01)
* Updated to Java SE Development Kit 11.
* Updated to Ruby 2.5.2.
* Updated to Ruby 2.5.3.
* Removed unnecessary source code comments.
== 6.0.0 (2018-10-01)
* Added XCode install tip.
* Updated boot disk creation to macOS Mojave.
* Updated to Contributor Covenant Code of Conduct 1.4.1.
* Updated to Java SE Development Kit 10.
== 5.0.0 (2018-08-01)
* Fixed Markdown ordered list numbering.
* Fixed verification of Homebrew formulas.
* Added App Store application verification.
* Added Homebrew cask application verifier.
* Updated Git checkout to silence detached head warnings.
* Updated README documentation.
* Updated Semantic Versioning links to be HTTPS.
* Updated boot disk format documentation.
* Updated project changes to use semantic versions.
* Removed Java install support.
* Removed restorer functions.
* Refactored function parameter documentation.
* Refactored library function order.
== 4.1.0 (2018-04-01)
* Updated README license information.
* Updated README screencast tutorial.
* Updated to Circle CI 2.0.0 configuration.
* Updated to Git Cop 2.2.0.
* Updated to Ruby 2.5.1.
* Removed Patreon badge from README.
== 4.0.0 (2018-01-01)
* Added Gemfile.lock to .gitignore.
* Updated to Apache 2.0 license.
* Updated to Ruby 2.4.3.
* Updated to Ruby 2.5.0.
== 3.1.0 (2017-11-26)
* Updated Gemfile.lock file.
* Updated boot disk documenation to mention APFS.
* Updated to Bundler 1.16.0.
* Updated to Git Cop 1.7.0.
* Updated to Rake 12.3.0.
* Updated to Rubocop 0.51.0.
== 3.0.0 (2017-10-01)
* Fixed table of contents.
* Updated boot disk creation to use macOS High Sierra.
* Updated gem dependencies.
* Updated to Git Cop 1.6.0.
* Updated to Ruby 2.4.2.
== 2.2.0 (2017-07-16)
* Added Git Cop support.
* Updated CONTRIBUTING documentation.
* Updated GitHub templates.
* Updated README headers.
* Updated gem dependencies.
== 2.1.0 (2017-04-29)
* Fixed Java SE Development Kit install.
* Fixed install-all command
== 2.0.0 (2017-04-09)
* Added Homebrew Casks install script.
* Updated README semantic versioning order.
* Updated contributing documentation.
* Refactored Homebrew software as Homebrew Formulas.
== 1.3.1 (2017-01-08)
* Fixed install of zip app downloads with sub-directories.
== 1.3.0 (2017-01-01)
* Updated README versioning documentation.
* Removed CHANGELOG.md (use CHANGES.md instead).
== 1.2.0 (2016-10-12)
* Fixed reinstaller path issues with application and extension scripts.
* Added screencast to README.
== 1.1.0 (2016-10-11)
* Fixed Bash script header to dynamically load correct environment.
* Fixed verification of Homebrew application installs.
* Added script hook for App Store software install.
* Added script hooks for unfinished custom configurations.
* Updated and clarified README documentation.
== 1.0.0 (2016-10-05)
* Initial version.

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Applies basic system settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_basic_settings"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Basic settings script does not exist or is not executable.\n"
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Applies default settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/apply_default_settings"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Default settings script does not exist or is not executable.\n"
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Configures installed software.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/configure_software"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Configure software script does not exist or is not executable.\n"
fi

View File

@@ -2,33 +2,35 @@
# Creates macOS boot disk.
printf "macOS Boot Disk Tips\n"
printf " - Use a USB drive (8GB or higher).\n"
printf " - Use Disk Utility to format the USB drive as \"Mac OS Extended (Journaled)\".\n"
printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n"
printf "\nmacOS Boot Disk Usage:\n"
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n"
printf " 2. Reboot the machine.\n"
printf " 3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.\n"
printf " 4. Select the USB boot disk from the menu.\n"
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n"
printf " 6. Use Disk Utility to create a single \"APFS\" drive as a \"GUID Partition Table\".\n"
printf " 7. Install the new operating system.\n"
printf "\nmacOS Boot Disk Recovery:\n"
printf " 1. Start/restart the machine.\n"
printf " 2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.\n"
printf " 3. Wait for the macOS installer to load from the recovery partition.\n"
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n"
printf "%s\n" "macOS Boot Disk Setup"
printf "%s\n" " 1. Insert a USB drive (8GB or higher)."
printf "%s\n" " 2. Use Disk Utility to format as \"Mac OS Extended (Journaled)\"."
printf "%s\n" " 3. Use Disk Utility to set the schema, if available, as \"GUID Partition Map\"."
printf "%s\n" " 4. Use Disk Utility to label as \"Untitled\"."
printf "%s\n" " 5. Run this script to install the OS and create a bootable USB drive."
printf "\n%s\n" "macOS Boot Disk Usage:"
printf "%s\n" " 1. Insert the USB drive, created above, into the machine to be upgraded."
printf "%s\n" " 2. Reboot the machine."
printf "%s\n" " 3. Press and hold the POWER key before the Apple logo appears."
printf "%s\n" " 4. Select the USB boot disk from the menu."
printf "%s\n" " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions."
printf "%s\n" " 6. Use Disk Utility to create a single \"APFS\" drive."
printf "%s\n" " 7. Install the new operating system."
printf "\n%s\n" "macOS Boot Disk Recovery:"
printf "%s\n" " 1. Start/restart the machine."
printf "%s\n" " 2. Press and hold the POWER key before the Apple logo appears."
printf "%s\n" " 3. Wait for the macOS installer to load from the recovery partition."
printf "%s\n" " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc."
printf "\nCreating macOS boot disk...\n"
printf "\n%s\n" "Creating macOS boot disk..."
if [[ ! -e "$MAC_OS_BOOT_DISK_CREATOR" ]]; then
printf "ERROR: macOS installer does not exist: $MAC_OS_BOOT_DISK_CREATOR. Use System Preferences → Software Update to download.\n"
printf "%s\n" "ERROR: macOS installer does not exist: $MAC_OS_BOOT_DISK_CREATOR. Use System Preferences → Software Update to download."
exit 1
fi
if [[ ! -d "$MAC_OS_BOOT_DISK_PATH" ]]; then
printf "ERROR: Boot disk must be mounted at: $MAC_OS_BOOT_DISK_PATH.\n"
printf "%s\n" "ERROR: Boot disk must be mounted at: $MAC_OS_BOOT_DISK_PATH."
exit 1
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
check_mas_install
"$SCRIPT_PATH"
else
printf "WARNING: App Store install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: App Store install script does not exist or is not executable."
fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Applications install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Applications install script does not exist or is not executable."
fi

16
bin/install_basics Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs basic system settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_basics"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Basic settings script does not exist or is not executable."
fi

16
bin/install_defaults Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs system and application default settings.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_defaults"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Default settings script does not exist or is not executable."
fi

View File

@@ -1,14 +1,14 @@
#! /usr/bin/env bash
Installs development tooling requirements.
# Installs development tooling requirements.
printf "Installing Xcode CLI tools...\n"
printf "%s\n" "Installing Xcode CLI tools..."
xcode-select --install
printf "%s\n" "💡 ALT+TAB to view and accept Xcode license window."
read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response
if [[ "$xcode_response" != "y" ]]; then
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
printf "%s\n" "ERROR: Xcode CLI tools must be installed before proceeding."
exit 1
fi

View File

@@ -1,16 +0,0 @@
#! /usr/bin/env bash
# Installs dotfiles.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_dotfiles"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Dotfiles install script does not exist or is not executable.\n"
fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Application extensions install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Application extensions install script does not exist or is not executable."
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew
"$SCRIPT_PATH"
else
printf "WARNING: Homebrew Casks install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Homebrew Casks install script does not exist or is not executable."
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew
"$SCRIPT_PATH"
else
printf "WARNING: Homebrew Formulas install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Homebrew Formulas install script does not exist or is not executable."
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_node
"$SCRIPT_PATH"
else
printf "WARNING: Node packages install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Node packages install script does not exist or is not executable."
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_ruby
"$SCRIPT_PATH"
else
printf "WARNING: Ruby gems install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Ruby gems install script does not exist or is not executable."
fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_rust
"$SCRIPT_PATH"
else
printf "WARNING: Rust crates install script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Rust crates install script does not exist or is not executable."
fi

16
bin/install_shell Executable file
View File

@@ -0,0 +1,16 @@
#! /usr/bin/env bash
# Installs shell.
set -o nounset
set -o errexit
set -o pipefail
IFS=$'\n\t'
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_shell"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "%s\n" "WARNING: Shell script does not exist or is not executable."
fi

6
bin/rake Executable file
View File

@@ -0,0 +1,6 @@
#! /usr/bin/env ruby
# frozen_string_literal: true
require "bundler/setup"
load Gem.bin_path "rake", "rake"

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH"
else
printf "WARNING: Restore backup script does not exist or is not executable.\n"
printf "%s\n" "WARNING: Restore backup script does not exist or is not executable."
fi

76
bin/run
View File

@@ -4,22 +4,20 @@
source lib/installers.sh
source lib/options.sh
source lib/reinstallers.sh
source lib/settings.sh
source lib/uninstallers.sh
source lib/utilities.sh
source lib/verifiers.sh
if [[ -e "$MAC_OS_CONFIG_PATH" ]]; then
source "$MAC_OS_CONFIG_PATH/lib/settings.sh"
else
printf "ERROR: Unable to load macOS configuration: $MAC_OS_CONFIG_PATH.\n\n"
printf "Please check the following before continuing:\n"
printf " • Download the default macOS configuration here: https://github.com/bkuhlmann/mac_os-config.\n"
printf " • Customize as necessary for your setup or fork the project and make your own configuration.\n"
printf " • When finished, your folder structure should look like this:\n"
printf " • <root path>/mac_os:\n"
printf " • <root path>/mac_os-config:\n"
printf "%s\n\n" "ERROR: Unable to load macOS configuration: $MAC_OS_CONFIG_PATH."
printf "%s\n" "Please check the following before continuing:"
printf "%s\n" " • Download the default macOS configuration here: https://github.com/bkuhlmann/mac_os-config."
printf "%s\n" " • Customize as necessary for your setup or fork the project and make your own configuration."
printf "%s\n" " • When finished, your folder structure should look like this:"
printf "%s\n" " • <root path>/mac_os:"
printf "%s\n" " • <root path>/mac_os-config:"
exit 1
fi
@@ -27,41 +25,37 @@ configure_environment
while true; do
if [[ $# == 0 ]]; then
printf "\nUsage: run OPTION\n"
printf "\nOSX Options:\n"
printf " Boot:\n"
printf " B: Create boot disk.\n"
printf " Install:\n"
printf " b: Apply basic settings.\n"
printf " t: Install development tools.\n"
printf " hf: Install Homebrew Formulas.\n"
printf " hc: Install Homebrew Casks.\n"
printf " m: Install Mac App Store software.\n"
printf " a: Install application software.\n"
printf " x: Install application software extensions.\n"
printf " df: Install dotfiles.\n"
printf " np: Install Node packages.\n"
printf " rg: Install Ruby gems.\n"
printf " rc: Install Rust crates.\n"
printf " d: Apply default settings.\n"
printf " cs: Configure installed software.\n"
printf " i: Install all (i.e. executes all of the above steps in order listed).\n"
printf " Restore:\n"
printf " R: Restore settings from backup.\n"
printf " Manage:\n"
printf " c: Check status of managed software.\n"
printf " C: Caffeinate machine.\n"
printf " ua: Uninstall application software.\n"
printf " ux: Uninstall application software extension.\n"
printf " ra: Reinstall application software.\n"
printf " rx: Reinstall application software extension.\n"
printf " w: Clean work (temp) directory.\n"
printf " q: Quit/Exit.\n\n"
printf "\n%s\n" "Usage: run OPTION"
printf "\n%s\n" "OSX Options:"
printf "%s\n" " Boot:"
printf "%s\n" " B: Create boot disk."
printf "%s\n" " Install:"
printf "%s\n" " b: Install basics."
printf "%s\n" " t: Install development tools."
printf "%s\n" " hf: Install Homebrew Formulas."
printf "%s\n" " hc: Install Homebrew Casks."
printf "%s\n" " m: Install Mac App Store software."
printf "%s\n" " a: Install application software."
printf "%s\n" " x: Install application software extensions."
printf "%s\n" " d: Install defaults."
printf "%s\n" " s: Install shell."
printf "%s\n" " r: Restore backups."
printf "%s\n" " i: Install all (i.e. executes all of the above steps in order listed)."
printf "%s\n" " Libraries:"
printf "%s\n" " rc: Install Rust crates."
printf "%s\n" " rg: Install Ruby gems."
printf "%s\n" " np: Install Node packages."
printf "%s\n" " l: Install libraries (i.e. executes all of the above steps in order listed)."
printf "%s\n" " Manage:"
printf "%s\n" " c: Check status of managed software."
printf "%s\n" " C: Caffeinate machine."
printf "%s\n" " w: Clean work (temp) directory."
printf "%s\n\n" " q: Quit/Exit."
read -p "Enter selection: " response
printf "\n"
process_option $response
process_option "$response"
else
process_option $1
process_option "$1"
fi
break

View File

@@ -2,8 +2,9 @@
# Defines software installer functions.
# Downloads remote file to local disk.
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header.
# Label: Download File
# Description: Download remote file to local disk.
# Parameters: $1 (required): URL, $2 (required): File name, $3 (optional): HTTP header.
download_file() {
local url="$1"
local file_name="$2"
@@ -11,43 +12,60 @@ download_file() {
printf "%s\n" "Downloading $1..."
clean_work_path
mkdir $MAC_OS_WORK_PATH
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
mkdir "$MAC_OS_WORK_PATH"
curl --header "$http_header" \
--location \
--retry 3 \
--retry-delay 5 \
--fail \
--silent \
--show-error \
"$url" >> "$MAC_OS_WORK_PATH/$file_name"
}
export -f download_file
# Installs an application.
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
# Label: Install Application
# Description: Install an application.
# Parameters: $1 (required): Install path, $2 (required): Name.
install_app() {
local install_root=$(get_install_root "$2")
local file_extension=$(get_extension "$2")
local install_path="$1"
local name="$2"
local install_root=""
local file_extension=""
printf "Installing: $install_root/$2...\n"
install_root=$(get_install_root "$name")
file_extension=$(get_extension "$name")
printf "%s\n" "Installing: $install_root/$name..."
case $file_extension in
'')
cp -a "$1/$2" "$install_root";;
cp -a "$install_path/$name" "$install_root";;
'app')
cp -a "$1/$2" "$install_root";;
cp -a "$install_path/$name" "$install_root";;
'prefPane')
sudo cp -pR "$1/$2" "$install_root";;
sudo cp -pR "$install_path/$name" "$install_root";;
'qlgenerator')
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
sudo cp -pR "$install_path/$name" "$install_root" && qlmanage -r;;
*)
printf "ERROR: Unknown file extension: $file_extension.\n"
printf "%s\n" "ERROR: Unknown file extension: $file_extension."
esac
}
export -f install_app
# Installs an application via a DMG file.
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# Label: Install DMG Application
# Description: Install DMG application.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_app() {
local url="$1"
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
@@ -58,66 +76,76 @@ install_dmg_app() {
}
export -f install_dmg_app
# Installs a package via a DMG file.
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
# Label: Install DMG Package
# Description: Install DMG application via a package file.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_pkg() {
local url="$1"
local mount_point="/Volumes/$2"
local app_name="$3"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_dmg_pkg
# Installs a single file.
# Parameters: $1 (required) - URL, $2 (required) - Install path.
# Label: Install File
# Description: Install a single file.
# Parameters: $1 (required): URL, $2 (required): Install path.
install_file() {
local file_url="$1"
local file_name=$(get_basename "$1")
local file_name=""
local install_path="$2"
file_name=$(get_basename "$1")
if [[ ! -e "$install_path" ]]; then
download_file "$file_url" "$file_name"
mkdir -p $(dirname "$install_path")
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
printf "Installed: $file_name.\n"
printf "%s\n" "Installed: $file_name."
verify_path "$install_path"
fi
}
export -f install_file
# Installs application code from a Git repository.
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
# Label: Install Git Application
# Description: Install application from a Git repository.
# Parameters: $1 (required): URL, $2 (required): Install path, $3 (optional): Git clone options.
install_git_app() {
local repository_url="$1"
local app_name=$(get_basename "$2")
local url="$1"
local install_path="$2"
local app_name=""
local options="--quiet"
app_name="$(get_basename "$2")"
if [[ -n "$3" ]]; then
local options="$options $3"
fi
if [[ ! -e "$install_path" ]]; then
printf "Installing: $install_path/$app_name...\n"
git clone $options "$repository_url" "$install_path"
printf "Installed: $app_name.\n"
printf "%s\n" "Installing: $install_path..."
git clone $options "$url" "$install_path"
printf "%s\n" "Installed: $app_name."
verify_path "$install_path"
fi
}
export -f install_git_app
# Installs settings from a Git repository.
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
# Label: Install Git Project
# Description: Install Git project.
# Parameters: $1 (required): URL, $2 (required): Version, $3 (required): Project directory, $4 (required): Script to run (including any arguments).
install_git_project() {
local repo_url="$1"
local repo_version="$2"
@@ -134,86 +162,105 @@ install_git_project() {
}
export -f install_git_project
# Installs Homebrew.
# Parameters: None.
# Label: Install Homebrew
# Description: Install and setup Homebrew.
install_homebrew() {
if ! command -v brew > /dev/null; then
/bin/bash -c "$(curl --location --fail --silent --show-error https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
echo "eval \"($(get_homebrew_bin_root)/brew shellenv)\"" > $HOME/.zprofile
echo "eval \"($(get_homebrew_bin_root)/brew shellenv)\"" > "$HOME/.zprofile"
eval "$($(get_homebrew_bin_root)/brew shellenv)"
fi
}
export -f install_homebrew
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
# Label: Install Bare Package
# Description: Install a bare package.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_bare_pkg() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="$app_name.pkg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_bare_pkg
# Installs a package.
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
# Label: Install Package
# Description: Install local package.
# Parameters: $1 (required): Package source path, $2 (required): Application name.
install_pkg() {
local install_root=$(get_install_root "$2")
local source_path="$1"
local name="$2"
local install_root=""
local package=""
printf "Installing: $install_root/$2...\n"
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
install_root=$(get_install_root "$name")
package=$(sudo find "$source_path" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
printf "%s\n" "Installing: $install_root/$name..."
sudo installer -pkg "$package" -target /
}
export -f install_pkg
# Installs program (single file).
# Parameters: $1 (required) - URL, $2 (required) - Program name.
# Label: Install Program
# Description: Installs program without any packaging.
# Parameters: $1 (required): URL, $2 (required): Name.
install_program() {
local url="$1"
local program_name="$2"
local install_path=$(get_install_path "$program_name")
local install_root=""
local install_path=""
install_root=$(get_install_root "$program_name")
install_path=$(get_install_path "$program_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$program_name"
mkdir -p "$install_root"
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
chmod 755 "$install_path"
printf "Installed: $program_name.\n"
printf "%s\n" "Installed: $program_name."
verify_application "$program_name"
fi
}
export -f install_program
# Installs Node.
# Parameters: None.
# Label: Install Node
# Description: Install and setup Node for local development.
install_node() {
if ! command -v fnm > /dev/null; then
$(get_homebrew_bin_root)/fnm install --lts
if [[ ! -x "$(command -v node)" ]]; then
"$(get_homebrew_bin_root)/fnm" install --latest
fi
}
export -f install_node
# Installs Ruby.
# Parameters: None.
# Label: Install Ruby
# Description: Install and setup Ruby for local development.
install_ruby() {
local version="$(cat $HOME/.ruby-version | tr -d '\n')"
local version=""
version="$(cat $HOME/.ruby-version | tr -d '\n')"
if [[ ! -x "$(command -v ruby)" && -n $(ruby --version | grep --quiet "$version") ]]; then
$(get_homebrew_bin_root)/frum install "$version"
$(get_homebrew_bin_root)/frum local "$version"
gem update --system && gem update
"$(get_homebrew_bin_root)"/frum install "$version" \
--with-openssl-dir="$(brew --prefix openssl)" \
--enable-shared \
--disable-silent-rules
"$(get_homebrew_bin_root)"/frum local "$version"
fi
}
export -f install_ruby
# Installs Rust.
# Parameters: None.
# Label: Install Rust
# Description: Install and setup Rust for local development.
install_rust() {
if ! command -v cargo > /dev/null; then
curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh
@@ -221,15 +268,18 @@ install_rust() {
}
export -f install_rust
# Installs an application via a tar file.
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
# Label: Install Tar Application
# Description: Install application from tar file.
# Parameters: $1 (required): URL, $2 (required): Name, $3 (required): Decompress options.
install_tar_app() {
local url="$1"
local app_name="$2"
local options="$3"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.tar"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -240,20 +290,23 @@ install_tar_app() {
)
install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_tar_app
# Installs an application via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
# Label: Install Zip Application
# Description: Install application from zip file.
# Parameters: $1 (required): URL, $2 (required): Name.
install_zip_app() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -265,20 +318,23 @@ install_zip_app() {
)
install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_zip_app
# Installs a package via a zip file.
# Parameters: $1 (required) - URL, $2 (required) - Application name.
# Label: Install Zip Package
# Description: Install application from a package within a zip file.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_zip_pkg() {
local url="$1"
local app_name="$2"
local install_path=$(get_install_path "$app_name")
local install_path=""
local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file"
@@ -289,24 +345,26 @@ install_zip_pkg() {
)
install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n"
printf "%s\n" "Installed: $app_name."
verify_application "$app_name"
fi
}
export -f install_zip_pkg
# Mounts a disk image.
# Parameters: $1 (required) - Image path.
# Label: Mount Image
# Description: Mount disk image.
# Parameters: $1 (required): Path.
mount_image() {
printf "Mounting image...\n"
printf "%s\n" "Mounting image..."
hdiutil attach -quiet -nobrowse -noautoopen "$1"
}
export -f mount_image
# Unmounts a disk image.
# Parameters: $1 (required) - Mount path.
# Label: Unmount Image
# Description: Unmount disk image.
# Parameters: $1 (required): Path.
unmount_image() {
printf "Unmounting image...\n"
printf "%s\n" "Unmounting image..."
hdiutil detach -force "$1"
}
export -f unmount_image

View File

@@ -2,14 +2,16 @@
# Defines command line prompt options.
# Process option selection.
# Parameters: $1 (required) - The option to process.
# Label: Process Option
# Description: Run script based on selection.
# Parameters: $1 (required): The option to process.
process_option() {
case $1 in
'B')
bin/create_boot_disk;;
'b')
bin/apply_basic_settings;;
bin/install_basics;;
't')
bin/install_dev_tools;;
'hf')
@@ -22,38 +24,36 @@ process_option() {
bin/install_applications;;
'x')
bin/install_extensions;;
'df')
bin/install_dotfiles;;
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'd')
bin/apply_default_settings;;
'cs')
bin/configure_software;;
bin/install_defaults;;
's')
bin/install_shell;;
'r')
bin/restore_backup;;
'i')
caffeinate_machine
bin/apply_basic_settings
bin/install_basics
bin/install_dev_tools
bin/install_homebrew_formulas
bin/install_homebrew_casks
bin/install_app_store
bin/install_applications
bin/install_extensions
bin/install_dotfiles
bin/install_node_packages
bin/install_ruby_gems
bin/install_rust_crates
bin/apply_default_settings
bin/configure_software
bin/install_defaults
bin/install_shell
bin/restore_backup
clean_work_path;;
'R')
caffeinate_machine
bin/restore_backup;;
'c')
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'l')
bin/install_rust_crates
bin/install_ruby_gems
bin/install_node_packages;;
'c')
verify_homebrew_formulas
verify_homebrew_casks
verify_app_store_applications
@@ -64,14 +64,6 @@ process_option() {
verify_rust_crates;;
'C')
caffeinate_machine;;
'ua')
uninstall_application;;
'ux')
uninstall_extension;;
'ra')
reinstall_application;;
'rx')
reinstall_extension;;
'w')
clean_work_path;;
'q');;

View File

@@ -1,17 +0,0 @@
#! /usr/bin/env bash
# Defines reinstall functions.
# Reinstall application.
reinstall_application() {
uninstall_application
bin/install_applications
}
export -f reinstall_application
# Reinstall extension.
reinstall_extension() {
uninstall_extension
bin/install_extensions
}
export -f reinstall_extension

View File

@@ -5,7 +5,7 @@ set -o errexit
set -o pipefail
IFS=$'\n\t'
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Monterey.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Sequoia.app/Contents/Resources/createinstallmedia"
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
export MAC_OS_WORK_PATH=/tmp/downloads
export MAC_OS_CONFIG_PATH="../mac_os-config"

View File

@@ -1,52 +0,0 @@
#! /usr/bin/env bash
# Defines uninstall functions.
# Uninstalls selected application.
uninstall_application() {
# Only use environment keys that end with "APP_NAME".
local keys=($(set | awk -F "=" '{print $1}' | grep ".*APP_NAME"))
printf "Select application to uninstall:\n"
for ((index = 0; index < ${#keys[*]}; index++)); do
local app_file="${!keys[$index]}"
printf " $index: ${app_file}\n"
done
printf " q: Quit/Exit\n\n"
read -p "Enter selection: " response
printf "\n"
local regex="^[0-9]+$"
if [[ $response =~ $regex ]]; then
local app_file="${!keys[$response]}"
local app_path=$(get_install_path "${app_file}")
sudo rm -rf "$app_path"
printf "Uninstalled: ${app_path}\n"
fi
}
export -f uninstall_application
# Uninstalls selected extension.
uninstall_extension() {
# Only use environment keys that end with "EXTENSION_PATH".
local keys=($(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH"))
printf "Select extension to uninstall:\n"
for ((index = 0; index < ${#keys[*]}; index++)); do
local extension_path="${!keys[$index]}"
printf " $index: ${extension_path}\n"
done
printf " q: Quit/Exit\n\n"
read -p "Enter selection: " response
printf "\n"
local regex="^[0-9]+$"
if [[ $response =~ $regex ]]; then
local extension_path="${!keys[$response]}"
rm -rf "${extension_path}"
printf "Uninstalled: ${extension_path}\n"
fi
}
export -f uninstall_extension

View File

@@ -2,11 +2,10 @@
# Defines general utility functions.
# Caffeinate machine.
# Label: Caffeinate Machine
# Description: Keep machine running for a very long time.
caffeinate_machine() {
local pid=$(pgrep -x caffeinate)
if [[ -n "$pid" ]]; then
if [[ -n "$(pgrep -x caffeinate)" ]]; then
printf "Machine is already caffeinated!\n"
else
caffeinate -s -u -d -i -t 3153600000 > /dev/null &
@@ -15,35 +14,40 @@ caffeinate_machine() {
}
export -f caffeinate_machine
# Cleans work path for temporary processing of installs.
# Label: Clean Work Path
# Description: Clean work path of artifacts.
clean_work_path() {
rm -rf "$MAC_OS_WORK_PATH"
}
export -f clean_work_path
# Answers the file or directory basename.
# Parameters: $1 (required) - The file path.
# Label: Get Basename
# Description: Answer file or directory basename.
# Parameters: $1 (required): Path.
get_basename() {
printf "${1##*/}" # Answers file or directory name.
printf "%s" "${1##*/}"
}
export -f get_basename
# Answers the file extension.
# Parameters: $1 (required) - The file name.
# Label: Get Extension
# Description: Answer file extension without dot prefix.
# Parameters: $1 (required): Path.
get_extension() {
local name=$(get_basename "$1")
local extension="${1##*.}" # Excludes dot.
local name=""
local extension="${1##*.}"
name=$(get_basename "$1")
if [[ "$name" == "$extension" ]]; then
printf ''
else
printf "$extension"
printf "%s" "$extension"
fi
}
export -f get_extension
# Answers Homebrew root path.
# Parameters: None.
# Label: Get Homebrew Root
# Description: Answer Homebrew root path.
get_homebrew_root() {
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
printf "%s" "/opt/homebrew"
@@ -53,8 +57,8 @@ get_homebrew_root() {
}
export -f get_homebrew_root
# Answers Homebrew binary root path.
# Parameters: None.
# Label: Get Homebrew Bin Root
# Description: Answer Homebrew binary root path.
get_homebrew_bin_root() {
if [[ "$(/usr/bin/arch)" == "arm64" ]]; then
printf "%s" "/opt/homebrew/bin"
@@ -64,31 +68,28 @@ get_homebrew_bin_root() {
}
export -f get_homebrew_bin_root
# Answers the full install path (including file name) for file name.
# Parameters: $1 (required) - The file name.
# Label: Get Install Path
# Description: Answer full install path (including file name).
# Parameters: $1 (required): Path.
get_install_path() {
local file_name="$1"
local install_path=$(get_install_root "$file_name")
printf "$install_path/$file_name"
local install_path=""
install_path=$(get_install_root "$file_name")
printf "%s" "$install_path/$file_name"
}
export -f get_install_path
# Answers the root install path for file name.
# Parameters: $1 (required) - The file name.
# Label: Get Install Root
# Description: Answer root install path.
# Parameters: $1 (required): Path.
get_install_root() {
local file_name="$1"
local file_extension=$(get_extension "$file_name")
# Special cases not supported by Homebrew.
if [[ "$file_name" == "elm" ]]; then
printf "/usr/local/bin"
return
fi
# Dynamically build the install path based on file extension.
case $file_extension in
case $(get_extension "$file_name") in
'')
printf "$(get_homebrew_bin_root)";;
printf "%s" "$HOME/.local/bin";;
'app')
printf "/Applications";;
'prefPane')
@@ -101,19 +102,19 @@ get_install_root() {
}
export -f get_install_root
# Checks Mac App Store (mas) CLI has been installed and exits if otherwise.
# Parameters: None.
# Label: Check Mac App Store Install
# Description: Check Mac App Store (mas) CLI has been installed.
check_mas_install() {
if ! command -v mas > /dev/null; then
printf "%s\n" "ERROR: Mac App Store (mas) CLI can't be found."
printf "%s\n" " Please ensure Homebrew and mas (i.e. brew install mas) have been installed."
printf "%s\n" " Please ensure mas (i.e. brew install mas) is installed."
exit 1
fi
}
export -f check_mas_install
# Configures shell for new machines and ensures PATH is properly configured for running scripts.
# Parameters: None.
# Label: Configure Environment
# Description: Configure shell and ensure PATH is properly configured.
configure_environment() {
if [[ ! -s "$HOME/.bash_profile" ]]; then
printf "%s\n" "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" > "$HOME/.bash_profile"

View File

@@ -2,57 +2,65 @@
# Defines verification/validation functions.
# Checks for missing App Store applications.
# Label: Verify App Store Applications
# Description: Check for missing App Store applications.
verify_app_store_applications() {
printf "\nChecking App Store applications...\n"
local applications=""
local applications="$(mas list)"
printf "\n%s\n" "Checking App Store applications..."
applications="$(mas list)"
while read line; do
if [[ "$line" == "mas install"* ]]; then
local application=$(printf "$line" | awk '{print $3}')
application=$(printf "$line" | awk '{print $3}')
verify_listed_application "$application" "${applications[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_app_store"
printf "App Store check complete.\n"
printf "%s\n" "App Store check complete."
}
export -f verify_app_store_applications
# Verifies application exists.
# Parameters: $1 (required) - The file name.
# Label: Verify Application
# Description: Verify application exists.
# Parameters: $1 (required): File name.
verify_application() {
local file_name="$1"
local install_path=$(get_install_path "$file_name")
if [[ ! -e "$install_path" ]]; then
printf " - Missing: $file_name\n"
if [[ ! -e "$(get_install_path "$file_name")" ]]; then
printf "%s\n" " - Missing: $file_name"
fi
}
export -f verify_application
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
# Label: Verify Applications
# Description: Check for missing applications suffixed by "APP_NAME" as defined in settings.
verify_applications() {
printf "\nChecking application software...\n"
local file_names=""
printf "\n%s\n" "Checking application software..."
# Only use environment keys that end with "APP_NAME".
local file_names=$(set | awk -F "=" '{print $1}' | grep ".*APP_NAME")
file_names=$(set | awk -F "=" '{print $1}' | grep ".*APP_NAME")
# For each application name, check to see if the application is installed. Otherwise, skip.
for name in $file_names; do
verify_application "${!name}"
done
printf "Application software check complete.\n"
printf "%s\n" "Application software check complete."
}
export -f verify_applications
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
# Label: Verify Extensions
# Description: Check for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.
verify_extensions() {
printf "\nChecking application extensions...\n"
local extensions=""
printf "\n%s\n" "Checking application extensions..."
# Only use environment keys that end with "EXTENSION_PATH".
local extensions=$(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH")
extensions=$(set | awk -F "=" '{print $1}' | grep ".*EXTENSION_PATH")
# For each extension, check to see if the extension is installed. Otherwise, skip.
for extension in $extensions; do
@@ -60,36 +68,42 @@ verify_extensions() {
verify_path "${!extension}"
done
printf "Application extension check complete.\n"
printf "%s\n" "Application extension check complete."
}
export -f verify_extensions
# Checks for missing Homebrew casks.
# Label: Verify Homebrew Casks
# Description: Check for missing Homebrew casks.
verify_homebrew_casks() {
local applications=""
printf "\nChecking Homebrew casks...\n"
local applications="$(brew list --casks)"
applications="$(brew list --casks)"
while read line; do
if [[ "$line" == "brew cask install"* ]]; then
local application=$(printf "$line" | awk '{print $4}')
application=$(printf "%s" "$line" | awk '{print $4}')
verify_listed_application "$application" "${applications[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
printf "Homebrew cask check complete.\n"
printf "%s\n" "Homebrew cask check complete."
}
export -f verify_homebrew_casks
# Checks for missing Homebrew formulas.
# Label: Verify Homebrew Formulas
# Description: Check for missing Homebrew formulas.
verify_homebrew_formulas() {
local applications=""
printf "Checking Homebrew formulas...\n"
local applications="$(brew list --formulae)"
applications="$(brew list --formulae)"
while read line; do
if [[ "$line" == "brew install"* ]]; then
local application=$(printf "$line" | awk '{print $3}')
application=$(printf "%s" "$line" | awk '{print $3}')
# Exception: "gpg" is the binary but is listed as "gnugp".
if [[ "$application" == "gpg" ]]; then
@@ -100,80 +114,89 @@ verify_homebrew_formulas() {
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
printf "Homebrew formula check complete.\n"
printf "%s\n" "Homebrew formula check complete."
}
export -f verify_homebrew_formulas
# Verifies listed application exists.
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
# Label: Verify Listed Application
# Description: Verify listed application exists.
# Parameters: $1 (required): Current application, $2 (required): Application list.
verify_listed_application() {
local application="$1"
local applications="$2"
if [[ "${applications[*]}" != *"$application"* ]]; then
printf " - Missing: $application\n"
printf "%s\n" " - Missing: $application"
fi
}
export -f verify_listed_application
# Verifies path exists.
# Parameters: $1 (required) - The path.
# Label: Verify Path
# Description: Verify path exists.
# Parameters: $1 (required): Path.
verify_path() {
local path="$1"
if [[ ! -e "$path" ]]; then
printf " - Missing: $path\n"
printf "%s\n" " - Missing: $path"
fi
}
export -f verify_path
# Checks for missing Node packages.
# Label: Verify Node Packages
# Description: Check for missing Node packages.
verify_node_packages() {
printf "\nChecking Node packages...\n"
printf "\n%s\n" "Checking Node packages..."
while read line; do
if [[ "$line" == "npm "* ]]; then
local package=$(printf "$line" | awk '{print $4}')
local packages=($(npm list --global --depth=0 | grep "$package"))
package=$(printf "$line" | awk '{print $4}')
packages=($(npm list --global --depth=0 | grep "$package"))
verify_listed_application "$package" "${packages[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_node_packages"
printf "Node packages check complete.\n"
printf "%s\n" "Node packages check complete."
}
export -f verify_node_packages
# Checks for missing Ruby gems.
# Label: Verify Ruby Gems
# Description: Check for missing Ruby gems.
verify_ruby_gems() {
local gems="$(gem list --no-versions)"
local gems=""
printf "\nChecking Ruby gems...\n"
printf "\n%s\n" "Checking Ruby gems..."
gems="$(gem list --no-versions)"
while read line; do
if [[ "$line" == "gem install"* ]]; then
local gem=$(printf "$line" | awk '{print $3}')
gem=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$gem" "${gems[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_ruby_gems"
printf "Ruby gems check complete.\n"
printf "%s\n" "Ruby gems check complete."
}
export -f verify_ruby_gems
# Checks for missing Rust crates.
# Label: Verify Rust Crates
# Description: Check for missing Rust crates.
verify_rust_crates() {
printf "\nChecking Rust crates...\n"
local crates=""
local crates="$(ls -A1 $HOME/.cargo/bin)"
printf "\n%s\n" "Checking Rust crates..."
crates="$(ls -A1 $HOME/.cargo/bin)"
while read line; do
if [[ "$line" == "cargo install"* ]]; then
local crate=$(printf "$line" | awk '{print $3}')
crate=$(printf "%s" "$line" | awk '{print $3}')
verify_listed_application "$crate" "${crates[*]}"
fi
done < "$MAC_OS_CONFIG_PATH/bin/install_rust_crates"
printf "Rust crates check complete.\n"
printf "%s\n" "Rust crates check complete."
}
export -f verify_rust_crates