 92aef0621f
			
		
	
	
		92aef0621f
		
	
	
	
	
		
			
			Should now work equally well with bash (as on NixOS) and dash (on various other distributions). The only truly required change was on line 10: "function" is a superfluous keyword that's not present in posix sh. Change-Id: If917499b2e24c0d039e8c61208227b90c9fc5c0d
		
			
				
	
	
		
			113 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| set -e
 | |
| 
 | |
| : ${NIXOS_CHANNELS:=https://nixos.org/channels/}
 | |
| : ${CHANNELS_NAMESPACE:=refs/heads/channels/}
 | |
| 
 | |
| # List all channels which are currently in the repository which we would
 | |
| # have to remove if they are not found again.
 | |
| deadChannels=$(git for-each-ref --format="%(refname)" "$CHANNELS_NAMESPACE")
 | |
| 
 | |
| updateRef() {
 | |
|     local channelName=$1
 | |
|     local newRev=$2
 | |
| 
 | |
|     # if the inputs are not valid, then we do not update any branch.
 | |
|     test -z "$newRev" -o -z "$channelName" && return;
 | |
| 
 | |
|     # Update the local refs/heads/channels/* branches to be in-sync with the
 | |
|     # channel references.
 | |
|     local branch=$CHANNELS_NAMESPACE$channelName
 | |
|     oldRev=$(git rev-parse --short "$branch" 2>/dev/null || true)
 | |
|     if test "$oldRev" != "$newRev"; then
 | |
|         if git update-ref "$branch" "$newRev" 2>/dev/null; then
 | |
|             if test -z "$oldRev"; then
 | |
|                 echo " * [new branch]      $newRev           -> ${branch#refs/heads/}"
 | |
|             else
 | |
|                 echo "                     $oldRev..$newRev  -> ${branch#refs/heads/}"
 | |
|             fi
 | |
|         else
 | |
|             if test -z "$oldRev"; then
 | |
|                 echo " * [missing rev]     $newRev           -> ${branch#refs/heads/}"
 | |
|             else
 | |
|                 echo "   [missing rev]     $oldRev..$newRev  -> ${branch#refs/heads/}"
 | |
|             fi
 | |
|         fi
 | |
|     fi
 | |
| 
 | |
|     # Filter out the current channel from the list of dead channels.
 | |
|     deadChannels=$(grep -v "$CHANNELS_NAMESPACE$channelName" <<EOF
 | |
| $deadChannels
 | |
| EOF
 | |
| ) ||true
 | |
| }
 | |
| 
 | |
| # Find the name of all channels which are listed in the directory.
 | |
| echo "Fetching channels from $NIXOS_CHANNELS:"
 | |
| for channelName in : $(curl -s "$NIXOS_CHANNELS" | sed -n '/folder/ { s,.*href=",,; s,/".*,,; p }'); do
 | |
|     test "$channelName" = : && continue;
 | |
| 
 | |
|     # Do not follow redirections, such that we can extract the
 | |
|     # short-changeset from the name of the directory where we are
 | |
|     # redirected to.
 | |
|     sha1=$(curl -sI "$NIXOS_CHANNELS$channelName" | sed -n '/Location/ { s,.*\.\([a-f0-9]*\)[ \r]*$,\1,; p; }')
 | |
| 
 | |
|     updateRef "remotes/$channelName" "$sha1"
 | |
| done
 | |
| 
 | |
| echo "Fetching channels from nixos-version:"
 | |
| if currentSystem=$(nixos-version 2>/dev/null); then
 | |
|     # If the system is entirely build from a custom nixpkgs version,
 | |
|     # then the version is not annotated in git version. This sed
 | |
|     # expression is basically matching that the expressions end with
 | |
|     # ".<sha1> (Name)" to extract the sha1.
 | |
|     sha1=$(echo "$currentSystem" | sed -n 's,^.*\.\([a-f0-9]*\) *(.*)$,\1,; T skip; p; :skip;')
 | |
| 
 | |
|     updateRef current-system "$sha1"
 | |
| fi
 | |
| 
 | |
| echo "Fetching channels from $HOME/.nix-defexpr:"
 | |
| for revFile in : $(find -L "$HOME/.nix-defexpr/" -maxdepth 4 -name svn-revision); do
 | |
|     test "$revFile" = : && continue;
 | |
| 
 | |
|     # Deconstruct a path such as, into:
 | |
|     #
 | |
|     #   /home/luke/.nix-defexpr/channels_root/nixos/nixpkgs/svn-revision
 | |
|     #     channelName = root/nixos
 | |
|     #
 | |
|     #   /home/luke/.nix-defexpr/channels/nixpkgs/svn-revision
 | |
|     #     channelName = nixpkgs
 | |
|     #
 | |
|     user=${revFile#*.nix-defexpr/channels}
 | |
|     repo=${user#*/}
 | |
|     repo=${repo%%/*}
 | |
|     user=${user%%/*}
 | |
|     user=${user#_}
 | |
|     test -z "$user" && user=$USER
 | |
|     channelName="$user${user:+/}$repo"
 | |
| 
 | |
|     sha1=$(sed -n 's,^.*\.\([a-f0-9]*\)$,\1,; T skip; p; :skip;' "$revFile")
 | |
| 
 | |
|     updateRef "$channelName" "$sha1"
 | |
| done
 | |
| 
 | |
| # Suggest to remove channel branches which are no longer found by this
 | |
| # script. This is to handle the cases where a local/remote channel
 | |
| # disappear. We should not attempt to remove manually any branches, as they
 | |
| # might be user branches.
 | |
| if test -n "$deadChannels"; then
 | |
| 
 | |
|     echo "
 | |
| Some old channel branches are still in your repository, if you
 | |
| want to remove them, run the following command(s):
 | |
| "
 | |
| 
 | |
|     while read branch; do
 | |
|         echo "    git update-ref -d $branch"
 | |
|     done <<EOF
 | |
| $deadChannels
 | |
| EOF
 | |
| 
 | |
|     echo
 | |
| fi
 |