Null-annotated Repository class and fixed related compiler errors
org.eclipse.jgit.lib.Repository class is an example of the API which should be written with Java 8 java.util.Optional<T> type. Unfortunately this API is already released and widely used. The good clients are currently doing their best with checking return values for null and bad clients do not know how bad their code is. I've tried not to change any logic and to be as less intrusive as possible. Most of the JGit code was well prepared to this, only few classes needed some smaller fixes. This change fixes all compiler errors in JGit and replaces possible NPE's with either appropriate exceptions, avoiding multiple "Nullable return" method calls or early returning from the method. Because annotating getDirectory() and getFS() as Nullable would cause lot of additional changes in JGit and EGit they are postponed. Change-Id: Ie8369d2c9c5fac5ce83b3b1b9bc217d7b55502a3 Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
This commit is contained in:
parent
d2faec27a7
commit
1020f40813
|
@ -143,6 +143,7 @@ notAJgitCommand={0} is not a jgit command
|
|||
notARevision=Not a revision: {0}
|
||||
notATree={0} is not a tree
|
||||
notAValidRefName={0} is not a valid ref name
|
||||
notAValidCommitName={0} is not a valid commit name
|
||||
notAnIndexFile={0} is not an index file
|
||||
notAnObject={0} is not an object
|
||||
notFound=!! NOT FOUND !!
|
||||
|
|
|
@ -154,10 +154,14 @@ protected void run() throws Exception {
|
|||
startBranch = Constants.HEAD;
|
||||
Ref startRef = db.getRef(startBranch);
|
||||
ObjectId startAt = db.resolve(startBranch + "^0"); //$NON-NLS-1$
|
||||
if (startRef != null)
|
||||
if (startRef != null) {
|
||||
startBranch = startRef.getName();
|
||||
else
|
||||
} else if (startAt != null) {
|
||||
startBranch = startAt.name();
|
||||
} else {
|
||||
throw die(MessageFormat.format(
|
||||
CLIText.get().notAValidCommitName, startBranch));
|
||||
}
|
||||
startBranch = Repository.shortenRefName(startBranch);
|
||||
String newRefName = newHead;
|
||||
if (!newRefName.startsWith(Constants.R_HEADS))
|
||||
|
@ -249,7 +253,7 @@ private void delete(boolean force) throws IOException {
|
|||
String current = db.getBranch();
|
||||
ObjectId head = db.resolve(Constants.HEAD);
|
||||
for (String branch : branches) {
|
||||
if (current.equals(branch)) {
|
||||
if (branch.equals(current)) {
|
||||
throw die(MessageFormat.format(CLIText.get().cannotDeleteTheBranchWhichYouAreCurrentlyOn, branch));
|
||||
}
|
||||
RefUpdate update = db.updateRef((remote ? Constants.R_REMOTES
|
||||
|
|
|
@ -96,6 +96,9 @@ protected void run() throws NoHeadException, NoMessageException,
|
|||
commitCmd.setAmend(amend);
|
||||
commitCmd.setAll(all);
|
||||
Ref head = db.getRef(Constants.HEAD);
|
||||
if (head == null) {
|
||||
throw die(CLIText.get().onBranchToBeBorn);
|
||||
}
|
||||
RevCommit commit;
|
||||
try {
|
||||
commit = commitCmd.call();
|
||||
|
|
|
@ -120,7 +120,7 @@ protected void run() throws Exception {
|
|||
throw die(MessageFormat.format(
|
||||
CLIText.get().refDoesNotExistOrNoCommit, ref));
|
||||
|
||||
Ref oldHead = db.getRef(Constants.HEAD);
|
||||
Ref oldHead = getOldHead();
|
||||
MergeResult result;
|
||||
try (Git git = new Git(db)) {
|
||||
MergeCommand mergeCmd = git.merge().setStrategy(mergeStrategy)
|
||||
|
@ -205,6 +205,14 @@ protected void run() throws Exception {
|
|||
}
|
||||
}
|
||||
|
||||
private Ref getOldHead() throws IOException {
|
||||
Ref oldHead = db.getRef(Constants.HEAD);
|
||||
if (oldHead == null) {
|
||||
throw die(CLIText.get().onBranchToBeBorn);
|
||||
}
|
||||
return oldHead;
|
||||
}
|
||||
|
||||
private boolean isMergedInto(Ref oldHead, AnyObjectId src)
|
||||
throws IOException {
|
||||
try (RevWalk revWalk = new RevWalk(db)) {
|
||||
|
|
|
@ -242,9 +242,10 @@ public int compare(Test a, Test b) {
|
|||
}
|
||||
});
|
||||
|
||||
if (db.getDirectory() != null) {
|
||||
String name = db.getDirectory().getName();
|
||||
File parent = db.getDirectory().getParentFile();
|
||||
File directory = db.getDirectory();
|
||||
if (directory != null) {
|
||||
String name = directory.getName();
|
||||
File parent = directory.getParentFile();
|
||||
if (name.equals(Constants.DOT_GIT) && parent != null)
|
||||
name = parent.getName();
|
||||
outw.println(name + ": start at " + startId.name());
|
||||
|
|
|
@ -117,9 +117,12 @@ class RebuildCommitGraph extends TextBuiltin {
|
|||
@Override
|
||||
protected void run() throws Exception {
|
||||
if (!really && !db.getRefDatabase().getRefs(ALL).isEmpty()) {
|
||||
File directory = db.getDirectory();
|
||||
String absolutePath = directory == null ? "null" //$NON-NLS-1$
|
||||
: directory.getAbsolutePath();
|
||||
errw.println(
|
||||
MessageFormat.format(CLIText.get().fatalThisProgramWillDestroyTheRepository
|
||||
, db.getDirectory().getAbsolutePath(), REALLY));
|
||||
, absolutePath, REALLY));
|
||||
throw die(CLIText.get().needApprovalToDestroyCurrentRepository);
|
||||
}
|
||||
if (!refList.isFile())
|
||||
|
|
|
@ -341,9 +341,10 @@ private void run(Repository db) throws Exception {
|
|||
}
|
||||
}
|
||||
|
||||
if (db.getDirectory() != null) {
|
||||
String name = db.getDirectory().getName();
|
||||
File parent = db.getDirectory().getParentFile();
|
||||
File directory = db.getDirectory();
|
||||
if (directory != null) {
|
||||
String name = directory.getName();
|
||||
File parent = directory.getParentFile();
|
||||
if (name.equals(Constants.DOT_GIT) && parent != null)
|
||||
name = parent.getName();
|
||||
outw.println(name + ":"); //$NON-NLS-1$
|
||||
|
|
|
@ -202,6 +202,7 @@ public static String formatLine(String line) {
|
|||
/***/ public String notARevision;
|
||||
/***/ public String notATree;
|
||||
/***/ public String notAValidRefName;
|
||||
/***/ public String notAValidCommitName;
|
||||
/***/ public String notAnIndexFile;
|
||||
/***/ public String notAnObject;
|
||||
/***/ public String notFound;
|
||||
|
|
|
@ -45,6 +45,7 @@ cannotBeCombined=Cannot be combined.
|
|||
cannotBeRecursiveWhenTreesAreIncluded=TreeWalk shouldn't be recursive when tree objects are included.
|
||||
cannotChangeActionOnComment=Cannot change action on comment line in git-rebase-todo file, old action: {0}, new action: {1}.
|
||||
cannotChangeToComment=Cannot change a non-comment line to a comment line.
|
||||
cannotCheckoutFromUnbornBranch=Cannot checkout from unborn branch
|
||||
cannotCheckoutOursSwitchBranch=Checking out ours/theirs is only possible when checking out index, not when switching branches.
|
||||
cannotCombineSquashWithNoff=Cannot combine --squash with --no-ff.
|
||||
cannotCombineTreeFilterWithRevFilter=Cannot combine TreeFilter {0} with RevFilter {1}.
|
||||
|
@ -345,6 +346,7 @@ invalidPathReservedOnWindows=Invalid path (''{0}'' is reserved on Windows): {1}
|
|||
invalidReflogRevision=Invalid reflog revision: {0}
|
||||
invalidRefName=Invalid ref name: {0}
|
||||
invalidRemote=Invalid remote: {0}
|
||||
invalidRepositoryStateNoHead=Invalid repository --- cannot read HEAD
|
||||
invalidShallowObject=invalid shallow object {0}, expected commit
|
||||
invalidStageForPath=Invalid stage {0} for path {1}
|
||||
invalidTagOption=Invalid tag option: {0}
|
||||
|
|
|
@ -222,6 +222,12 @@ public Ref call() throws GitAPIException, RefAlreadyExistsException,
|
|||
}
|
||||
|
||||
Ref headRef = repo.getRef(Constants.HEAD);
|
||||
if (headRef == null) {
|
||||
// TODO Git CLI supports checkout from unborn branch, we should
|
||||
// also allow this
|
||||
throw new UnsupportedOperationException(
|
||||
JGitText.get().cannotCheckoutFromUnbornBranch);
|
||||
}
|
||||
String shortHeadRef = getShortBranchName(headRef);
|
||||
String refLogMessage = "checkout: moving from " + shortHeadRef; //$NON-NLS-1$
|
||||
ObjectId branch;
|
||||
|
|
|
@ -668,12 +668,13 @@ private void writeCurrentCommit(RevCommit commit) throws IOException {
|
|||
}
|
||||
|
||||
private void writeRewrittenHashes() throws RevisionSyntaxException,
|
||||
IOException {
|
||||
IOException, RefNotFoundException {
|
||||
File currentCommitFile = rebaseState.getFile(CURRENT_COMMIT);
|
||||
if (!currentCommitFile.exists())
|
||||
return;
|
||||
|
||||
String head = repo.resolve(Constants.HEAD).getName();
|
||||
ObjectId headId = getHead().getObjectId();
|
||||
String head = headId.getName();
|
||||
String currentCommits = rebaseState.readFile(CURRENT_COMMIT);
|
||||
for (String current : currentCommits.split("\n")) //$NON-NLS-1$
|
||||
RebaseState
|
||||
|
@ -743,8 +744,8 @@ private RevCommit doSquashFixup(boolean isSquash, RevCommit commitToPick,
|
|||
|
||||
private void resetSoftToParent() throws IOException,
|
||||
GitAPIException, CheckoutConflictException {
|
||||
Ref orig_head = repo.getRef(Constants.ORIG_HEAD);
|
||||
ObjectId orig_headId = orig_head.getObjectId();
|
||||
Ref ref = repo.getRef(Constants.ORIG_HEAD);
|
||||
ObjectId orig_head = ref == null ? null : ref.getObjectId();
|
||||
try {
|
||||
// we have already commited the cherry-picked commit.
|
||||
// what we need is to have changes introduced by this
|
||||
|
@ -755,7 +756,7 @@ private void resetSoftToParent() throws IOException,
|
|||
} finally {
|
||||
// set ORIG_HEAD back to where we started because soft
|
||||
// reset moved it
|
||||
repo.writeOrigHead(orig_headId);
|
||||
repo.writeOrigHead(orig_head);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
import org.eclipse.jgit.api.errors.GitAPIException;
|
||||
import org.eclipse.jgit.api.errors.InvalidRefNameException;
|
||||
import org.eclipse.jgit.api.errors.JGitInternalException;
|
||||
import org.eclipse.jgit.api.errors.NoHeadException;
|
||||
import org.eclipse.jgit.api.errors.RefAlreadyExistsException;
|
||||
import org.eclipse.jgit.api.errors.RefNotFoundException;
|
||||
import org.eclipse.jgit.internal.JGitText;
|
||||
|
@ -121,6 +122,10 @@ public Ref call() throws GitAPIException, RefNotFoundException, InvalidRefNameEx
|
|||
fullOldName = ref.getName();
|
||||
} else {
|
||||
fullOldName = repo.getFullBranch();
|
||||
if (fullOldName == null) {
|
||||
throw new NoHeadException(
|
||||
JGitText.get().invalidRepositoryStateNoHead);
|
||||
}
|
||||
if (ObjectId.isId(fullOldName))
|
||||
throw new DetachedHeadException();
|
||||
}
|
||||
|
|
|
@ -104,6 +104,7 @@ public static JGitText get() {
|
|||
/***/ public String cannotBeRecursiveWhenTreesAreIncluded;
|
||||
/***/ public String cannotChangeActionOnComment;
|
||||
/***/ public String cannotChangeToComment;
|
||||
/***/ public String cannotCheckoutFromUnbornBranch;
|
||||
/***/ public String cannotCheckoutOursSwitchBranch;
|
||||
/***/ public String cannotCombineSquashWithNoff;
|
||||
/***/ public String cannotCombineTreeFilterWithRevFilter;
|
||||
|
@ -411,6 +412,7 @@ public static JGitText get() {
|
|||
/***/ public String invalidURL;
|
||||
/***/ public String invalidWildcards;
|
||||
/***/ public String invalidRefSpec;
|
||||
/***/ public String invalidRepositoryStateNoHead;
|
||||
/***/ public String invalidWindowSize;
|
||||
/***/ public String isAStaticFlagAndHasNorevWalkInstance;
|
||||
/***/ public String JRELacksMD5Implementation;
|
||||
|
|
|
@ -90,6 +90,7 @@
|
|||
import org.eclipse.jgit.lib.Ref.Storage;
|
||||
import org.eclipse.jgit.lib.RefDatabase;
|
||||
import org.eclipse.jgit.lib.ReflogEntry;
|
||||
import org.eclipse.jgit.lib.ReflogReader;
|
||||
import org.eclipse.jgit.revwalk.ObjectWalk;
|
||||
import org.eclipse.jgit.revwalk.RevObject;
|
||||
import org.eclipse.jgit.revwalk.RevWalk;
|
||||
|
@ -592,7 +593,11 @@ public Collection<PackFile> repack() throws IOException {
|
|||
* @throws IOException
|
||||
*/
|
||||
private Set<ObjectId> listRefLogObjects(Ref ref, long minTime) throws IOException {
|
||||
List<ReflogEntry> rlEntries = repo.getReflogReader(ref.getName())
|
||||
ReflogReader reflogReader = repo.getReflogReader(ref.getName());
|
||||
if (reflogReader == null) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
List<ReflogEntry> rlEntries = reflogReader
|
||||
.getReverseEntries();
|
||||
if (rlEntries == null || rlEntries.isEmpty())
|
||||
return Collections.<ObjectId> emptySet();
|
||||
|
@ -635,10 +640,7 @@ private Map<String, Ref> getAllRefs() throws IOException {
|
|||
*/
|
||||
private Set<ObjectId> listNonHEADIndexObjects()
|
||||
throws CorruptObjectException, IOException {
|
||||
try {
|
||||
if (repo.getIndexFile() == null)
|
||||
return Collections.emptySet();
|
||||
} catch (NoWorkTreeException e) {
|
||||
if (repo.isBare()) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
try (TreeWalk treeWalk = new TreeWalk(repo)) {
|
||||
|
|
|
@ -170,7 +170,7 @@ public Result rename() throws IOException {
|
|||
*/
|
||||
protected boolean needToUpdateHEAD() throws IOException {
|
||||
Ref head = source.getRefDatabase().getRef(Constants.HEAD);
|
||||
if (head.isSymbolic()) {
|
||||
if (head != null && head.isSymbolic()) {
|
||||
head = head.getTarget();
|
||||
return head.getName().equals(source.getName());
|
||||
}
|
||||
|
|
|
@ -64,6 +64,8 @@
|
|||
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 @@ protected Repository(final BaseRepositoryBuilder options) {
|
|||
}
|
||||
|
||||
/** @return listeners observing only events on this repository. */
|
||||
@NonNull
|
||||
public ListenerList getListenerList() {
|
||||
return myListeners;
|
||||
}
|
||||
|
@ -182,7 +185,16 @@ public void create() throws IOException {
|
|||
*/
|
||||
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 File getDirectory() {
|
|||
/**
|
||||
* @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 ObjectReader newObjectReader() {
|
|||
* 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 boolean hasObject(AnyObjectId objectId) {
|
|||
* @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 ObjectLoader open(final AnyObjectId objectId)
|
|||
* @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 ObjectLoader open(AnyObjectId objectId, int typeHint)
|
|||
* 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 RefUpdate updateRef(final String ref) throws IOException {
|
|||
* 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 RefUpdate updateRef(final String ref, final boolean detach) throws IOExce
|
|||
* 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 RefRename renameRef(final String fromRef, final String toRef) throws IOEx
|
|||
*
|
||||
* @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 RefRename renameRef(final String fromRef, final String toRef) throws IOEx
|
|||
* @throws IOException
|
||||
* on serious errors
|
||||
*/
|
||||
@Nullable
|
||||
public ObjectId resolve(final String revstr)
|
||||
throws AmbiguousObjectException, IncorrectObjectTypeException,
|
||||
RevisionSyntaxException, IOException {
|
||||
|
@ -408,10 +441,12 @@ public ObjectId resolve(final String revstr)
|
|||
* 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 String simplify(final String revstr)
|
|||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Object resolve(final RevWalk rw, final String revstr)
|
||||
throws IOException {
|
||||
char[] revChars = revstr.toCharArray();
|
||||
|
@ -728,11 +764,13 @@ private static boolean isAllHex(String str, int ptr) {
|
|||
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 @@ && isAllHex(revstr, dashg + 4)) {
|
|||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String resolveReflogCheckout(int checkoutNo)
|
||||
throws IOException {
|
||||
ReflogReader reader = getReflogReader(Constants.HEAD);
|
||||
|
@ -801,6 +840,7 @@ private RevCommit resolveReflog(RevWalk rw, Ref ref, String time)
|
|||
return rw.parseCommit(entry.getNewId());
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private ObjectId resolveAbbreviation(final String revstr) throws IOException,
|
||||
AmbiguousObjectException {
|
||||
AbbreviatedObjectId id = AbbreviatedObjectId.fromString(revstr);
|
||||
|
@ -837,11 +877,13 @@ protected void doClose() {
|
|||
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 String toString() {
|
|||
* 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 String getFullBranch() throws IOException {
|
|||
* 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 String getBranch() throws IOException {
|
|||
*
|
||||
* @return unmodifiable collection of other known objects.
|
||||
*/
|
||||
@NonNull
|
||||
public Set<ObjectId> getAdditionalHaves() {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
|
@ -916,9 +962,10 @@ public Set<ObjectId> getAdditionalHaves() {
|
|||
* 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 Ref getRef(final String name) throws IOException {
|
|||
/**
|
||||
* @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 Map<String, Ref> getAllRefs() {
|
|||
* 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 Map<String, Ref> getTags() {
|
|||
* 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 Ref peel(final Ref ref) {
|
|||
/**
|
||||
* @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 Map<AnyObjectId, Set<Ref>> getAllRefsByPeeledObjectId() {
|
|||
}
|
||||
|
||||
/**
|
||||
* @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 File getIndexFile() throws NoWorkTreeException {
|
|||
* 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 DirCache readDirCache() throws NoWorkTreeException,
|
|||
* 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 @@ static byte[] gitInternalSlash(byte[] bytes) {
|
|||
/**
|
||||
* @return an important state
|
||||
*/
|
||||
@NonNull
|
||||
public RepositoryState getRepositoryState() {
|
||||
if (isBare() || getDirectory() == null)
|
||||
return RepositoryState.BARE;
|
||||
|
@ -1218,6 +1274,7 @@ public static boolean isValidRefName(final String refName) {
|
|||
* @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 boolean isBare() {
|
|||
* 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 File getWorkTree() throws NoWorkTreeException {
|
|||
*
|
||||
* @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 static String shortenRefName(String refName) {
|
|||
* @return the remote branch name part of <code>refName</code>, i.e. without
|
||||
* the <code>refs/remotes/<remote></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 String shortenRemoteBranchName(String refName) {
|
|||
* @return the remote name part of <code>refName</code>, i.e. without the
|
||||
* <code>refs/remotes/<remote></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 String getRemoteName(String refName) {
|
|||
|
||||
/**
|
||||
* @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 ReflogReader getReflogReader(String refName)
|
|||
* 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 void writeMergeCommitMsg(String msg) throws IOException {
|
|||
* See {@link #isBare()}.
|
||||
* @since 4.0
|
||||
*/
|
||||
@Nullable
|
||||
public String readCommitEditMsg() throws IOException, NoWorkTreeException {
|
||||
return readCommitMsgFile(Constants.COMMIT_EDITMSG);
|
||||
}
|
||||
|
@ -1410,6 +1474,7 @@ public void writeCommitEditMsg(String msg) throws IOException {
|
|||
* 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 void writeMergeHeads(List<? extends ObjectId> heads) throws IOException {
|
|||
* 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 ObjectId readCherryPickHead() throws IOException,
|
|||
* 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 void writeOrigHead(ObjectId head) throws IOException {
|
|||
* 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 ObjectId readOrigHead() throws IOException, NoWorkTreeException {
|
|||
* 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 void writeSquashCommitMsg(String msg) throws IOException {
|
|||
writeCommitMsg(squashMsgFile, msg);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String readCommitMsgFile(String msgFilename) throws IOException {
|
||||
if (isBare() || getDirectory() == null)
|
||||
throw new NoWorkTreeException();
|
||||
|
@ -1615,9 +1685,11 @@ private void writeCommitMsg(File msgFile, String msg) throws IOException {
|
|||
* 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 @@ private void writeHeadsFile(List<? extends ObjectId> heads, String filename)
|
|||
* @throws IOException
|
||||
* @since 3.2
|
||||
*/
|
||||
@NonNull
|
||||
public List<RebaseTodoLine> readRebaseTodo(String path,
|
||||
boolean includeComments)
|
||||
throws IOException {
|
||||
|
@ -1703,6 +1776,7 @@ public void writeRebaseTodoFile(String path, List<RebaseTodoLine> steps,
|
|||
* @return the names of all known remotes
|
||||
* @since 3.4
|
||||
*/
|
||||
@NonNull
|
||||
public Set<String> getRemoteNames() {
|
||||
return getConfig()
|
||||
.getSubsections(ConfigConstants.CONFIG_REMOTE_SECTION);
|
||||
|
|
|
@ -786,11 +786,6 @@ private void updateIndex(CanonicalTreeParser base,
|
|||
private File writeMergedFile(MergeResult<RawText> result)
|
||||
throws FileNotFoundException, IOException {
|
||||
File workTree = db.getWorkTree();
|
||||
if (workTree == null)
|
||||
// TODO: This should be handled by WorkingTreeIterators which
|
||||
// support write operations
|
||||
throw new UnsupportedOperationException();
|
||||
|
||||
FS fs = db.getFS();
|
||||
File of = new File(workTree, tw.getPathString());
|
||||
File parentFolder = of.getParentFile();
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
*/
|
||||
package org.eclipse.jgit.transport;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
@ -85,12 +86,16 @@ public HMACSHA1NonceGenerator(String seed) throws IllegalStateException {
|
|||
public synchronized String createNonce(Repository repo, long timestamp)
|
||||
throws IllegalStateException {
|
||||
String path;
|
||||
if (repo instanceof DfsRepository)
|
||||
if (repo instanceof DfsRepository) {
|
||||
path = ((DfsRepository) repo).getDescription().getRepositoryName();
|
||||
else if (repo.getDirectory() != null)
|
||||
path = repo.getDirectory().getPath();
|
||||
else
|
||||
throw new IllegalStateException();
|
||||
} else {
|
||||
File directory = repo.getDirectory();
|
||||
if (directory != null) {
|
||||
path = directory.getPath();
|
||||
} else {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
}
|
||||
|
||||
String input = path + ":" + String.valueOf(timestamp); //$NON-NLS-1$
|
||||
byte[] rawHmac;
|
||||
|
|
|
@ -148,8 +148,9 @@ public Transport open(URIish uri, Repository local, String remoteName)
|
|||
super(local, uri);
|
||||
|
||||
Properties props = loadProperties();
|
||||
if (!props.containsKey("tmpdir") && local.getDirectory() != null) //$NON-NLS-1$
|
||||
props.put("tmpdir", local.getDirectory().getPath()); //$NON-NLS-1$
|
||||
File directory = local.getDirectory();
|
||||
if (!props.containsKey("tmpdir") && directory != null) //$NON-NLS-1$
|
||||
props.put("tmpdir", directory.getPath()); //$NON-NLS-1$
|
||||
|
||||
s3 = new AmazonS3(props);
|
||||
bucket = uri.getHost();
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
|
||||
package org.eclipse.jgit.transport;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.text.MessageFormat;
|
||||
|
@ -235,9 +236,10 @@ public Process exec(String command, int timeout)
|
|||
ProcessBuilder pb = new ProcessBuilder();
|
||||
pb.command(args);
|
||||
|
||||
if (local.getDirectory() != null)
|
||||
File directory = local.getDirectory();
|
||||
if (directory != null)
|
||||
pb.environment().put(Constants.GIT_DIR_KEY,
|
||||
local.getDirectory().getPath());
|
||||
directory.getPath());
|
||||
|
||||
try {
|
||||
return pb.start();
|
||||
|
|
|
@ -168,6 +168,9 @@ public ProcessResult runHookIfPresent(Repository repository, String hookName,
|
|||
@Override
|
||||
public File findHook(Repository repository, String hookName) {
|
||||
final File gitdir = repository.getDirectory();
|
||||
if (gitdir == null) {
|
||||
return null;
|
||||
}
|
||||
final Path hookPath = gitdir.toPath().resolve(Constants.HOOKS)
|
||||
.resolve(hookName);
|
||||
if (Files.isExecutable(hookPath))
|
||||
|
|
Loading…
Reference in New Issue