Don't crash when .git/refs/heads/master doesn't exist
authorMagnus Hagander <magnus@hagander.net>
Fri, 13 Oct 2017 09:15:51 +0000 (11:15 +0200)
committerMagnus Hagander <magnus@hagander.net>
Fri, 13 Oct 2017 09:15:51 +0000 (11:15 +0200)
This happens after a git gc which moves this into packed-refs. So when
this happens, look in packed-refs. If packed-refs also cannot be found,
just return a made up value instead of crashing.

pgweb/util/contexts.py

index 680b683cf5e6c210df2a41a468b449cecd824b1d..045cea1dd1daebd76d453c210571568cab2ad091 100644 (file)
@@ -104,8 +104,21 @@ class NavContext(RequestContext):
 def _get_gitrev():
        # Return the current git revision, that is used for
        # cache-busting URLs.
-       with open('.git/refs/heads/master') as f:
-               return f.readline()[:8]
+       try:
+               with open('.git/refs/heads/master') as f:
+                       return f.readline()[:8]
+       except IOError:
+               # A "git gc" will remove the ref and replace it with a packed-refs.
+               try:
+                       with open('.git/packed-refs') as f:
+                               for l in f.readlines():
+                                       if l.endswith("refs/heads/master\n"):
+                                               return l[:8]
+                               # Not found in packed-refs. Meh, just make one up.
+                               return 'ffffffff'
+               except IOError:
+                       # If packed-refs also can't be read, just give up
+                       return 'eeeeeeee'
 
 # Template context processor to add information about the root link and
 # the current git revision. git revision is returned as a lazy object so