Compare commits

..

68 Commits

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

View File

@@ -1 +1 @@
3.1.2 3.3.5

View File

@@ -1,10 +1,10 @@
cff-version: 1.2.0 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: Provides a shell based framework for automating the setup of a macOS machine. abstract: Shell scripts for automated macOS machine setup.
version: 15.0.5 version: 18.3.2
license: Hippocratic-2.1 license: Hippocratic-2.1
date-released: 2022-05-07 date-released: 2024-09-03
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://www.alchemists.io/projects/mac_os repository-code: https://github.com/bkuhlmann/mac_os
repository-artifact: https://www.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.8" gem "caliber", "~> 0.58"
gem "git-lint", "~> 4.0" gem "debug", "~> 1.9"
gem "rake", "~> 13.0" gem "git-lint", "~> 8.0"
gem "rake", "~> 13.2"

View File

@@ -8,13 +8,13 @@ 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 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 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 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 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: how the two projects are meant to be used:
* *macOS* (this project) - The foundational framework for building custom macOS machine setups. * *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 this _macOS_ project which defines a custom machine implementation. The project is meant to be
forked for as many custom machine setups as needed. forked for as many custom machine setups as needed.
@@ -38,14 +38,9 @@ toc::[]
* Configures installed software. * Configures installed software.
* Supports restoration of machine backups. * 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 == Requirements
. link:https://www.apple.com/macos/monterey[macOS Monterey] . link:https://www.apple.com/macos/sonoma[macOS Sonoma]
. link:https://developer.apple.com/xcode[Xcode] . link:https://developer.apple.com/xcode[Xcode]
== Setup == Setup
@@ -56,7 +51,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 15.0.5 git checkout 18.3.2
---- ----
== Usage == Usage
@@ -172,13 +167,13 @@ All executable scripts can be found in the `bin` folder:
* `bin/run` (required): The main script and interface for macOS setup. * `bin/run` (required): The main script and interface for macOS setup.
The `lib` folder provides the base framework for installing, re-installing, and uninstalling 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 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. * `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 * *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 prior to upgrading as you might experience various errors with Apple not being able to detect an
@@ -216,18 +211,20 @@ git clone https://github.com/bkuhlmann/mac_os.git
cd mac_os 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 == 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 # frozen_string_literal: true
require "git/lint/rake/setup" require "git/lint/rake/register"
require "rubocop/rake_task" require "rubocop/rake_task"
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,5 +1,100 @@
= Versions = Versions
== 18.3.2 (2024-09-03)
* 🟢 Added README Developer Certificate of Origin documentation - Brooke Kuhlmann
* 🔼 Updated to Ruby 3.3.5 - Brooke Kuhlmann
== 18.3.1 (2024-08-17)
* 🔼 Updated to Ruby 3.3.4 - Brooke Kuhlmann
== 18.3.0 (2024-07-08)
* 🔼 Updated to Caliber 0.58.0 - Brooke Kuhlmann
* 🔼 Updated to Git Lint 8.0.0 - Brooke Kuhlmann
* 🔼 Updated to Ruby 3.3.3 - Brooke Kuhlmann
== 18.2.2 (2024-06-01)
* 🔼 Updated citation URLs - Brooke Kuhlmann
* 🔼 Updated to Ruby 3.3.2 - Brooke Kuhlmann
== 18.2.1 (2024-05-02)
* 🔼 Updated to Ruby 3.3.1 - Brooke Kuhlmann
== 18.2.0 (2024-04-21)
* 🔼 Updated RuboCop to use XDG local configuration - Brooke Kuhlmann
* 🔼 Updated to Caliber 0.51.0 - Brooke Kuhlmann
* 🔼 Updated to Git Lint 7.1.0 - Brooke Kuhlmann
* 🔼 Updated to Git Lint 7.3.0 - Brooke Kuhlmann
* 🔼 Updated to Rake 13.2.0 - Brooke Kuhlmann
== 18.1.0 (2024-02-25)
* 🔼 Updated to Caliber 0.50.0 - Brooke Kuhlmann
* 🔁 Refactored bin script printing - Brooke Kuhlmann
* 🔁 Refactored library functions - Brooke Kuhlmann
== 18.0.0 (2024-01-06)
* Added Rakefile quality task - Brooke Kuhlmann
* Updated Circle CI step names - Brooke Kuhlmann
* Updated GitHub issue template with simplified sections - Brooke Kuhlmann
* Updated gem dependencies - Brooke Kuhlmann
* Updated to Caliber 0.42.0 - Brooke Kuhlmann
* Updated to Ruby 3.3.0 - Brooke Kuhlmann
* Refactored Gemfile to use ruby file syntax - Brooke Kuhlmann
== 17.0.0 (2023-09-28)
* Added Debug gem - Brooke Kuhlmann
* Updated to macOS Sonoma - Brooke Kuhlmann
== 16.0.4 (2023-06-19)
* Updated to Caliber 0.35.0 - Brooke Kuhlmann
* Updated to Git Lint 6.0.0 - Brooke Kuhlmann
* Updated to Refinements 11.0.0 - Brooke Kuhlmann
== 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) == 15.0.5 (2022-05-07)
* Updated to Caliber 0.6.0 - Brooke Kuhlmann * Updated to Caliber 0.6.0 - Brooke Kuhlmann

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,33 @@
# Creates macOS boot disk. # Creates macOS boot disk.
printf "macOS Boot Disk Tips\n" printf "%s\n" "macOS Boot Disk Tips"
printf " - Use a USB drive (8GB or higher).\n" printf "%s\n" " - Use a USB drive (8GB or higher)."
printf " - Use Disk Utility to format the USB drive as \"Mac OS Extended (Journaled)\".\n" printf "%s\n" " - Use Disk Utility to format the USB drive as \"APSF\"."
printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n" printf "%s\n" " - Use Disk Utility to label the USB drive as \"Untitled\"."
printf "\nmacOS Boot Disk Usage:\n" printf "\n%s\n" "macOS Boot Disk Usage:"
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n" printf "%s\n" " 1. Insert the USB boot disk into the machine to be upgraded."
printf " 2. Reboot the machine.\n" printf "%s\n" " 2. Reboot the machine."
printf " 3. Hold the POWER (Silicon) or OPTION (Intel) key before the Apple logo appears.\n" printf "%s\n" " 3. Press and hold the POWER key before the Apple logssssso appears."
printf " 4. Select the USB boot disk from the menu.\n" printf "%s\n" " 4. Select the USB boot disk from the menu."
printf " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions.\n" printf "%s\n" " 5. Use Disk Utility to delete and/or erase the hard drive including associated partitions."
printf " 6. Use Disk Utility to create a single \"APFS\" drive as a \"GUID Partition Table\".\n" printf "%s\n" " 6. Use Disk Utility to create a single \"APFS\" drive."
printf " 7. Install the new operating system.\n" printf "%s\n" " 7. Install the new operating system."
printf "\nmacOS Boot Disk Recovery:\n" printf "\n%s\n" "macOS Boot Disk Recovery:"
printf " 1. Start/restart the machine.\n" printf "%s\n" " 1. Start/restart the machine."
printf " 2. Hold the POWER (Silicon) or COMMAND+R (Intel) keys before the Apple logo appears.\n" printf "%s\n" " 2. Press and hold the POWER key before the Apple logo appears."
printf " 3. Wait for the macOS installer to load from the recovery partition.\n" printf "%s\n" " 3. Wait for the macOS installer to load from the recovery partition."
printf " 4. Use the dialog options to launch Disk Utility, reinstall the system, etc.\n" 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

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 #! /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

@@ -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 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

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 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

76
bin/run
View File

@@ -4,22 +4,20 @@
source lib/installers.sh source lib/installers.sh
source lib/options.sh source lib/options.sh
source lib/reinstallers.sh
source lib/settings.sh source lib/settings.sh
source lib/uninstallers.sh
source lib/utilities.sh source lib/utilities.sh
source lib/verifiers.sh 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
@@ -27,41 +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: Apply basic settings.\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 " df: Install dotfiles.\n" printf "%s\n" " d: Install defaults."
printf " np: Install Node packages.\n" printf "%s\n" " s: Install shell."
printf " rg: Install Ruby gems.\n" printf "%s\n" " r: Restore backups."
printf " rc: Install Rust crates.\n" printf "%s\n" " i: Install all (i.e. executes all of the above steps in order listed)."
printf " d: Apply default settings.\n" printf "%s\n" " Libraries:"
printf " cs: Configure installed software.\n" printf "%s\n" " np: Install Node packages."
printf " i: Install all (i.e. executes all of the above steps in order listed).\n" printf "%s\n" " rg: Install Ruby gems."
printf " Restore:\n" printf "%s\n" " rc: Install Rust crates."
printf " R: Restore settings from backup.\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 " ua: Uninstall application software.\n" printf "%s\n" " w: Clean work (temp) directory."
printf " ux: Uninstall application software extension.\n" printf "%s\n\n" " q: Quit/Exit."
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"
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"
@@ -11,43 +12,60 @@ download_file() {
printf "%s\n" "Downloading $1..." printf "%s\n" "Downloading $1..."
clean_work_path clean_work_path
mkdir $MAC_OS_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"
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 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"
@@ -58,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"
@@ -134,86 +162,102 @@ 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_path=""
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"
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 ! command -v fnm > /dev/null; then if [[ ! -x "$(command -v node)" ]]; then
$(get_homebrew_bin_root)/fnm install --lts "$(get_homebrew_bin_root)/fnm" install --latest
fi fi
} }
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" \
$(get_homebrew_bin_root)/frum local "$version" --with-openssl-dir="$(brew --prefix openssl)" \
gem update --system && gem update --enable-shared \
--disable-silent-rules
"$(get_homebrew_bin_root)"/frum local "$version"
fi fi
} }
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
@@ -221,15 +265,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"
@@ -240,20 +287,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"
@@ -265,20 +315,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"
@@ -289,24 +342,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,14 +2,16 @@
# 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')
bin/create_boot_disk;; bin/create_boot_disk;;
'b') 'b')
bin/apply_basic_settings;; bin/install_basics;;
't') 't')
bin/install_dev_tools;; bin/install_dev_tools;;
'hf') 'hf')
@@ -22,37 +24,35 @@ process_option() {
bin/install_applications;; bin/install_applications;;
'x') 'x')
bin/install_extensions;; bin/install_extensions;;
'df')
bin/install_dotfiles;;
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'd') 'd')
bin/apply_default_settings;; bin/install_defaults;;
'cs') 's')
bin/configure_software;; bin/install_shell;;
'r')
bin/restore_backup;;
'i') 'i')
caffeinate_machine caffeinate_machine
bin/apply_basic_settings bin/install_basics
bin/install_dev_tools bin/install_dev_tools
bin/install_homebrew_formulas bin/install_homebrew_formulas
bin/install_homebrew_casks bin/install_homebrew_casks
bin/install_app_store bin/install_app_store
bin/install_applications bin/install_applications
bin/install_extensions bin/install_extensions
bin/install_dotfiles bin/install_defaults
bin/install_shell
bin/restore_backup
clean_work_path;;
'np')
bin/install_node_packages;;
'rg')
bin/install_ruby_gems;;
'rc')
bin/install_rust_crates;;
'l')
bin/install_node_packages bin/install_node_packages
bin/install_ruby_gems bin/install_ruby_gems
bin/install_rust_crates bin/install_rust_crates;;
bin/apply_default_settings
bin/configure_software
clean_work_path;;
'R')
caffeinate_machine
bin/restore_backup;;
'c') 'c')
verify_homebrew_formulas verify_homebrew_formulas
verify_homebrew_casks verify_homebrew_casks
@@ -64,14 +64,6 @@ process_option() {
verify_rust_crates;; verify_rust_crates;;
'C') 'C')
caffeinate_machine;; caffeinate_machine;;
'ua')
uninstall_application;;
'ux')
uninstall_extension;;
'ra')
reinstall_application;;
'rx')
reinstall_extension;;
'w') 'w')
clean_work_path;; clean_work_path;;
'q');; '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 set -o pipefail
IFS=$'\n\t' 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 Sonoma.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

@@ -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. # 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,31 +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"
local file_extension=$(get_extension "$file_name")
# Special cases not supported by Homebrew. case $(get_extension "$file_name") in
if [[ "$file_name" == "elm" ]]; then
printf "/usr/local/bin"
return
fi
# Dynamically build the install path based on file extension.
case $file_extension in
'') '')
printf "$(get_homebrew_bin_root)";; printf "/usr/local/bin";;
'app') 'app')
printf "/Applications";; printf "/Applications";;
'prefPane') 'prefPane')
@@ -101,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