[Ovirt-devel] new git hook to be installed

Jim Meyering jim at meyering.net
Tue Sep 22 16:16:39 UTC 2009


Jim Meyering wrote:
> We've all wanted to be able to tweak a few server-side settings,
> without having to find/ask/wait for someone do something manually
> on the server.  With this change to ovirt's "update" hook,
> you can now do just that by pushing a specially formed tag to
> the remote repository.  (once this hook is installed) If that tag meets
> several criteria, the "update" hook will run the command you choose.
>
> Of course, security is important here.  We don't allow arbitrary
> commands, but only those specified explicitly by some server
> repository administrator.  See the examples in the comments below.
...
> Date: Tue, 22 Sep 2009 17:17:24 +0200
> Subject: [PATCH release] update hook: allow people to change server-side git config

FYI, here's the script I used to test this:
(depends on having "update" or similar named update-hook
 in the current directory)

#!/bin/bash
# a git hook that will modify server-side config

mkdir .j
(cd .j
 git init

 git config hooks.server.config-changing.valid-commands \
'git config hooks.allowbadwhitespace true
git config hooks.allowbadwhitespace false
git config hooks.denypush.branch.master master-branch-owner at example.com
git config --unset hooks.denypush.branch.master'

 touch k
 git add k
 git commit -m. -a
 git config core.bare true
 echo foo > .git/description
 cp -a ../update-hook .git/hooks/update
 )

lock_cmd='git config hooks.denypush.branch.master master-branch-owner at example.com'
unlock_cmd='git config --unset hooks.denypush.branch.master'

server_config_change()
{
  cmd=$1
  first_commit=$(git log --reverse --pretty=%H |head -1)
  tag_name=git-control-$(date +%F-%H-%M-%S.%N)
  git tag -m "$cmd" $tag_name $first_commit
  git push origin tag $tag_name
}
lock_repo() { server_config_change "$lock_cmd"; }
unlock_repo() { server_config_change "$unlock_cmd"; }

git clone .j .j2
(cd .j2
 first_commit=$(git log --reverse --pretty=%H |head -1)
 echo a >> k; git commit -m'log msg 1 *************' -a
 lock_repo
 echo a >> k; git commit -m'log msg 2 *************' -a
 unlock_repo
 git checkout -b br
 echo on-branch >> k; git commit -m'log msg on-br *********' -a
 lock_repo
 git push --tags
 git push --all
 )




More information about the ovirt-devel mailing list