You get a nasty error like:

$ git push origin -d refs/users/redi/heads/calendar
remote: *** Update rejected by this repository's hooks.update-hook script
remote: *** (/git/gcc.git/hooks-bin/update_hook):
remote: *** fatal: bad object 0000000000000000000000000000000000000000
remote: *** Traceback (most recent call last):
remote: ***   File "/git/gcc.git/hooks-bin/update_hook", line 39, in <module>
remote: ***     main()
remote: ***   File "/git/gcc.git/hooks-bin/update_hook", line 27, in main
remote: ***     check=True, universal_newlines=True).stdout.split('\n')
remote: ***   File "/usr/lib64/python3.6/subprocess.py", line 438, in run
remote: ***     output=stdout, stderr=stderr)
remote: *** subprocess.CalledProcessError: Command '['git',
'rev-list', '0000000000000000000000000000000000000000',
'^4415a3e0965ae6e2a4bedd3584b2504ebb2d96f3']' returned non-zero exit
status 128.
remote: error: hook declined to update refs/users/redi/heads/calendar
To git+ssh://gcc.gnu.org/git/gcc.git
! [remote rejected]         refs/users/redi/heads/calendar (hook declined)
error: failed to push some refs to 'git+ssh://gcc.gnu.org/git/gcc.git'


The problem is that the script doesn't check whether the new_object is
000000000.

I think we want something like this:

--- update_hook 2020-09-02 23:30:25.074884982 +0000
+++ /tmp/update_hook    2020-10-01 13:57:14.681656258 +0000
@@ -12,6 +12,12 @@
    ref_name = sys.argv[1]
    old_object = sys.argv[2]
    new_object = sys.argv[3]
+    if re.fullmatch('0+', new_object) is not None:
+        if (not ref_name.startswith('refs/users/')
+            and not ref_name.startswith('refs/vendors/')):
+            error('Only personal and vendor branches can be deleted.')
+            sys.exit(1)
+        sys.exit(0)
    # Do not allow updates introducing ancestry based on the old
    # git-svn repository, to ensure people rebase onto the new history
    # rather than merging branches based on git-svn history into those

Reply via email to