Browse Source

AddCommand: Cleanup conditional logic

Unnest and simplify conditional logic for handling entries.

Change-Id: I3093cab5f0edfaf3efbbd6c644e9c922edc67d38
stable-4.3
Shawn Pearce 9 years ago
parent
commit
bb8627bd9b
  1. 79
      org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

79
org.eclipse.jgit/src/org/eclipse/jgit/api/AddCommand.java

@ -43,6 +43,9 @@
*/ */
package org.eclipse.jgit.api; package org.eclipse.jgit.api;
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import static org.eclipse.jgit.lib.FileMode.GITLINK;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
@ -58,8 +61,8 @@ import org.eclipse.jgit.dircache.DirCacheBuilder;
import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheEntry;
import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.dircache.DirCacheIterator;
import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.FileMode;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectInserter; import org.eclipse.jgit.lib.ObjectInserter;
import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.treewalk.FileTreeIterator; import org.eclipse.jgit.treewalk.FileTreeIterator;
@ -135,15 +138,12 @@ public class AddCommand extends GitCommand<DirCache> {
throw new NoFilepatternException(JGitText.get().atLeastOnePatternIsRequired); throw new NoFilepatternException(JGitText.get().atLeastOnePatternIsRequired);
checkCallable(); checkCallable();
DirCache dc = null; DirCache dc = null;
boolean addAll = false; boolean addAll = filepatterns.contains("."); //$NON-NLS-1$
if (filepatterns.contains(".")) //$NON-NLS-1$
addAll = true;
try (ObjectInserter inserter = repo.newObjectInserter(); try (ObjectInserter inserter = repo.newObjectInserter();
final TreeWalk tw = new TreeWalk(repo)) { final TreeWalk tw = new TreeWalk(repo)) {
tw.setOperationType(OperationType.CHECKIN_OP); tw.setOperationType(OperationType.CHECKIN_OP);
dc = repo.lockDirCache(); dc = repo.lockDirCache();
DirCacheIterator c;
DirCacheBuilder builder = dc.builder(); DirCacheBuilder builder = dc.builder();
tw.addTree(new DirCacheBuildIterator(builder)); tw.addTree(new DirCacheBuildIterator(builder));
@ -158,55 +158,60 @@ public class AddCommand extends GitCommand<DirCache> {
String lastAddedFile = null; String lastAddedFile = null;
while (tw.next()) { while (tw.next()) {
String path = tw.getPathString(); DirCacheIterator c = tw.getTree(0, DirCacheIterator.class);
WorkingTreeIterator f = tw.getTree(1, WorkingTreeIterator.class); WorkingTreeIterator f = tw.getTree(1, WorkingTreeIterator.class);
if (tw.getTree(0, DirCacheIterator.class) == null && if (c == null && f != null && f.isEntryIgnored()) {
f != null && f.isEntryIgnored()) {
// file is not in index but is ignored, do nothing // file is not in index but is ignored, do nothing
continue;
} else if (c == null && update) {
// Only update of existing entries was requested.
continue;
} }
String path = tw.getPathString();
if (path.equals(lastAddedFile)) {
// In case of an existing merge conflict the // In case of an existing merge conflict the
// DirCacheBuildIterator iterates over all stages of // DirCacheBuildIterator iterates over all stages of
// this path, we however want to add only one // this path, we however want to add only one
// new DirCacheEntry per path. // new DirCacheEntry per path.
else if (!(path.equals(lastAddedFile))) { continue;
if (!(update && tw.getTree(0, DirCacheIterator.class) == null)) { }
c = tw.getTree(0, DirCacheIterator.class);
if (f != null) { // the file exists if (f == null) { // working tree file does not exist
if (c != null
&& (!update || GITLINK == c.getEntryFileMode())) {
builder.add(c.getDirCacheEntry());
}
continue;
}
if (c != null && c.getDirCacheEntry() != null
&& c.getDirCacheEntry().isAssumeValid()) {
// Index entry is marked assume valid. Even though
// the user specified the file to be added JGit does
// not consider the file for addition.
builder.add(c.getDirCacheEntry());
continue;
}
long sz = f.getEntryLength(); long sz = f.getEntryLength();
DirCacheEntry entry = new DirCacheEntry(path); DirCacheEntry entry = new DirCacheEntry(path);
if (c == null || c.getDirCacheEntry() == null
|| !c.getDirCacheEntry().isAssumeValid()) {
FileMode mode = f.getIndexFileMode(c); FileMode mode = f.getIndexFileMode(c);
entry.setFileMode(mode); entry.setFileMode(mode);
if (FileMode.GITLINK != mode) { if (GITLINK != mode) {
entry.setLength(sz); entry.setLength(sz);
entry.setLastModified(f entry.setLastModified(f.getEntryLastModified());
.getEntryLastModified()); long len = f.getEntryContentLength();
long contentSize = f try (InputStream in = f.openEntryStream()) {
.getEntryContentLength(); ObjectId id = inserter.insert(OBJ_BLOB, len, in);
InputStream in = f.openEntryStream(); entry.setObjectId(id);
try {
entry.setObjectId(inserter.insert(
Constants.OBJ_BLOB, contentSize, in));
} finally {
in.close();
} }
} else } else {
entry.setObjectId(f.getEntryObjectId()); entry.setObjectId(f.getEntryObjectId());
}
builder.add(entry); builder.add(entry);
lastAddedFile = path; lastAddedFile = path;
} else {
builder.add(c.getDirCacheEntry());
}
} else if (c != null
&& (!update || FileMode.GITLINK == c
.getEntryFileMode()))
builder.add(c.getDirCacheEntry());
}
}
} }
inserter.flush(); inserter.flush();
builder.commit(); builder.commit();

Loading…
Cancel
Save