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:
parent
a78d85cea1
commit
190a0512ab
1 changed files with 71 additions and 79 deletions
|
@ -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])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue