Skip to content
This repository was archived by the owner on May 7, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 20 additions & 6 deletions transcrypt
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,18 @@ save_helper_scripts() {
fi
EOF

cat <<-'EOF' >"${GIT_DIR}/crypt/merge"
#!/usr/bin/env bash
# Decrypt BASE, LOCAL, and REMOTE versions of file being merged
echo "$(./.git/crypt/textconv $1)" > $1
echo "$(./.git/crypt/textconv $2)" > $2
echo "$(./.git/crypt/textconv $3)" > $3
# Use git's internal merge-file to merge the decrypted files
git merge-file --marker-size=$4 -L local -L base -L remote $2 $1 $3
EOF

# make scripts executable
for script in {clean,smudge,textconv}; do
for script in {clean,smudge,textconv,merge}; do
chmod 0755 "${GIT_DIR}/crypt/${script}"
done
}
Expand All @@ -340,15 +350,18 @@ save_configuration() {
git config filter.crypt.clean '"$(git rev-parse --git-common-dir)"/crypt/clean %f'
git config filter.crypt.smudge '"$(git rev-parse --git-common-dir)"/crypt/smudge'
git config diff.crypt.textconv '"$(git rev-parse --git-common-dir)"/crypt/textconv'
git config merge.crypt.driver '"$(git rev-parse --git-common-dir)"/crypt/merge %O %A %B %L %P'
else
git config filter.crypt.clean '"$(git rev-parse --git-dir)"/crypt/clean %f'
git config filter.crypt.smudge '"$(git rev-parse --git-dir)"/crypt/smudge'
git config diff.crypt.textconv '"$(git rev-parse --git-dir)"/crypt/textconv'
git config merge.crypt.driver '"$(git rev-parse --git-dir)"/crypt/merge %O %A %B %L %P'
fi
git config filter.crypt.required 'true'
git config diff.crypt.cachetextconv 'true'
git config diff.crypt.binary 'true'
git config merge.renormalize 'true'
git config merge.crypt.name 'Merge transcrypt secret files'

# add a git alias for listing encrypted files
git config alias.ls-crypt "!git ls-files | git check-attr --stdin filter | awk 'BEGIN { FS = \":\" }; /crypt$/{ print \$1 }'"
Expand Down Expand Up @@ -376,6 +389,7 @@ clean_gitconfig() {
git config --remove-section transcrypt
git config --remove-section filter.crypt
git config --remove-section diff.crypt
git config --remove-section merge.crypt
git config --unset merge.renormalize

# remove the merge section if it's now empty
Expand Down Expand Up @@ -453,7 +467,7 @@ uninstall_transcrypt() {
clean_gitconfig

# remove helper scripts
for script in {clean,smudge,textconv}; do
for script in {clean,smudge,textconv,merge}; do
[[ -f "${GIT_DIR}/crypt/${script}" ]] && rm "${GIT_DIR}/crypt/${script}"
done
[[ -d "${GIT_DIR}/crypt" ]] && rmdir "${GIT_DIR}/crypt"
Expand All @@ -477,10 +491,10 @@ uninstall_transcrypt() {
# remove any defined crypt patterns in gitattributes
case $OSTYPE in
darwin*)
sed -i '' '/filter=crypt diff=crypt[ \t]*$/d' "$GIT_ATTRIBUTES"
sed -i '' '/filter=crypt diff=crypt merge=crypt[ \t]*$/d' "$GIT_ATTRIBUTES"
;;
linux*)
sed -i '/filter=crypt diff=crypt[ \t]*$/d' "$GIT_ATTRIBUTES"
sed -i '/filter=crypt diff=crypt merge=crypt[ \t]*$/d' "$GIT_ATTRIBUTES"
;;
esac

Expand Down Expand Up @@ -669,7 +683,7 @@ help() {
a file in your repository, the file will be transparently encrypted
once you stage and commit it:

$ echo 'sensitive_file filter=crypt diff=crypt' >> .gitattributes
$ echo 'sensitive_file filter=crypt diff=crypt merge=crypt' >> .gitattributes
$ git add .gitattributes sensitive_file
$ git commit -m 'Add encrypted version of a sensitive file'

Expand Down Expand Up @@ -858,7 +872,7 @@ fi
# ensure the git attributes file exists
if [[ ! -f $GIT_ATTRIBUTES ]]; then
mkdir -p "${GIT_ATTRIBUTES%/*}"
printf '#pattern filter=crypt diff=crypt\n' > "$GIT_ATTRIBUTES"
printf '#pattern filter=crypt diff=crypt merge=crypt\n' > "$GIT_ATTRIBUTES"
fi

printf 'The repository has been successfully configured by transcrypt.\n'
Expand Down