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 |