@ -64,6 +64,8 @@ import java.util.Map;
import java.util.Set ;
import java.util.concurrent.atomic.AtomicInteger ;
import org.eclipse.jgit.annotations.NonNull ;
import org.eclipse.jgit.annotations.Nullable ;
import org.eclipse.jgit.attributes.AttributesNodeProvider ;
import org.eclipse.jgit.dircache.DirCache ;
import org.eclipse.jgit.errors.AmbiguousObjectException ;
@ -138,6 +140,7 @@ public abstract class Repository implements AutoCloseable {
}
/** @return listeners observing only events on this repository. */
@NonNull
public ListenerList getListenerList ( ) {
return myListeners ;
}
@ -182,7 +185,16 @@ public abstract class Repository implements AutoCloseable {
* /
public abstract void create ( boolean bare ) throws IOException ;
/** @return local metadata directory; null if repository isn't local. */
/ * *
* @return local metadata directory ; { @code null } if repository isn ' t local .
* /
/ *
* TODO This method should be annotated as Nullable , because in some
* specific configurations metadata is not located in the local file system
* ( for example in memory databases ) . In "usual" repositories this
* annotation would only cause compiler errors at places where the actual
* directory can never be null .
* /
public File getDirectory ( ) {
return gitDir ;
}
@ -190,24 +202,29 @@ public abstract class Repository implements AutoCloseable {
/ * *
* @return the object database which stores this repository ' s data .
* /
@NonNull
public abstract ObjectDatabase getObjectDatabase ( ) ;
/** @return a new inserter to create objects in {@link #getObjectDatabase()} */
@NonNull
public ObjectInserter newObjectInserter ( ) {
return getObjectDatabase ( ) . newInserter ( ) ;
}
/** @return a new reader to read objects from {@link #getObjectDatabase()} */
@NonNull
public ObjectReader newObjectReader ( ) {
return getObjectDatabase ( ) . newReader ( ) ;
}
/** @return the reference database which stores the reference namespace. */
@NonNull
public abstract RefDatabase getRefDatabase ( ) ;
/ * *
* @return the configuration of this repository
* /
@NonNull
public abstract StoredConfig getConfig ( ) ;
/ * *
@ -217,11 +234,20 @@ public abstract class Repository implements AutoCloseable {
* instance for each use .
* @since 4 . 2
* /
@NonNull
public abstract AttributesNodeProvider createAttributesNodeProvider ( ) ;
/ * *
* @return the used file system abstraction
* @return the used file system abstraction , or or { @code null } if
* repository isn ' t local .
* /
/ *
* TODO This method should be annotated as Nullable , because in some
* specific configurations metadata is not located in the local file system
* ( for example in memory databases ) . In "usual" repositories this
* annotation would only cause compiler errors at places where the actual
* directory can never be null .
* /
public FS getFS ( ) {
return fs ;
@ -255,6 +281,7 @@ public abstract class Repository implements AutoCloseable {
* @throws IOException
* the object store cannot be accessed .
* /
@NonNull
public ObjectLoader open ( final AnyObjectId objectId )
throws MissingObjectException , IOException {
return getObjectDatabase ( ) . open ( objectId ) ;
@ -282,6 +309,7 @@ public abstract class Repository implements AutoCloseable {
* @throws IOException
* the object store cannot be accessed .
* /
@NonNull
public ObjectLoader open ( AnyObjectId objectId , int typeHint )
throws MissingObjectException , IncorrectObjectTypeException ,
IOException {
@ -300,6 +328,7 @@ public abstract class Repository implements AutoCloseable {
* a symbolic ref was passed in and could not be resolved back
* to the base ref , as the symbolic ref could not be read .
* /
@NonNull
public RefUpdate updateRef ( final String ref ) throws IOException {
return updateRef ( ref , false ) ;
}
@ -318,6 +347,7 @@ public abstract class Repository implements AutoCloseable {
* a symbolic ref was passed in and could not be resolved back
* to the base ref , as the symbolic ref could not be read .
* /
@NonNull
public RefUpdate updateRef ( final String ref , final boolean detach ) throws IOException {
return getRefDatabase ( ) . newUpdate ( ref , detach ) ;
}
@ -334,6 +364,7 @@ public abstract class Repository implements AutoCloseable {
* the rename could not be performed .
*
* /
@NonNull
public RefRename renameRef ( final String fromRef , final String toRef ) throws IOException {
return getRefDatabase ( ) . newRename ( fromRef , toRef ) ;
}
@ -373,7 +404,8 @@ public abstract class Repository implements AutoCloseable {
*
* @param revstr
* A git object references expression
* @return an ObjectId or null if revstr can ' t be resolved to any ObjectId
* @return an ObjectId or { @code null } if revstr can ' t be resolved to any
* ObjectId
* @throws AmbiguousObjectException
* { @code revstr } contains an abbreviated ObjectId and this
* repository contains more than one object which match to the
@ -387,6 +419,7 @@ public abstract class Repository implements AutoCloseable {
* @throws IOException
* on serious errors
* /
@Nullable
public ObjectId resolve ( final String revstr )
throws AmbiguousObjectException , IncorrectObjectTypeException ,
RevisionSyntaxException , IOException {
@ -408,10 +441,12 @@ public abstract class Repository implements AutoCloseable {
* expects a branch or revision id .
*
* @param revstr
* @return object id or ref name from resolved expression
* @return object id or ref name from resolved expression or { @code null } if
* given expression cannot be resolved
* @throws AmbiguousObjectException
* @throws IOException
* /
@Nullable
public String simplify ( final String revstr )
throws AmbiguousObjectException , IOException {
try ( RevWalk rw = new RevWalk ( this ) ) {
@ -425,6 +460,7 @@ public abstract class Repository implements AutoCloseable {
}
}
@Nullable
private Object resolve ( final RevWalk rw , final String revstr )
throws IOException {
char [ ] revChars = revstr . toCharArray ( ) ;
@ -728,11 +764,13 @@ public abstract class Repository implements AutoCloseable {
return true ;
}
@Nullable
private RevObject parseSimple ( RevWalk rw , String revstr ) throws IOException {
ObjectId id = resolveSimple ( revstr ) ;
return id ! = null ? rw . parseAny ( id ) : null ;
}
@Nullable
private ObjectId resolveSimple ( final String revstr ) throws IOException {
if ( ObjectId . isId ( revstr ) )
return ObjectId . fromString ( revstr ) ;
@ -760,6 +798,7 @@ public abstract class Repository implements AutoCloseable {
return null ;
}
@Nullable
private String resolveReflogCheckout ( int checkoutNo )
throws IOException {
ReflogReader reader = getReflogReader ( Constants . HEAD ) ;
@ -801,6 +840,7 @@ public abstract class Repository implements AutoCloseable {
return rw . parseCommit ( entry . getNewId ( ) ) ;
}
@Nullable
private ObjectId resolveAbbreviation ( final String revstr ) throws IOException ,
AmbiguousObjectException {
AbbreviatedObjectId id = AbbreviatedObjectId . fromString ( revstr ) ;
@ -837,11 +877,13 @@ public abstract class Repository implements AutoCloseable {
getRefDatabase ( ) . close ( ) ;
}
@NonNull
@SuppressWarnings ( "nls" )
public String toString ( ) {
String desc ;
if ( getDirectory ( ) ! = null )
desc = getDirectory ( ) . getPath ( ) ;
File directory = getDirectory ( ) ;
if ( directory ! = null )
desc = directory . getPath ( ) ;
else
desc = getClass ( ) . getSimpleName ( ) + "-" //$NON-NLS-1$
+ System . identityHashCode ( this ) ;
@ -861,10 +903,12 @@ public abstract class Repository implements AutoCloseable {
* current ObjectId in hexadecimal string format .
*
* @return name of current branch ( for example { @code refs / heads / master } ) ,
* an ObjectId in hex format if the current branch is detached ,
* or null if the repository is corrupt and has no HEAD reference .
* an ObjectId in hex format if the current branch is detached , or
* { @code null } if the repository is corrupt and has no HEAD
* reference .
* @throws IOException
* /
@Nullable
public String getFullBranch ( ) throws IOException {
Ref head = getRef ( Constants . HEAD ) ;
if ( head = = null )
@ -883,16 +927,17 @@ public abstract class Repository implements AutoCloseable {
* leading prefix { @code refs / heads / } is removed from the reference before
* it is returned to the caller .
*
* @return name of current branch ( for example { @code master } ) , an
* ObjectId in hex format if the current branch is detached ,
* or null if the repository is corrupt and has no HEAD reference .
* @return name of current branch ( for example { @code master } ) , an ObjectId
* in hex format if the current branch is detached , or { @code null }
* if the repository is corrupt and has no HEAD reference .
* @throws IOException
* /
@Nullable
public String getBranch ( ) throws IOException {
String name = getFullBranch ( ) ;
if ( name ! = null )
return shortenRefName ( name ) ;
return name ;
return null ;
}
/ * *
@ -905,6 +950,7 @@ public abstract class Repository implements AutoCloseable {
*
* @return unmodifiable collection of other known objects .
* /
@NonNull
public Set < ObjectId > getAdditionalHaves ( ) {
return Collections . emptySet ( ) ;
}
@ -916,9 +962,10 @@ public abstract class Repository implements AutoCloseable {
* the name of the ref to lookup . May be a short - hand form , e . g .
* "master" which is is automatically expanded to
* "refs/heads/master" if "refs/heads/master" already exists .
* @return the Ref with the given name , or null if it does not exist
* @return the Ref with the given name , or { @code null } if it does not exist
* @throws IOException
* /
@Nullable
public Ref getRef ( final String name ) throws IOException {
return getRefDatabase ( ) . getRef ( name ) ;
}
@ -926,6 +973,7 @@ public abstract class Repository implements AutoCloseable {
/ * *
* @return mutable map of all known refs ( heads , tags , remotes ) .
* /
@NonNull
public Map < String , Ref > getAllRefs ( ) {
try {
return getRefDatabase ( ) . getRefs ( RefDatabase . ALL ) ;
@ -939,6 +987,7 @@ public abstract class Repository implements AutoCloseable {
* of the entry contains the ref with the full tag name
* ( "refs/tags/v1.0" ) .
* /
@NonNull
public Map < String , Ref > getTags ( ) {
try {
return getRefDatabase ( ) . getRefs ( Constants . R_TAGS ) ;
@ -960,6 +1009,7 @@ public abstract class Repository implements AutoCloseable {
* will be true and getPeeledObjectId will contain the peeled object
* ( or null ) .
* /
@NonNull
public Ref peel ( final Ref ref ) {
try {
return getRefDatabase ( ) . peel ( ref ) ;
@ -974,6 +1024,7 @@ public abstract class Repository implements AutoCloseable {
/ * *
* @return a map with all objects referenced by a peeled ref .
* /
@NonNull
public Map < AnyObjectId , Set < Ref > > getAllRefsByPeeledObjectId ( ) {
Map < String , Ref > allRefs = getAllRefs ( ) ;
Map < AnyObjectId , Set < Ref > > ret = new HashMap < AnyObjectId , Set < Ref > > ( allRefs . size ( ) ) ;
@ -998,11 +1049,13 @@ public abstract class Repository implements AutoCloseable {
}
/ * *
* @return the index file location
* @return the index file location or { @code null } if repository isn ' t
* local .
* @throws NoWorkTreeException
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@NonNull
public File getIndexFile ( ) throws NoWorkTreeException {
if ( isBare ( ) )
throw new NoWorkTreeException ( ) ;
@ -1027,6 +1080,7 @@ public abstract class Repository implements AutoCloseable {
* the index file is using a format or extension that this
* library does not support .
* /
@NonNull
public DirCache readDirCache ( ) throws NoWorkTreeException ,
CorruptObjectException , IOException {
return DirCache . read ( this ) ;
@ -1051,6 +1105,7 @@ public abstract class Repository implements AutoCloseable {
* the index file is using a format or extension that this
* library does not support .
* /
@NonNull
public DirCache lockDirCache ( ) throws NoWorkTreeException ,
CorruptObjectException , IOException {
// we want DirCache to inform us so that we can inform registered
@ -1076,6 +1131,7 @@ public abstract class Repository implements AutoCloseable {
/ * *
* @return an important state
* /
@NonNull
public RepositoryState getRepositoryState ( ) {
if ( isBare ( ) | | getDirectory ( ) = = null )
return RepositoryState . BARE ;
@ -1218,6 +1274,7 @@ public abstract class Repository implements AutoCloseable {
* @return normalized repository relative path or the empty
* string if the file is not relative to the work directory .
* /
@NonNull
public static String stripWorkDir ( File workDir , File file ) {
final String filePath = file . getPath ( ) ;
final String workDirPath = workDir . getPath ( ) ;
@ -1252,6 +1309,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@NonNull
public File getWorkTree ( ) throws NoWorkTreeException {
if ( isBare ( ) )
throw new NoWorkTreeException ( ) ;
@ -1275,6 +1333,7 @@ public abstract class Repository implements AutoCloseable {
*
* @return a more user friendly ref name
* /
@NonNull
public static String shortenRefName ( String refName ) {
if ( refName . startsWith ( Constants . R_HEADS ) )
return refName . substring ( Constants . R_HEADS . length ( ) ) ;
@ -1290,9 +1349,10 @@ public abstract class Repository implements AutoCloseable {
* @return the remote branch name part of < code > refName < / code > , i . e . without
* the < code > refs / remotes / & lt ; remote & gt ; < / code > prefix , if
* < code > refName < / code > represents a remote tracking branch ;
* otherwise null .
* otherwise { @code null } .
* @since 3 . 4
* /
@Nullable
public String shortenRemoteBranchName ( String refName ) {
for ( String remote : getRemoteNames ( ) ) {
String remotePrefix = Constants . R_REMOTES + remote + "/" ; //$NON-NLS-1$
@ -1307,9 +1367,10 @@ public abstract class Repository implements AutoCloseable {
* @return the remote name part of < code > refName < / code > , i . e . without the
* < code > refs / remotes / & lt ; remote & gt ; < / code > prefix , if
* < code > refName < / code > represents a remote tracking branch ;
* otherwise null .
* otherwise { @code null } .
* @since 3 . 4
* /
@Nullable
public String getRemoteName ( String refName ) {
for ( String remote : getRemoteNames ( ) ) {
String remotePrefix = Constants . R_REMOTES + remote + "/" ; //$NON-NLS-1$
@ -1321,12 +1382,13 @@ public abstract class Repository implements AutoCloseable {
/ * *
* @param refName
* @return a { @link ReflogReader } for the supplied refname , or null if the
* named ref does not exist .
* @return a { @link ReflogReader } for the supplied refname , or { @code null }
* if the named ref does not exist .
* @throws IOException
* the ref could not be accessed .
* @since 3 . 0
* /
@Nullable
public abstract ReflogReader getReflogReader ( String refName )
throws IOException ;
@ -1342,6 +1404,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public String readMergeCommitMsg ( ) throws IOException , NoWorkTreeException {
return readCommitMsgFile ( Constants . MERGE_MSG ) ;
}
@ -1376,6 +1439,7 @@ public abstract class Repository implements AutoCloseable {
* See { @link # isBare ( ) } .
* @since 4 . 0
* /
@Nullable
public String readCommitEditMsg ( ) throws IOException , NoWorkTreeException {
return readCommitMsgFile ( Constants . COMMIT_EDITMSG ) ;
}
@ -1410,6 +1474,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public List < ObjectId > readMergeHeads ( ) throws IOException , NoWorkTreeException {
if ( isBare ( ) | | getDirectory ( ) = = null )
throw new NoWorkTreeException ( ) ;
@ -1453,6 +1518,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public ObjectId readCherryPickHead ( ) throws IOException ,
NoWorkTreeException {
if ( isBare ( ) | | getDirectory ( ) = = null )
@ -1476,6 +1542,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public ObjectId readRevertHead ( ) throws IOException , NoWorkTreeException {
if ( isBare ( ) | | getDirectory ( ) = = null )
throw new NoWorkTreeException ( ) ;
@ -1541,6 +1608,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public ObjectId readOrigHead ( ) throws IOException , NoWorkTreeException {
if ( isBare ( ) | | getDirectory ( ) = = null )
throw new NoWorkTreeException ( ) ;
@ -1561,6 +1629,7 @@ public abstract class Repository implements AutoCloseable {
* if this is bare , which implies it has no working directory .
* See { @link # isBare ( ) } .
* /
@Nullable
public String readSquashCommitMsg ( ) throws IOException {
return readCommitMsgFile ( Constants . SQUASH_MSG ) ;
}
@ -1582,6 +1651,7 @@ public abstract class Repository implements AutoCloseable {
writeCommitMsg ( squashMsgFile , msg ) ;
}
@Nullable
private String readCommitMsgFile ( String msgFilename ) throws IOException {
if ( isBare ( ) | | getDirectory ( ) = = null )
throw new NoWorkTreeException ( ) ;
@ -1615,9 +1685,11 @@ public abstract class Repository implements AutoCloseable {
* Read a file from the git directory .
*
* @param filename
* @return the raw contents or null if the file doesn ' t exist or is empty
* @return the raw contents or { @code null } if the file doesn ' t exist or is
* empty
* @throws IOException
* /
@Nullable
private byte [ ] readGitDirectoryFile ( String filename ) throws IOException {
File file = new File ( getDirectory ( ) , filename ) ;
try {
@ -1674,6 +1746,7 @@ public abstract class Repository implements AutoCloseable {
* @throws IOException
* @since 3 . 2
* /
@NonNull
public List < RebaseTodoLine > readRebaseTodo ( String path ,
boolean includeComments )
throws IOException {
@ -1703,6 +1776,7 @@ public abstract class Repository implements AutoCloseable {
* @return the names of all known remotes
* @since 3 . 4
* /
@NonNull
public Set < String > getRemoteNames ( ) {
return getConfig ( )
. getSubsections ( ConfigConstants . CONFIG_REMOTE_SECTION ) ;