| 3964 | } |
| 3965 | |
| 3966 | bool HandleChmodCommandImpl(std::vector<std::string> const& args, bool recurse, |
| 3967 | cmExecutionStatus& status) |
| 3968 | { |
| 3969 | mode_t perms = 0; |
| 3970 | mode_t fperms = 0; |
| 3971 | mode_t dperms = 0; |
| 3972 | cmsys::Glob globber; |
| 3973 | |
| 3974 | globber.SetRecurse(recurse); |
| 3975 | globber.SetRecurseListDirs(recurse); |
| 3976 | |
| 3977 | struct Arguments : public ArgumentParser::ParseResult |
| 3978 | { |
| 3979 | cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>> |
| 3980 | Permissions; |
| 3981 | cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>> |
| 3982 | FilePermissions; |
| 3983 | cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>> |
| 3984 | DirectoryPermissions; |
| 3985 | }; |
| 3986 | |
| 3987 | static auto const parser = |
| 3988 | cmArgumentParser<Arguments>{} |
| 3989 | .Bind("PERMISSIONS"_s, &Arguments::Permissions) |
| 3990 | .Bind("FILE_PERMISSIONS"_s, &Arguments::FilePermissions) |
| 3991 | .Bind("DIRECTORY_PERMISSIONS"_s, &Arguments::DirectoryPermissions); |
| 3992 | |
| 3993 | std::vector<std::string> pathEntries; |
| 3994 | Arguments parsedArgs = |
| 3995 | parser.Parse(cmMakeRange(args).advance(1), &pathEntries); |
| 3996 | |
| 3997 | // check validity of arguments |
| 3998 | if (!parsedArgs.Permissions && !parsedArgs.FilePermissions && |
| 3999 | !parsedArgs.DirectoryPermissions) // no permissions given |
| 4000 | { |
| 4001 | status.SetError("No permissions given"); |
| 4002 | cmSystemTools::SetFatalErrorOccurred(); |
| 4003 | return false; |
| 4004 | } |
| 4005 | |
| 4006 | if (parsedArgs.Permissions && parsedArgs.FilePermissions && |
| 4007 | parsedArgs.DirectoryPermissions) // all keywords are used |
| 4008 | { |
| 4009 | status.SetError("Remove either PERMISSIONS or FILE_PERMISSIONS or " |
| 4010 | "DIRECTORY_PERMISSIONS from the invocation"); |
| 4011 | cmSystemTools::SetFatalErrorOccurred(); |
| 4012 | return false; |
| 4013 | } |
| 4014 | |
| 4015 | if (parsedArgs.MaybeReportError(status.GetMakefile())) { |
| 4016 | cmSystemTools::SetFatalErrorOccurred(); |
| 4017 | return true; |
| 4018 | } |
| 4019 | |
| 4020 | // validate permissions |
| 4021 | bool validatePermissions = |
| 4022 | ValidateAndConvertPermissions(parsedArgs.Permissions, perms, status) && |
| 4023 | ValidateAndConvertPermissions(parsedArgs.FilePermissions, fperms, |
no test coverage detected
searching dependent graphs…