#!/usr/bin/env python
# Utility functions
-# Copyright (C) 2000, 2001, 2002, 2003 James Troup <james@nocrew.org>
-# $Id: utils.py,v 1.58 2003-09-07 13:54:20 troup Exp $
+# Copyright (C) 2000, 2001, 2002, 2003, 2004 James Troup <james@nocrew.org>
+# $Id: utils.py,v 1.65 2004-04-01 17:13:10 troup Exp $
################################################################################
changes_parse_error_exc = "Can't parse line in .changes file";
invalid_dsc_format_exc = "Invalid .dsc file";
nk_format_exc = "Unknown Format: in .changes file";
-no_files_exc = "No Files: field in .dsc file.";
+no_files_exc = "No Files: field in .dsc or .changes file.";
cant_open_exc = "Can't read file.";
unknown_hostname_exc = "Unknown hostname";
cant_overwrite_exc = "Permission denied; can't overwrite existent file."
if section.find('/') != -1:
component = section.split('/')[0];
- if component.lower() == "non-us" and section.count('/') > 0:
+ if component.lower() == "non-us" and section.find('/') != -1:
s = component + '/' + section.split('/')[1];
if Cnf.has_key("Component::%s" % s): # Avoid e.g. non-US/libs
component = s;
inside_signature = 0;
- indices = indexed_lines.keys()
+ num_of_lines = len(indexed_lines.keys());
index = 0;
first = -1;
- while index < max(indices):
+ while index < num_of_lines:
index += 1;
line = indexed_lines[index];
if line == "":
if dsc_whitespace_rules:
index += 1;
- if index > max(indices):
+ if index > num_of_lines:
raise invalid_dsc_format_exc, index;
line = indexed_lines[index];
if not line.startswith("-----BEGIN PGP SIGNATURE"):
if line.startswith("-----BEGIN PGP SIGNATURE"):
break;
if line.startswith("-----BEGIN PGP SIGNED MESSAGE"):
+ inside_signature = 1;
if dsc_whitespace_rules:
- inside_signature = 1;
- while index < max(indices) and line != "":
+ while index < num_of_lines and line != "":
index += 1;
line = indexed_lines[index];
continue;
+ # If we're not inside the signed data, don't process anything
+ if not inside_signature:
+ continue;
slf = re_single_line_field.match(line);
if slf:
field = slf.groups()[0].lower();
rfc822 = maintainer;
name = "";
email = "";
- if m != None and len(m.groups()) == 2:
+ if m and len(m.groups()) == 2:
name = m.group(1);
email = m.group(2);
if name.find(',') != -1 or name.find('.') != -1:
# Don't overwrite unless forced to
if os.path.exists(dest):
if not overwrite:
- raise file_exists_exc;
+ fubar("Can't move %s to %s - file already exists." % (src, dest));
else:
if not os.access(dest, os.W_OK):
- raise cant_overwrite_exc
+ fubar("Can't move %s to %s - can't write to existing file." % (src, dest));
shutil.copy2(src, dest);
os.chmod(dest, perms);
os.unlink(src);
################################################################################
+def temp_filename(directory=None, dotprefix=None, perms=0700):
+ """Return a secure and unique filename by pre-creating it.
+If 'directory' is non-null, it will be the directory the file is pre-created in.
+If 'dotprefix' is non-null, the filename will be prefixed with a '.'."""
+
+ if directory:
+ old_tempdir = tempfile.tempdir;
+ tempfile.tempdir = directory;
+
+ filename = tempfile.mktemp();
+
+ if dotprefix:
+ filename = "%s/.%s" % (os.path.dirname(filename), os.path.basename(filename));
+ fd = os.open(filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, perms);
+ os.close(fd);
+
+ if directory:
+ tempfile.tempdir = old_tempdir;
+
+ return filename;
+
+################################################################################
+
apt_pkg.init();
Cnf = apt_pkg.newConfiguration();