diff options
author | William Deegan <bill@baddogconsulting.com> | 2016-02-15 20:30:40 (GMT) |
---|---|---|
committer | William Deegan <bill@baddogconsulting.com> | 2016-02-15 20:30:40 (GMT) |
commit | b0f4c6bc7b32102a75e2d6c8ef880e6135cbfd53 (patch) | |
tree | 37bde0110ac00ab47747adb7df24b4d98f6b08c9 /src/engine | |
parent | b7bf26899595e90e1cc6937fb18fd5702bec8d8d (diff) | |
parent | 3909c2e02d5497858dcb509f09fe5766a9aa0b4d (diff) | |
download | SCons-b0f4c6bc7b32102a75e2d6c8ef880e6135cbfd53.zip SCons-b0f4c6bc7b32102a75e2d6c8ef880e6135cbfd53.tar.gz SCons-b0f4c6bc7b32102a75e2d6c8ef880e6135cbfd53.tar.bz2 |
Merged in adarshsanjeev/scons (pull request #291)
Diffstat (limited to 'src/engine')
-rw-r--r-- | src/engine/SCons/Defaults.py | 64 |
1 files changed, 61 insertions, 3 deletions
diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py index c1bd902..6344975 100644 --- a/src/engine/SCons/Defaults.py +++ b/src/engine/SCons/Defaults.py @@ -169,15 +169,73 @@ def get_paths_str(dest): else: return '"' + str(dest) + '"' +permission_dic = { + 'u':{ + 'r':stat.S_IRUSR, + 'w':stat.S_IWUSR, + 'x':stat.S_IXUSR + }, + 'g':{ + 'r':stat.S_IRGRP, + 'w':stat.S_IWGRP, + 'x':stat.S_IXGRP + }, + 'o':{ + 'r':stat.S_IROTH, + 'w':stat.S_IWOTH, + 'x':stat.S_IXOTH + } +} + def chmod_func(dest, mode): + import SCons.Util + from string import digits SCons.Node.FS.invalidate_node_memos(dest) if not SCons.Util.is_List(dest): dest = [dest] - for element in dest: - os.chmod(str(element), mode) + if SCons.Util.is_String(mode) and not 0 in [i in digits for i in mode]: + mode = int(mode, 8) + if not SCons.Util.is_String(mode): + for element in dest: + os.chmod(str(element), mode) + else: + mode = str(mode) + for operation in mode.split(","): + if "=" in operation: + operator = "=" + elif "+" in operation: + operator = "+" + elif "-" in operation: + operator = "-" + else: + raise SyntaxError("Could not find +, - or =") + operation_list = operation.split(operator) + if len(operation_list) is not 2: + raise SyntaxError("More than one operator found") + user = operation_list[0].strip().replace("a", "ugo") + permission = operation_list[1].strip() + new_perm = 0 + for u in user: + for p in permission: + try: + new_perm = new_perm | permission_dic[u][p] + except KeyError: + raise SyntaxError("Unrecognized user or permission format") + for element in dest: + curr_perm = os.stat(str(element)).st_mode + if operator == "=": + os.chmod(str(element), new_perm) + elif operator == "+": + os.chmod(str(element), curr_perm | new_perm) + elif operator == "-": + os.chmod(str(element), curr_perm & ~new_perm) def chmod_strfunc(dest, mode): - return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode) + import SCons.Util + if not SCons.Util.is_String(mode): + return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode) + else: + return 'Chmod(%s, "%s")' % (get_paths_str(dest), str(mode)) Chmod = ActionFactory(chmod_func, chmod_strfunc) |