@ -1,4 +1,5 @@
/ *
* Copyright ( C ) 2010 , Chris Aniszczyk < caniszczyk @gmail.com >
* Copyright ( C ) 2008 , Google Inc .
* and other copyright owners as documented in the project ' s IP log .
*
@ -43,56 +44,29 @@
package org.eclipse.jgit.pgm ;
import java.io.File ;
import java.util.ArrayList ;
import java.util.List ;
import org.eclipse.jgit.api.Git ;
import org.eclipse.jgit.api.RmCommand ;
import org.kohsuke.args4j.Argument ;
import org.kohsuke.args4j.Option ;
import org.kohsuke.args4j.spi.StopOptionHandler ;
import org.eclipse.jgit.dircache.DirCache ;
import org.eclipse.jgit.dircache.DirCacheBuildIterator ;
import org.eclipse.jgit.dircache.DirCacheBuilder ;
import org.eclipse.jgit.lib.Constants ;
import org.eclipse.jgit.lib.FileMode ;
import org.eclipse.jgit.pgm.opt.PathTreeFilterHandler ;
import org.eclipse.jgit.treewalk.TreeWalk ;
import org.eclipse.jgit.treewalk.filter.TreeFilter ;
@Command ( usage = "usage_StopTrackingAFile" , common = true )
class Rm extends TextBuiltin {
@Argument ( metaVar = "metaVar_path" , usage = "usage_path" , multiValued = true , required = true , handler = PathTreeFilterHandler . class )
@Argument ( metaVar = "metaVar_path" , usage = "usage_path" , multiValued = true , required = true )
@Option ( name = "--" , handler = StopOptionHandler . class )
private TreeFilter paths ;
private List < String > paths = new ArrayList < String > ( ) ;
private File root ;
@Override
protected void run ( ) throws Exception {
root = db . getWorkTree ( ) ;
final DirCache dirc = db . lockDirCache ( ) ;
final DirCacheBuilder edit = dirc . builder ( ) ;
final TreeWalk walk = new TreeWalk ( db ) ;
walk . reset ( ) ; // drop the first empty tree, which we do not need here
walk . setRecursive ( true ) ;
walk . setFilter ( paths ) ;
walk . addTree ( new DirCacheBuildIterator ( edit ) ) ;
while ( walk . next ( ) ) {
final File path = new File ( root , walk . getPathString ( ) ) ;
final FileMode mode = walk . getFileMode ( 0 ) ;
if ( mode . getObjectType ( ) = = Constants . OBJ_BLOB ) {
// Deleting a blob is simply a matter of removing
// the file or symlink named by the tree entry.
delete ( path ) ;
}
}
edit . commit ( ) ;
RmCommand command = new Git ( db ) . rm ( ) ;
for ( String p : paths )
command . addFilepattern ( p ) ;
command . call ( ) ;
}
private void delete ( File p ) {
while ( p ! = null & & ! p . equals ( root ) & & p . delete ( ) )
p = p . getParentFile ( ) ;
}
}