Compare commits

..

80 Commits

Author SHA1 Message Date
Brooke Kuhlmann
5312d36d67 Updated version 2026-01-01 14:36:32 -07:00
Brooke Kuhlmann
76f34a826c Updated to Git Lint 10.0.0
link:https://alchemists.io/projects/git-lint/versions/10.0.0/[Details]. This only effects the development environment which is why this is a minor bump.

Milestone: minor
2026-01-01 11:45:49 -07:00
Brooke Kuhlmann
9f5cc69c7d Updated to Refinements 14.0.0
link:https://alchemists.io/projects/refinements/versions/14.0.0/[Details].

Milestone: major
2026-01-01 07:26:30 -07:00
Brooke Kuhlmann
e4331ce887 Updated to Ruby 4.0.0
link:https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released[Details]

Milestone: major
2025-12-25 08:40:18 -07:00
Brooke Kuhlmann
ce3c24adcd Updated to Ruby 3.4.8
link:https://github.com/ruby/ruby/releases/tag/v3_4_8[Details].

Milestone: patch
2025-12-16 20:43:29 -07:00
Brooke Kuhlmann
8a21a0f3e8 Updated to Ruby 3.4.7
link:https://www.ruby-lang.org/en/news/2025/10/07/ruby-3-4-7-released/[Details].

Milestone: patch
2025-10-07 19:13:01 -06:00
Brooke Kuhlmann
6a259a7859 Updated version 2025-09-19 08:26:43 -06:00
Brooke Kuhlmann
76fd15a82f Updated to macOS Tahoe
Necessary to leverage the latest operating system version.

Milestone: major
2025-09-19 08:25:47 -06:00
Brooke Kuhlmann
8bafdda425 Updated to Ruby 3.4.6
link:https://www.ruby-lang.org/en/news/2025/09/16/ruby-3-4-6-released[Details].

Milestone: patch
2025-09-15 21:47:03 -06:00
Brooke Kuhlmann
ec55a93405 Updated GitHub issue and code review templates
Necessary to fix an issue with the issue templates since GitHub no longer respects the `.github/ISSUE_TEMPLATE.md` file so am now using the `ISSUE_TEMPLATE` folder with additional links to community and security information. Only a single issue template is being used to reduce the number of choices people have to make. The code view template was also updated to improve the descriptions.

Milestone: minor
2025-08-08 11:17:37 -06:00
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
32 changed files with 385 additions and 619 deletions

View File

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

View File

@@ -1,11 +0,0 @@
## Overview
<!-- Required. Describe, briefly, the behavior experienced and desired. -->
## Screenshots/Screencasts
<!-- Optional. Attach screenshot(s) and/or screencast(s) that demo the behavior. -->
## Steps to Recreate
<!-- Required. List exact steps (numbered list) to reproduce errant behavior. -->
## Environment
<!-- Required. What is your operating system, software version(s), etc. -->

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Community
url: https://alchemists.io/community
about: Please ask questions or discuss specifics here.
- name: Security
url: https://alchemists.io/policies/security
about: Please report security vulnerabilities here.

18
.github/ISSUE_TEMPLATE/issue.md vendored Normal file
View File

@@ -0,0 +1,18 @@
---
name: Issue
title: "Add|Update|Fix|Remove|Refactor "
about: Report an issue. Please use only one of the subject prefixes.
---
<!--
Please focus on well written issues. Context: https://alchemists.io/articles/software_issues.
-->
## Why
<!-- Required. Describe, briefly, why this issue is important. -->
## How
<!-- Optional. List exact steps to implement or reproduce behavior. Screen shots/casts are welcome! -->
## Notes
<!-- Optional. Provide additional details like operating system, software version(s), stack dump, logs, or anything else that would be helpful. -->

View File

@@ -1,8 +1,8 @@
## Overview ## Overview
<!-- Required. Why is this important/necessary and what is the overarching architecture. --> <!-- Required. Describe, briefly, why this is necessary and what the overarching architecture is. -->
## Screenshots/Screencasts ## Screenshots/Screencasts
<!-- Optional. Provide supporting image/video. --> <!-- Optional. Provide supporting screen shots/casts. -->
## Details ## Details
<!-- Optional. List the key features/highlights as bullet points. --> <!-- Optional. As bullet points, list related issue(s); major highlights; team callouts; and/or other information that is helpful. -->

View File

@@ -1 +1 @@
3.2.2 4.0.0

View File

