private void handleLongFileNames()

in git-agent/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/agent/command/impl/CleanCommandImpl.java [97:142]


  private void handleLongFileNames(@NotNull File rootDir, @NotNull VcsException originalError) throws VcsException {
    List<String> files = new ArrayList<String>();
    FileUtil.listFilesRecursively(rootDir, "", true, Integer.MAX_VALUE, new Predicate<File>() {
      public boolean apply(File f) {
        return true;
      }
    }, files);

    int targetDirLength = rootDir.getAbsolutePath().length();
    List<String> longFileNames = new ArrayList<String>();
    for (String f : files) {
      if (targetDirLength + 1 + f.length() >= 256)
        longFileNames.add(f);
    }

    if (longFileNames.isEmpty()) {
      Loggers.VCS.info("No files with long names found");
      throw originalError;
    } else {
      Loggers.VCS.info(longFileNames.size() + " files with long names found:");
      for (String f : longFileNames) {
        Loggers.VCS.info(f);
      }
      Loggers.VCS.info("Try removing files with long names manually");
    }

    Repository repository = null;
    try {
      repository = new RepositoryBuilder().setWorkTree(rootDir).build();
      WorkingDirStatus status = getWorkingDirStatus(repository);
      Set<String> untracked = status.getUntracked();
      for (String f : longFileNames) {
        if (untracked.contains(f) || status.isIgnored(f)) {
          FileUtil.delete(new File(rootDir, f));
          Loggers.VCS.info(f + " is removed");
        } else {
          Loggers.VCS.info("The file " + f + " is tracked, don't remove it");
        }
      }
    } catch (Exception e1) {
      Loggers.VCS.error("Error while cleaning files with long names", e1);
    } finally {
      if (repository != null)
        repository.close();
    }
  }