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:
else: if os.access(DATE_FILE, os.R_OK):
seen=set([]) lastdate=file(DATE_FILE).read().strip()
return set(filter(lambda x: x.endswith(".gz"), os.listdir("_darcs/patches"))) - seen else:
lastdate='19700101000000'
def addseen(patches): files = os.listdir("_darcs/patches")
'''Ajoute des patches aux patches déjà vus''' patches = []
if not os.path.exists(CONF_PATH): for f in files:
p = "." if f.endswith(".gz"):
for comp in CONF_PATH.split('/'): date = f.split("-", 1)[0]
p = "%s/%s" % (p, comp) if date > lastdate:
if not os.path.exists(p): patches.append(f)
os.mkdir(p) patches.sort()
open(SEEN_FILE, "a+").writelines([patch + "\n" for patch in patches]) return 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)
[("YO", "oui"), if count:
("nq", "non", None, lambda: sys.exit(0))]) ask("%d patches à envoyer, accepter ?" % count,
for d in decided: [("YO", "oui"),
if d[0]: ("nq", "non", None, lambda: sys.exit(0))])
patches.append(d[1]) for d in decided:
else: if d[0]:
ignore.append(d[1]) patches.append(d[1])
return patches, ignore return patches
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,40 +291,37 @@ 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):
# Sélection du patch façon darcs try:
cprint(u"C'est la première fois que vous lancez %s dans ce dépôt." % os.path.basename(sys.argv[0])) # Sélection du patch façon darcs
c = ask("Que voulez-vous faire ?", cprint(u"C'est la première fois que vous lancez %s dans ce dépôt." % os.path.basename(sys.argv[0]))
[("S", "sélectionner les patchs à envoyer/ignorer en mode interactif", "select"), c = ask("Que voulez-vous faire ?",
("e", "tout envoyer", "all"), [("S", "sélectionner les patchs à envoyer/ignorer en mode interactif", "select"),
("i", "tout ignorer", "none"), ("e", "tout envoyer", "all"),
Exit]) ("i", "tout ignorer", "none"),
if c == "none": Exit])
addseen(getnew()) patches = getnew(lastdate)
sys.exit(0) if c == "none":
elif c == "all": if patches:
patches = getnew() open(DATE_FILE, "w").write(patches[-1].split("-", 1)[0])
elif c == "select": patches = []
# On récupère la liste des patches triés else:
patches = [x.attrib['hash'] for x in etree.XML(darcs_raw("changes --xml-output")[1])] open(DATE_FILE, "w").write("19700101000000")
patches, ignore = select(patches) elif c == "select":
addseen(ignore) 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: else:
patches = [] patches = getnew(lastdate)
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]
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])