Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c01bdeb393 | ||
|
|
f6610849eb | ||
|
|
d0c2335f35 | ||
|
|
cc9fc3a2f9 | ||
|
|
023c8bbae2 | ||
|
|
5c12a47f11 | ||
|
|
cc1b7527fe | ||
|
|
2f6b385f2f | ||
|
|
6c06f7107b | ||
|
|
da81619140 | ||
|
|
6c4fc52511 | ||
|
|
ccb9aa8c1d | ||
|
|
940ad7e622 | ||
|
|
f7fb380233 | ||
|
|
c0b9be502b | ||
|
|
66cd8d988e | ||
|
|
955af0fc9e | ||
|
|
9730e0ce45 | ||
|
|
94373dd5e8 | ||
|
|
87282969de | ||
|
|
6a6286755e | ||
|
|
5866049618 | ||
|
|
3cba8eaa48 | ||
|
|
cd89faac07 | ||
|
|
ea8944a1dc | ||
|
|
1e6e9a43bd | ||
|
|
68c1ea0515 | ||
|
|
419fceba0c | ||
|
|
9fba750712 | ||
|
|
de9e9dc73e | ||
|
|
0f13af9692 | ||
|
|
7133361277 | ||
|
|
bc01beac6a | ||
|
|
18ff862a4a | ||
|
|
c6ef97a88b | ||
|
|
67a17a0113 | ||
|
|
e5f2051412 | ||
|
|
bbdedb1a56 | ||
|
|
cd595f1bd1 | ||
|
|
e89a05fcbf | ||
|
|
048908f2ba | ||
|
|
cc23f2d634 | ||
|
|
4d85b3353f | ||
|
|
a757ed1210 | ||
|
|
2994653972 | ||
|
|
6716e687d1 | ||
|
|
18dccd7773 | ||
|
|
88494e2ed3 | ||
|
|
87e84a658f | ||
|
|
949a6b9d1e | ||
|
|
3b6137ec36 | ||
|
|
e1bc7e939a | ||
|
|
8bf0ef473d | ||
|
|
79f7103179 | ||
|
|
38fa30a028 | ||
|
|
a2a2820098 |
15
.github/ISSUE_TEMPLATE.md
vendored
15
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,16 +1,11 @@
|
||||
## Expected Behavior
|
||||
<!-- Required. Describe, in detail, the behavior experienced. -->
|
||||
|
||||
## Actual Behavior
|
||||
<!-- Required. Describe, in detail, what should be the correct behavior. -->
|
||||
## Overview
|
||||
<!-- Required. Describe, in detail, the behavior experienced and what is desired. -->
|
||||
|
||||
## Steps to Recreate
|
||||
<!-- Required. List the exact steps to the reproduce errant behavior. -->
|
||||
<!-- Optional. List exact steps (numbered list) to reproduce errant behavior. Delete if unused. -->
|
||||
|
||||
0.
|
||||
## Screenshots/Screencasts
|
||||
<!-- Optional. Attach screenshot/screencast(s) that demo the behavior. Delete if unused. -->
|
||||
|
||||
## Environment
|
||||
<!-- Optional. What is your operating system, software version(s), etc. Delete if unused. -->
|
||||
|
||||
## Screenshots/Screencasts
|
||||
<!-- Optional. Attach screenshots/screencasts that demo the behavior. Delete if unused. -->
|
||||
|
||||
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
4
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -2,10 +2,10 @@
|
||||
<!-- Required. Why is this important/necessary? -->
|
||||
|
||||
## Details
|
||||
<!-- Optional. List the key features/highlights as bullet points. -->
|
||||
<!-- Optional. List the key features/highlights as bullet points. Delete if unused. -->
|
||||
|
||||
## Notes
|
||||
<!-- Optional. List additional notes/references as bullet points. Delete if unused. -->
|
||||
|
||||
## Screenshots/Screencasts
|
||||
<!-- Optional. Provide image/video support. Delete if unused. -->
|
||||
<!-- Optional. Provide supporting image/video. Delete if unused. -->
|
||||
|
||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
Gemfile.lock
|
||||
1
.ruby-version
Normal file
1
.ruby-version
Normal file
@@ -0,0 +1 @@
|
||||
2.5.1
|
||||
79
CHANGES.md
79
CHANGES.md
@@ -1,18 +1,87 @@
|
||||
# v1.3.1 (2017-01-08)
|
||||
# 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.
|
||||
|
||||
# v1.3.0 (2017-01-01)
|
||||
# 1.3.0 (2017-01-01)
|
||||
|
||||
- Updated README versioning documentation.
|
||||
- Removed CHANGELOG.md (use CHANGES.md instead).
|
||||
|
||||
# v1.2.0 (2016-10-12)
|
||||
# 1.2.0 (2016-10-12)
|
||||
|
||||
- Fixed reinstaller path issues with application and extension scripts.
|
||||
- Added screencast to README.
|
||||
|
||||
# v1.1.0 (2016-10-11)
|
||||
# 1.1.0 (2016-10-11)
|
||||
|
||||
- Fixed Bash script header to dynamically load correct environment.
|
||||
- Fixed verification of Homebrew application installs.
|
||||
@@ -20,6 +89,6 @@
|
||||
- Added script hooks for unfinished custom configurations.
|
||||
- Updated and clarified README documentation.
|
||||
|
||||
# v1.0.0 (2016-10-05)
|
||||
# 1.0.0 (2016-10-05)
|
||||
|
||||
- Initial version.
|
||||
|
||||
@@ -1,35 +1,22 @@
|
||||
# Overview
|
||||
# Contributing
|
||||
|
||||
Thanks for taking an interest in this open source project. Your support and involvement is greatly appreciated. The
|
||||
following details what you need to know in order to contribute.
|
||||
Thanks for taking an interest in this open source project. Your support and involvement is greatly
|
||||
appreciated. The following sections detail what you need to know in order to contribute.
|
||||
|
||||
# Requirements
|
||||
## Code
|
||||
|
||||
- Follow these [Basic Programming Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/basic.md).
|
||||
- Follow these [Code Review Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/code_reviews.md).
|
||||
- Follow these [Git Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/git.md).
|
||||
- Follow these [Bash Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/bash.md).
|
||||
- Follow these [CSS Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/css.md).
|
||||
- Follow these [Ruby Styles](https://github.com/bkuhlmann/style_guides/blob/master/programming/languages/ruby/ruby.md).
|
||||
1. Read the project README before starting.
|
||||
1. Fork the `master` branch of this repository and clone the fork locally.
|
||||
1. Ensure there are no setup, usage, and/or test issues.
|
||||
1. Add tests for new functionality and ensure they pass.
|
||||
1. Submit a pull request, follow the instructions it provides, and ensure the build passes.
|
||||
|
||||
# Contributing Code
|
||||
## Issues
|
||||
|
||||
0. Read the project README thoroughly before starting.
|
||||
0. Fork the master branch of the repository.
|
||||
0. Ensure there are no setup, usage, and/or test issues (again, follow the README).
|
||||
0. Add tests for new functionality (refactoring and documentation changes can be excluded).
|
||||
0. Ensure all tests pass.
|
||||
0. Push your feature branch and submit a pull request.
|
||||
- Submit an issue via the GitHub Issues tab (assuming one does not
|
||||
already exist) and follow the instructions it provides.
|
||||
|
||||
# Submitting Issues
|
||||
## Feedback
|
||||
|
||||
0. Submit an issue via the GitHub Issues tab (assuming one does not already exist).
|
||||
0. Clearly describe the issue (including steps to reproduce).
|
||||
0. Specify your enviroment setup (OS, browser, language, etc. with version info).
|
||||
0. Provide a stack dump (if possible).
|
||||
0. Explain any additional details that might help diagnose the problem quickly.
|
||||
|
||||
# Feedback
|
||||
|
||||
Expect a response within one to three business days.
|
||||
Changes, alternatives, and/or improvements might be suggested upon review.
|
||||
- Expect a response within one to three business days.
|
||||
- Changes, alternatives, and/or improvements might be suggested upon review.
|
||||
|
||||
6
Gemfile
Normal file
6
Gemfile
Normal file
@@ -0,0 +1,6 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
source "https://rubygems.org"
|
||||
|
||||
gem "rake", "~> 12.0"
|
||||
gem "git-cop", "~> 2.2"
|
||||
177
LICENSE.md
177
LICENSE.md
@@ -1,20 +1,163 @@
|
||||
Copyright (c) 2016 [Alchemists](https://www.alchemists.io).
|
||||
# Apache License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
Version 2.0, January 2004
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
http://www.apache.org/licenses
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
## 1. Definitions
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by
|
||||
Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is
|
||||
granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are
|
||||
controlled by, or are under common control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the direction or management of such
|
||||
entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this
|
||||
License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications, including but not limited to
|
||||
software source code, documentation source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical transformation or translation of a
|
||||
Source form, including but not limited to compiled object code, generated documentation, and
|
||||
conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the
|
||||
License, as indicated by a copyright notice that is included in or attached to the work (an example
|
||||
is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or
|
||||
derived from) the Work and for which the editorial revisions, annotations, elaborations, or other
|
||||
modifications represent, as a whole, an original work of authorship. For the purposes of this
|
||||
License, Derivative Works shall not include works that remain separable from, or merely link (or
|
||||
bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including the original version of the Work and any
|
||||
modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted
|
||||
to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity
|
||||
authorized to submit on behalf of the copyright owner. For the purposes of this definition,
|
||||
"submitted" means any form of electronic, verbal, or written communication sent to the Licensor or
|
||||
its representatives, including but not limited to communication on electronic mailing lists, source
|
||||
code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor
|
||||
for the purpose of discussing and improving the Work, but excluding communication that is
|
||||
conspicuously marked or otherwise designated in writing by the copyright owner as "Not a
|
||||
Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a
|
||||
Contribution has been received by Licensor and subsequently incorporated within the Work.
|
||||
|
||||
## 2. Grant of Copyright License
|
||||
|
||||
Subject to the terms and conditions of this License, each Contributor hereby grants to You a
|
||||
perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to
|
||||
reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and
|
||||
distribute the Work and such Derivative Works in Source or Object form.
|
||||
|
||||
## 3. Grant of Patent License
|
||||
|
||||
Subject to the terms and conditions of this License, each Contributor hereby grants to You a
|
||||
perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this
|
||||
section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer
|
||||
the Work, where such license applies only to those patent claims licensable by such Contributor that
|
||||
are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You institute patent litigation
|
||||
against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or
|
||||
a Contribution incorporated within the Work constitutes direct or contributory patent infringement,
|
||||
then any patent licenses granted to You under this License for that Work shall terminate as of the
|
||||
date such litigation is filed.
|
||||
|
||||
## 4. Redistribution
|
||||
|
||||
You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with
|
||||
or without modifications, and in Source or Object form, provided that You meet the following
|
||||
conditions:
|
||||
|
||||
1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
||||
|
||||
2. You must cause any modified files to carry prominent notices stating that You changed the
|
||||
files; and
|
||||
|
||||
3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright,
|
||||
patent, trademark, and attribution notices from the Source form of the Work, excluding those
|
||||
notices that do not pertain to any part of the Derivative Works; and
|
||||
|
||||
4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative
|
||||
Works that You distribute must include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not pertain to any part of the
|
||||
Derivative Works, in at least one of the following places: within a NOTICE text file
|
||||
distributed as part of the Derivative Works; within the Source form or documentation, if
|
||||
provided along with the Derivative Works; or, within a display generated by the Derivative
|
||||
Works, if and wherever such third-party notices normally appear. The contents of the NOTICE
|
||||
file are for informational purposes only and do not modify the License. You may add Your own
|
||||
attribution notices within Derivative Works that You distribute, alongside or as an addendum to
|
||||
the NOTICE text from the Work, provided that such additional attribution notices cannot be
|
||||
construed as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and may provide additional or
|
||||
different license terms and conditions for use, reproduction, or distribution of Your modifications,
|
||||
or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of
|
||||
the Work otherwise complies with the conditions stated in this License.
|
||||
|
||||
## 5. Submission of Contributions
|
||||
|
||||
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the
|
||||
Work by You to the Licensor shall be under the terms and conditions of this License, without any
|
||||
additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed with Licensor regarding such
|
||||
Contributions.
|
||||
|
||||
## 6. Trademarks
|
||||
|
||||
This License does not grant permission to use the trade names, trademarks, service marks, or product
|
||||
names of the Licensor, except as required for reasonable and customary use in describing the origin
|
||||
of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
## 7. Disclaimer of Warranty
|
||||
|
||||
Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
KIND, either express or implied, including, without limitation, any warranties or conditions of
|
||||
TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely
|
||||
responsible for determining the appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
## 8. Limitation of Liability
|
||||
|
||||
In no event and under no legal theory, whether in tort (including negligence), contract, or
|
||||
otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or
|
||||
agreed to in writing, shall any Contributor be liable to You for damages, including any direct,
|
||||
indirect, special, incidental, or consequential damages of any character arising as a result of this
|
||||
License or out of the use or inability to use the Work (including but not limited to damages for
|
||||
loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial
|
||||
damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||
|
||||
## 9. Accepting Warranty or Additional Liability
|
||||
|
||||
While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee
|
||||
for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights
|
||||
consistent with this License. However, in accepting such obligations, You may act only on Your own
|
||||
behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You
|
||||
agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or
|
||||
claims asserted against, such Contributor by reason of your accepting any such warranty or
|
||||
additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Copyright 2016 [Alchemists](https://www.alchemists.io).
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
|
||||
compliance with the License. You may obtain a [copy](http://www.apache.org/licenses/LICENSE-2.0) of
|
||||
the License.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed under the License is
|
||||
distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied. See the License for the specific language governing permissions and limitations under the
|
||||
License.
|
||||
|
||||
96
README.md
96
README.md
@@ -1,6 +1,6 @@
|
||||
# macOS
|
||||
|
||||
[](https://www.patreon.com/bkuhlmann)
|
||||
[](https://circleci.com/gh/bkuhlmann/mac_os)
|
||||
|
||||
Shell scripts for automated macOS machine setup.
|
||||
|
||||
@@ -11,15 +11,15 @@ project is an opinionated configuration which meets the needs of my development
|
||||
also meant to serve as an example and guide for building your own personalized setup. Here is how
|
||||
the two projects are meant to be used:
|
||||
|
||||
- **macOS** (this project) - Foundation and framework for building customizated macOS machine
|
||||
- **macOS** (this project) - The foundation framework for building customizated macOS machine
|
||||
setups.
|
||||
- **[macOS Config](https://github.com/bkuhlmann/mac_os-config)** - The layer on top of this *macOS*
|
||||
project which defines a custom machine setup and base implementation. The project is meant to be
|
||||
forked for as many custom machine setups as needed.
|
||||
- **[macOS Configuration](https://github.com/bkuhlmann/mac_os-config)** - The layer on top of this
|
||||
*macOS* project which defines a custom machine setup and base implementation. The project is meant
|
||||
to be forked for as many custom machine setups as needed.
|
||||
|
||||
<!-- Tocer[start]: Auto-generated, don't remove. -->
|
||||
|
||||
# Table of Contents
|
||||
## Table of Contents
|
||||
|
||||
- [Features](#features)
|
||||
- [Screencast](#screencast)
|
||||
@@ -36,16 +36,16 @@ the two projects are meant to be used:
|
||||
|
||||
<!-- Tocer[finish]: Auto-generated, don't remove. -->
|
||||
|
||||
# Features
|
||||
## Features
|
||||
|
||||
- Provides a command line interface, written in Bash with no additional dependencies, for
|
||||
- Provides a command line interface, written in Bash, with no additional dependencies for
|
||||
installation and management of a macOS machine.
|
||||
- Supports macOS boot disk creation for setting up a machine with a fresh install of the operation
|
||||
system.
|
||||
- Supports macOS boot disk creation for fresh install of operating system.
|
||||
- Downloads and installs development tools (required by Homebrew):
|
||||
- [Xcode Command Line Tools](https://developer.apple.com/xcode)
|
||||
- [Java SE Development Kit](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
|
||||
- Downloads, installs, and configures [Homebrew](http://brew.sh) command line software.
|
||||
- Downloads, installs, and configures [Homebrew Formulas](http://brew.sh).
|
||||
- Downloads, installs, and configures [Homebrew Casks](https://caskroom.github.io).
|
||||
- Downloads, installs, and configures
|
||||
[App Store](http://www.apple.com/macosx/whats-new/app-store.html) software.
|
||||
- Downloads, installs, and configures non-App Store software applications.
|
||||
@@ -54,16 +54,16 @@ the two projects are meant to be used:
|
||||
- Sets up and configures installed software for use.
|
||||
- Supports restoration of machine backups.
|
||||
|
||||
# Screencast
|
||||
## Screencast
|
||||
|
||||
[](https://asciinema.org/a/88971)
|
||||
[](https://asciinema.org/a/155990)
|
||||
|
||||
# Requirements
|
||||
## Requirements
|
||||
|
||||
0. [macOS Sierra](https://www.apple.com/macos) (with latest software updates applied)
|
||||
0. [Xcode](https://developer.apple.com/xcode) (with accepted license agreement)
|
||||
1. [macOS High Sierra](https://www.apple.com/macos) (with latest software updates applied)
|
||||
1. [Xcode](https://developer.apple.com/xcode) (with accepted license agreement)
|
||||
|
||||
# Setup
|
||||
## Setup
|
||||
|
||||
Open a terminal window and execute one of the following setup sequences depending on your version
|
||||
preference:
|
||||
@@ -72,27 +72,28 @@ Current Version (stable):
|
||||
|
||||
git clone https://github.com/bkuhlmann/mac_os.git
|
||||
cd mac_os
|
||||
git checkout v1.3.1
|
||||
git checkout 5.0.0
|
||||
|
||||
Master Version (unstable):
|
||||
|
||||
git clone https://github.com/bkuhlmann/mac_os.git
|
||||
cd mac_os
|
||||
|
||||
# Usage
|
||||
## Usage
|
||||
|
||||
Run the following script:
|
||||
Run the following:
|
||||
|
||||
bin/run
|
||||
|
||||
You will be presented with the following options:
|
||||
You will be presented with the following options (listed in order of use):
|
||||
|
||||
Boot:
|
||||
B: Create boot disk.
|
||||
Install:
|
||||
b: Apply basic settings.
|
||||
t: Install development tools.
|
||||
h: Install Homebrew software.
|
||||
hf: Install Homebrew Formulas.
|
||||
hc: Install Homebrew Casks.
|
||||
m: Install Mac App Store software.
|
||||
a: Install application software.
|
||||
x: Install application software extensions.
|
||||
@@ -111,12 +112,12 @@ You will be presented with the following options:
|
||||
w: Clean work (temp) directory.
|
||||
q: Quit/Exit.
|
||||
|
||||
Choose option `i` to run all install options or select a specific option to run a single option.
|
||||
Each option is designed to be re-run if necessary. This can also be handy for performing upgrades,
|
||||
Choose option `i` to run a full install or select a specific option to run a single action. Each
|
||||
option is designed to be re-run if necessary. This can also be handy for performing upgrades,
|
||||
re-running a missing/failed install, etc.
|
||||
|
||||
The option prompt can be skipped by passing the desired option directly to the `bin/run` script. For
|
||||
example, executing `bin/run i` will execute the complete software install process.
|
||||
example, executing `bin/run i` will execute the full install process.
|
||||
|
||||
The machine should be rebooted after all install tasks have completed to ensure all settings have
|
||||
been loaded.
|
||||
@@ -124,28 +125,25 @@ been loaded.
|
||||
It is recommended that the `mac_os` project directory not be deleted and kept on the local machine
|
||||
in order to manage installed software and benefit from future upgrades.
|
||||
|
||||
## Customization
|
||||
### Customization
|
||||
|
||||
All executable scripts can be found in the `bin` folder:
|
||||
|
||||
- `bin/apply_basic_settings`: Applies basic, initial, settings for setting up a machine. *This is
|
||||
meant to be customized.*
|
||||
- `bin/apply_default_settings`: Applies useful system and application defaults. *This is meant to be
|
||||
- `bin/apply_basic_settings`: Applies basic, initial, settings for setting up a machine. *Can be
|
||||
customized.*
|
||||
- `bin/apply_default_settings`: Applies useful system and application defaults. *Can be customized.*
|
||||
- `bin/create_boot_disk`: Creates macOS boot disk.
|
||||
- `bin/install_app_store`: Installs macOS, GUI-based, App Store applications. *This is meant to be
|
||||
- `bin/install_app_store`: Installs macOS, GUI-based, App Store applications. *Can be customized.*
|
||||
- `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. *Can be
|
||||
customized.*
|
||||
- `bin/install_applications`: Installs macOS, GUI-based, non-App Store applications. *This is meant
|
||||
to be customized.*
|
||||
- `bin/install_dev_tools`: Installs macOS development tools required by Homebrew.
|
||||
- `bin/install_extensions`: Installs macOS application extensions and add-ons. *This is meant to be
|
||||
customized.*
|
||||
- `bin/install_homebrew`: Installs Homebrew managed software. *This is meant to be customized.*
|
||||
- `bin/restore_backup`: Restores system/application settings from backup image. *This is meant to be
|
||||
customized.*
|
||||
- `bin/install_extensions`: Installs macOS application extensions and add-ons. *Can be customized.*
|
||||
- `bin/install_homebrew_casks`: Installs Homebrew Formulas. *Can be customized.*
|
||||
- `bin/install_homebrew_formulas`: Installs Homebrew Casks. *Can be customized.*
|
||||
- `bin/restore_backup`: Restores system/application settings from backup image. *Can be customized.*
|
||||
- `bin/run`: The main script and interface for macOS setup.
|
||||
- `bin/setup_software`: Configures and launches (if necessary) installed software. *This is meant to
|
||||
be customized.*
|
||||
- `bin/setup_software`: Configures and launches (if necessary) installed software. *Can be
|
||||
customized.*
|
||||
|
||||
The `lib` folder provides the base framework for installing, re-installing, and uninstalling
|
||||
software. Everything provided via the [macOS Config](https://github.com/bkuhlmann/mac_os-config)
|
||||
@@ -154,34 +152,34 @@ project is built upon the functions found in the `lib` folder. See the
|
||||
|
||||
- `lib/settings.sh`: Defines global settings for software applications, extensions, etc.
|
||||
|
||||
# Versioning
|
||||
## Versioning
|
||||
|
||||
Read [Semantic Versioning](http://semver.org) for details. Briefly, it means:
|
||||
Read [Semantic Versioning](https://semver.org) for details. Briefly, it means:
|
||||
|
||||
- Patch (x.y.Z) - Incremented for small, backwards compatible, bug fixes.
|
||||
- Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.
|
||||
- Major (X.y.z) - Incremented for any backwards incompatible public API changes.
|
||||
- Minor (x.Y.z) - Incremented for new, backwards compatible, public API enhancements/fixes.
|
||||
- Patch (x.y.Z) - Incremented for small, backwards compatible, bug fixes.
|
||||
|
||||
# Code of Conduct
|
||||
## Code of Conduct
|
||||
|
||||
Please note that this project is released with a [CODE OF CONDUCT](CODE_OF_CONDUCT.md). By
|
||||
participating in this project you agree to abide by its terms.
|
||||
|
||||
# Contributions
|
||||
## Contributions
|
||||
|
||||
Read [CONTRIBUTING](CONTRIBUTING.md) for details.
|
||||
|
||||
# License
|
||||
## License
|
||||
|
||||
Copyright (c) 2016 [Alchemists](https://www.alchemists.io).
|
||||
Copyright 2016 [Alchemists](https://www.alchemists.io).
|
||||
Read [LICENSE](LICENSE.md) for details.
|
||||
|
||||
# History
|
||||
## History
|
||||
|
||||
Read [CHANGES](CHANGES.md) for details.
|
||||
Built with [Bashsmith](https://github.com/bkuhlmann/bashsmith).
|
||||
|
||||
# Credits
|
||||
## Credits
|
||||
|
||||
Developed by [Brooke Kuhlmann](https://www.alchemists.io) at
|
||||
[Alchemists](https://www.alchemists.io).
|
||||
|
||||
9
Rakefile
Normal file
9
Rakefile
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
begin
|
||||
require "git/cop/rake/setup"
|
||||
rescue LoadError => error
|
||||
puts error.message
|
||||
end
|
||||
|
||||
task default: :git_cop
|
||||
@@ -5,14 +5,15 @@
|
||||
|
||||
# EXECUTION
|
||||
printf "macOS Boot Disk Tips\n"
|
||||
printf " - Use a USB drive (8GB or higher is best).\n"
|
||||
printf " - Use Disk Utility to format the USB drive (Use \"Untitled\" for the label).\n"
|
||||
printf " - Use a USB drive (8GB or higher).\n"
|
||||
printf " - Use Disk Utility to format the USB drive as \"Mac OS Extended (Journaled)\".\n"
|
||||
printf " - Use Disk Utility to label the USB drive as \"Untitled\".\n"
|
||||
printf "\nmacOS Boot Disk Usage:\n"
|
||||
printf " 1. Insert the USB boot disk into the machine to be upgraded.\n"
|
||||
printf " 2. Reboot the machine.\n"
|
||||
printf " 3. Hold down the OPTION key before the Apple logo appears.\n"
|
||||
printf " 4. Select the USB boot disk from the menu.\n"
|
||||
printf " 5. Format the machine's internal drive using Disk Utility.\n"
|
||||
printf " 5. Use Disk Utility to format the machine's drive as \"APFS (Encrypted)\".\n"
|
||||
printf " 6. Install the new operating system.\n"
|
||||
printf "\nmacOS Reinstall:\n"
|
||||
printf " 1. Click the Apple icon from the operating system main menu.\n"
|
||||
|
||||
@@ -6,11 +6,18 @@
|
||||
printf "Installing Xcode CLI tools...\n"
|
||||
xcode-select --install
|
||||
|
||||
read -p "Have you completed the Xcode CLI tools install (y/n)? " response
|
||||
if [[ "$response" != "y" ]]; then
|
||||
read -p "Have you completed the Xcode CLI tools install (y/n)? " xcode_response
|
||||
if [[ "$xcode_response" != "y" ]]; then
|
||||
printf "ERROR: Xcode CLI tools must be installed before proceeding.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
printf "Installing Java...\n"
|
||||
install_java "$JAVA_URL" "$JAVA_VOLUME_NAME"
|
||||
printf "Installing $JAVA_LABEL...\n"
|
||||
printf "%s\n" "You must manually accept the license and download the $JAVA_LABEL: $JAVA_DOWNLOAD_URL."
|
||||
open $JAVA_DOWNLOAD_URL
|
||||
|
||||
read -p "Have you completed the $JAVA_LABEL install (y/n)? " java_response
|
||||
if [[ "$java_response" != "y" ]]; then
|
||||
printf "ERROR: $JAVA_LABEL must be installed before proceeding.\n"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Installs Homebrew software.
|
||||
|
||||
# SETTINGS
|
||||
set -o nounset
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
IFS=$'\n\t'
|
||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew"
|
||||
|
||||
# EXECUTION
|
||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||
"$SCRIPT_PATH"
|
||||
else
|
||||
printf "WARNING: Homebrew install script does not exist or is not executable.\n"
|
||||
fi
|
||||
18
bin/install_homebrew_casks
Executable file
18
bin/install_homebrew_casks
Executable file
@@ -0,0 +1,18 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Installs Homebrew Cask software.
|
||||
|
||||
# SETTINGS
|
||||
set -o nounset
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
IFS=$'\n\t'
|
||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||
|
||||
# EXECUTION
|
||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||
"$SCRIPT_PATH"
|
||||
else
|
||||
printf "WARNING: Homebrew Casks install script does not exist or is not executable.\n"
|
||||
fi
|
||||
18
bin/install_homebrew_formulas
Executable file
18
bin/install_homebrew_formulas
Executable file
@@ -0,0 +1,18 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Installs Homebrew Formula software.
|
||||
|
||||
# SETTINGS
|
||||
set -o nounset
|
||||
set -o errexit
|
||||
set -o pipefail
|
||||
IFS=$'\n\t'
|
||||
SCRIPT_PATH="$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||
|
||||
# EXECUTION
|
||||
if [[ -x "$SCRIPT_PATH" ]]; then
|
||||
"$SCRIPT_PATH"
|
||||
else
|
||||
printf "WARNING: Homebrew Formulas install script does not exist or is not executable.\n"
|
||||
fi
|
||||
4
bin/run
4
bin/run
@@ -10,7 +10,6 @@
|
||||
source lib/installers.sh
|
||||
source lib/options.sh
|
||||
source lib/reinstallers.sh
|
||||
source lib/restorers.sh
|
||||
source lib/settings.sh
|
||||
source lib/uninstallers.sh
|
||||
source lib/utilities.sh
|
||||
@@ -39,7 +38,8 @@ while true; do
|
||||
printf " Install:\n"
|
||||
printf " b: Apply basic settings.\n"
|
||||
printf " t: Install development tools.\n"
|
||||
printf " h: Install Homebrew software.\n"
|
||||
printf " hf: Install Homebrew Formulas.\n"
|
||||
printf " hc: Install Homebrew Casks.\n"
|
||||
printf " m: Install Mac App Store software.\n"
|
||||
printf " a: Install application software.\n"
|
||||
printf " x: Install application software extensions.\n"
|
||||
|
||||
33
circle.yml
Normal file
33
circle.yml
Normal file
@@ -0,0 +1,33 @@
|
||||
version: 2
|
||||
jobs:
|
||||
build:
|
||||
working_directory: ~/project
|
||||
docker:
|
||||
- image: circleci/ruby:2.5
|
||||
environment:
|
||||
BUNDLE_JOBS: 3
|
||||
BUNDLE_RETRY: 3
|
||||
BUNDLE_PATH: vendor/bundle
|
||||
EDITOR: vim
|
||||
steps:
|
||||
- checkout
|
||||
|
||||
- type: cache-restore
|
||||
name: Bundler Cache Restore
|
||||
key: bundle-{{ checksum "Gemfile" }}
|
||||
|
||||
- run:
|
||||
name: Bundler Install
|
||||
command: |
|
||||
gem update --system
|
||||
bundle check || bundle install
|
||||
|
||||
- type: cache-save
|
||||
name: Bundler Cache Store
|
||||
key: bundle-{{ checksum "Gemfile" }}
|
||||
paths:
|
||||
- vendor/bundle
|
||||
|
||||
- run:
|
||||
name: Rake Run
|
||||
command: bundle exec rake
|
||||
@@ -3,137 +3,8 @@
|
||||
# DESCRIPTION
|
||||
# Defines software installer functions.
|
||||
|
||||
# Mounts a disk image.
|
||||
# Parameters:
|
||||
# $1 = The image path.
|
||||
mount_image() {
|
||||
printf "Mounting image...\n"
|
||||
hdiutil attach -quiet -nobrowse -noautoopen "$1"
|
||||
}
|
||||
export -f mount_image
|
||||
|
||||
# Unmounts a disk image.
|
||||
# Parameters:
|
||||
# $1 = The mount path.
|
||||
unmount_image() {
|
||||
printf "Unmounting image...\n"
|
||||
hdiutil detach -force "$1"
|
||||
}
|
||||
export -f unmount_image
|
||||
|
||||
# Downloads an installer to local disk.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The file name.
|
||||
# $3 = The HTTP header.
|
||||
download_installer() {
|
||||
local url="$1"
|
||||
local file_name="$2"
|
||||
local http_header="$3"
|
||||
|
||||
printf "%s\n" "Downloading $1..."
|
||||
clean_work_path
|
||||
mkdir $MAC_OS_WORK_PATH
|
||||
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
||||
}
|
||||
export -f download_installer
|
||||
|
||||
# Downloads an installer to the $HOME/Downloads folder for manual use.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The file name.
|
||||
download_only() {
|
||||
if [[ -e "$HOME/Downloads/$2" ]]; then
|
||||
printf "Downloaded: $2.\n"
|
||||
else
|
||||
printf "Downloading $1...\n"
|
||||
download_installer "$1" "$2"
|
||||
mv "$MAC_OS_WORK_PATH/$2" "$HOME/Downloads"
|
||||
fi
|
||||
}
|
||||
export -f download_only
|
||||
|
||||
# Installs a single file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The install path.
|
||||
install_file() {
|
||||
local file_url="$1"
|
||||
local file_name=$(get_file_name "$1")
|
||||
local install_path="$2"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf "Installing: $install_path...\n"
|
||||
download_installer "$file_url" "$file_name"
|
||||
mkdir -p $(dirname "$install_path")
|
||||
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
||||
printf "Installed: $file_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_file
|
||||
|
||||
# Installs an application.
|
||||
# Parameters:
|
||||
# $1 = The application source path.
|
||||
# $2 = The application name.
|
||||
install_app() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
local file_extension=$(get_file_extension "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
|
||||
case $file_extension in
|
||||
'app')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'prefPane')
|
||||
sudo cp -pR "$1/$2" "$install_root";;
|
||||
'qlgenerator')
|
||||
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
||||
*)
|
||||
printf "ERROR: Unknown file extension: $file_extension.\n"
|
||||
esac
|
||||
}
|
||||
export -f install_app
|
||||
|
||||
# Installs a package.
|
||||
# Parameters:
|
||||
# $1 = The package source path.
|
||||
# $2 = The application name.
|
||||
install_pkg() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
||||
sudo installer -pkg "$package" -target /
|
||||
}
|
||||
export -f install_pkg
|
||||
|
||||
# Installs Java.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The volume name.
|
||||
install_java() {
|
||||
local url="$1"
|
||||
local volume_path="/Volumes/$2"
|
||||
local app_name="java"
|
||||
local install_path="/usr/bin/$app_name"
|
||||
local download_file="download.dmg"
|
||||
|
||||
download_installer "$url" "$download_file" "Cookie: oraclelicense=accept-securebackup-cookie"
|
||||
mount_image "$MAC_OS_WORK_PATH/$download_file"
|
||||
local package=$(sudo find "$volume_path" -maxdepth 1 -type f -name "*.pkg")
|
||||
sudo installer -pkg "$package" -target /
|
||||
unmount_image "$volume_path"
|
||||
printf "Installed: $app_name.\n"
|
||||
}
|
||||
export -f install_java
|
||||
|
||||
# Installs an application via a DMG file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The mount path.
|
||||
# $3 = The application name.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
|
||||
install_dmg_app() {
|
||||
local url="$1"
|
||||
local mount_point="/Volumes/$2"
|
||||
@@ -152,10 +23,7 @@ install_dmg_app() {
|
||||
export -f install_dmg_app
|
||||
|
||||
# Installs a package via a DMG file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The mount path.
|
||||
# $3 = The application name.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Mount path, $3 (required) - Application name.
|
||||
install_dmg_pkg() {
|
||||
local url="$1"
|
||||
local mount_point="/Volumes/$2"
|
||||
@@ -175,9 +43,7 @@ install_dmg_pkg() {
|
||||
export -f install_dmg_pkg
|
||||
|
||||
# Installs an application via a zip file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The application name.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name.
|
||||
install_zip_app() {
|
||||
local url="$1"
|
||||
local app_name="$2"
|
||||
@@ -202,10 +68,7 @@ install_zip_app() {
|
||||
export -f install_zip_app
|
||||
|
||||
# Installs an application via a tar file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The application name.
|
||||
# $3 = The decompress options.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name, $3 (required) - Decompress options.
|
||||
install_tar_app() {
|
||||
local url="$1"
|
||||
local app_name="$2"
|
||||
@@ -230,9 +93,7 @@ install_tar_app() {
|
||||
export -f install_tar_app
|
||||
|
||||
# Installs a package via a zip file.
|
||||
# Parameters:
|
||||
# $1 = The URL.
|
||||
# $2 = The application name.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Application name.
|
||||
install_zip_pkg() {
|
||||
local url="$1"
|
||||
local app_name="$2"
|
||||
@@ -256,10 +117,7 @@ install_zip_pkg() {
|
||||
export -f install_zip_pkg
|
||||
|
||||
# Installs application code from a Git repository.
|
||||
# Parameters:
|
||||
# $1 = Repository URL.
|
||||
# $2 = Install path.
|
||||
# $3 = Git clone options (if any).
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Install path, $3 (optional) - Git clone options.
|
||||
install_git_app() {
|
||||
local repository_url="$1"
|
||||
local app_name=$(get_file_name "$2")
|
||||
@@ -280,11 +138,7 @@ install_git_app() {
|
||||
export -f install_git_app
|
||||
|
||||
# Installs settings from a Git repository.
|
||||
# Parameters:
|
||||
# $1 = The repository URL.
|
||||
# $2 = The repository version.
|
||||
# $3 = The project directory.
|
||||
# $4 = The script to run (including any arguments).
|
||||
# Parameters: $1 (required) - Repository URL, $2 (required) - Repository version, $3 (required) - Project directory, $4 (required) - Script to run (including any arguments).
|
||||
install_git_project() {
|
||||
local repo_url="$1"
|
||||
local repo_version="$2"
|
||||
@@ -294,9 +148,102 @@ install_git_project() {
|
||||
git clone "$repo_url"
|
||||
(
|
||||
cd "$project_dir"
|
||||
git checkout "$repo_version"
|
||||
git -c advice.detachedHead=false checkout "$repo_version"
|
||||
eval "$script"
|
||||
)
|
||||
rm -rf "$project_dir"
|
||||
}
|
||||
export -f install_git_project
|
||||
|
||||
# Downloads an installer to local disk.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - File name, $3 (required) - HTTP header.
|
||||
download_installer() {
|
||||
local url="$1"
|
||||
local file_name="$2"
|
||||
local http_header="$3"
|
||||
|
||||
printf "%s\n" "Downloading $1..."
|
||||
clean_work_path
|
||||
mkdir $MAC_OS_WORK_PATH
|
||||
curl --header "$http_header" --location --retry 3 --retry-delay 5 --fail --silent --show-error "$url" >> "$MAC_OS_WORK_PATH/$file_name"
|
||||
}
|
||||
export -f download_installer
|
||||
|
||||
# Downloads an installer to the $HOME/Downloads folder for manual use.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - File name.
|
||||
download_only() {
|
||||
if [[ -e "$HOME/Downloads/$2" ]]; then
|
||||
printf "Downloaded: $2.\n"
|
||||
else
|
||||
printf "Downloading $1...\n"
|
||||
download_installer "$1" "$2"
|
||||
mv "$MAC_OS_WORK_PATH/$2" "$HOME/Downloads"
|
||||
fi
|
||||
}
|
||||
export -f download_only
|
||||
|
||||
# Installs a single file.
|
||||
# Parameters: $1 (required) - URL, $2 (required) - Install path.
|
||||
install_file() {
|
||||
local file_url="$1"
|
||||
local file_name=$(get_file_name "$1")
|
||||
local install_path="$2"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf "Installing: $install_path...\n"
|
||||
download_installer "$file_url" "$file_name"
|
||||
mkdir -p $(dirname "$install_path")
|
||||
mv "$MAC_OS_WORK_PATH/$file_name" "$install_path"
|
||||
printf "Installed: $file_name.\n"
|
||||
verify_path "$install_path"
|
||||
fi
|
||||
}
|
||||
export -f install_file
|
||||
|
||||
# Installs an application.
|
||||
# Parameters: $1 (required) - Application source path, $2 (required) - Application name.
|
||||
install_app() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
local file_extension=$(get_file_extension "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
|
||||
case $file_extension in
|
||||
'app')
|
||||
cp -a "$1/$2" "$install_root";;
|
||||
'prefPane')
|
||||
sudo cp -pR "$1/$2" "$install_root";;
|
||||
'qlgenerator')
|
||||
sudo cp -pR "$1/$2" "$install_root" && qlmanage -r;;
|
||||
*)
|
||||
printf "ERROR: Unknown file extension: $file_extension.\n"
|
||||
esac
|
||||
}
|
||||
export -f install_app
|
||||
|
||||
# Installs a package.
|
||||
# Parameters: $1 (required) - Package source path, $2 (required) - Application name.
|
||||
install_pkg() {
|
||||
local install_root=$(get_install_root "$2")
|
||||
|
||||
printf "Installing: $install_root/$2...\n"
|
||||
local package=$(sudo find "$1" -maxdepth 1 -type f -name "*.pkg" -o -name "*.mpkg")
|
||||
sudo installer -pkg "$package" -target /
|
||||
}
|
||||
export -f install_pkg
|
||||
|
||||
# Mounts a disk image.
|
||||
# Parameters: $1 (required) - Image path.
|
||||
mount_image() {
|
||||
printf "Mounting image...\n"
|
||||
hdiutil attach -quiet -nobrowse -noautoopen "$1"
|
||||
}
|
||||
export -f mount_image
|
||||
|
||||
# Unmounts a disk image.
|
||||
# Parameters: $1 (required) - Mount path.
|
||||
unmount_image() {
|
||||
printf "Unmounting image...\n"
|
||||
hdiutil detach -force "$1"
|
||||
}
|
||||
export -f unmount_image
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
# Defines command line prompt options.
|
||||
|
||||
# Process option selection.
|
||||
# Parameters:
|
||||
# $1 = The option to process.
|
||||
# Parameters: $1 (required) - The option to process.
|
||||
process_option() {
|
||||
case $1 in
|
||||
'B')
|
||||
@@ -14,8 +13,10 @@ process_option() {
|
||||
bin/apply_basic_settings;;
|
||||
't')
|
||||
bin/install_dev_tools;;
|
||||
'h')
|
||||
bin/install_homebrew;;
|
||||
'hf')
|
||||
bin/install_homebrew_formulas;;
|
||||
'hc')
|
||||
bin/install_homebrew_casks;;
|
||||
'm')
|
||||
bin/install_app_store;;
|
||||
'a')
|
||||
@@ -30,7 +31,8 @@ process_option() {
|
||||
caffeinate_machine
|
||||
bin/apply_basic_settings
|
||||
bin/install_dev_tools
|
||||
bin/install_homebrew
|
||||
bin/install_homebrew_formulas
|
||||
bin/install_homebrew_casks
|
||||
bin/install_app_store
|
||||
bin/install_applications
|
||||
bin/install_extensions
|
||||
@@ -40,7 +42,9 @@ process_option() {
|
||||
'R')
|
||||
bin/restore_backup;;
|
||||
'c')
|
||||
verify_homebrews
|
||||
verify_homebrew_formulas
|
||||
verify_homebrew_casks
|
||||
verify_app_store_applications
|
||||
verify_applications
|
||||
verify_extensions;;
|
||||
'C')
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
# DESCRIPTION
|
||||
# Defines software restore functions.
|
||||
|
||||
# Label: Restore Preference
|
||||
# Description: Restores an application preference.
|
||||
# Parameters: $1 (required) - The backup volume root path, $2 (required) - The preference file.
|
||||
restore_preference() {
|
||||
local backup_root="$1"
|
||||
local preference_file="$2"
|
||||
local backup_path="$backup_root/Users/$USER/Library/Preferences/$preference_file"
|
||||
local restore_root="$HOME/Library/Preferences"
|
||||
|
||||
cp -p "$backup_path" "$restore_root"
|
||||
}
|
||||
export -f restore_preference
|
||||
|
||||
# Label: Restore Application Support
|
||||
# Description: Restores application support files.
|
||||
# Parameters: $1 (required) - The backup volume root path, $2 required - The application name.
|
||||
restore_app_support() {
|
||||
local backup_root="$1"
|
||||
local app_name="$2"
|
||||
local backup_path="$backup_root/Users/$USER/Library/Application Support/$app_name"
|
||||
local restore_path="$HOME/Library/Application Support"
|
||||
|
||||
mkdir -p "$restore_path"
|
||||
cp -pR "$backup_path" "$restore_path"
|
||||
}
|
||||
export -f restore_app_support
|
||||
@@ -11,12 +11,12 @@ set -o pipefail
|
||||
IFS=$'\n\t'
|
||||
|
||||
# Globals
|
||||
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS Sierra.app/Contents/Resources/createinstallmedia"
|
||||
export MAC_OS_BOOT_DISK_CREATOR="/Applications/Install macOS High Sierra.app/Contents/Resources/createinstallmedia"
|
||||
export MAC_OS_BOOT_DISK_PATH="/Volumes/Untitled"
|
||||
export MAC_OS_INSTALLER_PATH="/Applications/Install macOS Sierra.app"
|
||||
export MAC_OS_INSTALLER_PATH="/Applications/Install macOS High Sierra.app"
|
||||
export MAC_OS_WORK_PATH=/tmp/downloads
|
||||
export MAC_OS_CONFIG_PATH="../mac_os-config"
|
||||
|
||||
# Java
|
||||
export JAVA_VOLUME_NAME="JDK 8 Update 101"
|
||||
export JAVA_URL="http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-macosx-x64.dmg"
|
||||
export JAVA_LABEL="Java SE Development Kit"
|
||||
export JAVA_DOWNLOAD_URL="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html"
|
||||
|
||||
@@ -3,55 +3,8 @@
|
||||
# DESCRIPTION
|
||||
# Defines general utility functions.
|
||||
|
||||
# Answers the file name.
|
||||
# Parameters:
|
||||
# $1 = The file path.
|
||||
get_file_name() {
|
||||
printf "${1##*/}" # Answers file or directory name.
|
||||
}
|
||||
export -f get_file_name
|
||||
|
||||
# Answers the file extension.
|
||||
# Parameters:
|
||||
# $1 = The file name.
|
||||
get_file_extension() {
|
||||
local name=$(get_file_name "$1")
|
||||
local extension="${1##*.}" # Excludes dot.
|
||||
|
||||
if [[ "$name" == "$extension" ]]; then
|
||||
printf ''
|
||||
else
|
||||
printf "$extension"
|
||||
fi
|
||||
}
|
||||
export -f get_file_extension
|
||||
|
||||
# Answers the root install path for file name.
|
||||
# Parameters:
|
||||
# $1 = The file name.
|
||||
get_install_root() {
|
||||
local file_name="$1"
|
||||
local file_extension=$(get_file_extension "$file_name")
|
||||
|
||||
# Dynamically build the install path based on file extension.
|
||||
case $file_extension in
|
||||
'')
|
||||
printf "/usr/local/bin";;
|
||||
'app')
|
||||
printf "/Applications";;
|
||||
'prefPane')
|
||||
printf "/Library/PreferencePanes";;
|
||||
'qlgenerator')
|
||||
printf "/Library/QuickLook";;
|
||||
*)
|
||||
printf "/tmp/unknown";;
|
||||
esac
|
||||
}
|
||||
export -f get_install_root
|
||||
|
||||
# Answers the full install path (including file name) for file name.
|
||||
# Parameters:
|
||||
# $1 = The file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_path() {
|
||||
local file_name="$1"
|
||||
local install_path=$(get_install_root "$file_name")
|
||||
@@ -77,3 +30,46 @@ caffeinate_machine() {
|
||||
fi
|
||||
}
|
||||
export -f caffeinate_machine
|
||||
|
||||
# Answers the root install path for file name.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_install_root() {
|
||||
local file_name="$1"
|
||||
local file_extension=$(get_file_extension "$file_name")
|
||||
|
||||
# Dynamically build the install path based on file extension.
|
||||
case $file_extension in
|
||||
'')
|
||||
printf "/usr/local/bin";;
|
||||
'app')
|
||||
printf "/Applications";;
|
||||
'prefPane')
|
||||
printf "/Library/PreferencePanes";;
|
||||
'qlgenerator')
|
||||
printf "/Library/QuickLook";;
|
||||
*)
|
||||
printf "/tmp/unknown";;
|
||||
esac
|
||||
}
|
||||
export -f get_install_root
|
||||
|
||||
# Answers the file extension.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
get_file_extension() {
|
||||
local name=$(get_file_name "$1")
|
||||
local extension="${1##*.}" # Excludes dot.
|
||||
|
||||
if [[ "$name" == "$extension" ]]; then
|
||||
printf ''
|
||||
else
|
||||
printf "$extension"
|
||||
fi
|
||||
}
|
||||
export -f get_file_extension
|
||||
|
||||
# Answers the file name.
|
||||
# Parameters: $1 (required) - The file path.
|
||||
get_file_name() {
|
||||
printf "${1##*/}" # Answers file or directory name.
|
||||
}
|
||||
export -f get_file_name
|
||||
|
||||
122
lib/verifiers.sh
122
lib/verifiers.sh
@@ -3,22 +3,9 @@
|
||||
# DESCRIPTION
|
||||
# Defines verification/validation functions.
|
||||
|
||||
# Verifies Homebrew software exists.
|
||||
# Parameters:
|
||||
# $1 = The file name.
|
||||
verify_homebrew() {
|
||||
local application="$1"
|
||||
local applications="$2"
|
||||
|
||||
if [[ "${applications[*]}" != *"$application"* ]]; then
|
||||
printf " - Missing: $application\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_homebrew
|
||||
|
||||
# Checks for missing Homebrew software.
|
||||
verify_homebrews() {
|
||||
printf "Checking Homebrew software...\n"
|
||||
# Checks for missing Homebrew formulas.
|
||||
verify_homebrew_formulas() {
|
||||
printf "Checking Homebrew formulas...\n"
|
||||
|
||||
local applications="$(brew list)"
|
||||
|
||||
@@ -37,28 +24,72 @@ verify_homebrews() {
|
||||
application="mercurial"
|
||||
fi
|
||||
|
||||
verify_homebrew "$application" "${applications[*]}"
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew"
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_formulas"
|
||||
|
||||
printf "Homebrew check complete.\n"
|
||||
printf "Homebrew formula check complete.\n"
|
||||
}
|
||||
export -f verify_homebrews
|
||||
export -f verify_homebrew_formulas
|
||||
|
||||
# Verifies application exists.
|
||||
# Parameters:
|
||||
# $1 = The file name.
|
||||
verify_application() {
|
||||
local file_name="$1"
|
||||
# Checks for missing Homebrew casks.
|
||||
verify_homebrew_casks() {
|
||||
printf "\nChecking Homebrew casks...\n"
|
||||
|
||||
# Display the missing install if not found.
|
||||
local install_path=$(get_install_path "$file_name")
|
||||
local applications="$(brew cask list)"
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf " - Missing: $file_name\n"
|
||||
while read line; do
|
||||
# Skip blank or comment lines.
|
||||
if [[ "$line" == "brew cask install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $4}')
|
||||
|
||||
# Skip: Only necessary for the purpose of licensing system preference.
|
||||
if [[ "$application" == "witch" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Skip: Bug with Homebrew Cask as these apps never show up as installed.
|
||||
if [[ "$application" == "skitch" || "$application" == "openemu" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_homebrew_casks"
|
||||
|
||||
printf "Homebrew cask check complete.\n"
|
||||
}
|
||||
export -f verify_homebrew_casks
|
||||
|
||||
# Checks for missing App Store applications.
|
||||
verify_app_store_applications() {
|
||||
printf "\nChecking App Store applications...\n"
|
||||
|
||||
local applications="$(mas list)"
|
||||
|
||||
while read line; do
|
||||
# Skip blank or comment lines.
|
||||
if [[ "$line" == "mas install"* ]]; then
|
||||
local application=$(printf "$line" | awk '{print $3}')
|
||||
verify_listed_application "$application" "${applications[*]}"
|
||||
fi
|
||||
done < "$MAC_OS_CONFIG_PATH/bin/install_app_store"
|
||||
|
||||
printf "App Store check complete.\n"
|
||||
}
|
||||
export -f verify_app_store_applications
|
||||
|
||||
# Verifies listed application exists.
|
||||
# Parameters: $1 (required) - The current application, $2 (required) - The application list.
|
||||
verify_listed_application() {
|
||||
local application="$1"
|
||||
local applications="$2"
|
||||
|
||||
if [[ "${applications[*]}" != *"$application"* ]]; then
|
||||
printf " - Missing: $application\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_application
|
||||
export -f verify_listed_application
|
||||
|
||||
# Checks for missing applications suffixed by "APP_NAME" as defined in settings.sh.
|
||||
verify_applications() {
|
||||
@@ -77,18 +108,19 @@ verify_applications() {
|
||||
}
|
||||
export -f verify_applications
|
||||
|
||||
# Verifies path exists.
|
||||
# Parameters:
|
||||
# $1 = The path.
|
||||
verify_path() {
|
||||
local path="$1"
|
||||
# Verifies application exists.
|
||||
# Parameters: $1 (required) - The file name.
|
||||
verify_application() {
|
||||
local file_name="$1"
|
||||
|
||||
# Display the missing path if not found.
|
||||
if [[ ! -e "$path" ]]; then
|
||||
printf " - Missing: $path\n"
|
||||
# Display the missing install if not found.
|
||||
local install_path=$(get_install_path "$file_name")
|
||||
|
||||
if [[ ! -e "$install_path" ]]; then
|
||||
printf " - Missing: $file_name\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_path
|
||||
export -f verify_application
|
||||
|
||||
# Checks for missing extensions suffixed by "EXTENSION_PATH" as defined in settings.sh.
|
||||
verify_extensions() {
|
||||
@@ -106,3 +138,15 @@ verify_extensions() {
|
||||
printf "Application extension check complete.\n"
|
||||
}
|
||||
export -f verify_extensions
|
||||
|
||||
# Verifies path exists.
|
||||
# Parameters: $1 (required) - The path.
|
||||
verify_path() {
|
||||
local path="$1"
|
||||
|
||||
# Display the missing path if not found.
|
||||
if [[ ! -e "$path" ]]; then
|
||||
printf " - Missing: $path\n"
|
||||
fi
|
||||
}
|
||||
export -f verify_path
|
||||
|
||||
Reference in New Issue
Block a user