@@ -2,9 +2,9 @@ cff-version: 1.2.0
message: Please use the following metadata when citing this project in your work. message: Please use the following metadata when citing this project in your work.
title: macOS title: macOS
abstract: Shell scripts for automated macOS machine setup. abstract: Shell scripts for automated macOS machine setup.
version: 16.0.3 version: 22.0.0
license: Hippocratic-2.1 license: Hippocratic-2.1
date-released: 2023-05-18 date-released: 2026-01-01
authors: authors:
- family-names: Kuhlmann - family-names: Kuhlmann
given-names: Brooke given-names: Brooke
@@ -17,5 +17,6 @@ keywords:
- automation - automation
- setup - setup
- recovery - recovery
repository-code: https://alchemists.io/projects/mac_os repository-code: https://github.com/bkuhlmann/mac_os
repository-artifact: https://alchemists.io/projects/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 # frozen_string_literal: true
ruby File.read(".ruby-version").strip ruby file: ".ruby-version"
source "https://rubygems.org" source "https://rubygems.org"
gem "caliber", "~> 0.30" gem "caliber", "~> 0.82"
gem "git-lint", "~> 5.0" gem "debug", "~> 1.11"
gem "rake", "~> 13.0" gem "git-lint", "~> 10.0"
gem "rake", "~> 13.3"

View File

