int getPermissionsFromFile()

in deploy-runner-agent/src/main/java/jetbrains/buildServer/deployer/agent/ssh/scp/FileScpOperation.java [47:103]


  int getPermissionsFromFile(File file) throws IOException {
    Set<PosixFilePermission> permission;
    try {
      permission = Files.getPosixFilePermissions(file.toPath(), LinkOption.NOFOLLOW_LINKS);
    } catch (UnsupportedOperationException e) {
      logger.warn("Filesystem doesn't support POSIX file attributes, rolling back to generics.");
      permission = new HashSet<>();
      if (Files.isExecutable(file.toPath())) {
        permission.add(OWNER_EXECUTE);
        permission.add(GROUP_EXECUTE);
        permission.add(OTHERS_EXECUTE);
      }
      if (Files.isReadable(file.toPath())) {
        permission.add(OWNER_READ);
        permission.add(GROUP_READ);
        permission.add(OTHERS_READ);
      }
      if (Files.isWritable(file.toPath())) {
        permission.add(OWNER_WRITE);
        permission.add(GROUP_WRITE);
        permission.add(OTHERS_WRITE);
      }
    }
    AtomicInteger permissionInt = new AtomicInteger(0);
    permission.forEach(p -> {
      switch (p) {
        case OWNER_READ:
          permissionInt.updateAndGet(i -> i | 256);
          break;
        case OWNER_WRITE:
          permissionInt.updateAndGet(i -> i | 128);
          break;
        case OWNER_EXECUTE:
          permissionInt.updateAndGet(i -> i | 64);
          break;
        case GROUP_READ:
          permissionInt.updateAndGet(i -> i | 32);
          break;
        case GROUP_WRITE:
          permissionInt.updateAndGet(i -> i | 16);
          break;
        case GROUP_EXECUTE:
          permissionInt.updateAndGet(i -> i | 8);
          break;
        case OTHERS_READ:
          permissionInt.updateAndGet(i -> i | 4);
          break;
        case OTHERS_WRITE:
          permissionInt.updateAndGet(i -> i | 2);
          break;
        case OTHERS_EXECUTE:
          permissionInt.updateAndGet(i -> i | 1);
          break;
      }
    });
    return permissionInt.get();
  }