-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
update-go-yaml.sh
executable file
·108 lines (87 loc) · 3.67 KB
/
update-go-yaml.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/bin/bash
# Copyright 2021 The Kubernetes Authors.
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail
if [ "$#" -ne 1 ]; then
echo "Usage: $0 \$GOYAML_V3_SHA"
exit 1
fi
if [ "$(git branch --show-current)" == "master" ]; then
echo "You must be on a branch to use this script."
exit 1
fi
blue=$(tput setaf 4)
normal=$(tput sgr0)
# This should be the version of go-yaml v3 used by kubectl
# In the original fork, this is 496545a6307b2a7d7a710fd516e5e16e8ab62dbc
export GOYAML_SHA=$1
export GOYAML_REF="goyaml-$GOYAML_SHA"
# The PRs we need to cherry-pick onto the above commit
declare -r GO_YAML_PRS=(753 766)
REPO_ROOT=$(git rev-parse --show-toplevel)
declare -r REPO_ROOT
declare -r REBASEMAGIC="${REPO_ROOT}/.git/rebase-apply"
function explain() {
printf "\n\n%s\n" "${blue}$1${normal}"
}
# cherry-pick REPO PR
function cherry-pick(){
repo=$1
pull=$2
echo "+++ Downloading patch to /tmp/${pull}.patch (in case you need to do this again)"
curl -o "/tmp/${pull}.patch" -sSL "${repo}/pull/${pull}.patch"
echo
echo "+++ About to attempt cherry pick of PR. To reattempt:"
echo " $ git am -x -X subtree=kyaml/internal/forked/github.com/go-yaml/yaml -3 /tmp/${pull}.patch"
echo
git am -3 "/tmp/${pull}.patch" || {
conflicts=false
while unmerged=$(git status --porcelain | grep ^U) && [[ -n ${unmerged} ]] \
|| [[ -e "${REBASEMAGIC}" ]]; do
conflicts=true # <-- We should have detected conflicts once
echo
explain "+++ Conflicts detected:"
echo
(git status --porcelain | grep ^U) || echo "!!! None. Did you git am --continue?"
echo
explain "+++ Please resolve the conflicts in another window (and remember to 'git add / git am --continue')"
read -p "+++ Proceed (anything but 'y' aborts the cherry-pick)? [y/n] " -r
echo
if ! [[ "${REPLY}" =~ ^[yY]$ ]]; then
explain "Aborting." >&2
exit 1
fi
done
if [[ "${conflicts}" != "true" ]]; then
explain "!!! git am failed, likely because of an in-progress 'git am' or 'git rebase'"
exit 1
fi
}
# remove the patch file from /tmp
rm -f "/tmp/${pull}.patch"
}
subtree_commit_flag=""
explain "Removing the fork's tree from git, if it exists. We'll write over this commit in a moment, but \`read-tree\` requires a clean directory."
find kyaml/internal/forked/github.com/go-yaml/yaml -type f -delete
if [[ $(git diff --exit-code kyaml/internal/forked/github.com/go-yaml/yaml) ]]; then
git add kyaml/internal/forked/github.com/go-yaml/yaml
git commit -m "Temporarily remove go-yaml fork"
subtree_commit_flag="--amend"
fi
explain "Fetching the version of go-yaml used by kubectl. Tag it more explicitly in case of conflicts with commits local to this repo."
git fetch --depth=1 https://github.com/go-yaml/yaml.git "$GOYAML_SHA:$GOYAML_REF"
explain "Inserting the content we just pulled as a subtree of this repository and squash the changes into the last commit."
git read-tree --prefix=kyaml/internal/forked/github.com/go-yaml/yaml/ -u "$GOYAML_REF"
git add kyaml/internal/forked/github.com/go-yaml/yaml
git commit $subtree_commit_flag -m "Internal copy of go-yaml at $GOYAML_SHA"
explain "Subtree creation successful."
explain "Cherry-picking the commits from our go-yaml/yaml PRs"
for pr in "${GO_YAML_PRS[@]}" ; do
cherry-pick https://github.com/go-yaml/yaml "$pr"
done
explain "Converting module to be internal."
find kyaml/internal/forked/github.com/go-yaml/yaml -name "*.go" -type f | xargs sed -i '' s+"gopkg.in/yaml.v3"+"sigs.k8s.io/kustomize/kyaml/internal/forked/github.com/go-yaml/yaml"+g
rm kyaml/internal/forked/github.com/go-yaml/yaml/go.mod
git commit --all -m "Internalize forked code"
explain "SUCCEEDED."
exit 0