Rational ClearCase; Java; a utlity to recursively add files to ClearCase.
The inability to add entire directories to ClearCase annoyed me endlessly. I didn’t know about the clearfsimport
command.
And even if I did, I might have written my own utility just for fun. In either case, the code below performs the task. The underlying interaction with ClearCase is handled by the http://sourceforge.net/projects/clearcase-java/ project. If you need to use the ClearcaseCLI class instead of ClearcaseJNI then simply change the import
line and the start
method. Have Fun!
package com.cordiem.clearcase; import java.io.*; import java.util.*; import net.sourceforge.clearcase.api.IClearcase; import net.sourceforge.clearcase.api.IClearcase.Status; import net.sourceforge.clearcase.simple.ClearcaseJNI; /** * @author david medinets */ public class AddToClearCase { String dirName = null; IClearcase ccase = null; public AddToClearCase() { } public AddToClearCase(String dirName) { setDirName(dirName); } private class FilterAllFiles extends Object implements FilenameFilter { public FilterAllFiles() { } public boolean accept(File dir, String name) { return true; } } public void start() { ccase = new ClearcaseJNI(); /* Convert the directory hierarchy into a * stack so that it can be easily traversed. */ File f = new File(getDirName()); Stack s = new Stack(); do { s.add(f); f = f.getParentFile(); } while (f != null); /* * Try to check on all levels of the directory * hierarchy. If one of them can be checked in * then I assume that it's ok to add files to * this tree. */ boolean checkedIn = false; do { f = (File)s.pop(); if (ccase.isElement(f.toString()) == false) { addToClearCase(f); checkedIn = CheckoutFromClearCase(f); } else { if (ccase.isElement(f.toString()) == true && ccase.isCheckedOut(f.toString()) == true) { checkedIn = true; } else { checkedIn = CheckoutFromClearCase(f); } } } while (s.empty() == false); } private void addToClearCase(File f) { if (false == ccase.isElement(f.toString())) { System.out.println("adding: " + f.toString()); Status status = ccase.add(f.toString(), "", f.isDirectory()); if (status.status == false) System.out.println("m: " + status.message); } } private boolean CheckoutFromClearCase(File f) { boolean rv = false; if (ccase.isElement(f.toString()) == true && ccase.isCheckedOut(f.toString()) == false) { System.out.println("checking out: " + f.toString()); Status status = ccase.checkout(f.toString(), "", true, false); if (status.status == false) System.out.println("m: " + status.message); else rv = true; } return rv; } private void CheckinToClearCase(File f) { if (ccase.isElement(f.toString()) == true && ccase.isCheckedOut(f.toString()) == true) { System.out.println("checking in: " + f.toString()); Status status = ccase.checkin(f.toString(), "", false); if (status.status == false) System.out.println("m: " + status.message); } } // Check the directory hierarchy back into ClearCase. public void stop() { /* Convert the directory hierarchy into a * stack so that it can be easily traversed. */ File f = new File(getDirName()); do { CheckinToClearCase(f); f = f.getParentFile(); } while (f != null); } public void process() { process(new File(getDirName())); } public void process(File path) { this.addToClearCase(path); if (path.isDirectory() == true) this.CheckoutFromClearCase(path); String[] sDirs = path.list(new FilterAllFiles()); if (sDirs != null) { for (int i = 0; i < sDirs.length; i++) { File newPath = new File(path.toString() + "/" + sDirs[i]); System.out.println(newPath.toString()); this.addToClearCase(newPath); if (true == newPath.isDirectory()) { CheckoutFromClearCase(newPath); // recurse to handle subdirectories. process(newPath); } // The JNI interaction with ClearCase leaves files checked out // after adding. And the directory also is checked out. So // regardless, the element needs to be checked in at this point. this.CheckinToClearCase(newPath); } } } public static void main(String[] args) { if (args.length != 1) { System.out.println("Usage: AddToClearCase [initialDir]"); } else { System.out.println("Processing directory [" + args[0] + "]"); AddToClearCase c = new AddToClearCase(args[0]); c.start(); c.process(); c.stop(); System.out.println("Done!"); } } public String getDirName() { return dirName; } public void setDirName(String dirName) { this.dirName = dirName; } public void setCcase(IClearcase ccase) { this.ccase = ccase; } }