Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Prettify diff generated by git for encripted file:
- @sinsoku had the idea and started implementing it few months ago but sadly didn't finish it. This PR is taking over his work. The credentials feature has changed a lot since @sinsoku opened hi PR, it was easier to just restart from scratch instead of checking out his branch. Sinsoku will get all the credit he deserves for this idea :) TL;DR on that that feature is to make the `git diff` or `git log` of encrypted files to be readable. The previous implementation was only setting up the git required configuration for the first time Rails was bootstraped, so I decided to instead provide the user a choice to opt-in for readable diff credential whenever a user types the `bin/rails credentials:edit` command. The question won't be asked in the future the user has already answered or if the user already opted in. Co-authored-by: Takumi Shotoku <insoku.listy@gmail.com>
- Loading branch information
1 parent
ec7aa03
commit 5a4acf7
Showing
4 changed files
with
185 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
# frozen_string_literal: true | ||
|
||
require "fileutils" | ||
|
||
module Rails | ||
module Command | ||
module Helpers | ||
module PrettyCredentials | ||
Error = Class.new(StandardError) | ||
|
||
def opt_in_pretty_credentials | ||
unless already_answered? || already_opted_in? | ||
answer = yes?("Would you like to make the credentials diff from git more readable in the future? [Y/n]") | ||
end | ||
|
||
opt_in! if answer | ||
FileUtils.touch(tracker) unless answer.nil? | ||
rescue Error | ||
say("Couldn't setup git to prettify the credentials diff") | ||
end | ||
|
||
private | ||
def already_answered? | ||
tracker.exist? | ||
end | ||
|
||
def already_opted_in? | ||
system_call("git config --get 'diff.rails_credentials.textconv'", accepted_codes: [0, 1]) | ||
end | ||
|
||
def opt_in! | ||
system_call("git config diff.rails_credentials.textconv 'bin/rails credentials:show'", accepted_codes: [0]) | ||
|
||
git_attributes = Rails.root.join(".gitattributes") | ||
File.open(git_attributes, "a+") do |file| | ||
file.write(<<~EOM) | ||
config/credentials/*.yml.enc diff=rails_credentials | ||
config/credentials.yml.enc diff=rails_credentials | ||
EOM | ||
end | ||
end | ||
|
||
def tracker | ||
Rails.root.join("tmp", "rails_pretty_credentials") | ||
end | ||
|
||
def system_call(command_line, accepted_codes:) | ||
result = system(command_line) | ||
raise(Error) if accepted_codes.exclude?($?.exitstatus) | ||
result | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters