summary refs log tree commit diff
path: root/maintainers/scripts/update-channel-branches.sh
diff options
context:
space:
mode:
authorNicolas B. Pierron <nicolas.b.pierron@gmail.com>2014-12-18 22:25:21 +0100
committerNicolas B. Pierron <nicolas.b.pierron@gmail.com>2014-12-18 22:25:21 +0100
commit9334085e80600e4baf9561b3a9836937a6f73d5f (patch)
treeaf3f9869d5a83391dd1d529e9ad492747d6c13f5 /maintainers/scripts/update-channel-branches.sh
parentd7edec4888fae4bd4611d94e89b1af234fdacbc4 (diff)
downloadnixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar.gz
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar.bz2
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar.lz
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar.xz
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.tar.zst
nixpkgs-9334085e80600e4baf9561b3a9836937a6f73d5f.zip
update-channel-branches.sh: Add verbosity to improve the user experience, and update NixOS documentation.
Diffstat (limited to 'maintainers/scripts/update-channel-branches.sh')
-rwxr-xr-xmaintainers/scripts/update-channel-branches.sh88
1 files changed, 70 insertions, 18 deletions
diff --git a/maintainers/scripts/update-channel-branches.sh b/maintainers/scripts/update-channel-branches.sh
index d7fbcb75690..5dbbec9393c 100755
--- a/maintainers/scripts/update-channel-branches.sh
+++ b/maintainers/scripts/update-channel-branches.sh
@@ -1,8 +1,48 @@
 #!/bin/sh
 
 : ${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)
+
+function 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
+)
+}
 
 # 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;
 
@@ -10,50 +50,62 @@ for channelName in : $(curl -s $NIXOS_CHANNELS | sed -n '/folder/ { s,.*href=",,
     # 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; }')
-    test -z "$sha1" -o -z "$channelName" && continue;
 
-    # Update the local refs/heads/channels/remotes/* branches to be
-    # in-sync with the channel references.
-    git update-ref refs/heads/channels/remotes/$channelName $sha1
+    updateRef "remotes/$channelName" "$sha1"
 done
 
+echo "Fetching channels from nixos-version:"
 if currentSystem=$(nixos-version 2>/dev/null); then
-    channelName=current-system
-
     # 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;')
-    if test -n "$sha1"; then
 
-        # Update the local refs/heads/channels/locals/* branches to be
-        # in-sync with the channel references.
-        git update-ref refs/heads/channels/locals/$channelName $sha1
-    fi
+    updateRef current-system "$sha1"
 fi
 
+echo "Fetching channels from ~/.nix-defexpr:"
 for revFile in : $(find -L ~/.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
-    #     user=root  repo=nixos    channelName=root/nixos
+    #     channelName = root/nixos
     #
     #   /home/luke/.nix-defexpr/channels/nixpkgs/svn-revision
-    #     user=luke  repo=nixpkgs  channelName=luke/nixpkgs
+    #     channelName = nixpkgs
+    #
     user=${revFile#*.nix-defexpr/channels}
     repo=${user#*/}
     repo=${repo%%/*}
     user=${user%%/*}
     user=${user#_}
     test -z "$user" && user=$USER
-    channelName="$user/$repo"
+    channelName="$user${user:+/}$repo"
 
     sha1=$(cat $revFile | sed -n 's,^.*\.\([a-f0-9]*\)$,\1,; T skip; p; :skip;')
-    test -z "$sha1" -o -z "$channelName" && continue;
 
-    # Update the local refs/heads/channels/locals/* branches to be
-    # in-sync with the channel references.
-    git update-ref refs/heads/channels/locals/$channelName $sha1
+    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