@@ -2,6 +2,8 @@
:toclevels: 5 :toclevels: 5
:figure-caption!: :figure-caption!:
:mac_os_defaults_link: link:https://macos-defaults.com[macOS Defaults]
= macOS = macOS
Shell scripts for automated macOS machine setup. Shell scripts for automated macOS machine setup.
@@ -34,18 +36,13 @@ toc::[]
* Installs link:https://nodejs.org[Node] link:https://www.npmjs.com[packages]. * 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.ruby-lang.org[Ruby] link:https://rubygems.org[gems].
* Installs link:https://www.rust-lang.org[Rust] link:https://crates.io[crates]. * 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. * Configures installed software.
* Supports restoration of machine backups. * Supports restoration of machine backups.
== Screencast
[link=https://alchemists.io/screencasts/mac_os]
image::https://alchemists.io/images/screencasts/mac_os/cover.svg[Screencast,600,240,role=focal_point]
== Requirements == Requirements
. link:https://www.apple.com/macos/ventura[macOS Ventura] . link:https://www.apple.com/os/macos[macOS 26.0.0 (Tahoe)]
. link:https://developer.apple.com/xcode[Xcode] . link:https://developer.apple.com/xcode[Xcode]
== Setup == Setup
@@ -56,7 +53,7 @@ To install, run:
---- ----
git clone https://github.com/bkuhlmann/mac_os.git git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os cd mac_os
git checkout 16.0.3 git checkout 22.0.0
---- ----
== Usage == Usage
@@ -121,35 +118,47 @@ When attempting to create a boot disk via `bin/run B`, youll be presented wit
documentation (provided here for reference): documentation (provided here for reference):
.... ....
macOS Boot Disk Tips macOS Boot Disk Setup
- Use a USB drive (8GB or higher). 1. Insert a USB drive (8GB or higher).
- Use Disk Utility to format the USB drive as "Mac OS Extended (Journaled)". 2. Use Disk Utility to format as "Mac OS Extended (Journaled)".
- Use Disk Utility to label the USB drive as "Untitled". 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: 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. 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. 4. Select the USB boot disk from the menu.
5. Use Disk Utility to delete and/or erase the hard drive including associated partitions. 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. 7. Install the new operating system.
macOS Boot Disk Recovery: macOS Boot Disk Recovery:
1. Start/restart the machine. 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. 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. 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.
.... ....
💡 You can ensure the right installer is downloaded and available for Boot Disk creation by running the following commands:
[source,bash]
----
# Show which installers are available.
softwareupdate --list-full-installers
# Download desired version.
sudo softwareupdate --fetch-full-installer --full-installer-version 26.0
----
=== Customization === Customization
All executable scripts can be found in the `bin` folder: All executable scripts can be found in the `bin` folder:
* `bin/apply_basic_settings` (optional, customizable): Applies basic and initial settings for * `bin/apply_basic_settings` (optional, customizable): Applies basic and initial settings for
setting up a machine. setting up a machine.
* `bin/apply_default_settings` (optional, customizable): Applies bare minimum system and application * `bin/apply_default_settings` (optional, customizable): Applies {mac_os_defaults_link}.
defaults.
* `bin/configure_software` (optional, customizable): Configures installed software as part of the * `bin/configure_software` (optional, customizable): Configures installed software as part of the
post install process. post install process.
* `bin/create_boot_disk` (optional): Creates a macOS boot disk. * `bin/create_boot_disk` (optional): Creates a macOS boot disk.
@@ -205,6 +214,7 @@ link:https://alchemists.io/projects/mac_os-config[macOS Config] project for furt
** After seven seconds, hold down the Power button as well. ** After seven seconds, hold down the Power button as well.
** Release all keys after another seven seconds. ** Release all keys after another seven seconds.
** Turn on your Mac. ** 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 == Development
@@ -224,6 +234,8 @@ cd mac_os
== link:https://alchemists.io/policies/contributions[Contributions] == link:https://alchemists.io/policies/contributions[Contributions]
== link:https://alchemists.io/policies/developer_certificate_of_origin[Developer Certificate of Origin]
== link:https://alchemists.io/projects/mac_os/versions[Versions] == link:https://alchemists.io/projects/mac_os/versions[Versions]
== link:https://alchemists.io/community[Community] == link:https://alchemists.io/community[Community]

View File

@@ -6,4 +6,7 @@ require "rubocop/rake_task"
Git::Lint::Rake::Register.call Git::Lint::Rake::Register.call
RuboCop::RakeTask.new 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,350 +0,0 @@
= Versions
== 16.0.3 (2023-05-18)
* Updated to Caliber 0.30.0 - Brooke Kuhlmann
== 16.0.2 (2023-04-02)
* Fixed programs without extensions to install to user directory - Brooke Kuhlmann
* Updated site URLs to use bare domain - Brooke Kuhlmann
* Updated to Ruby 3.2.1 - Brooke Kuhlmann
* Updated to Ruby 3.2.2 - Brooke Kuhlmann
== 16.0.1 (2023-02-05)
* Added Rake binstub - Brooke Kuhlmann
* Updated to Caliber 0.21.0 - Brooke Kuhlmann
* Updated to Caliber 0.25.0 - Brooke Kuhlmann
* Updated to Git Lint 5.0.0 - Brooke Kuhlmann
== 16.0.0 (2022-12-25)
* Fixed Node installer to detect Node and version - Brooke Kuhlmann
* Fixed Ruby installer to pass configuration options - Brooke Kuhlmann
* Updated README sections - Brooke Kuhlmann
* Updated installs for basic, default, and shell scripts - Brooke Kuhlmann
* Updated run script to distinquish between applications and libraries - Brooke Kuhlmann
* Updated to Caliber 0.11.0 - Brooke Kuhlmann
* Updated to Caliber 0.16.0 - Brooke Kuhlmann
* Updated to Ruby 3.1.3 - Brooke Kuhlmann
* Updated to Ruby 3.2.0 - Brooke Kuhlmann
* Updated to macOS Ventura - Brooke Kuhlmann
* Removed configure software script - Brooke Kuhlmann
* Removed mention of Intel CPUs from boot disk instructions - Brooke Kuhlmann
* Removed system update from Ruby install - Brooke Kuhlmann
* Removed uninstallers and reinstallers - Brooke Kuhlmann
* Refactored download file function to use multi-line curl command - Brooke Kuhlmann
== 15.0.5 (2022-05-07)
* Updated to Caliber 0.6.0 - Brooke Kuhlmann
* Updated to Caliber 0.7.0 - Brooke Kuhlmann
* Updated to Caliber 0.8.0 - Brooke Kuhlmann
== 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

@@ -2,33 +2,35 @@
# Creates macOS boot disk. # Creates macOS boot disk.
printf "macOS Boot Disk Tips\n" printf "%s\n" "macOS Boot Disk Setup"
printf " - Use a USB drive (8GB or higher).\n" printf "%s\n" " 1. Insert a USB drive (8GB or higher)."
printf " - Use Disk Utility to format the USB drive as \"APSF\".\n" printf "%s\n" " 2. Use Disk Utility to format as \"Mac OS Extended (Journaled)\"."
printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n" printf "%s\n" " 3. Use Disk Utility to set the schema, if available, as \"GUID Partition Map\"."
printf "\nmacOS Boot Disk Usage:\n" printf "%s\n" " 4. Use Disk Utility to label as \"Untitled\"."
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n" printf "%s\n" " 5. Run this script to install the OS and create a bootable USB drive."
printf " 2. Reboot the machine.\n" printf "\n%s\n" "macOS Boot Disk Usage:"
printf " 3. Press and hold the POWER key before the Apple logo appears.\n" printf "%s\n" " 1. Insert the USB drive, created above, into the machine to be upgraded."
printf " 4. Select the USB boot disk from the menu.\n" printf "%s\n" " 2. Reboot the machine."
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n" printf "%s\n" " 3. Press and hold the POWER key before the Apple logo appears."
printf " 6. Use Disk Utility to create a single \"APFS\" drive.\n" printf "%s\n" " 4. Select the USB boot disk from the menu."
printf " 7. Install the new operating system.\n" printf "%s\n" " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions."
printf "\nmacOS Boot Disk Recovery:\n" printf "%s\n" " 6. Use Disk Utility to create a single \"APFS\" drive."
printf " 1. Start/restart the machine.\n" printf "%s\n" " 7. Install the new operating system."
printf " 2. Press and hold the POWER key before the Apple logo appears.\n" printf "\n%s\n" "macOS Boot Disk Recovery:"
printf " 3. Wait for the macOS installer to load from the recovery partition.\n" printf "%s\n" " 1. Start/restart the machine."
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n" 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 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 exit 1
fi fi
if [[ ! -d "$MAC_OS_BOOT_DISK_PATH" ]]; then 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 exit 1
fi fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
check_mas_install check_mas_install
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_applications"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

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

View File

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

View File

@@ -1,14 +1,14 @@
#! /usr/bin/env bash #! /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 xcode-select --install
printf "%s\n" "💡 ALT+TAB to view and accept Xcode license window." 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 read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response
if [[ "$xcode_response" != "y" ]]; then 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 exit 1
fi fi

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_extensions"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew install_homebrew
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_homebrew install_homebrew
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_node install_node
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_ruby install_ruby
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

@@ -13,5 +13,5 @@ if [[ -x "$SCRIPT_PATH" ]]; then
install_rust install_rust
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

View File

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

View File

@@ -12,5 +12,5 @@ SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/restore_backup"
if [[ -x "$SCRIPT_PATH" ]]; then if [[ -x "$SCRIPT_PATH" ]]; then
"$SCRIPT_PATH" "$SCRIPT_PATH"
else 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 fi

70
bin/run
View File

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

View File

@@ -2,8 +2,9 @@
# Defines software installer functions. # Defines software installer functions.
# Downloads remote file to local disk. # Label: Download File
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (optional) - HTTP header. # Description: Download remote file to local disk.
# Parameters: $1 (required): URL, $2 (required): File name, $3 (optional): HTTP header.
download_file() { download_file() {
local url="$1" local url="$1"
local file_name="$2" local file_name="$2"
@@ -24,38 +25,47 @@ download_file() {
} }
export -f download_file export -f download_file
# Installs an application. # Label: Install Application
# Parameters: $1 (required) - Application source path, $2 (required) - Application name. # Description: Install an application.
# Parameters: $1 (required): Install path, $2 (required): Name.
install_app() { install_app() {
local install_root=$(get_install_root "$2") local install_path="$1"
local file_extension=$(get_extension "$2") 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 case $file_extension in
'') '')
cp -a "$1/$2" "$install_root";; cp -a "$install_path/$name" "$install_root";;
'app') 'app')
cp -a "$1/$2" "$install_root";; cp -a "$install_path/$name" "$install_root";;
'prefPane') 'prefPane')
sudo cp -pR "$1/$2" "$install_root";; sudo cp -pR "$install_path/$name" "$install_root";;
'qlgenerator') '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 esac
} }
export -f install_app export -f install_app
# Installs an application via a DMG file. # Label: Install DMG Application
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name. # Description: Install DMG application.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_app() { install_dmg_app() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.dmg" local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
@@ -66,66 +76,76 @@ install_dmg_app() {
} }
export -f install_dmg_app export -f install_dmg_app
# Installs a package via a DMG file. # Label: Install DMG Package
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name. # Description: Install DMG application via a package file.
# Parameters: $1 (required): URL, $2 (required): Mount path, $3 (required): Application name.
install_dmg_pkg() { install_dmg_pkg() {
local url="$1" local url="$1"
local mount_point="/Volumes/$2" local mount_point="/Volumes/$2"
local app_name="$3" local app_name="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.dmg" local work_file="download.dmg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
mount_image "$MAC_OS_WORK_PATH/$work_file" mount_image "$MAC_OS_WORK_PATH/$work_file"
install_pkg "$mount_point" "$app_name" install_pkg "$mount_point" "$app_name"
unmount_image "$mount_point" unmount_image "$mount_point"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_dmg_pkg export -f install_dmg_pkg
# Installs a single file. # Label: Install File
# Parameters: $1 (required) - URL, $2 (required) - Install path. # Description: Install a single file.
# Parameters: $1 (required): URL, $2 (required): Install path.
install_file() { install_file() {
local file_url="$1" local file_url="$1"
local file_name=$(get_basename "$1") local file_name=""
local install_path="$2" local install_path="$2"
file_name=$(get_basename "$1")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$file_url" "$file_name" download_file "$file_url" "$file_name"
mkdir -p $(dirname "$install_path") mkdir -p $(dirname "$install_path")
mv "$MAC_OS_WORK_PATH/$file_name" "$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" verify_path "$install_path"
fi fi
} }
export -f install_file export -f install_file
# Installs application code from a Git repository. # Label: Install Git Application
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options. # Description: Install application from a Git repository.
# Parameters: $1 (required): URL, $2 (required): Install path, $3 (optional): Git clone options.
install_git_app() { install_git_app() {
local repository_url="$1" local url="$1"
local app_name=$(get_basename "$2")
local install_path="$2" local install_path="$2"
local app_name=""
local options="--quiet" local options="--quiet"
app_name="$(get_basename "$2")"
if [[ -n "$3" ]]; then if [[ -n "$3" ]]; then
local options="$options $3" local options="$options $3"
fi fi
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
printf "Installing: $install_path/$app_name...\n" printf "%s\n" "Installing: $install_path..."
git clone $options "$repository_url" "$install_path" git clone $options "$url" "$install_path"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_path "$install_path" verify_path "$install_path"
fi fi
} }
export -f install_git_app export -f install_git_app
# Installs settings from a Git repository. # Label: Install Git Project
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments). # 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() { install_git_project() {
local repo_url="$1" local repo_url="$1"
local repo_version="$2" local repo_version="$2"
@@ -142,64 +162,79 @@ install_git_project() {
} }
export -f install_git_project export -f install_git_project
# Installs Homebrew. # Label: Install Homebrew
# Parameters: None. # Description: Install and setup Homebrew.
install_homebrew() { install_homebrew() {
if ! command -v brew > /dev/null; then 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)" /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)" eval "$($(get_homebrew_bin_root)/brew shellenv)"
fi fi
} }
export -f install_homebrew export -f install_homebrew
# Installs a package via a zip file. # Label: Install Bare Package
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install a bare package.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_bare_pkg() { install_bare_pkg() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="$app_name.pkg" local work_file="$app_name.pkg"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
install_pkg "$MAC_OS_WORK_PATH" "$app_name" install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_bare_pkg export -f install_bare_pkg
# Installs a package. # Label: Install Package
# Parameters: $1 (required) - Package source path, $2 (required) - Application name. # Description: Install local package.
# Parameters: $1 (required): Package source path, $2 (required): Application name.
install_pkg() { 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" install_root=$(get_install_root "$name")
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg") 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 / sudo installer -pkg "$package" -target /
} }
export -f install_pkg export -f install_pkg
# Installs program (single file). # Label: Install Program
# Parameters: $1 (required) - URL, $2 (required) - Program name. # Description: Installs program without any packaging.
# Parameters: $1 (required): URL, $2 (required): Name.
install_program() { install_program() {
local url="$1" local url="$1"
local program_name="$2" 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 if [[ ! -e "$install_path" ]]; then
download_file "$url" "$program_name" download_file "$url" "$program_name"
mkdir -p "$install_root"
mv "$MAC_OS_WORK_PATH/$program_name" "$install_path" mv "$MAC_OS_WORK_PATH/$program_name" "$install_path"
chmod 755 "$install_path" chmod 755 "$install_path"
printf "Installed: $program_name.\n" printf "%s\n" "Installed: $program_name."
verify_application "$program_name" verify_application "$program_name"
fi fi
} }
export -f install_program export -f install_program
# Installs Node. # Label: Install Node
# Parameters: None. # Description: Install and setup Node for local development.
install_node() { install_node() {
if [[ ! -x "$(command -v node)" ]]; then if [[ ! -x "$(command -v node)" ]]; then
"$(get_homebrew_bin_root)/fnm" install --latest "$(get_homebrew_bin_root)/fnm" install --latest
@@ -207,10 +242,12 @@ install_node() {
} }
export -f install_node export -f install_node
# Installs Ruby. # Label: Install Ruby
# Parameters: None. # Description: Install and setup Ruby for local development.
install_ruby() { 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 if [[ ! -x "$(command -v ruby)" && -n $(ruby --version | grep --quiet "$version") ]]; then
"$(get_homebrew_bin_root)"/frum install "$version" \ "$(get_homebrew_bin_root)"/frum install "$version" \
@@ -222,8 +259,8 @@ install_ruby() {
} }
export -f install_ruby export -f install_ruby
# Installs Rust. # Label: Install Rust
# Parameters: None. # Description: Install and setup Rust for local development.
install_rust() { install_rust() {
if ! command -v cargo > /dev/null; then if ! command -v cargo > /dev/null; then
curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh curl --proto "=https" --tlsv1.2 --fail --silent --show-error https://sh.rustup.rs | sh
@@ -231,15 +268,18 @@ install_rust() {
} }
export -f install_rust export -f install_rust
# Installs an application via a tar file. # Label: Install Tar Application
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options. # Description: Install application from tar file.
# Parameters: $1 (required): URL, $2 (required): Name, $3 (required): Decompress options.
install_tar_app() { install_tar_app() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local options="$3" local options="$3"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.tar" local work_file="download.tar"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -250,20 +290,23 @@ install_tar_app() {
) )
install_app "$MAC_OS_WORK_PATH" "$app_name" install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_tar_app export -f install_tar_app
# Installs an application via a zip file. # Label: Install Zip Application
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install application from zip file.
# Parameters: $1 (required): URL, $2 (required): Name.
install_zip_app() { install_zip_app() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.zip" local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -275,20 +318,23 @@ install_zip_app() {
) )
install_app "$MAC_OS_WORK_PATH" "$app_name" install_app "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_zip_app export -f install_zip_app
# Installs a package via a zip file. # Label: Install Zip Package
# Parameters: $1 (required) - URL, $2 (required) - Application name. # Description: Install application from a package within a zip file.
# Parameters: $1 (required): URL, $2 (required): Application name.
install_zip_pkg() { install_zip_pkg() {
local url="$1" local url="$1"
local app_name="$2" local app_name="$2"
local install_path=$(get_install_path "$app_name") local install_path=""
local work_file="download.zip" local work_file="download.zip"
install_path=$(get_install_path "$app_name")
if [[ ! -e "$install_path" ]]; then if [[ ! -e "$install_path" ]]; then
download_file "$url" "$work_file" download_file "$url" "$work_file"
@@ -299,24 +345,26 @@ install_zip_pkg() {
) )
install_pkg "$MAC_OS_WORK_PATH" "$app_name" install_pkg "$MAC_OS_WORK_PATH" "$app_name"
printf "Installed: $app_name.\n" printf "%s\n" "Installed: $app_name."
verify_application "$app_name" verify_application "$app_name"
fi fi
} }
export -f install_zip_pkg export -f install_zip_pkg
# Mounts a disk image. # Label: Mount Image
# Parameters: $1 (required) - Image path. # Description: Mount disk image.
# Parameters: $1 (required): Path.
mount_image() { mount_image() {
printf "Mounting image...\n" printf "%s\n" "Mounting image..."
hdiutil attach -quiet -nobrowse -noautoopen "$1" hdiutil attach -quiet -nobrowse -noautoopen "$1"
} }
export -f mount_image export -f mount_image
# Unmounts a disk image. # Label: Unmount Image
# Parameters: $1 (required) - Mount path. # Description: Unmount disk image.
# Parameters: $1 (required): Path.
unmount_image() { unmount_image() {
printf "Unmounting image...\n" printf "%s\n" "Unmounting image..."
hdiutil detach -force "$1" hdiutil detach -force "$1"
} }
export -f unmount_image export -f unmount_image

View File

@@ -2,8 +2,10 @@
# Defines command line prompt options. # 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() { process_option() {
case $1 in case $1 in
'B') 'B')
@@ -48,9 +50,9 @@ process_option() {
'rc') 'rc')
bin/install_rust_crates;; bin/install_rust_crates;;
'l') 'l')
bin/install_node_packages bin/install_rust_crates
bin/install_ruby_gems bin/install_ruby_gems
bin/install_rust_crates;; bin/install_node_packages;;
'c') 'c')
verify_homebrew_formulas verify_homebrew_formulas
verify_homebrew_casks verify_homebrew_casks

View File

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

View File

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

View File

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