mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-25 03:17:13 +00:00
261 lines
5.5 KiB
Bash
261 lines
5.5 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
usage () {
|
||
|
echo 1>&2 "
|
||
|
usage:
|
||
|
$0
|
||
|
[--git commit..commit | --git commit]
|
||
|
[--svn rev:rev | --svn rev]
|
||
|
[--path path[:path]*]
|
||
|
[--help]
|
||
|
|
||
|
This program is used to investigate how any changes inside your nixpkgs
|
||
|
repository may hurt. With these kind of information you may choose wisely
|
||
|
where you should commit your changes.
|
||
|
|
||
|
This program adapts it-self to your versionning system to avoid too much
|
||
|
effort on your Internet bandwidth. If you need to check more than one
|
||
|
commits / revisions, you may use the following commands:
|
||
|
|
||
|
--git remotes/trunk..master
|
||
|
--svn 17670:17677
|
||
|
|
||
|
Check the differences between each commit separating the first and the
|
||
|
last commit.
|
||
|
|
||
|
--path /etc/nixos/nixpkgs:/tmp/nixpkgs_1:/tmp/nixpkgs_2
|
||
|
|
||
|
Check the differences between multiple directories containing different
|
||
|
versions of nixpkgs.
|
||
|
|
||
|
All these options exist with one commit / revision argument. Such options
|
||
|
are used to compare your \$NIXPKGS path with the specified version.
|
||
|
|
||
|
If you omit to mention any other commit / revision, then your \$NIXPKGS path
|
||
|
is compared with its last update. This command is useful to test code from
|
||
|
a dirty repository.
|
||
|
|
||
|
"
|
||
|
|
||
|
exit 1;
|
||
|
}
|
||
|
|
||
|
#####################
|
||
|
# Process Arguments #
|
||
|
#####################
|
||
|
|
||
|
: ${NIXPKGS=/etc/nixos/nixpkgs/}
|
||
|
|
||
|
vcs=""
|
||
|
gitCommits=""
|
||
|
svnRevisions=""
|
||
|
pathLocations=""
|
||
|
verbose=false
|
||
|
|
||
|
argfun=""
|
||
|
for arg; do
|
||
|
if test -z "$argfun"; then
|
||
|
case $arg in
|
||
|
--git) vcs="git"; argfun="set_gitCommits";;
|
||
|
--svn) vcs="svn"; argfun="set_svnRevisions";;
|
||
|
--path) vcs="path"; argfun="set_pathLocations";;
|
||
|
--verbose) verbose=true;;
|
||
|
--help) usage;;
|
||
|
*) usage;;
|
||
|
esac
|
||
|
else
|
||
|
case $argfun in
|
||
|
set_*)
|
||
|
var=$(echo $argfun | sed 's,^set_,,')
|
||
|
eval $var=$arg
|
||
|
;;
|
||
|
esac
|
||
|
argfun=""
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
if $verbose; then
|
||
|
set -x
|
||
|
else
|
||
|
set +x
|
||
|
fi
|
||
|
|
||
|
############################
|
||
|
# Find the repository type #
|
||
|
############################
|
||
|
|
||
|
if test -z "$vcs"; then
|
||
|
if test -x "$NIXPKGS/.git"; then
|
||
|
if git --git-dir="$NIXPKGS/.git" branch > /dev/null 2>&1; then
|
||
|
vcs="git"
|
||
|
gitCommits=$(git --git-dir="$NIXPKGS/.git" log -n 1 --pretty=format:%H 2> /dev/null)
|
||
|
fi
|
||
|
elif test -x "$NIXPKGS/.svn"; then
|
||
|
cd "$NIXPKGS"
|
||
|
if svn info > /dev/null 2>&1; then
|
||
|
vcs="svn";
|
||
|
svnRevisions=$(svn info | sed -n 's,Revision: ,,p')
|
||
|
fi
|
||
|
cd -
|
||
|
else
|
||
|
usage
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
###############################
|
||
|
# Define a storage directory. #
|
||
|
###############################
|
||
|
|
||
|
pkgListDir=""
|
||
|
exitCode=1
|
||
|
cleanup(){
|
||
|
test -e "$pkgListDir" && rm -rf "$pkgListDir"
|
||
|
exit $exitCode;
|
||
|
}
|
||
|
|
||
|
trap cleanup EXIT SIGINT SIGQUIT ERR
|
||
|
|
||
|
pkgListDir=$(mktemp --tmpdir -d rebuild-amount-XXXXXXXX)
|
||
|
vcsDir="$pkgListDir/.vcs"
|
||
|
|
||
|
###########################
|
||
|
# Versionning for Dummies #
|
||
|
###########################
|
||
|
|
||
|
path_init() {
|
||
|
if test "${pathLocations#*:}" = "$pathLocations"; then
|
||
|
pathLocations="$NIXPKGS:$pathLocations"
|
||
|
fi
|
||
|
pathLocations="${pathLocations}:"
|
||
|
}
|
||
|
|
||
|
path_getNext() {
|
||
|
pathLoc="${pathLocations%%:*}"
|
||
|
pathLocations="${pathLocations#*:}"
|
||
|
}
|
||
|
|
||
|
path_setPath() {
|
||
|
path="$pathLoc"
|
||
|
}
|
||
|
|
||
|
path_setName() {
|
||
|
name=$(echo "$pathLoc" | tr '/' '_')
|
||
|
}
|
||
|
|
||
|
################
|
||
|
# Git Commands #
|
||
|
################
|
||
|
|
||
|
git_init() {
|
||
|
git clone "$NIXPKGS/.git" "$vcsDir" > /dev/null 2>&1
|
||
|
if echo "gitCommits" | grep -c "\.\." > /dev/null 2>&1; then
|
||
|
gitCommits=$(git --git-dir="$vcsDir/.git" log --reverse --pretty=format:%H $gitCommits 2> /dev/null)
|
||
|
else
|
||
|
pathLocations="$vcsDir:$NIXPKGS"
|
||
|
vcs="path"
|
||
|
path_init
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
git_getNext() {
|
||
|
git --git-dir="$vcsDir/.git" checkout $(echo "$gitCommits" | head -n 1) > /dev/null 2>&1
|
||
|
gitCommits=$(echo "$gitCommits" | sed '1 d')
|
||
|
}
|
||
|
|
||
|
git_setPath() {
|
||
|
path="$vcsDir"
|
||
|
}
|
||
|
|
||
|
git_setName() {
|
||
|
name=$(git --git-dir="$vcsDir/.git" log -n 1 --pretty=format:%H 2> /dev/null)
|
||
|
}
|
||
|
|
||
|
#######################
|
||
|
# Subversion Commands #
|
||
|
#######################
|
||
|
|
||
|
svn_init() {
|
||
|
cp -r "$NIXPKGS" "$vcsDir" > /dev/null 2>&1
|
||
|
if echo "svnRevisions" | grep -c ":" > /dev/null 2>&1; then
|
||
|
svnRevisions=$(seq ${svnRevisions%:*} ${svnRevisions#*:})
|
||
|
else
|
||
|
pathLocations="$vcsDir:$NIXPKGS"
|
||
|
vcs="path"
|
||
|
path_init
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
svn_getNext() {
|
||
|
cd "$vcsDir"
|
||
|
svn checkout $(echo "$svnRevisions" | head -n 1) > /dev/null 2>&1
|
||
|
cd -
|
||
|
svnRevisions=$(echo "$svnRevisions" | sed '1 d')
|
||
|
}
|
||
|
|
||
|
svn_setPath() {
|
||
|
path="$vcsDir"
|
||
|
}
|
||
|
|
||
|
svn_setName() {
|
||
|
name=$(svn info 2> /dev/null | sed -n 's,Revision: ,,p')
|
||
|
}
|
||
|
|
||
|
####################
|
||
|
# Logical Commands #
|
||
|
####################
|
||
|
|
||
|
init () { ${vcs}_init; }
|
||
|
getNext () { ${vcs}_getNext; }
|
||
|
setPath () { ${vcs}_setPath; }
|
||
|
setName () { ${vcs}_setName; }
|
||
|
|
||
|
|
||
|
#####################
|
||
|
# Check for Rebuild #
|
||
|
#####################
|
||
|
|
||
|
# Generate the list of all derivations that could be build from a nixpkgs
|
||
|
# respository. This list of derivation hashes is compared with previous
|
||
|
# lists and a brief summary is produced on the output.
|
||
|
|
||
|
compareNames () {
|
||
|
nb=$(diff -y --suppress-common-lines --speed-large-files "$pkgListDir/$1.drvs" "$pkgListDir/$2.drvs" 2> /dev/null | wc -l)
|
||
|
echo "$1 -> $2: $nb"
|
||
|
}
|
||
|
|
||
|
echo "Please wait, this may take some minutes ..."
|
||
|
|
||
|
init
|
||
|
first=""
|
||
|
oldPrev=""
|
||
|
|
||
|
prev=""
|
||
|
curr=""
|
||
|
|
||
|
while true; do
|
||
|
getNext
|
||
|
setPath # set path=...
|
||
|
setName # set name=...
|
||
|
curr="$name"
|
||
|
|
||
|
test -z "$curr" && break || true
|
||
|
|
||
|
nix-instantiate "$path" > "$pkgListDir/$curr.drvs" > /dev/null 2>&1 || true
|
||
|
|
||
|
if test -n "$prev"; then
|
||
|
compareNames "$prev" "$curr"
|
||
|
else
|
||
|
echo "Number of package to rebuild:"
|
||
|
first="$curr"
|
||
|
fi
|
||
|
oldPrev="$prev"
|
||
|
prev="$curr"
|
||
|
done
|
||
|
|
||
|
if test "$first" != "$oldPrev"; then
|
||
|
echo "Number of package to rebuild (first -> last):"
|
||
|
compareNames "$first" "$curr"
|
||
|
fi
|
||
|
|
||
|
exitCode=0
|