261 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 | 
