Utilisation de la date pour trouver les nouveaux patches.

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
This commit is contained in:
Jeremie Dimino 2007-12-18 01:41:46 +01:00
parent a78d85cea1
commit 190a0512ab

View file

@ -45,7 +45,7 @@ from email.Utils import formatdate
from email import Encoders from email import Encoders
CONF_PATH = "_darcs/third-party/darcs-send-changes" 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" ID_FILE = CONF_PATH + "/id"
def to_utf8(str): def to_utf8(str):
@ -70,10 +70,6 @@ def darcs(args):
o = to_utf8(o) o = to_utf8(o)
return (s, 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): def get_patch_properties(hash):
""" Récupère les informations a propos d'un certain patch. """ """ Récupère les informations a propos d'un certain patch. """
if hash: if hash:
@ -108,16 +104,6 @@ def get_patch_properties(hash):
'diff': diff, 'diff': diff,
'changes': darcs("changes %s --summary" % match_cmd)[1] } '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): def send_changes(smtp, recipient, patch_props):
""" Formate et envoie un mail avec les modifications sur le dernier """ Formate et envoie un mail avec les modifications sur le dernier
patch appliqué au dépot. patch appliqué au dépot.
@ -157,7 +143,7 @@ contenir les variables suivantes:
mail['X-CVSinfo'] = "CRANS" mail['X-CVSinfo'] = "CRANS"
mail['X-DarcsInfo'] = "CRANS-%(id)s" % patch_props 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") texte.set_charset("UTF-8")
mail.attach(texte) mail.attach(texte)
@ -190,33 +176,35 @@ Les options disponibles sont:
-r, --repo <chemin> spécifie l'emplacement du dépôt -r, --repo <chemin> spécifie l'emplacement du dépôt
-f, --from <hash> hash du premier patch de la série a envoyer -f, --from <hash> hash du premier patch de la série a envoyer
-i, --interactive sélectionne les patches en mode interactif -i, --interactive sélectionne les patches en mode interactif
-d, --date <date> ne considérer que les patches depuis <date>,
qui doit être un préfixe d'un date
de la forme AAAAMMJJHHMMSS
Si aucun destinataire n'est donné, roots@crans.org est utilisé. Si aucun destinataire n'est donné, roots@crans.org est utilisé.
""" % { 'name': os.path.basename(sys.argv[0]) }) """ % { 'name': os.path.basename(sys.argv[0]) })
sys.exit(0) sys.exit(0)
def getnew(): def getnew(lastdate=None):
'''Renvoie les possibles nouveaux patches''' '''Renvoie les possibles nouveaux patches depuis lastdate,
if os.access(SEEN_FILE, os.R_OK): ou depuis la date retenue par le programme'''
seen=set(map(lambda x: x[0:-1], file(SEEN_FILE).readlines())) if not lastdate:
if os.access(DATE_FILE, os.R_OK):
lastdate=file(DATE_FILE).read().strip()
else: else:
seen=set([]) lastdate='19700101000000'
return set(filter(lambda x: x.endswith(".gz"), os.listdir("_darcs/patches"))) - seen files = os.listdir("_darcs/patches")
patches = []
def addseen(patches): for f in files:
'''Ajoute des patches aux patches déjà vus''' if f.endswith(".gz"):
if not os.path.exists(CONF_PATH): date = f.split("-", 1)[0]
p = "." if date > lastdate:
for comp in CONF_PATH.split('/'): patches.append(f)
p = "%s/%s" % (p, comp) patches.sort()
if not os.path.exists(p): return patches
os.mkdir(p)
open(SEEN_FILE, "a+").writelines([patch + "\n" for patch in patches])
def select(patches): def select(patches):
'''Sélection interactive de patches''' '''Sélection interactive de patches'''
decided = [] decided = []
ignore = []
while patches: while patches:
(status, changelog) = darcs("changes --match='hash %s'" % patches[-1]) (status, changelog) = darcs("changes --match='hash %s'" % patches[-1])
if status == 0: if status == 0:
@ -245,18 +233,16 @@ def select(patches):
elif c == "i": elif c == "i":
while patches: while patches:
decided.append((False, patches.pop())) decided.append((False, patches.pop()))
else:
ignore.append(patches.pop())
ask("%d patches à envoyer, accepter ?" % [x[0] for x in decided].count(True), count = [x[0] for x in decided].count(True)
if count:
ask("%d patches à envoyer, accepter ?" % count,
[("YO", "oui"), [("YO", "oui"),
("nq", "non", None, lambda: sys.exit(0))]) ("nq", "non", None, lambda: sys.exit(0))])
for d in decided: for d in decided:
if d[0]: if d[0]:
patches.append(d[1]) patches.append(d[1])
else: return patches
ignore.append(d[1])
return patches, ignore
if __name__ == "__main__": if __name__ == "__main__":
import smtplib, getopt import smtplib, getopt
@ -265,9 +251,12 @@ if __name__ == "__main__":
repo = None repo = None
from_hash = None from_hash = None
interactive = False interactive = False
lastdate = None
try: 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: except getopt.error, msg:
__usage(unicode(msg)) __usage(unicode(msg))
for opt, val in options: for opt, val in options:
@ -281,6 +270,12 @@ if __name__ == "__main__":
from_hash = val from_hash = val
elif opt in [ '-i', '--interactive' ]: elif opt in [ '-i', '--interactive' ]:
interactive = True 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: else:
__usage("option inconnue « %s »'" % opt) __usage("option inconnue « %s »'" % opt)
recipient = arg recipient = arg
@ -296,7 +291,8 @@ if __name__ == "__main__":
cprint("Pas de dépôt darcs trouvé") cprint("Pas de dépôt darcs trouvé")
sys.exit(1) sys.exit(1)
if not os.path.exists(SEEN_FILE): if not os.path.exists(DATE_FILE):
try:
# Sélection du patch façon darcs # 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])) 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 ?", c = ask("Que voulez-vous faire ?",
@ -304,32 +300,28 @@ if __name__ == "__main__":
("e", "tout envoyer", "all"), ("e", "tout envoyer", "all"),
("i", "tout ignorer", "none"), ("i", "tout ignorer", "none"),
Exit]) Exit])
patches = getnew(lastdate)
if c == "none": if c == "none":
addseen(getnew()) if patches:
sys.exit(0) open(DATE_FILE, "w").write(patches[-1].split("-", 1)[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)
else:
patches = [] patches = []
ignore = [] else:
# Tri des patches open(DATE_FILE, "w").write("19700101000000")
for patch in getnew(): elif c == "select":
(status, changelog) = darcs_raw("changes --xml-output --match='hash %s'" % patch) patches = select(patches)
try: except OSError, e:
prop = etree.XML(changelog)[0] if e.errno == 11:
patches.append((int(prop.attrib['date']), prop.attrib['hash'])) # Quand c'est darcs qui lance la commande on ne pas lire
except: # l'entrée standart
ignore.append(patch) print
addseen(ignore) cprint("Veuillez lancez %s à la main" % os.path.basename(sys.argv[0]), 'rouge')
patches.sort() sys.exit(1)
patches = [x[1] for x in patches] else:
raise e
else:
patches = getnew(lastdate)
if interactive: if interactive:
patches, _ = select(patches) patches = select(patches)
if len(patches) == 0: if len(patches) == 0:
sys.exit(0) sys.exit(0)
@ -338,4 +330,4 @@ if __name__ == "__main__":
if props: if props:
cprint("Envoi du patch %s a %s." % (props['hash'], ", ".join(recipient))) cprint("Envoi du patch %s a %s." % (props['hash'], ", ".join(recipient)))
send_changes(smtplib.SMTP(smtp), recipient, props) send_changes(smtplib.SMTP(smtp), recipient, props)
addseen([patch]) open(DATE_FILE, "w").write(patch.split("-", 1)[0])