From 190a0512ab20f3208981ce0e93fccceaee39d4fe Mon Sep 17 00:00:00 2001 From: Jeremie Dimino Date: Tue, 18 Dec 2007 01:41:46 +0100 Subject: [PATCH] Utilisation de la date pour trouver les nouveaux patches. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Je viens de me rendre compte que le début du hash du patch correspond à la date... Du coup c'est plus et plus rapide. darcs-hash:20071218004146-af139-9925ce3d960912c84efa314643a3a7cda10e0f6f.gz --- gestion/darcs_send_changes.py | 150 ++++++++++++++++------------------ 1 file changed, 71 insertions(+), 79 deletions(-) diff --git a/gestion/darcs_send_changes.py b/gestion/darcs_send_changes.py index c35617e9..e22af9c0 100755 --- a/gestion/darcs_send_changes.py +++ b/gestion/darcs_send_changes.py @@ -45,7 +45,7 @@ from email.Utils import formatdate from email import Encoders CONF_PATH = "_darcs/third-party/darcs-send-changes" -SEEN_FILE = CONF_PATH + "/seen" +DATE_FILE = CONF_PATH + "/date-last-send" ID_FILE = CONF_PATH + "/id" def to_utf8(str): @@ -70,10 +70,6 @@ def darcs(args): o = to_utf8(o) return (s, o) -def darcs_raw(args): - """ Invoque darcs et renvoie sa sortie. """ - return commands.getstatusoutput("env DARCS_DONT_ESCAPE_8BIT=0 darcs " + args) - def get_patch_properties(hash): """ Récupère les informations a propos d'un certain patch. """ if hash: @@ -108,16 +104,6 @@ def get_patch_properties(hash): 'diff': diff, 'changes': darcs("changes %s --summary" % match_cmd)[1] } -def get_patches_properties(from_hash): - """ Construit la liste des informations sur les patches à partir du patch from_hash. """ - changelog = etree.XML(darcs("changes --from-match='hash %s' --reverse --xml-output" % from_hash)) - props = [] - for change in changelog[1:]: - # Ca peut parraitre inutile de refaire un darcs changes, mais c'est pour palier aux problemes - # d'encodages - props.append(get_patch_properties(change.attrib['hash'])) - return props - def send_changes(smtp, recipient, patch_props): """ Formate et envoie un mail avec les modifications sur le dernier patch appliqué au dépot. @@ -157,7 +143,7 @@ contenir les variables suivantes: mail['X-CVSinfo'] = "CRANS" mail['X-DarcsInfo'] = "CRANS-%(id)s" % patch_props - texte = MIMEText(message_template % patch_props, "UTF-8") + texte = MIMEText(message_template % patch_props, "plain") texte.set_charset("UTF-8") mail.attach(texte) @@ -190,33 +176,35 @@ Les options disponibles sont: -r, --repo spécifie l'emplacement du dépôt -f, --from hash du premier patch de la série a envoyer -i, --interactive sélectionne les patches en mode interactif + -d, --date ne considérer que les patches depuis , + qui doit être un préfixe d'un date + de la forme AAAAMMJJHHMMSS Si aucun destinataire n'est donné, roots@crans.org est utilisé. """ % { 'name': os.path.basename(sys.argv[0]) }) sys.exit(0) -def getnew(): - '''Renvoie les possibles nouveaux patches''' - if os.access(SEEN_FILE, os.R_OK): - seen=set(map(lambda x: x[0:-1], file(SEEN_FILE).readlines())) - else: - seen=set([]) - return set(filter(lambda x: x.endswith(".gz"), os.listdir("_darcs/patches"))) - seen - -def addseen(patches): - '''Ajoute des patches aux patches déjà vus''' - if not os.path.exists(CONF_PATH): - p = "." - for comp in CONF_PATH.split('/'): - p = "%s/%s" % (p, comp) - if not os.path.exists(p): - os.mkdir(p) - open(SEEN_FILE, "a+").writelines([patch + "\n" for patch in patches]) +def getnew(lastdate=None): + '''Renvoie les possibles nouveaux patches depuis lastdate, + ou depuis la date retenue par le programme''' + if not lastdate: + if os.access(DATE_FILE, os.R_OK): + lastdate=file(DATE_FILE).read().strip() + else: + lastdate='19700101000000' + files = os.listdir("_darcs/patches") + patches = [] + for f in files: + if f.endswith(".gz"): + date = f.split("-", 1)[0] + if date > lastdate: + patches.append(f) + patches.sort() + return patches def select(patches): '''Sélection interactive de patches''' decided = [] - ignore = [] while patches: (status, changelog) = darcs("changes --match='hash %s'" % patches[-1]) if status == 0: @@ -245,18 +233,16 @@ def select(patches): elif c == "i": while patches: decided.append((False, patches.pop())) - else: - ignore.append(patches.pop()) - ask("%d patches à envoyer, accepter ?" % [x[0] for x in decided].count(True), - [("YO", "oui"), - ("nq", "non", None, lambda: sys.exit(0))]) - for d in decided: - if d[0]: - patches.append(d[1]) - else: - ignore.append(d[1]) - return patches, ignore + count = [x[0] for x in decided].count(True) + if count: + ask("%d patches à envoyer, accepter ?" % count, + [("YO", "oui"), + ("nq", "non", None, lambda: sys.exit(0))]) + for d in decided: + if d[0]: + patches.append(d[1]) + return patches if __name__ == "__main__": import smtplib, getopt @@ -265,9 +251,12 @@ if __name__ == "__main__": repo = None from_hash = None interactive = False + lastdate = None try: - options, arg = getopt.getopt(sys.argv[1:], 'hs:r:f:i', [ 'help', 'smtp=', 'repo=', 'from=', 'interactive']) + options, arg = getopt.getopt(sys.argv[1:], 'hs:r:f:id:', + [ 'help', 'smtp=', 'repo=', 'from=', + 'interactive', 'date']) except getopt.error, msg: __usage(unicode(msg)) for opt, val in options: @@ -281,6 +270,12 @@ if __name__ == "__main__": from_hash = val elif opt in [ '-i', '--interactive' ]: interactive = True + elif opt in [ '-d', '--date' ]: + lastdate = val + if not lastdate.isdigit or len(lastdate) >= 14: + __usage("date invalide") + lastdate += (14 - len(lastdate)) * "0" + print lastdate else: __usage("option inconnue « %s »'" % opt) recipient = arg @@ -296,40 +291,37 @@ if __name__ == "__main__": cprint("Pas de dépôt darcs trouvé") sys.exit(1) - if not os.path.exists(SEEN_FILE): - # Sélection du patch façon darcs - cprint(u"C'est la première fois que vous lancez %s dans ce dépôt." % os.path.basename(sys.argv[0])) - c = ask("Que voulez-vous faire ?", - [("S", "sélectionner les patchs à envoyer/ignorer en mode interactif", "select"), - ("e", "tout envoyer", "all"), - ("i", "tout ignorer", "none"), - Exit]) - if c == "none": - addseen(getnew()) - sys.exit(0) - elif c == "all": - patches = getnew() - elif c == "select": - # On récupère la liste des patches triés - patches = [x.attrib['hash'] for x in etree.XML(darcs_raw("changes --xml-output")[1])] - patches, ignore = select(patches) - addseen(ignore) + if not os.path.exists(DATE_FILE): + try: + # Sélection du patch façon darcs + cprint(u"C'est la première fois que vous lancez %s dans ce dépôt." % os.path.basename(sys.argv[0])) + c = ask("Que voulez-vous faire ?", + [("S", "sélectionner les patchs à envoyer/ignorer en mode interactif", "select"), + ("e", "tout envoyer", "all"), + ("i", "tout ignorer", "none"), + Exit]) + patches = getnew(lastdate) + if c == "none": + if patches: + open(DATE_FILE, "w").write(patches[-1].split("-", 1)[0]) + patches = [] + else: + open(DATE_FILE, "w").write("19700101000000") + elif c == "select": + patches = select(patches) + except OSError, e: + if e.errno == 11: + # Quand c'est darcs qui lance la commande on ne pas lire + # l'entrée standart + print + cprint("Veuillez lancez %s à la main" % os.path.basename(sys.argv[0]), 'rouge') + sys.exit(1) + else: + raise e else: - patches = [] - ignore = [] - # Tri des patches - for patch in getnew(): - (status, changelog) = darcs_raw("changes --xml-output --match='hash %s'" % patch) - try: - prop = etree.XML(changelog)[0] - patches.append((int(prop.attrib['date']), prop.attrib['hash'])) - except: - ignore.append(patch) - addseen(ignore) - patches.sort() - patches = [x[1] for x in patches] + patches = getnew(lastdate) if interactive: - patches, _ = select(patches) + patches = select(patches) if len(patches) == 0: sys.exit(0) @@ -338,4 +330,4 @@ if __name__ == "__main__": if props: cprint("Envoi du patch %s a %s." % (props['hash'], ", ".join(recipient))) send_changes(smtplib.SMTP(smtp), recipient, props) - addseen([patch]) + open(DATE_FILE, "w").write(patch.split("-", 1)[0])