#!/usr/bin/env python import itertools import subprocess import requests import json import sys def ssh_cmd(extra): cmd = ['ssh', '-p', '29418', 'gerrit.wikimedia.org', '--', 'gerrit'] return subprocess.check_output(cmd + extra) def chunks(l, n=100): """Yield successive n-sized chunks from l.""" for i in range(0, len(l), n): yield l[i:i + n] def trust_accounts(accounts): accounts_cmd = ['set-members'] accounts_cmd += [ str(item) for sublist in list(zip(itertools.repeat('--add'), accounts)) for item in sublist ] accounts_cmd += ['Trusted-Users'] return ssh_cmd(accounts_cmd) class GerritActiveAccounts(object): _gerrit_shit = ")]}'" gerrit = 'https://gerrit.wikimedia.org/r' def __init__(self): self.url_fmt = '/accounts/?q=is:active&start={}' self.active = [] def make_url(self, start=0): base = self.gerrit + self.url_fmt return base.format(start) def get_json(self, start=0): r = requests.get(self.make_url(start)) r.raise_for_status() return json.loads(r.text[len(self._gerrit_shit):]) def get_users(self, start=0): for entry in self.get_json(start): for k, v in entry.items(): if k == '_account_id': self.active.append(int(v)) if k == '_more_accounts': return self.get_users(start=len(self.active)) return set(self.active) class GerritTrustedAccounts(object): TRUSTED_USERS = 'Trusted-Users' def __init__(self): self.users = [] def get_users(self): for row in ssh_cmd(['ls-members', self.TRUSTED_USERS]).splitlines(): if row.strip().startswith(b'id'): continue self.users.append(int(row.split(b'\t')[0])) return set(self.users) def main(): ga = GerritActiveAccounts() active_accounts = ga.get_users() ta = GerritTrustedAccounts() trusted_accounts = ta.get_users() accounts_to_add = active_accounts - trusted_accounts for chunk in chunks(list(accounts_to_add)): print(trust_accounts(chunk)) if __name__ == '__main__': main()