summaryrefslogtreecommitdiff
path: root/absurd/git
blob: d9e2d4ee66a2d8398a7c090514cc894767fa048e (plain)
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/bin/sh
set -e

case "$DGIT_ABSURD_DEBUG" in
''|0)	exec 3>/dev/null ;;
1)	exec 3>>../../gbp-pq-output ;;
*)	exec 3>>../../gbp-pq-output 2>&3 ;;
esac

exec 4>>../../absurd-apply-warnings

log () {
	echo >&3 "DGIT ABSURD GIT APPLY (DEBUG)  $*"
	echo >&2 "DGIT ABSURD GIT APPLY (STDERR) $*"
}

fail () {
	log "FAILED: $*"
	exit 127
}

self=${0%/*}
npath=${PATH#$self:}
if test "x$PATH" = "x$npath"; then
	fail "PATH FILTER FAIL ($0 $self $PATH)"
fi

filter_path () {
	PATH=$npath
}

squash_author () {
	author_vars='NAME EMAIL DATE'
	for var in in $author_vars; do
		eval "GIT_AUTHOR_$var=\$GIT_COMMITTER_$var"
	done
}

try_commit () { git commit-tree "$try_commit_obj" </dev/null >/dev/null; }

maybe_squash_author () {
	if   (set -e; filter_path;                try_commit); then return; fi
	if ! (set -e; filter_path; squash_author; try_commit); then return; fi
	read last <../../absurd-apply-applied
	echo >&4 \
 "dgit: warning: suppressed corrupted metadata! ($last)"
	squash_author
}

bypass=true
for arg in "$@"; do
	case "$arg" in
	apply)	bypass=false; break	;;
	commit-tree)
		# Work around #950446 in gbp
		echo >&3 "DGIT ABSURD GIT APPLY - COMMIT-TREE: $*"
		try_commit_obj="$2"
		maybe_squash_author
		bypass=true; break
		;;
	-*)				;;
	*)	bypass=true; break	;;
	esac
done

if $bypass; then
	filter_path
	echo >&3 "DGIT ABSURD GIT APPLY - BYPASS: $*"
	exec git "$@"
fi

log "NO BYPASS: $*"

case "$DGIT_ABSURD_DEBUG" in
''|0|1) ;;
*)	set -x ;;
esac

#exec >/dev/tty 2>&1

index=0
noo=0

for arg in "$@"; do
	case "$noo.$arg" in
	1.--index)
		index=1
		continue
		;;
	1.--whitespace=fix)
		continue
		;;
	?.-*)
		fail "UNKNOWN OPTION $arg ($*)"
		;;
	0.apply)
		;;
	1.*)	patch="$arg"
		;;
	*)
		fail "BAD USAGE $arg ($noo $*)"
	esac
	noo=$(( $noo + 1 ))
done

if [ $noo != 2 ]; then
	fail "NO PATCH ($*)"
fi

pwd=`pwd`
patch=${patch#$pwd/debian/patches/}
rm -f debian/patches/series

# Work around #848611.
# We need a stunt filename which the source package must not
# contain.  A trick is to use the commit hash of HEAD, whose
# hash value cannot appear in any file in its own tree.
omgwtf="dgit-omg-wtf-$(git rev-parse HEAD)"
cat <<END >debian/patches/$omgwtf
---
--- a/$omgwtf	2016-10-31 23:28:47.314155919 +0000
+++ b/$omgwtf	2016-12-18 22:40:01.870058270 +0000
@@ -0,0 +1 @@
+:
END
printf "%s\n" "$omgwtf" >debian/patches/series
printf "%s\n" "$patch" >>debian/patches/series

# Just in case some joker tries to patch .git/something
mv .git ../.git
set +e
dpkg-source --before-build .
rc=$?
set -e
rm -rf .git
mv ../.git .
test $rc = 0

rm -f $omgwtf debian/patches/$omgwtf

rm -rf .pc
git checkout debian/patches/series
git add -Af .

log "APPLIED $patch"
printf >../../absurd-apply-applied '%s\n' "$patch"
#printf 'APPLIED '; date --iso-8601=ns