예제 #1
0
  /**
   * Semantics is similar to {@link org.openide.windows.TopComponent#getActivatedNodes()} except
   * that this method returns File objects instead od Nodes. Every node is examined for Files it
   * represents. File and Folder nodes represent their underlying files or folders. Project nodes
   * are represented by their source groups. Other logical nodes must provide FileObjects in their
   * Lookup.
   *
   * @param nodes null (then taken from windowsystem, it may be wrong on editor tabs #66700).
   * @param includingFileStatus if any activated file does not have this CVS status, an empty array
   *     is returned
   * @param includingFolderStatus if any activated folder does not have this CVS status, an empty
   *     array is returned
   * @param onlyCachedStatus if set to true, only cached status will be considered
   * @return File [] array of activated files, or an empty array if any of examined files/folders
   *     does not have given status
   */
  public static Context getCurrentContext(
      Node[] nodes, int includingFileStatus, int includingFolderStatus, boolean onlyCachedStatus) {
    Context context = getCurrentContext(nodes);
    FileStatusCache cache = CvsVersioningSystem.getInstance().getStatusCache();
    File[] files = context.getRootFiles();
    for (int i = 0; i < files.length; i++) {
      File file = files[i];
      FileInformation fi = onlyCachedStatus ? cache.getCachedStatus(file) : cache.getStatus(file);
      int status = fi == null ? FileInformation.STATUS_VERSIONED_UPTODATE : fi.getStatus();
      if (file.isDirectory()) {
        if ((status & includingFolderStatus) == 0) return Context.Empty;
      } else {
        if ((status & includingFileStatus) == 0) return Context.Empty;
      }
    }
    // if there are no exclusions, we may safely return this context because filtered files == root
    // files
    if (context.getExclusions().isEmpty()) return context;

    // in this code we remove files from filteredFiles to NOT include any files that do not have
    // required status
    // consider a freeform project that has 'build' in filteredFiles, the Branch action would try to
    // branch it
    // so, it is OK to have BranchAction enabled but the context must be a bit adjusted here
    Set<File> filteredFiles = new HashSet<File>(Arrays.asList(context.getFiles()));
    Set<File> rootFiles = new HashSet<File>(Arrays.asList(context.getRootFiles()));
    Set<File> rootFileExclusions = new HashSet<File>(context.getExclusions());

    for (Iterator<File> i = filteredFiles.iterator(); i.hasNext(); ) {
      File file = i.next();
      if (file.isDirectory()) {
        if ((cache.getStatus(file).getStatus() & includingFolderStatus) == 0) i.remove();
      } else {
        if ((cache.getStatus(file).getStatus() & includingFileStatus) == 0) i.remove();
      }
    }
    return new Context(filteredFiles, rootFiles, rootFileExclusions);
  }
예제 #2
0
 /**
  * Returns the widest possible versioned context for the given file, the outter boundary is the
  * file's Project.
  *
  * @param file a file
  * @return Context a context
  */
 public static Context getProjectContext(Project project, File file) {
   Context context = Utils.getProjectsContext(new Project[] {project});
   if (context.getRootFiles().length == 0) {
     // the project itself is not versioned, try to search in the broadest context possible
     FileStatusCache cache = CvsVersioningSystem.getInstance().getStatusCache();
     for (; ; ) {
       File parent = file.getParentFile();
       assert parent != null;
       if ((cache.getStatus(parent).getStatus() & FileInformation.STATUS_IN_REPOSITORY) == 0) {
         Set<File> files = new HashSet<File>(1);
         files.add(file);
         context = new Context(files, files, Collections.emptySet());
         break;
       }
       file = parent;
     }
   }
   return context;
 }