X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fprocess_new.py;h=52e1f4e9780350d722e533a0a179b0f290a4c577;hb=35cd0972b5e14dc8727403e13fccd30776f3ae02;hp=02f1b8bcd7e73145e13ccf846c274e981fcdbb03;hpb=5060396984d61d74c89b73e30604f3fcb5978201;p=dak.git diff --git a/dak/process_new.py b/dak/process_new.py index 02f1b8bc..52e1f4e9 100755 --- a/dak/process_new.py +++ b/dak/process_new.py @@ -41,6 +41,8 @@ ################################################################################ +from __future__ import with_statement + import copy import errno import os @@ -48,6 +50,8 @@ import readline import stat import sys import time +import contextlib +import pwd import apt_pkg, apt_inst import examine_package from daklib import database @@ -55,7 +59,7 @@ from daklib import logging from daklib import queue from daklib import utils from daklib.regexes import re_no_epoch, re_default_answer, re_isanum -from daklib.dak_exceptions import CantOpenError +from daklib.dak_exceptions import CantOpenError, AlreadyLockedError # Globals Cnf = None #: Configuration, apt_pkg.Configuration @@ -699,7 +703,7 @@ def do_new(): edit_note(database.get_new_comments(changes.get("source", ""))) elif answer == 'P' and not Options["Trainee"]: prod_maintainer(database.get_new_comments(changes.get("source", ""))) - elif answer == 'R': + elif answer == 'R' and not Options["Trainee"]: confirm = utils.our_raw_input("Really clear note (y/N)? ").lower() if confirm == "y": database.delete_new_comments(changes.get("source"), changes.get("version")) @@ -834,6 +838,29 @@ def get_accept_lock(): else: raise + +@contextlib.contextmanager +def lock_package(package): + """ + Lock C{package} so that noone else jumps in processing it. + + @type package: string + @param package: source package name to lock + """ + + path = os.path.join(Cnf["Process-New::LockDir"], package) + try: + fd = os.open(path, os.O_CREAT | os.O_EXCL | os.O_RDONLY) + except OSError, e: + if e.errno == errno.EEXIST or e.errno == errno.EACCES: + user = pwd.getpwuid(os.stat(path)[stat.ST_UID])[4].split(',')[0].replace('.', '') + raise AlreadyLockedError, user + + try: + yield fd + finally: + os.unlink(path) + def move_to_dir (dest, perms=0660, changesperms=0664): utils.move (Upload.pkg.changes_file, dest, perms=changesperms) file_keys = Upload.pkg.files.keys() @@ -958,19 +985,23 @@ def do_pkg(changes_file): Upload.update_subst() files = Upload.pkg.files - if not recheck(): - return - - (new, byhand) = check_status(files) - if new or byhand: - if new: - do_new() - if byhand: - do_byhand() - (new, byhand) = check_status(files) - - if not new and not byhand: - do_accept() + try: + with lock_package(Upload.pkg.changes["source"]): + if not recheck(): + return + + (new, byhand) = check_status(files) + if new or byhand: + if new: + do_new() + if byhand: + do_byhand() + (new, byhand) = check_status(files) + + if not new and not byhand: + do_accept() + except AlreadyLockedError, e: + print "Seems to be locked by %s already, skipping..." % (e) ################################################################################