Thread: [A-A-P-develop] [PATCH] Python 2.6 and 3.x compatibility
Brought to you by:
vimboss
From: Leandro L. <ll...@gm...> - 2009-04-06 14:45:47
|
Hi! Attached are 2 patches to make A-A-P Python 2.6 compatible and to improve Python 3.x compatibility (it's not yet Python 3.x compatible as the changes needed break backward compatibility). I guess backward compatibility should not be broken by these patches (at least for Python 2.x series), because I've done the patches with backward compatibility in mind, but I'm not sure (specially for the "in" operator). Using A-A-P with Python 2.6 passes all the tests. Adding support for Python 3.x is backward incompatible, so I guess a new branch should be done to tackle that. If there are interest in this, I could provide patches for this too. |
From: Leandro L. <ll...@gm...> - 2009-04-06 14:45:47
|
From: Leandro Lucarella <llu...@in...> --- Filetype.py | 16 ++++++++-------- Sign.py | 11 ++++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Filetype.py b/Filetype.py index 74765e1..9f61730 100755 --- a/Filetype.py +++ b/Filetype.py @@ -1414,12 +1414,12 @@ def ft_add_rules(dtstr, recipe_line_nr, recdict = None): rline = items[1] rline_len = len(rline) # isolate first argument, which may be in quotes - as = 0 - if as < rline_len: - if rline[as] == '"' or rline[as] == "'": - quote = rline[as] - as = as + 1 - ae = as + as_ = 0 + if as_ < rline_len: + if rline[as_] == '"' or rline[as_] == "'": + quote = rline[as_] + as_ = as_ + 1 + ae = as_ while ae < rline_len and rline[ae] != quote: ae = ae + 1 if ae == rline_len: @@ -1427,11 +1427,11 @@ def ft_add_rules(dtstr, recipe_line_nr, recdict = None): % (line_idx + recipe_line_nr, line)) n = ae + 1 else: - ae = as + ae = as_ while ae < rline_len and rline[ae] != ' ' and rline[ae] != '\t': ae = ae + 1 n = ae - arg1 = rline[as:ae] + arg1 = rline[as_:ae] else: arg1 = '' n = rline_len diff --git a/Sign.py b/Sign.py index 171b3ab..378e236 100644 --- a/Sign.py +++ b/Sign.py @@ -11,7 +11,12 @@ import os import os.path import string -import md5 +try: + import hashlib +except ImportError: # Backward compatilibity + import md5 + class hashlib: + md5 = md5.new import time from Util import * @@ -272,7 +277,7 @@ def check_md5(recdict, fname, msg = 1): try: f = open(fname, "rb") - m = md5.new() + m = hashlib.md5() while 1: # Read big blocks at a time for speed, but don't read the whole # file at once to reduce memory usage. @@ -404,7 +409,7 @@ def check_c_md5(recdict, fname): def buildcheckstr2sign(str): """Compute a signature from a string for the buildcheck.""" - return hexdigest(md5.new(str)) + return hexdigest(hashlib.md5(str)) def _sign_lookup(signatures, name, key): -- 1.6.2.1 |
From: Leandro L. <ll...@gm...> - 2009-04-06 14:45:56
|
From: Leandro Lucarella <llu...@in...> This patch changes 2 things: 1) Try to use html or HTMLParser module first, then use htmllib module 2) Use the "in" operator instead of the "has_key()" method --- Action.py | 34 +++++++++++++++++----------------- Args.py | 2 +- Cache.py | 10 +++++----- Commands.py | 46 +++++++++++++++++++++++----------------------- CopyMove.py | 2 +- DoArgs.py | 12 ++++++------ DoBuild.py | 26 +++++++++++++------------- DoRead.py | 2 +- Filetype.py | 14 +++++++------- Node.py | 12 ++++++------ Port.py | 14 +++++++------- RecPython.py | 40 +++++++++++++++++++++++++++------------- Remote.py | 6 +++--- Rule.py | 4 ++-- Scope.py | 54 +++++++++++++++++++++++++++--------------------------- Sign.py | 38 +++++++++++++++++++------------------- Util.py | 14 +++++++------- VersCont.py | 12 ++++++------ VersContCvs.py | 8 ++++---- Work.py | 18 +++++++++--------- aap | 2 +- import_re.py | 2 +- 22 files changed, 193 insertions(+), 179 deletions(-) diff --git a/Action.py b/Action.py index 94191f8..179be4b 100644 --- a/Action.py +++ b/Action.py @@ -134,7 +134,7 @@ def action_add_to_dict(action, act): Add action object "act" to the dictionary of actions. """ global _action_dict - if not _action_dict.has_key(action): + if not action in _action_dict: _action_dict[action] = [] _action_dict[action].append(act) @@ -215,7 +215,7 @@ def get_ftypes(action, in_types, intype = None, outtype = None): If "outtype" given this output type must be supported. """ retval = [] - if _action_dict.has_key(action): + if action in _action_dict: for act in _action_dict[action]: if in_types: l = act.get_in_types(outtype = outtype) @@ -245,7 +245,7 @@ def action_get_list(): retval[action] = {} for act in _action_dict[action]: for intype in act.get_in_types(): - if not retval[action].has_key(intype): + if intype not in retval[action]: retval[action][intype] = {} for outtype in act.get_out_types(): retval[action][intype][outtype] = act @@ -258,18 +258,18 @@ def action_ftype(recdict, action, dict): Decide what filetype to use for "action" for the file specified with dictionary "dict". """ - if dict.has_key("filetype"): + if "filetype" in dict: return dict["filetype"] from Work import getwork fname = dict["name"] node = getwork(recdict).find_node(fname) - if node and node.attributes.has_key("filetype"): + if node and "filetype" in node.attributes: return node.attributes["filetype"] # A ":program", ":produce" etc. adds a "filetypehint" attribute that has a # lower priority than a "filetype" attribute the user specifies. - if dict.has_key("filetypehint"): + if "filetypehint" in dict: return dict["filetypehint"] # For viewing a remote file the filetype doesn't really matter, need to @@ -290,7 +290,7 @@ def has_action(recdict, action, dict): Return non-zero if "action" is defined for the file specified with "dict". Does not use the default. """ - if not _action_dict.has_key(action): + if action not in _action_dict: return 0 intype = action_ftype(recdict, action, dict) for act in _action_dict[action]: @@ -301,7 +301,7 @@ def has_action(recdict, action, dict): def find_depend_action(ftype): """Find the depend action for a source file with type "ftype".""" - if not _action_dict.has_key("depend"): + if not "depend" in _action_dict: return None found_act = None @@ -433,7 +433,7 @@ def action_run(recdict, args): When the "filetype" attribute isn't specified, detect it from args[1]. Returns None for success, an error message for failure.""" action = args[0]["name"] - if not _action_dict.has_key(action): + if action not in _action_dict: return _("Unknown action: %s") % action in_ftype = action_ftype(recdict, action, args[1]) @@ -445,9 +445,9 @@ def action_run(recdict, args): out_ftype = args[0].get("filetype") if not out_ftype: - if args[0].has_key("target"): + if "target" in args[0]: t = args[0]["target"] - elif recdict.has_key("target"): + elif "target" in recdict: t = recdict["target"] else: t = None @@ -515,7 +515,7 @@ def action_run(recdict, args): get_vars_from_attr(s, new_recdict) # Also use "var_" and "add_" attributes from the target. - if new_recdict.has_key("target"): + if "target" in new_recdict: for d in str2dictlist([], new_recdict["target"]): get_vars_from_attr(d, new_recdict) @@ -564,13 +564,13 @@ def action_expand_do(recdict, commands, targetlist, sourcelist): # The action is the first argument. action = args[0]["name"] - if _action_dict.has_key(action): + if action in _action_dict: # Guess the input filetype to be used: # 1. an explicitly defined filetype after the action. # 2. if the first filename doesn't contain a $, get the # filetype from it. # 3. use the filetype from the first source item - if args[1].has_key("filetype"): + if "filetype" in args[1]: in_ftype = args[1]["filetype"] elif not '$' in args[1]["name"]: in_ftype = action_ftype(recdict, action, args[1]) @@ -594,12 +594,12 @@ def action_expand_do(recdict, commands, targetlist, sourcelist): args[0]["target"], Expand(1, Expand.quote_aap)))[0] except: target = targetlist[0] - if recdict.has_key("target"): + if "target" in recdict: if tt is None: del recdict["target"] else: recdict["target"] = tt - if target.has_key("filetype"): + if "filetype" in target: out_ftype = target["filetype"] elif not '$' in target["name"]: out_ftype = action_ftype(recdict, action, target) @@ -622,7 +622,7 @@ def action_expand_do(recdict, commands, targetlist, sourcelist): cmd = act.commands # Check if this action isn't used recursively. key = action + '@' + in_ftype + '@' + out_ftype - if (exp_action_end.has_key(key) + if (key in exp_action_end and exp_action_end[key] > do): # :do command starts before expanded commands. act = None diff --git a/Args.py b/Args.py index 5c79cd3..4db8e76 100644 --- a/Args.py +++ b/Args.py @@ -28,7 +28,7 @@ class Args: self.targets = [] def has_option(self, name): - return self.options.has_key(name) + return name in self.options def printit(self): """print the contents of the attributes (for debugging)""" diff --git a/Cache.py b/Cache.py index f603b57..fe50eab 100644 --- a/Cache.py +++ b/Cache.py @@ -111,7 +111,7 @@ def cache_read(recdict, fname, rcache, lock): except: # Some error in this line, skip it. continue - if rcache.has_key(url): + if url in rcache: # URL already exists. Only use new entry when it's newer. rc = rcache[url] if rtime > rc.rtime or ltime > rc.ltime: @@ -142,7 +142,7 @@ def index_write_newest(recdict, fname, f, use_cache, check_cache): # it does have an entry which is not written but our entry is # newer. else: - if check_cache.has_key(url) and not check_cache[url].gone: + if url in check_cache and not check_cache[url].gone: ck = check_cache[url] else: ck = None @@ -324,13 +324,13 @@ def fill_cache(recdict): # $CACHEPATH and the current directory. Avoids expanding items in # $CACHEPATH to absolute paths each time. check = get_var_val_int(recdict, "CACHEPATH") + '>' + os.getcwd() - if not cache_val_read.has_key(check): + if check not in cache_val_read: cache_val_read[check] = 1 # Read the cache index files for all entries in $CACHEPATH for n in cache_dirlist(recdict): index = os.path.join(os.path.abspath(n), index_fname) - if not cache_indexes.has_key(index): + if index not in cache_indexes: cache_read(recdict, index, cache, 1) @@ -347,7 +347,7 @@ def dump_cache(recdict): def cache_lookup(recdict, name, cache_update_str = None): """Lookup URL "name" in the cache. Return the Cache object if found.""" - if cache.has_key(name): + if name in cache: ent = cache[name] # if the entry was updated this session, it's always accepted. diff --git a/Commands.py b/Commands.py index cc4612a..74a10d2 100644 --- a/Commands.py +++ b/Commands.py @@ -58,7 +58,7 @@ def get_args(line_nr, recdict, arg, options = None, exp_attr = 1): # Move options from attrdict to optiondict. Translate aliases. if options: for k in attrdict.keys(): - if options.has_key(k): + if k in options: optiondict[options[k]] = attrdict[k] del attrdict[k] @@ -349,10 +349,10 @@ def aap_program(line_nr, recdict, arg, type = "program"): varname = ba[4:] for source in sourcelist: # Source-level var_ attributes take precedence - if source.has_key("var_"+varname): + if "var_"+varname in source: continue # Prepend build attribute - if source.has_key("add_"+varname): + if "add_"+varname in source: if ba.startswith("add_"): source[ba] = value + " " + source[ba] else: @@ -362,7 +362,7 @@ def aap_program(line_nr, recdict, arg, type = "program"): source[ba] = value else: for source in sourcelist: - if not source.has_key(ba): + if ba not in source: source[ba] = value # ":produce abc" needs to declare "abc" as a filetype. @@ -450,7 +450,7 @@ def aap_lib(line_nr, recdict, arg): def aap_ltlib(line_nr, recdict, arg): """Add a libtool library built from sources.""" # We automatically import the libtool module. - if not getwork(recdict).module_already_read.has_key("libtool"): + if "libtool" not in getwork(recdict).module_already_read: aap_import(line_nr, recdict, "libtool") aap_program(line_nr, recdict, arg, type = "ltlib") @@ -1114,7 +1114,7 @@ def aap_syseval(line_nr, recdict, raw_arg, pipein = None): cmd = cmd + (' < %s' % tmpin) tmpout = tempfname() - if attrdict.has_key("stderr"): + if "stderr" in attrdict: cmd = cmd + ' 2>&1' cmd = cmd + (' > %s' % tmpout) @@ -1258,7 +1258,7 @@ def aap_child_and_exe(line_nr, recdict, arg, child): force_fetch = Global.cmd_args.has_option("fetch-recipe") if ((force_fetch or not os.path.exists(name)) - and varlist[0].has_key("fetch")): + and "fetch" in varlist[0]): # Need to create a node to fetch it. # Ignore errors, a check for existence is below. # Use a cached file when no forced fetch. @@ -1267,7 +1267,7 @@ def aap_child_and_exe(line_nr, recdict, arg, child): fetch_nodelist(rpstack, recdict, [ node ], not force_fetch) if not os.path.exists(name): - if varlist[0].has_key("fetch"): + if "fetch" in varlist[0]: recipe_error(rpstack, _('Cannot download recipe "%s"') % name) else: recipe_error(rpstack, _('Recipe "%s" does not exist') % name) @@ -1483,7 +1483,7 @@ def aap_assign(line_nr, recdict, name, arg, dollar, extra): rd, scope, varname = get_scope_recdict(rpstack, recdict, name, 1) # Skip the whole assignment for "var ?= val" if var was already set. - if extra != '?' or not rd.has_key(varname): + if extra != '?' or varname not in rd: if dollar != '$': # Expand variables in "arg". val = expand(line_nr, recdict, arg, Expand(1, Expand.quote_aap)) @@ -1491,7 +1491,7 @@ def aap_assign(line_nr, recdict, name, arg, dollar, extra): val = arg import types - if rd.has_key(varname): + if varname in rd: v = rd.get(varname) from Scope import RecipeDict if isinstance(v, types.DictType) or isinstance(v, RecipeDict): @@ -1889,7 +1889,7 @@ def aap_shell(line_nr, recdict, cmds, async = -1): cmd = expand(line_nr, recdict, cmds, Expand(0, Expand.quote_shell)) - if recdict.has_key("target"): + if "target" in recdict: msg_extra(recdict, _('Shell commands for updating "%s":') % recdict["target"]) @@ -1933,7 +1933,7 @@ def aap_sysdepend(line_nr, recdict, arg): cmd = expand(line_nr, recdict, arg[i:], Expand(0, Expand.quote_shell)) from RecPython import redir_system - if attrdict.has_key("srcpath"): + if "srcpath" in attrdict: # Use the specified search path. searchpath = attrdict.get("srcpath") else: @@ -2495,11 +2495,11 @@ def aap_include(line_nr, recdict, arg): # Fetch the recipe when invoked with the "-R" argument. if ((Global.cmd_args.has_option("fetch-recipe") or not os.path.exists(recname)) - and args[0].has_key("fetch")): + and "fetch" in args[0]): # Use the original recipe name, without the directory of "-I dir" added. fetchname = args[0]["name"] fullname = full_fname(fetchname) - if not recipe_fetched.has_key(fullname): + if fullname not in recipe_fetched: from VersCont import fetch_nodelist # Create a node for the recipe and fetch it. @@ -2539,7 +2539,7 @@ def aap_import(line_nr, recdict, arg): name = args[0]["name"] # Import only imports a given module once. - if work.module_already_read.has_key(name): + if name in work.module_already_read: msg_extra(recdict, _('Skipping module already imported: %s"') % name) return work.module_already_read[name] = 1 @@ -2638,7 +2638,7 @@ def maydo_recipe_cmd(rpstack): # Skip when this recipe was already updated. recname = full_fname(rpstack[-1].name) - if recipe_fetched.has_key(recname): + if recname in recipe_fetched: return 0 return 1 @@ -2663,7 +2663,7 @@ def aap_recipe(line_nr, recdict, arg): msg_info(recdict, _('Updating recipe "%s"') % short_name) orgdict, i = get_attrdict(rpstack, recdict, arg, 0, 1) - if not orgdict.has_key("fetch"): + if "fetch" not in orgdict: recipe_error(rpstack, _(":recipe requires a fetch attribute")) # TODO: warning for trailing characters? @@ -2679,7 +2679,7 @@ def aap_recipe(line_nr, recdict, arg): # recipe. start_recdict = recdict["_start_recdict"] for k in recdict.keys(): - if not start_recdict.has_key(k): + if k not in start_recdict: del recdict[k] for k in start_recdict.keys(): recdict[k] = start_recdict[k] @@ -2816,8 +2816,8 @@ def do_fetch_all(rpstack, recdict, attrdict): # - it has an "fetch" attribute # - the node doesn't exist yet # - it does exist and the "constant" attribute isn't set - if ((node.attributes.has_key("fetch") - or node.attributes.has_key("commit")) + if (("fetch" in node.attributes + or "commit" in node.attributes) and node.may_fetch()): node.set_attributes(attrdict) nodelist.append(node) @@ -2849,8 +2849,8 @@ def do_verscont_all(rpstack, recdict, action, attrdict): # Loop over all nodes. nodelist = [] for node in work.nodes.values(): - if (node.attributes.has_key("commit") - and (action != "add" or node.attributes.has_key("tag"))): + if ("commit" in node.attributes + and (action != "add" or "tag" in node.attributes)): node.set_attributes(attrdict) nodelist.append(node) @@ -2929,7 +2929,7 @@ def do_publish_all(rpstack, recdict, attrdict): # Loop over all nodes. nodelist = [] for node in work.nodes.values(): - if node.attributes.has_key("publish"): + if "publish" in node.attributes: node.set_attributes(attrdict) nodelist.append(node) diff --git a/CopyMove.py b/CopyMove.py index 51bec19..49a8744 100644 --- a/CopyMove.py +++ b/CopyMove.py @@ -501,7 +501,7 @@ def remote_copy_move(rpstack, recdict, copy, from_items, to_item, if flist: # Remove the "keepdir" attribute, the directory # name is already in "destpath" now. - if optiondict.has_key("keepdir"): + if "keepdir" in optiondict: opt = optiondict.copy() del opt["keepdir"] else: diff --git a/DoArgs.py b/DoArgs.py index fca2d2d..8918e03 100644 --- a/DoArgs.py +++ b/DoArgs.py @@ -371,7 +371,7 @@ def doargs(argv): if not arg: arg = 1 if o.append: - if args.options.has_key(o.name): + if o.name in args.options: args.options[o.name].append(arg) else: args.options[o.name] = [ arg ] @@ -379,7 +379,7 @@ def doargs(argv): args.options[o.name] = arg # Did we encounter "--"? - if not args.options.has_key("end"): + if "end" not in args.options: n = len(prev_argv) - len(argv) if n > 0 and prev_argv[n - 1] == "--": args.options["end"] = 1 @@ -392,7 +392,7 @@ def doargs(argv): while argv: if argv[0] == '-': raise UserError, _("Invalid argument: - (reading from stdin not implemented yet)") - elif argv[0][0] == '-' and not args.options.has_key("end"): + elif argv[0][0] == '-' and "end" not in args.options: break elif '=' in argv[0]: name, value = string.split(argv[0], '=', 1) @@ -401,7 +401,7 @@ def doargs(argv): args.targets.append(argv[0]) # Using a "refresh", "fetch" or "update" target implies the # --fetch-recipe option, unless --nofetch-recipe was used. - if (not args.options.has_key("nofetch-recipe") + if ("nofetch-recipe" not in args.options and (argv[0] == "refresh" or argv[0] == "fetch" or argv[0] == "update")): @@ -414,7 +414,7 @@ def doargs(argv): def local_arg(): """Return non-zero if the "-l" or "--local" argument was given. zero string otherwise.""" - if Global.cmd_args.options.has_key("local"): + if "local" in Global.cmd_args.options: return 1 return 0 @@ -456,7 +456,7 @@ def copy_global_options(cmd_args_from, cmd_args_to): "verbose", ] for k in cmd_args_from.options.keys(): - if k in global_options and not cmd_args_to.options.has_key(k): + if k in global_options and k not in cmd_args_to.options: cmd_args_to.options[k] = cmd_args_from.options[k] # vim: set sw=4 et sts=4 tw=79 fo+=l: diff --git a/DoBuild.py b/DoBuild.py index 534f48e..4ec5aa7 100644 --- a/DoBuild.py +++ b/DoBuild.py @@ -273,7 +273,7 @@ def autodep_update(work, recdict, scope_recdict, src_dict, # If "target" starts with (part of) $BDIR set the depdir attribute # to use it for the auto-dependency file. Useful if some variant # isn't used for the directory. - if not node.attributes.has_key("depdir"): + if "depdir" not in node.attributes: bdir = locate_bdir(target.get_name(), remove = 0) if bdir: node.attributes["depdir"] = bdir @@ -327,7 +327,7 @@ def expand_srcpath(recdict, isabs, name, dict): The "srcpath" attribute in "dict" overrules $SRCPATH. """ if not isabs: - if dict.has_key("srcpath"): + if "srcpath" in dict: from Dictlist import str2dictlist srcpath = str2dictlist([], dict["srcpath"]) else: @@ -427,7 +427,7 @@ def dictlist_update(dictlist, work, recdict, scope_recdict, # However, need to add the directory for a child recipe. src = src_dict["name"] src_isabs = os.path.isabs(src) - if not src_isabs and src_dict.has_key("_node"): + if not src_isabs and "_node" in src_dict: src = src_dict["_node"].short_name() names = expand_srcpath(recdict, @@ -496,7 +496,7 @@ def check_need_update(recdict, update, src_dict, target, rootname = None): # to be able to remember them). if target.status != Node.builderror and not update.outdated(target): virtual = 0 - if src_dict.has_key("_node"): + if "_node" in src_dict: node = src_dict["_node"] src_name = node.get_name() virtual = node.attributes.get("virtual") @@ -514,7 +514,7 @@ def check_need_update(recdict, update, src_dict, target, rootname = None): update.source = src_name else: alt_dict = None - if src_dict.has_key("_node"): + if "_node" in src_dict: alt_dict = src_dict["_node"].attributes check = check_name(recdict, src_name, src_dict, alt_dict) if check == "newer": @@ -628,12 +628,12 @@ def buildcheck_update(recdict, checkstring, dep, target, update, level): commands, xp, skip_errors = 1) check_str = expand(line_nr, recdict, checkstring, xp, skip_errors = 1) del recdict["commands"] - if recdict.has_key("xcommands"): + if "xcommands" in recdict: del recdict["xcommands"] for k in saved + save_attr.keys(): if save[k] is None: - if recdict.has_key(k): + if k in recdict: del recdict[k] else: recdict[k] = save[k] @@ -993,7 +993,7 @@ def target_update(work, recdict, target, toplevel = 0, force = 0, level = None): # If the target doesn't exist and has the "fetch" attribute, try # fetching it. This may use a cached file. if (not os.path.exists(target_name) - and target.attributes.has_key("fetch")): + and "fetch" in target.attributes): fetch_nodelist(target.rpstack(), recdict, [ target ], 1) if target.attributes.get("virtual"): msg_depend(recdict, @@ -1143,7 +1143,7 @@ def target_update(work, recdict, target, toplevel = 0, force = 0, level = None): # restore "virtual" attribute if save_virtual is None: - if target.attributes.has_key("virtual"): + if "virtual" in target.attributes: del target.attributes["virtual"] else: target.attributes["virtual"] = save_virtual @@ -1164,7 +1164,7 @@ def dictlist2depnodelist(work, dictlist): nl = [] for item in dictlist: # for a dependency we know the node, need to find it for a rule - if item.has_key("_node"): + if "_node" in item: n = item["_node"] else: n = work.get_node(item["name"], 1) @@ -1219,7 +1219,7 @@ def may_exec_depend(recdict, dep, update, target, src_list_list, level, # If a "buildcheck" attribute is defined for the build commands, check # if it has changed. Otherwise check if the build commands changed. - if dep.build_attr.has_key("buildcheck"): + if "buildcheck" in dep.build_attr: buildcheck = dep.build_attr["buildcheck"] else: buildcheck = "$xcommands" @@ -1292,7 +1292,7 @@ def may_exec_depend(recdict, dep, update, target, src_list_list, level, # executed at all. for trg in dep.targetlist: # Can there be a target without a node??? - if not trg.has_key("_node"): + if "_node" not in trg: continue node = trg["_node"] # Skip standard virtual targets, they are always rebuild @@ -1419,7 +1419,7 @@ def build_autodepend(work, recdict, stype, source, source_dict, level): # If the autodepend used the {recursive} attribute, need to carry this over # to the source node. - if action.attributes.has_key("recursive"): + if "recursive" in action.attributes: source.autodep_recursive = action.attributes["recursive"] else: source.autodep_recursive = 0 diff --git a/DoRead.py b/DoRead.py index d5c5925..03e00e1 100644 --- a/DoRead.py +++ b/DoRead.py @@ -61,7 +61,7 @@ def read_recipe(rpstack, recdict, sname, toplevel, optional = 0, reread = 0): ":include" command inside build commands. """ name = full_fname(sname) - if not reread and recipe_active.has_key(name): + if not reread and name in recipe_active: msg_warning(recdict, _('Skipping recipe already being read: "%s"') % sname) else: diff --git a/Filetype.py b/Filetype.py index 9f61730..c39f7f6 100755 --- a/Filetype.py +++ b/Filetype.py @@ -1337,7 +1337,7 @@ class DetectError(Exception): def ft_known(type): """Return True when "type" is a known filetype.""" __init__() - return _filetype_dict.has_key(type) + return type in _filetype_dict def ft_declare(type): """Delcare "type" to be a known filetype.""" @@ -1568,7 +1568,7 @@ def _add_suffix(suf, type): detection done on the rest. When "type" is "remove" an existing detection for "suf" is removed.""" if type == 'remove': - if _suffix_dict.has_key(suf): + if suf in _suffix_dict: del _suffix_dict[suf] else: _suffix_dict[suf] = type @@ -1667,7 +1667,7 @@ def _exec_py(fname, item, ignore): exec_recdict["fname_base"] = os.path.basename(fname) exec_recdict["ft_detect"] = ft_detect exec_recdict["ignore"] = ignore - if exec_recdict.has_key("type"): + if "type" in exec_recdict: del exec_recdict["type"] item.compile() @@ -1678,7 +1678,7 @@ def _exec_py(fname, item, ignore): except StandardError, e: raise DetectError, _(item.error_msg) + str(e) - if exec_recdict.has_key("type"): + if "type" in exec_recdict: return exec_recdict["type"] return None @@ -1687,7 +1687,7 @@ def ft_detect(fname, ignore = 0, recdict = None): """Detect the file type for file "fname". Returns the type as a string or None.""" # return quickly when already detected before - if _cache_dict[ignore].has_key(fname): + if fname in _cache_dict[ignore]: return _cache_dict[ignore][fname] if os.path.isdir(fname): @@ -1724,7 +1724,7 @@ def ft_detect(fname, ignore = 0, recdict = None): i = string.find(bn, ".") while i > 0 and i + 1 < len(bn): # Found a dot that's not the first or last character. - if _suffix_dict.has_key(bn[i + 1:]): + if bn[i + 1:] in _suffix_dict: ft = _suffix_dict[bn[i + 1:]] if ft == "ignore" and ignore: # remove an ignored extension and detect with that @@ -1846,7 +1846,7 @@ if __name__ == '__main__': # Check specified directories for *.afd files and read specified files. for item in items: - if item.has_key("dir"): + if "dir" in item: ft_check_dir(item["dir"]) else: try: diff --git a/Node.py b/Node.py index f16f17a..64ab49c 100644 --- a/Node.py +++ b/Node.py @@ -184,10 +184,10 @@ class Node: def get_sign_fname(self): """Get the file name to use for the signatures of this node. When using a directory, append "sign_fname".""" - if self.attributes.has_key("signfile"): + if "signfile" in self.attributes: return os.path.abspath(os.path.expanduser( self.attributes["signfile"])) - if self.attributes.has_key("signdirectory"): + if "signdirectory" in self.attributes: adir = os.path.abspath(os.path.expanduser( self.attributes["signdirectory"])) elif self.name_relative and not self.attributes.get("virtual"): @@ -238,7 +238,7 @@ class Node: """Set attributes for a node from "dictlist". Skip "name" and items that start with an underscore.""" for k in dictlist.keys(): - if k == "virtual" and self.attributes.has_key(k): + if k == "virtual" and k in self.attributes: # The "virtual" attribute is never reset self.attributes[k] = (self.attributes[k] or dictlist[k]) elif k != "name" and k[0] != '_': @@ -251,12 +251,12 @@ class Node: for attr in ["virtual", "remember", "directory", "filetype", "force", "constant", "fetch", "commit", "publish", "signfile", "depdir"]: - if dictlist.has_key(attr) and dictlist[attr]: + if attr in dictlist and dictlist[attr]: self.attributes[attr] = dictlist[attr] def get_cache_update(self): """Get the cache_update attribute. Return None if it's not set.""" - if self.attributes.has_key("cache_update"): + if "cache_update" in self.attributes: return self.attributes["cache_update"] return None @@ -265,7 +265,7 @@ class Node: specified with set_attributes() return the value used (mode value for creation).""" # A specified attribute overrules everything - if self.attributes.has_key("directory"): + if "directory" in self.attributes: return self.attributes["directory"] # A virtual target can't be a directory if self.attributes.get("virtual"): diff --git a/Port.py b/Port.py index b96b2a4..55c0e40 100644 --- a/Port.py +++ b/Port.py @@ -140,7 +140,7 @@ def add_port_defaults(work): for name in ["PORTVERSION", "PORTCOMMENT", "PORTDESCR"]: if not get_var_val_int(work.recdict, name): - if work.recdict["_no"].has_key(name): + if name in work.recdict["_no"]: recipe_error([], _('Empty variable "%s"') % name) else: recipe_error([], _('Missing variable "%s"') % name) @@ -722,7 +722,7 @@ def port_fetch(recdict): # Get each module from CVS. for f in modules: - if f.has_key("cvsroot"): + if "cvsroot" in f: root = f["cvsroot"] else: root = cvsroot @@ -770,7 +770,7 @@ def port_fetch(recdict): # Let the "distdir" attribute overrule the default directory. fn = os.path.basename(f["name"]) - if f.has_key("distdir"): + if "distdir" in f: fname = os.path.join(f["distdir"], fn) else: fname = os.path.join(destdir, fn) @@ -786,7 +786,7 @@ def port_fetch(recdict): # Make the fetch attribute include the full path of the file to # download. n = work.get_node(fname, 0, f) - if f.has_key("fetch"): + if "fetch" in f: rf = f["fetch"] else: rf = master_fetch @@ -836,7 +836,7 @@ def port_extract(recdict): distdir = os.path.abspath(get_var_val_int(recdict, "DISTDIR")) for x in archlist: fn = os.path.basename(x["name"]) - if x.has_key("distdir"): + if "distdir" in x: x["name"] = os.path.abspath(os.path.join(x["distdir"], fn)) else: x["name"] = os.path.join(distdir, fn) @@ -848,7 +848,7 @@ def port_extract(recdict): for f in archlist: # change to "extractdir" # Make path absolute now, before changing directories. - if f.has_key("extractdir"): + if "extractdir" in f: adir = os.path.join(wrkdir, f["extractdir"]) else: adir = wrkdir @@ -879,7 +879,7 @@ def port_patch(recdict): patchdistdir = os.path.abspath(get_var_val_int(recdict, "PATCHDISTDIR")) for x in patchlist: fn = os.path.basename(x["name"]) - if x.has_key("distdir"): + if "distdir" in x: x["name"] = os.path.abspath(os.path.join(x["distdir"], fn)) else: x["name"] = os.path.join(patchdistdir, fn) diff --git a/RecPython.py b/RecPython.py index 39170b4..8531733 100644 --- a/RecPython.py +++ b/RecPython.py @@ -188,7 +188,7 @@ def childdir(arg): recipe. """ recdict = Global.globals - if not recdict.has_key("CHILDDIR"): + if "CHILDDIR" not in recdict: msg_error(recdict, _("Using childdir() at the top level")) return '' return relativedir(arg, "CHILDDIR") @@ -199,7 +199,7 @@ def parentdir(arg): directory, assuming it is relative to the parent recipe. """ recdict = Global.globals - if not recdict.has_key("PARENTDIR"): + if "PARENTDIR" not in recdict: msg_error(recdict, _("Using parentdir() at the top level")) return '' return relativedir(arg, "PARENTDIR") @@ -264,9 +264,9 @@ def srcitem2obj(recdict, name, attrdict = {}, sufname = "OBJSUF", auto = 1): variables. """ node = getwork(recdict).find_node(name) - if attrdict.has_key("var_BDIR"): + if "var_BDIR" in attrdict: bdir = attrdict["var_BDIR"] - elif node and node.attributes.has_key("var_BDIR"): + elif node and "var_BDIR" in node.attributes: bdir = node.attributes["var_BDIR"] else: bdir = get_var_val_int(recdict, "BDIR") @@ -284,7 +284,7 @@ def srcitem2obj(recdict, name, attrdict = {}, sufname = "OBJSUF", auto = 1): name = os.path.join(bdir, name) - if attrdict.has_key("suffix"): + if "suffix" in attrdict: # Use the suffix attribute if it exists. objsuf = attrdict["suffix"] elif sufname: @@ -311,10 +311,10 @@ def srcitem2obj(recdict, name, attrdict = {}, sufname = "OBJSUF", auto = 1): else: l = [ sufname ] for sn in l: - if attrdict.has_key("var_" + sn): + if "var_" + sn in attrdict: objsuf = attrdict["var_" + sn] break - if node and node.attributes.has_key("var_" + sn): + if node and "var_" + sn in node.attributes: objsuf = node.attributes["var_" + sn] break objsuf = get_var_val_int(recdict, sn) @@ -331,7 +331,7 @@ def srcitem2obj(recdict, name, attrdict = {}, sufname = "OBJSUF", auto = 1): else: n = name + objsuf - if attrdict.has_key("prefix"): + if "prefix" in attrdict: n = os.path.join(os.path.dirname(n), attrdict["prefix"] + os.path.basename(n)) return n @@ -399,7 +399,7 @@ def program_path(name, path = None, pathext = None, skip = None): # Decide on the list of directories to examine. if not path is None: envpath = path - elif os.environ.has_key('PATH'): + elif 'PATH' in os.environ: envpath = os.environ['PATH'] else: envpath = os.defpath @@ -656,6 +656,10 @@ def define_action(action, primary, commands, attr = {}, Define an action. """ from RecPos import RecPos + try: + from functools import reduce # Python 3.0 + except: + pass # TODO: is there a way to put a line number in rpstack? recdict = Global.globals @@ -849,7 +853,17 @@ def ask_prefix(name): # This must be here instead of inside get_html_images() for Python 1.5. -import htmllib +try: + import html # >= Python 3.0 +except ImportError: # Backward compatibility (< Python 3.0) + try: + import HTMLParser + class html: + parser = HTMLParser.HTMLParser + except ImportError: # More backward compatibility (< Python 2.2) + import htmllib + class html: + parser = htmllib.HTMLParser def get_html_images(files, add_dir = 1): """ @@ -857,9 +871,9 @@ def get_html_images(files, add_dir = 1): Only relative file names are supported, because a relative file name means the file can be found when testing locally. """ - class ImgHTMLParser(htmllib.HTMLParser): + class ImgHTMLParser(html.parser): def __init__(self, formatter, verbose=0): - htmllib.HTMLParser.__init__(self, formatter, verbose) + html.parser.__init__(self, formatter, verbose) self.img_list = [] # list of images so far def set_dir(self, dir): self.img_dir = dir # dir of image file @@ -1070,7 +1084,7 @@ def _scan_c_file(recdict, fname, scanned, local, localpathlist, globalpathlist): if not fn: fn = search_target(getwork(recdict), pathlist, name) - if fn and not scanned.has_key(fn): + if fn and fn not in scanned: scanned[fn] = not local except IOError: diff --git a/Remote.py b/Remote.py index a856d8a..a6d3467 100644 --- a/Remote.py +++ b/Remote.py @@ -101,9 +101,9 @@ def get_header_date(headers): """Get the date from a MIME header. Returns zero when not available.""" from rfc822 import parsedate - if headers.has_key("Last-Modified"): + if "Last-Modified" in headers: return time.mktime(parsedate(headers["Last-Modified"])) - if headers.has_key("Date"): + if "Date" in headers: return time.mktime(parsedate(headers["Date"])) # When a file does exist but has no timestamp return 1, so that it's # different from a file that does not exist. @@ -310,7 +310,7 @@ def download_file(recdict, url_dl, node, use_cache): return 0 return 1 - if url_dl.has_key("cache_update"): + if "cache_update" in url_dl: cu = url_dl["cache_update"] else: cu = None diff --git a/Rule.py b/Rule.py index bde0934..01e36ae 100644 --- a/Rule.py +++ b/Rule.py @@ -64,7 +64,7 @@ def _trymatch(rpstack, name, name_short, patlist): # If the pattern has the "virtual" attribute, use the short name # (if it's already known the name is a virtual item, "name" already is # the short name). - elif t.has_key("virtual") and t["virtual"]: + elif "virtual" in t and t["virtual"]: s = name_short str_len = len(name_short) else: @@ -104,7 +104,7 @@ def _trymatch(rpstack, name, name_short, patlist): continue # TODO: use a regexp pattern to match with - if t.has_key("skip") and t["skip"] == name: + if "skip" in t and t["skip"] == name: continue # When matching with the tail, return the directory of the short name, diff --git a/Scope.py b/Scope.py index 2470235..42c6046 100644 --- a/Scope.py +++ b/Scope.py @@ -89,14 +89,14 @@ class NoScopeDict: def __getattr__(self, key): # 1: local scope - if self.data.has_key(key): + if key in self.data: return self.data[key] # Remember we read the variable from a non-local scope. # self.read_from_callstack[key] = 1 # 2: _up scope (callstack) - if self.data.has_key("_up") and self.data["_up"].has_key(key): + if "_up" in self.data and key in self.data["_up"]: return self.data["_up"][key] # Generate an error as if reading from the local scope. @@ -111,19 +111,19 @@ class NoScopeDict: self.data[key] = value def has_key(self, key): - return (self.data.has_key(key) - or (self.data.has_key("_up") and self.data["_up"].has_key(key))) + return (key in self.data + or ("_up" in self.data and key in self.data["_up"])) def get(self, key, f = None): - if self.data.has_key(key): + if key in self.data: return self.data[key] - if self.data.has_key("_up") and self.data["_up"].has_key(key): + if "_up" in self.data and key in self.data["_up"]: return self.data["_up"][key] return f def keys(self): l = self.data.keys() - if self.data.has_key("_up"): + if "_up" in self.data: l.extend(self.data["_up"].keys()) # Remove duplicates: two scopes can hold the same variable but we will @@ -147,7 +147,7 @@ class NoScopeDict: def __str__(self): s = str(self.data) - if self.data.has_key("_up"): + if "_up" in self.data: s = s + "; _up stack: " + str(self.data["_up"]) return s @@ -165,7 +165,7 @@ class NoScopeDict: def __contains__(self, key): return (self.data.__contains__(key) - or (self.data.has_key("_up") + or ("_up" in self.data and self.data["_up"].__contains__(key))) def items(self): @@ -209,20 +209,20 @@ class CallstackDict: def __getattr__(self, key): for d in self.stack: - if d.has_key(key): + if key in d: return d[key] raise AttributeError, _("Variable not found in _up scope: %s") % str(key) def __setattr__(self, key, value): for d in self.stack: - if d.has_key(key): + if key in d: d[key] = value return raise AttributeError, _("Variable not found in _up scope: %s") % str(key) def __setitem__(self, key, value): for d in self.stack: - if d.has_key(key): + if key in d: d[key] = value return raise AttributeError, _("Variable not found in _up scope: %s") % str(key) @@ -244,7 +244,7 @@ class CallstackDict: def has_key(self, key): for d in self.stack: - if d.has_key(key): + if key in d: return 1 return 0 @@ -256,7 +256,7 @@ class CallstackDict: def get(self, key, f = None): for d in self.stack: - if d.has_key(key): + if key in d: return d[key] return f @@ -361,16 +361,16 @@ def find_recdict(recdict, name): nord = recdict.get("_no") if not nord: # simple recdict, can't use scopes - if recdict.has_key(name): + if name in recdict: return recdict return None # use the _no scope - if nord.data.has_key(name): + if name in nord.data: return nord.data - if nord.data.has_key("_up"): + if "_up" in nord.data: for rd in nord.data["_up"].stack: - if rd.has_key(name): + if name in rd: return rd return None @@ -426,12 +426,12 @@ def get_build_recdict(recdict, buildrecdict, rpstack = None, else: # For a dependency the tree of the invoker is not used. new_recdict["_tree"] = buildrecdict["_tree"] - if buildrecdict.has_key("_parent"): + if "_parent" in buildrecdict: new_recdict["_parent"] = buildrecdict["_parent"] new_recdict["_rpstack"] = buildrecdict["_rpstack"] # Add the invoking scope to the "_stack" scope. - if recdict.has_key("_stack"): + if "_stack" in recdict: stack = [ recdict ] + recdict["_stack"].stack new_recdict["_caller"] = recdict else: @@ -453,12 +453,12 @@ def get_build_recdict(recdict, buildrecdict, rpstack = None, new_recdict["_tree"] = CallstackDict([ new_recdict ] + recdict["_tree"].stack) # The "_stack" scope doesn't change. - if recdict.has_key("_stack"): + if "_stack" in recdict: new_recdict["_stack"] = recdict["_stack"] # The "_up" scope is "_stack" plus "_tree" plus "_conf", but exclude # the recipe itself. - if recdict.has_key("_stack"): + if "_stack" in recdict: new_recdict["_up"] = CallstackDict(new_recdict["_stack"].stack + recdict["_tree"].stack + [ recdict["_conf"] ]) @@ -504,10 +504,10 @@ def check_user_scope(recdict, name): value as a dictionary and fail then. Return None if it is OK, an error message otherwise. """ - if recdict.has_key("_up"): + if "_up" in recdict: for d in recdict["_up"].stack: - if d.has_key(name): - if d.has_key("recipe_name"): + if name in d: + if "recipe_name" in d: if d["recipe_name"] == "toplevel": where = "at the toplevel" else: @@ -535,7 +535,7 @@ def add_user_scope(recdict, name, dict): # Add the user scope to the callstack and recipe tree scopes, so that it is # available when leaving the current scope. - if recdict.has_key("_up"): + if "_up" in recdict: for d in recdict["_up"].stack: d[name] = dict @@ -594,7 +594,7 @@ def rule_in_tree(rule_recdict, target_recdict): return 1 # that was easy! # Check the _tree scope for rules. - if target_recdict.has_key("_tree"): + if "_tree" in target_recdict: for rd in target_recdict["_tree"].stack: if rd["_recipe"] is rule_recdict["_recipe"]: return 1 diff --git a/Sign.py b/Sign.py index 378e236..501f835 100644 --- a/Sign.py +++ b/Sign.py @@ -76,7 +76,7 @@ def get_sign_file(recdict, target, update): """Get the sign file that is used for "target" if it wasn't done already. When "update" is non-zero, mark the file needs writing.""" fname = fname_fold(target.get_sign_fname()) - if not sign_files.has_key(fname): + if fname not in sign_files: sign_files[fname] = update sign_read(recdict, fname) elif update: @@ -207,7 +207,7 @@ def sign_write(recdict, fname): # if it is available. for c in old.keys(): if c != "signfile": - if new and new.has_key(c): + if new and c in new: val = new[c] else: val = old[c] @@ -217,7 +217,7 @@ def sign_write(recdict, fname): # value. if new: for c in new.keys(): - if c != "signfile" and not old.has_key(c): + if c != "signfile" and c not in old: f.write("%s=%s\033" % (sign_reduce_name(basedir, c), new[c])) @@ -230,7 +230,7 @@ def sign_write(recdict, fname): # When the item is in upd_signatures, use the directory specified # there, otherwise use the directory of old_signatures. for s in old_signatures.keys(): - if upd_signatures.has_key(s): + if s in upd_signatures: if upd_signatures[s]["signfile"] != fname: continue new = upd_signatures[s] @@ -244,7 +244,7 @@ def sign_write(recdict, fname): # Go over all updated signatures, write only the ones for which there # is no old signature. for s in upd_signatures.keys(): - if (not old_signatures.has_key(s) + if (s not in old_signatures and upd_signatures[s]["signfile"] == fname): write_sign_line(f, basedir, s, upd_signatures[s], None) @@ -417,10 +417,10 @@ def _sign_lookup(signatures, name, key): Get the "key" signature for item "name" from dictionary "signatures". "name" must have gone through fname_fold(). """ - if not signatures.has_key(name): + if name not in signatures: return '' s = signatures[name] - if not s.has_key(key): + if key not in s: return '' return s[key] @@ -447,8 +447,8 @@ def get_new_sign(recdict, name, check, force = 0): name = fname_fold(name) if (not force and skip_commands() - and new_signatures.has_key(name) - and new_signatures[name].has_key("cleared")): + and name in new_signatures + and "cleared" in new_signatures[name]): return "cleared" key = check @@ -467,7 +467,7 @@ def get_new_sign(recdict, name, check, force = 0): res = "unknown" # Store the new signature to avoid recomputing it many times. - if not new_signatures.has_key(name): + if name not in new_signatures: new_signatures[name] = {} new_signatures[name][key] = res @@ -478,9 +478,9 @@ def sign_clear_target(recdict, target): for "target". sign_updated() should be called next for each source.""" get_sign_file(recdict, target, 1) target_name = fname_fold(target.get_name()) - if old_signatures.has_key(target_name): + if target_name in old_signatures: del old_signatures[target_name] - if upd_signatures.has_key(target_name): + if target_name in upd_signatures: del upd_signatures[target_name] @@ -488,7 +488,7 @@ def sign_clear_file(fname, recursive): """Called to clear signatures for a file "fname". Used for ":changed" and "--changed=FILE".""" chd_signatures[full_fname(fname)] = recursive - if upd_signatures.has_key(fname): + if fname in upd_signatures: del upd_signatures[fname] @@ -508,7 +508,7 @@ def _sign_upd_sign(recdict, target, key, value): """Update signature for node "target" with "key" to "value".""" get_sign_file(recdict, target, 1) target_name = fname_fold(target.get_name()) - if not upd_signatures.has_key(target_name): + if target_name not in upd_signatures: upd_signatures[target_name] = {"signfile": fname_fold(target.get_sign_fname())} upd_signatures[target_name][key] = value @@ -543,7 +543,7 @@ def get_old_sign(recdict, name, check, target, rootname = None): If it doesn't exist an empty string is returned.""" # Check if this file was marked as changed. name = fname_fold(name) - if chd_signatures.has_key(name): + if name in chd_signatures: return "changed" # May need to read the sign file for this target. @@ -568,8 +568,8 @@ def get_old_sign(recdict, name, check, target, rootname = None): for name in sigdict.keys(): if (len(name) > rootname_len and name[:rootname_len] == rootname - and sigdict[name].has_key(key) - and sigdict[name].has_key(timekey) + and key in sigdict[name] + and timekey in sigdict[name] and float(sigdict[name][timekey]) > newtime): ret = sigdict[name][key] newtime = float(sigdict[name][timekey]) @@ -580,9 +580,9 @@ def get_old_sign(recdict, name, check, target, rootname = None): def check_name(recdict, name, itemdict, altdict = None): """Return the check name to be used for item "name" with dictlist "itemdict". Also use "altdict" if given (attributes of the node).""" - if itemdict.has_key("check"): + if "check" in itemdict: check = itemdict["check"] - elif altdict and altdict.has_key("check"): + elif altdict and "check" in altdict: check = altdict["check"] else: # TODO: make mapping from name or filetype to check configurable diff --git a/Util.py b/Util.py index e7c8cde..2593719 100644 --- a/Util.py +++ b/Util.py @@ -31,7 +31,7 @@ def i18n_init(): # If already done return quickly. import __builtin__ - if __builtin__.__dict__.has_key("_"): + if "_" in __builtin__.__dict__: return # Set the locale to the users default. @@ -333,7 +333,7 @@ def get_var_val_int(recdict, name): the "_up" scope. Do not use the "_no" scope to avoid setting the flag that the variable was read before set. """ - if recdict.has_key(name): + if name in recdict: return recdict[name] return get_var_val(0, recdict, "_up", name) @@ -635,7 +635,7 @@ def shorten_dictlist(dictlist): new_item = {} for k in item.keys(): if k == "name": - if item.has_key("_node") and k == "name": + if "_node" in item and k == "name": new_item[k] = shorten_name(item["_node"].get_name(), adir) else: new_item[k] = shorten_name(item[k], adir) @@ -1071,9 +1071,9 @@ def async_system(rpstack, recdict, cmd): def get_shell_name(): """Get the name of the shell to use (either command.com or cmd.exe).""" - if os.environ.has_key("SHELL"): + if "SHELL" in os.environ: shell = os.environ["SHELL"] - elif os.environ.has_key("COMSPEC"): + elif "COMSPEC" in os.environ: shell = os.environ["COMSPEC"] else: from RecPython import program_path @@ -1203,7 +1203,7 @@ compiled_re = {} def cre_match(regexp, text): """Call re.match while caching the compiled regexp.""" - if compiled_re.has_key(regexp): + if regexp in compiled_re: cre = compiled_re[regexp] else: cre = re.compile(regexp) @@ -1212,7 +1212,7 @@ def cre_match(regexp, text): def cre_search(regexp, text): """Call re.search while caching the compiled regexp.""" - if compiled_re.has_key(regexp): + if regexp in compiled_re: cre = compiled_re[regexp] else: cre = re.compile(regexp) diff --git a/VersCont.py b/VersCont.py index 2a5eec9..71465ef 100644 --- a/VersCont.py +++ b/VersCont.py @@ -127,7 +127,7 @@ def handle_nodelist(rpstack, recdict, nodelist, use_cache, action, attrnames): # empty. nx_attr = '' for n in attrnames: - if node.attributes.has_key(n): + if n in node.attributes: nx_attr = node.attributes[n] if nx_attr: attrname = n @@ -233,9 +233,9 @@ def publish_nodelist(rpstack, recdict, nodelist, msg): _('Published file does not exist: "%s"') % node_name) continue - if node.attributes.has_key("publish"): + if "publish" in node.attributes: s = node.attributes["publish"] - elif node.attributes.has_key("commit"): + elif "commit" in node.attributes: s = node.attributes["commit"] else: s = '' @@ -341,7 +341,7 @@ def verscont_remove_add(rpstack, recdict, dir, recursive, action): "dir" is a dictionary for the directory and its attributes. Enter directories recursively when "recursive" is non-zero. """ - if not dir.has_key("commit"): + if "commit" not in dir: recipe_error(rpstack, _("no commit attribute for %s") % dir["name"]) from Dictlist import str2dictlist @@ -377,7 +377,7 @@ def verscont_remove_add(rpstack, recdict, dir, recursive, action): # Remove: Loop over all items found in the VCS. for item in alist: node = work.find_node(item) - if not node or not node.attributes.has_key("commit"): + if not node or "commit" not in node.attributes: if not node: node = Node(item) if skip_commands(): @@ -396,7 +396,7 @@ def verscont_remove_add(rpstack, recdict, dir, recursive, action): # - the node does not appear in the list from the VCS dirname_len = len(dirname) for node in work.nodes.values(): - if (node.attributes.has_key("commit") + if ("commit" in node.attributes and len(node.absname) > dirname_len and ((recursive and node.absname[:dirname_len] == dirname diff --git a/VersContCvs.py b/VersContCvs.py index 1f47026..ea042a2 100644 --- a/VersContCvs.py +++ b/VersContCvs.py @@ -71,7 +71,7 @@ def cvs_command(recdict, server, url_dict, nodelist, action): thislist = [] for node in todolist[:]: # Use the specified "tag" attribute for tagging. - if not node.attributes.has_key("tag"): + if "tag" not in node.attributes: msg_error(recdict, _('tag attribute missing for "%s"') % node.short_name()) failed.extend(todolist) @@ -186,7 +186,7 @@ def cvs_command_node(recdict, serverarg, url_dict, node, action): # Change to the directory where "path" + "node.name" is valid. if action == "checkout": cvspath = '' - if url_dict.has_key("path"): + if "path" in url_dict: # Use the specified "path" attribute. cvspath = url_dict["path"] dir_for_path = node.recipe_dir @@ -238,9 +238,9 @@ def cvs_command_node(recdict, serverarg, url_dict, node, action): # Use the specified "logentry" attribute for a log message. # Only used for "commit" (also for add and remove). - if url_dict.has_key("logentry"): + if "logentry" in url_dict: logentry = url_dict["logentry"] - elif node.attributes.has_key("logentry"): + elif "logentry" in node.attributes: logentry = node.attributes["logentry"] else: logentry = get_var_val_int(recdict, "LOGENTRY") diff --git a/Work.py b/Work.py index 1349bb8..2bcb624 100644 --- a/Work.py +++ b/Work.py @@ -245,14 +245,14 @@ class Work: if absname: findname = absname for i in r: - if self.absnodes.has_key(findname): + if findname in self.absnodes: return self.absnodes[findname] if i: findname = fname_fold(absname) for i in r: findname = name - if self.nodes.has_key(findname): + if findname in self.nodes: n = self.nodes[findname] if n.attributes.get("virtual"): return n @@ -264,7 +264,7 @@ class Work: if absname and use_alias: findname = absname for i in r: - if self.aliasnodes.has_key(findname): + if findname in self.aliasnodes: return self.aliasnodes[findname] if i: findname = fname_fold(absname) @@ -341,7 +341,7 @@ class Work: node = self.find_node(item["name"]) if node: for k in node.attributes.keys(): - if not item.has_key(k): + if k not in item: item[k] = node.attributes[k] @@ -362,7 +362,7 @@ class Work: """ for in_ftype in r... [truncated message content] |
From: Bram M. <Br...@mo...> - 2009-04-06 18:11:42
|
Leandro Lucarella wrote: > This patch changes 2 things: > 1) Try to use html or HTMLParser module first, then use htmllib module > 2) Use the "in" operator instead of the "has_key()" method I'm very glad that you take the time to make improvements. At this moment i'm not so concerned about Python 3.x support. It's not backwards compatible with 2.x and, as far as I know, it's impossible to write a Python script that runs on both 2.x and 3.x. I rather stick with Python 2.x for a while, since every system should have that version. Aap is actually compatible with Python 1.5x to maximize the number of systems it runs on. What is the advantage of using "in" instead of "has_key()? -- FATHER: One day, lad, all this will be yours ... PRINCE: What - the curtains? "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |
From: Leandro L. <ll...@gm...> - 2009-04-06 18:28:56
|
Bram Moolenaar, el 6 de abril a las 20:10 me escribiste: > > Leandro Lucarella wrote: > > > This patch changes 2 things: > > 1) Try to use html or HTMLParser module first, then use htmllib module > > 2) Use the "in" operator instead of the "has_key()" method > > I'm very glad that you take the time to make improvements. > > At this moment i'm not so concerned about Python 3.x support. It's not > backwards compatible with 2.x and, as far as I know, it's impossible to > write a Python script that runs on both 2.x and 3.x. I rather stick > with Python 2.x for a while, since every system should have that > version. Aap is actually compatible with Python 1.5x to maximize the > number of systems it runs on. > > What is the advantage of using "in" instead of "has_key()? Both changes are for "improved Python 3.x compatibility" (they try to minimize the gap between Python 2.x and Python 3.x compatible code). "has_key()" method is removed from Python in 3.x series (the same goes for the "htmllib" module). -- Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/ ---------------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ---------------------------------------------------------------------------- |
From: Bram M. <Br...@mo...> - 2009-04-06 20:17:18
|
Leandro Lucarella wrote: > Hi! Attached are 2 patches to make A-A-P Python 2.6 compatible and to > improve Python 3.x compatibility (it's not yet Python 3.x compatible > as the changes needed break backward compatibility). > > I guess backward compatibility should not be broken by these patches > (at least for Python 2.x series), because I've done the patches with > backward compatibility in mind, but I'm not sure (specially for the > "in" operator). > > Using A-A-P with Python 2.6 passes all the tests. > > Adding support for Python 3.x is backward incompatible, so I guess a > new branch should be done to tackle that. If there are interest in > this, I could provide patches for this too. As I mentioned in another thread: Since it's not possible to make Aap work both with 2.x and 3.x, and I don't like having two branches, I prefer not to work on Python 3.x support. In my opinion there is no good reason for Python 3.x to not be backwards compatible with 2.x scripts. They could have solved that somehow. It irritates me that they intentionally cause problems for scripts that are not maintained. It's a "not my problem" attitude. -- "To whoever finds this note - I have been imprisoned by my father who wishes me to marry against my will. Please please please please come and rescue me. I am in the tall tower of Swamp Castle." SIR LAUNCELOT's eyes light up with holy inspiration. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |