X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils.py;h=b2adbaa64ca5d72c659f6c5b4802510f0068a884;hb=2bed9bb874f5258e91ffe9c54241141daba0ee77;hp=97df03c06d818f32a878a187dfd8e8f1c3a2cb7e;hpb=9fa337542a3305a3e6efa863b92e8ff17677377b;p=dak.git diff --git a/utils.py b/utils.py index 97df03c0..b2adbaa6 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,6 @@ # Utility functions -# Copyright (C) 2000, 2001 James Troup -# $Id: utils.py,v 1.38 2002-02-12 23:15:23 troup Exp $ +# Copyright (C) 2000, 2001, 2002 James Troup +# $Id: utils.py,v 1.45 2002-05-19 00:47:27 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 @@ -57,21 +57,18 @@ def open_file(filename, mode='r'): raise cant_open_exc, filename return f -def touch_file(filename): - fd = os.open(filename, os.O_RDONLY | os.O_CREAT); - os.close(fd); - ###################################################################################### -# From reportbug -def our_raw_input(): - sys.stdout.flush() +def our_raw_input(prompt=""): + if prompt: + sys.stdout.write(prompt); + sys.stdout.flush(); try: - ret = raw_input() + ret = raw_input(); return ret except EOFError: - sys.stderr.write('\nUser interrupt (^D).\n') - raise SystemExit + sys.stderr.write('\nUser interrupt (^D).\n'); + raise SystemExit; ###################################################################################### @@ -126,7 +123,7 @@ def extract_component_from_section(section): # o The data section must end with a blank line and must be followed by # "-----BEGIN PGP SIGNATURE-----". -def parse_changes(filename, dsc_whitespace_rules): +def parse_changes(filename, dsc_whitespace_rules=0): changes_in = open_file(filename); error = ""; changes = {}; @@ -202,12 +199,12 @@ def parse_changes(filename, dsc_whitespace_rules): # Dropped support for 1.4 and ``buggy dchanges 3.4'' (?!) compared to di.pl -def build_file_list(changes, dsc): +def build_file_list(changes, is_a_dsc=0): files = {} format = changes.get("format", "") if format != "": format = float(format) - if dsc == "" and (format < 1.5 or format > 2.0): + if not is_a_dsc and (format < 1.5 or format > 2.0): raise nk_format_exc, format; # No really, this has happened. Think 0 length .dsc file. @@ -220,7 +217,7 @@ def build_file_list(changes, dsc): s = string.split(i) section = priority = ""; try: - if dsc != "": + if is_a_dsc: (md5, size, name) = s else: (md5, size, section, priority, name) = s @@ -300,7 +297,7 @@ def poolify (source, component): ###################################################################################### -def move (src, dest, overwrite = 0): +def move (src, dest, overwrite = 0, perms = 0664): if os.path.exists(dest) and os.path.isdir(dest): dest_dir = dest; else: @@ -320,10 +317,10 @@ def move (src, dest, overwrite = 0): if not os.access(dest, os.W_OK): raise cant_overwrite_exc shutil.copy2(src, dest); - os.chmod(dest, 0664); + os.chmod(dest, perms); os.unlink(src); -def copy (src, dest, overwrite = 0): +def copy (src, dest, overwrite = 0, perms = 0664): if os.path.exists(dest) and os.path.isdir(dest): dest_dir = dest; else: @@ -343,7 +340,7 @@ def copy (src, dest, overwrite = 0): if not os.access(dest, os.W_OK): raise cant_overwrite_exc shutil.copy2(src, dest); - os.chmod(dest, 0664); + os.chmod(dest, perms); ###################################################################################### @@ -382,10 +379,13 @@ def regex_safe (s): ###################################################################################### # Perform a substition of template -def TemplateSubst(Map,Template): - for x in Map.keys(): - Template = string.replace(Template,x,Map[x]); - return Template; +def TemplateSubst(map, filename): + file = open_file(filename); + template = file.read(); + for x in map.keys(): + template = string.replace(template,x,map[x]); + file.close(); + return template; ###################################################################################### @@ -425,33 +425,22 @@ def cc_fix_changes (changes): for j in string.split(o): changes["architecture"][j] = 1 -# Sort by 'have source', by source name, by source version number, by filename - +# Sort by source name, source version, 'have source', and then by filename def changes_compare (a, b): try: - a_changes = parse_changes(a, 0) + a_changes = parse_changes(a); except: return -1; try: - b_changes = parse_changes(b, 0) + b_changes = parse_changes(b); except: return 1; cc_fix_changes (a_changes); cc_fix_changes (b_changes); - # Sort by 'have source' - - a_has_source = a_changes["architecture"].get("source") - b_has_source = b_changes["architecture"].get("source") - if a_has_source and not b_has_source: - return -1; - elif b_has_source and not a_has_source: - return 1; - # Sort by source name - a_source = a_changes.get("source"); b_source = b_changes.get("source"); q = cmp (a_source, b_source); @@ -459,15 +448,21 @@ def changes_compare (a, b): return q; # Sort by source version - a_version = a_changes.get("version"); b_version = b_changes.get("version"); q = apt_pkg.VersionCompare(a_version, b_version); if q: - return q + return q; - # Fall back to sort by filename + # Sort by 'have source' + a_has_source = a_changes["architecture"].get("source"); + b_has_source = b_changes["architecture"].get("source"); + if a_has_source and not b_has_source: + return -1; + elif b_has_source and not a_has_source: + return 1; + # Fall back to sort by filename return cmp(a, b); ################################################################################ @@ -493,11 +488,44 @@ def result_join (original, sep = '\t'): list.append(original[i]); return string.join(list, sep); -def plural (x): - if x > 1: - return "s"; +################################################################################ + +def prefix_multi_line_string(str, prefix): + out = ""; + for line in string.split(str, '\n'): + line = string.strip(line); + if line: + out = out + "%s%s\n" % (prefix, line); + # Strip trailing new line + if out: + out = out[:-1]; + return out; + +################################################################################ + +def validate_changes_file_arg(file, fatal=1): + error = None; + + if file[-6:] == ".katie": + file = file[:-6]+".changes"; + + if file[-8:] != ".changes": + error = "invalid file type; not a changes file"; + else: + if not os.access(file,os.R_OK): + if os.path.exists(file): + error = "permission denied"; + else: + error = "file not found"; + + if error: + if fatal: + fubar("%s: %s." % (file, error)); + else: + warn("Skipping %s - %s" % (file, error)); + return None; else: - return ""; + return file; ################################################################################