X-Git-Url: https://git.ralfj.de/git-mirror.git/blobdiff_plain/b13f671882eb0d0e302860144103870f38f4a062..d82914054bb75574c2675649a943025e57fa8680:/git_mirror.py diff --git a/git_mirror.py b/git_mirror.py index ab8699e..0bd4e81 100644 --- a/git_mirror.py +++ b/git_mirror.py @@ -21,10 +21,12 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #============================================================================== -import sys, os, subprocess +import sys, os, os.path, subprocess import configparser, itertools, json, re import email.mime.text, email.utils, smtplib +mail_sender = "null@localhost" + class GitCommand: def __getattr__(self, name): def call(*args, capture_stderr = False, check = True): @@ -58,20 +60,20 @@ def read_config(fname, defSection = 'DEFAULT'): config.read_file(stream) return config -def send_mail(subject, text, receivers, sender='post+webhook@ralfj.de', replyTo=None): - assert isinstance(receivers, list) - if not len(receivers): return # nothing to do +def send_mail(subject, text, recipients, sender, replyTo = None): + assert isinstance(recipients, list) + if not len(recipients): return # nothing to do # construct content msg = email.mime.text.MIMEText(text.encode('UTF-8'), 'plain', 'UTF-8') msg['Subject'] = subject msg['Date'] = email.utils.formatdate(localtime=True) msg['From'] = sender - msg['To'] = ', '.join(receivers) + msg['To'] = ', '.join(recipients) if replyTo is not None: msg['Reply-To'] = replyTo # put into envelope and send s = smtplib.SMTP('localhost') - s.sendmail(sender, receivers, msg.as_string()) + s.sendmail(sender, recipients, msg.as_string()) s.quit() def get_github_payload(): @@ -89,6 +91,7 @@ class Repo: self.name = name self.local = conf['local'] self.owner = conf['owner'] # email address to notify in case of problems + self.deploy_key = conf['deploy-key'] # the SSH ky used for authenticating against remote hosts self.mirrors = {} # maps mirrors to their URLs mirror_prefix = 'mirror-' for name in filter(lambda s: s.startswith(mirror_prefix), conf.keys()): @@ -96,7 +99,8 @@ class Repo: self.mirrors[mirror] = conf[name] def mail_owner(self, msg): - send_mail("git-mirror {0}".format(self.name), msg, [self.owner]) + global mail_sender + send_mail("git-mirror {0}".format(self.name), msg, recipients = [self.owner], sender = mail_sender) def find_mirror_by_url(self, match_urls): for mirror, url in self.mirrors.items(): @@ -104,10 +108,18 @@ class Repo: return mirror return None + def setup_env(self): + '''Setup the environment to work with this repository''' + os.chdir(self.local) + ssh_set_ident = os.path.join(os.path.dirname(__file__), 'ssh-set-ident.sh') + os.putenv('GIT_SSH', ssh_set_ident) + ssh_ident = os.path.join(os.path.expanduser('~/.ssh'), self.deploy_key) + os.putenv('SSH_IDENT', ssh_ident) + def update_mirrors(self, ref, oldsha, newsha, except_mirrors = [], suppress_stderr = False): '''Update the from to on all mirrors. The update must already have happened locally.''' assert len(oldsha) == 40 and len(newsha) == 40, "These are not valid SHAs." - os.chdir(self.local) + self.setup_env() # check for a forced update is_forced = newsha != git_nullsha and oldsha != git_nullsha and git_is_forced_update(oldsha, newsha) # tell all the mirrors @@ -124,7 +136,7 @@ class Repo: def update_ref_from_mirror(self, ref, oldsha, newsha, mirror, suppress_stderr = False): '''Update the local version of this to what's currently on the given . and are checked. Then update all the other mirrors.''' - os.chdir(self.local) + self.setup_env() url = self.mirrors[mirror] # first check whether the remote really is at newsha remote_state, code = git.ls_remote(url, ref) @@ -169,8 +181,11 @@ def find_repo_by_directory(repos, dir): return None def load_repos(): + global mail_sender conffile = os.path.join(os.path.dirname(__file__), 'git-mirror.conf') conf = read_config(conffile) + mail_sender = conf['DEFAULT']['mail-sender'] + repos = {} for name, section in conf.items(): if name != 'DEFAULT':