@ -67,6 +67,10 @@ import org.eclipse.jgit.dircache.DirCache;
import org.eclipse.jgit.errors.ConfigInvalidException ;
import org.eclipse.jgit.errors.IncorrectObjectTypeException ;
import org.eclipse.jgit.errors.RevisionSyntaxException ;
import org.eclipse.jgit.revwalk.RevBlob ;
import org.eclipse.jgit.revwalk.RevCommit ;
import org.eclipse.jgit.revwalk.RevObject ;
import org.eclipse.jgit.revwalk.RevWalk ;
import org.eclipse.jgit.util.FS ;
import org.eclipse.jgit.util.IO ;
import org.eclipse.jgit.util.RawParseUtils ;
@ -754,27 +758,28 @@ public class Repository {
* < li > ref ^ { commit } - commit references by ref < / li >
* < / ul >
*
* Not supported is
* Not supported is :
* < ul >
* < li > timestamps in reflogs , ref @ { full or relative timestamp } < / li >
* < li > abbreviated SHA - 1 ' s < / li >
* < / ul >
*
* @param revstr A git object references expression
* @param revstr
* A git object references expression
* @return an ObjectId or null if revstr can ' t be resolved to any ObjectId
* @throws IOException on serious errors
* @throws IOException
* on serious errors
* /
public ObjectId resolve ( final String revstr ) throws IOException {
char [ ] rev = revstr . toCharArray ( ) ;
Object ref = null ;
ObjectId refId = null ;
Rev Object ref = null ;
RevWalk rw = new RevWalk ( this ) ;
for ( int i = 0 ; i < rev . length ; + + i ) {
switch ( rev [ i ] ) {
case '^' :
if ( refId = = null ) {
String refstr = new String ( rev , 0 , i ) ;
refId = resolveSimple ( refstr ) ;
if ( refId = = null )
if ( ref = = null ) {
ref = parseSimple ( rw , new String ( rev , 0 , i ) ) ;
if ( ref = = null )
return null ;
}
if ( i + 1 < rev . length ) {
@ -790,14 +795,7 @@ public class Repository {
case '8' :
case '9' :
int j ;
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag tag = ( Tag ) ref ;
refId = tag . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ! ( ref instanceof Commit ) )
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_COMMIT ) ;
ref = rw . parseCommit ( ref ) ;
for ( j = i + 1 ; j < rev . length ; + + j ) {
if ( ! Character . isDigit ( rev [ j ] ) )
break ;
@ -812,12 +810,11 @@ public class Repository {
revstr ) ;
}
if ( pnum ! = 0 ) {
final ObjectId parents [ ] = ( ( Commit ) ref )
. getParentIds ( ) ;
if ( pnum > parents . length )
refId = null ;
RevCommit commit = ( RevCommit ) ref ;
if ( pnum > commit . getParentCount ( ) )
ref = null ;
else
refId = parents [ pnum - 1 ] ;
ref = commit . getParent ( pnum - 1 ) ;
}
i = j - 1 ;
break ;
@ -833,96 +830,57 @@ public class Repository {
i = k ;
if ( item ! = null )
if ( item . equals ( "tree" ) ) {
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag t = ( Tag ) ref ;
refId = t . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ref instanceof Treeish )
refId = ( ( Treeish ) ref ) . getTreeId ( ) ;
else
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_TREE ) ;
}
else if ( item . equals ( "commit" ) ) {
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag t = ( Tag ) ref ;
refId = t . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ! ( ref instanceof Commit ) )
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_COMMIT ) ;
}
else if ( item . equals ( "blob" ) ) {
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag t = ( Tag ) ref ;
refId = t . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ! ( ref instanceof byte [ ] ) )
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_BLOB ) ;
}
else if ( item . equals ( "" ) ) {
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag t = ( Tag ) ref ;
refId = t . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
}
else
ref = rw . parseTree ( ref ) ;
} else if ( item . equals ( "commit" ) ) {
ref = rw . parseCommit ( ref ) ;
} else if ( item . equals ( "blob" ) ) {
ref = rw . peel ( ref ) ;
if ( ! ( ref instanceof RevBlob ) )
throw new IncorrectObjectTypeException ( ref ,
Constants . TYPE_BLOB ) ;
} else if ( item . equals ( "" ) ) {
ref = rw . peel ( ref ) ;
} else
throw new RevisionSyntaxException ( revstr ) ;
else
throw new RevisionSyntaxException ( revstr ) ;
break ;
default :
ref = mapObject ( refId , null ) ;
if ( ref instanceof Commit ) {
final ObjectId parents [ ] = ( ( Commit ) ref )
. getParentIds ( ) ;
if ( parents . length = = 0 )
refId = null ;
ref = rw . parseAny ( ref ) ;
if ( ref instanceof RevCommit ) {
RevCommit commit = ( ( RevCommit ) ref ) ;
if ( commit . getParentCount ( ) = = 0 )
ref = null ;
else
refId = parents [ 0 ] ;
ref = commit . getParent ( 0 ) ;
} else
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_COMMIT ) ;
throw new IncorrectObjectTypeException ( ref ,
Constants . TYPE_COMMIT ) ;
}
} else {
ref = mapObject ( refId , null ) ;
while ( ref instanceof Tag ) {
Tag tag = ( Tag ) ref ;
refId = tag . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ref instanceof Commit ) {
final ObjectId parents [ ] = ( ( Commit ) ref )
. getParentIds ( ) ;
if ( parents . length = = 0 )
refId = null ;
ref = rw . peel ( ref ) ;
if ( ref instanceof RevCommit ) {
RevCommit commit = ( ( RevCommit ) ref ) ;
if ( commit . getParentCount ( ) = = 0 )
ref = null ;
else
refId = parents [ 0 ] ;
ref = commit . getParent ( 0 ) ;
} else
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_COMMIT ) ;
throw new IncorrectObjectTypeException ( ref ,
Constants . TYPE_COMMIT ) ;
}
break ;
case '~' :
if ( ref = = null ) {
String refstr = new String ( rev , 0 , i ) ;
refId = resolveSimple ( refstr ) ;
if ( refId = = null )
ref = parseSimple ( rw , new String ( rev , 0 , i ) ) ;
if ( ref = = null )
return null ;
ref = mapObject ( refId , null ) ;
}
while ( ref instanceof Tag ) {
Tag tag = ( Tag ) ref ;
refId = tag . getObjId ( ) ;
ref = mapObject ( refId , null ) ;
}
if ( ! ( ref instanceof Commit ) )
throw new IncorrectObjectTypeException ( refId , Constants . TYPE_COMMIT ) ;
ref = rw . peel ( ref ) ;
if ( ! ( ref instanceof RevCommit ) )
throw new IncorrectObjectTypeException ( ref ,
Constants . TYPE_COMMIT ) ;
int l ;
for ( l = i + 1 ; l < rev . length ; + + l ) {
if ( ! Character . isDigit ( rev [ l ] ) )
@ -937,13 +895,14 @@ public class Repository {
JGitText . get ( ) . invalidAncestryLength , revstr ) ;
}
while ( dist > 0 ) {
final ObjectId [ ] parents = ( ( Commit ) ref ) . getParentIds ( ) ;
if ( parents . length = = 0 ) {
refId = null ;
RevCommit commit = ( Rev Commit) ref ;
if ( commit . getParentCount ( ) = = 0 ) {
ref = null ;
break ;
}
refId = parents [ 0 ] ;
ref = mapCommit ( refId ) ;
commit = commit . getParent ( 0 ) ;
rw . parseHeaders ( commit ) ;
ref = commit ;
- - dist ;
}
i = l - 1 ;
@ -958,23 +917,28 @@ public class Repository {
}
}
if ( time ! = null )
throw new RevisionSyntaxException ( JGitText . get ( ) . reflogsNotYetSupportedByRevisionParser , revstr ) ;
throw new RevisionSyntaxException (
JGitText . get ( ) . reflogsNotYetSupportedByRevisionParser ,
revstr ) ;
i = m - 1 ;
break ;
default :
if ( refId ! = null )
if ( ref ! = null )
throw new RevisionSyntaxException ( revstr ) ;
}
}
if ( refId = = null )
refId = resolveSimple ( revstr ) ;
return refId ;
return ref ! = null ? ref . copy ( ) : resolveSimple ( revstr ) ;
}
private RevObject parseSimple ( RevWalk rw , String revstr ) throws IOException {
ObjectId id = resolveSimple ( revstr ) ;
return id ! = null ? rw . parseAny ( id ) : null ;
}
private ObjectId resolveSimple ( final String revstr ) throws IOException {
if ( ObjectId . isId ( revstr ) )
return ObjectId . fromString ( revstr ) ;
final Ref r = refs . getRef ( revstr ) ;
final Ref r = getRefDatabase ( ) . getRef ( revstr ) ;
return r ! = null ? r . getObjectId ( ) : null ;
}