X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils.py;h=59df9f3c36164a066320857fb9ef6e315003c236;hb=6d72ae4bca15c0ed410798e62d3e367cf7abcdb6;hp=95a0882633dfb690d0f070cfa36102d5f91afcd6;hpb=9747704c3468d10a66a0bd20a489ee800815dacf;p=dak.git diff --git a/utils.py b/utils.py index 95a08826..59df9f3c 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,6 @@ # Utility functions -# Copyright (C) 2000 James Troup -# $Id: utils.py,v 1.23 2001-05-24 18:56:23 troup Exp $ +# Copyright (C) 2000, 2001 James Troup +# $Id: utils.py,v 1.30 2001-07-25 15:51:15 troup Exp $ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,10 +42,23 @@ no_files_exc = "No Files: field in .dsc file."; cant_open_exc = "Can't read file."; unknown_hostname_exc = "Unknown hostname"; cant_overwrite_exc = "Permission denied; can't overwrite existent file." - +file_exists_exc = "Destination file exists"; +send_mail_invalid_args_exc = "Both arguments are non-null."; +sendmail_failed_exc = "Sendmail invocation failed"; +tried_too_hard_exc = "Tried too hard to find a free filename."; + +# Valid components; used by extract_component_from_section() because +# it doesn't know about Conf from it's caller. FIXME + +valid_components = { + "main": "", + "contrib": "", + "non-free": "" + }; + ###################################################################################### -def open_file(filename, mode): +def open_file(filename, mode='r'): try: f = open(filename, mode); except IOError: @@ -74,7 +87,9 @@ def str_isnum (s): ###################################################################################### -# What a mess. FIXME +# Prefix and components hardcoded into this like a good'un; need to unhardcod at some +# stage. [FIXME] + def extract_component_from_section(section): component = ""; @@ -82,15 +97,23 @@ def extract_component_from_section(section): component = string.split(section, '/')[0]; if string.lower(component) == "non-us" and string.count(section, '/') > 0: s = string.split(section, '/')[1]; - if s == "main" or s == "non-free" or s == "contrib": # Avoid e.g. non-US/libs + if valid_components.has_key(s): # Avoid e.g. non-US/libs component = string.split(section, '/')[0]+ '/' + string.split(section, '/')[1]; if string.lower(section) == "non-us": component = "non-US/main"; - + + # non-US prefix is case insensitive + if string.lower(component)[:6] == "non-us": + component = "non-US"+component[6:]; + + # Expand default component if component == "": - component = "main"; - elif string.lower(component) == "non-us": + if valid_components.has_key(section): + component = section; + else: + component = "main"; + elif component == "non-US": component = "non-US/main"; return (section, component); @@ -193,7 +216,7 @@ def build_file_list(changes, dsc): if format != "": format = float(format) if dsc == "" and (format < 1.5 or format > 2.0): - raise nk_format_exc, changes["format"]; + raise nk_format_exc, format; # No really, this has happened. Think 0 length .dsc file. if not changes.has_key("files"): @@ -255,22 +278,23 @@ def send_mail (message, filename): # Sanity check arguments if message != "" and filename != "": - sys.stderr.write ("send_mail() can't be called with both arguments as non-null! (`%s' and `%s')\n%s" % (message, filename)) - sys.exit(1) + raise send_mail_invalid_args_exc; + # If we've been passed a string dump it into a temporary file if message != "": - filename = tempfile.mktemp() - fd = os.open(filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700) - os.write (fd, message) - os.close (fd) + filename = tempfile.mktemp(); + fd = os.open(filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700); + os.write (fd, message); + os.close (fd); + # Invoke sendmail - (result, output) = commands.getstatusoutput("%s < %s" % (sendmail_command, filename)) + (result, output) = commands.getstatusoutput("%s < %s" % (sendmail_command, filename)); if (result != 0): - sys.stderr.write ("Sendmail invocation (`%s') failed for `%s'!\n%s" % (sendmail_command, filename, output)) - sys.exit(result) + raise sendmail_failed_exc, output; + # Clean up any temporary files if message !="": - os.unlink (filename) + os.unlink (filename); ###################################################################################### @@ -287,7 +311,7 @@ def poolify (source, component): ###################################################################################### -def move (src, dest): +def move (src, dest, overwrite = 0): if os.path.exists(dest) and os.path.isdir(dest): dest_dir = dest; else: @@ -299,14 +323,18 @@ def move (src, dest): #print "Moving %s to %s..." % (src, dest); if os.path.exists(dest) and os.path.isdir(dest): dest = dest + '/' + os.path.basename(src); - # Check for overwrite permission on existent files - if os.path.exists(dest) and not os.access(dest, os.W_OK): - raise cant_overwrite_exc + # Don't overwrite unless forced to + if os.path.exists(dest): + if not overwrite: + raise file_exists_exc; + else: + if not os.access(dest, os.W_OK): + raise cant_overwrite_exc shutil.copy2(src, dest); os.chmod(dest, 0664); os.unlink(src); -def copy (src, dest): +def copy (src, dest, overwrite = 0): if os.path.exists(dest) and os.path.isdir(dest): dest_dir = dest; else: @@ -318,8 +346,13 @@ def copy (src, dest): #print "Copying %s to %s..." % (src, dest); if os.path.exists(dest) and os.path.isdir(dest): dest = dest + '/' + os.path.basename(src); - if os.path.exists(dest) and not os.access(dest, os.W_OK): - raise cant_overwrite_exc + # Don't overwrite unless forced to + if os.path.exists(dest): + if not overwrite: + raise file_exists_exc + else: + if not os.access(dest, os.W_OK): + raise cant_overwrite_exc shutil.copy2(src, dest); os.chmod(dest, 0664); @@ -423,12 +456,12 @@ def cc_fix_changes (changes): def changes_compare (a, b): try: a_changes = parse_changes(a, 0) - except changes_parse_error_exc, line: + except: return -1; try: b_changes = parse_changes(b, 0) - except changes_parse_error_exc, line: + except: return 1; cc_fix_changes (a_changes); @@ -464,3 +497,15 @@ def changes_compare (a, b): return cmp(a, b); ################################################################################ + +def find_next_free (dest, too_many=100): + extra = 0; + orig_dest = dest; + while os.path.exists(dest) and extra < too_many: + dest = orig_dest + '.' + repr(extra); + extra = extra + 1; + if extra >= too_many: + raise tried_too_hard_exc; + return dest; + +################################################################################