Mention that repo-specific-hooks need to be enabled
[git-mirror.git] / git_mirror.py
index a3b7fe9b714c848c66c9428142835e6172fb7b81..859b3768cad7db5e3d16231efa96a1ed906a4909 100644 (file)
@@ -27,6 +27,7 @@ import hmac, hashlib
 import email.mime.text, email.utils, smtplib
 
 mail_sender = "null@localhost"
 import email.mime.text, email.utils, smtplib
 
 mail_sender = "null@localhost"
+config_file = os.path.join(os.path.dirname(__file__), 'git-mirror.conf')
 
 class GitCommand:
     def __getattr__(self, name):
 
 class GitCommand:
     def __getattr__(self, name):
@@ -53,10 +54,10 @@ def git_is_forced_update(oldsha, newsha):
     assert code in (0, 1)
     return False if code == 0 else True # if oldsha is an ancestor of newsha, then this was a "good" (non-forced) update
 
     assert code in (0, 1)
     return False if code == 0 else True # if oldsha is an ancestor of newsha, then this was a "good" (non-forced) update
 
-def read_config(fname, defSection = 'DEFAULT'):
+def read_config(defSection = 'DEFAULT'):
     '''Reads a config file that may have options outside of any section.'''
     config = configparser.ConfigParser()
     '''Reads a config file that may have options outside of any section.'''
     config = configparser.ConfigParser()
-    with open(fname) as file:
+    with open(config_file) as file:
         stream = itertools.chain(("["+defSection+"]\n",), file)
         config.read_file(stream)
     return config
         stream = itertools.chain(("["+defSection+"]\n",), file)
         config.read_file(stream)
     return config
@@ -153,7 +154,8 @@ class Repo:
             if len(local_state):
                 raise Exception("Something went wrong getting the local state of {}.".format(ref))
             local_sha = git_nullsha
             if len(local_state):
                 raise Exception("Something went wrong getting the local state of {}.".format(ref))
             local_sha = git_nullsha
-        assert local_sha in (oldsha, newsha), "Someone lied about the old SHA."
+        # some sanity checking, but deal gracefully with new branches appearing
+        assert local_sha in (git_nullsha, oldsha, newsha), "Someone lied about the old SHA: Local ({}) is neither old ({}) nor new ({})".format(local_sha, oldsha, newsha)
         # if we are already at newsha locally, we also ran the local hooks, so we do not have to do anything
         if local_sha == newsha:
             return "Local repository is already up-to-date."
         # if we are already at newsha locally, we also ran the local hooks, so we do not have to do anything
         if local_sha == newsha:
             return "Local repository is already up-to-date."
@@ -189,8 +191,7 @@ def find_repo_by_directory(repos, dir):
 
 def load_repos():
     global mail_sender
 
 def load_repos():
     global mail_sender
-    conffile = os.path.join(os.path.dirname(__file__), 'git-mirror.conf')
-    conf = read_config(conffile)
+    conf = read_config()
     mail_sender = conf['DEFAULT']['mail-sender']
     
     repos = {}
     mail_sender = conf['DEFAULT']['mail-sender']
     
     repos = {}