blob: 9a388618dabc57f8cad5cb3a898965ee790f4a4d (
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
|
#!/usr/bin/env bash
#
#
# Updates a package definition by downloading the patch from monitor.nixos.org,
# creating a branch in the nixpkgs repo for it, applying the patch and
# test-building the package if you want to.
#
#
source $(dirname ${BASH_SOURCE[0]})/nix-utils.sh
usage() {
cat <<EOS
$(help_synopsis "${BASH_SOURCE[0]}" "[-y] [-b] [-g <nixpkgs path>] -u <url>")
-y Don't ask before executing things (optional) (not implemented yet)
-b Also test-build the package (optional)
-u <url> Download and apply this url
-g <path> Path of nixpkgs clone (defaults to ./)
-h Show this help and exit
Helper for developers of Nix packages.
With this command you can
- Download package update diffs
- Create package update commits on a new branch
- Test build the updated package
and everything in one step. All you need is the URL of the
patch.
The script asks before building the package, so you can abort if
the script fails to find the package name.
You really should base the update branch on the commit your
current system is based on. This way you don't need to rebuild
the whole world.
Example usage:
# Create in the current directory (which should be a clone
# of the nixpkgs repo) a new branch for updateing ffmpeg,
# download the patch and apply it (commit message gets generated
# for you) and then test build it.
# Verbosity is on.
nix-script -v update-package-def -b -u http://monitor.nixos.org/patch?p=ffmpeg-full&v=2.7.1&m=Matthias+Beyer
$(help_end)
EOS
}
YES=0
TESTBUILD=0
NIXPKGS=
URL=
while getopts "ybu:g:h" OPTION
do
case $OPTION in
y)
YES=1
stdout "Setting YES"
;;
b)
TESTBUILD=1
stdout "Test-building enabled"
;;
u)
URL="$OPTARG"
stdout "URL = $URL"
;;
g)
NIXPKGS="$OPTARG"
stdout "NIXPKGS = $NIXPKGS"
;;
h)
usage
exit 0
;;
esac
done
if [ -z "$URL" ]
then
stderr "No URL for the patch"
exit 1
fi
if [ -z "$NIXPKGS" ]
then
stderr "No nixpkgs passed."
stderr "Checking whether the current directory is a git repository!"
stderr "(this could possibly blow up pretty badly)"
continue_question "Continue execution" || exit 1
if [[ -d ./.git ]]
then
stdout "Git directory found"
NIXPKGS="."
else
stderr "No git directory"
exit 1
fi
fi
stdout "Making temp directory"
TMP=$(mktemp)
stdout "TMP = $TMP"
stdout "Fetching patch"
curl $URL > $TMP
stdout "Parsing subject to branch name"
PKG=$(cat $TMP | grep Subject | cut -d: -f 2 | sed -r 's,(\ *)(.*)(\ *),\2,')
CURRENT_BRANCH=$(__git_current_branch "$NIXPKGS")
__git "$NIXPKGS" checkout -b update-$PKG
if [[ $? -ne 0 ]]
then
stderr "Switching to branch update-$PKG failed."
exit 1
fi
cat $TMP | __git "$NIXPKGS" am
stdout "Patch applied."
if [[ $TESTBUILD -eq 1 ]]
then
ask_execute "Build '$PKG' in nixpkgs clone at '$NIXPKGS'" nix-build -A $PKG -I $NIXPKGS
fi
stdout "Switching back to old commit which was current before we started."
stdout "Switching to '$CURRENT_BRANCH'"
__git "$NIXPKGS" checkout $CURRENT_BRANCH
if [[ $? -ne 0 ]]
then
stderr "Switching back to '$CURRENT_BRANCH' failed. Please check manually"
exit 1
fi
|