diff options
author | Adarsh Sanjeev <adarshsanjeev@gmail.com> | 2016-01-03 11:02:25 (GMT) |
---|---|---|
committer | Adarsh Sanjeev <adarshsanjeev@gmail.com> | 2016-01-03 11:02:25 (GMT) |
commit | 5f0194ba83727df2cea55f0af67633e8f02b5982 (patch) | |
tree | d041bc47696adb2b8597605e3dc6c238c820f3eb /src | |
parent | 9d558dd65deacc958edc1f0da2dab1ec56ff4e4e (diff) | |
download | SCons-5f0194ba83727df2cea55f0af67633e8f02b5982.zip SCons-5f0194ba83727df2cea55f0af67633e8f02b5982.tar.gz SCons-5f0194ba83727df2cea55f0af67633e8f02b5982.tar.bz2 |
String support for Chmod added
Diffstat (limited to 'src')
-rw-r--r-- | src/engine/SCons/Defaults.py | 56 |
1 files changed, 53 insertions, 3 deletions
diff --git a/src/engine/SCons/Defaults.py b/src/engine/SCons/Defaults.py index c1bd902..0fbd097 100644 --- a/src/engine/SCons/Defaults.py +++ b/src/engine/SCons/Defaults.py @@ -169,15 +169,65 @@ 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): 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 str(mode).isdigit(): + 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 =") + user = operation.split(operator)[0].strip().replace("a", "ugo") + permission = operation.split(operator)[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) + if str(mode).isdigit(): + 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) |