for (int i = removed.size() - 1; i >= 0; i--) {
String r = removed.get(i);
file = new File(repo.getWorkTree(), r);
- if (!file.delete() && file.exists())
- toBeDeleted.add(r);
- else {
+ if (!file.delete() && file.exists()) {
+ // The list of stuff to delete comes from the index
+ // which will only contain a directory if it is
+ // a submodule, in which case we shall not attempt
+ // to delete it. A submodule is not empty, so it
+ // is safe to check this after a failed delete.
+ if (!file.isDirectory())
+ toBeDeleted.add(r);
+ } else {
if (!isSamePrefix(r, last))
removeEmptyParents(new File(repo.getWorkTree(), last));
last = r;
if (i == null) {
// make sure not to overwrite untracked files
if (f != null) {
- // a dirty worktree: the index is empty but we have a
- // workingtree-file
- if (mId == null || !mId.equals(f.getEntryObjectId())) {
- conflict(name, null, h, m);
- return;
+ // A submodule is not a file. We should ignore it
+ if (!FileMode.GITLINK.equals(m.getEntryFileMode())) {
+ // a dirty worktree: the index is empty but we have a
+ // workingtree-file
+ if (mId == null || !mId.equals(f.getEntryObjectId())) {
+ conflict(name, null, h, m);
+ return;
+ }
}
}
* </pre>
*/
- if (hId.equals(iId)) {
- if (f == null || f.isModified(dce, true))
+ if (dce.getFileMode() == FileMode.GITLINK) {
+ // Submodules that disappear from the checkout must
+ // be removed from the index, but not deleted from disk.
+ remove(name);
+ } else {
+ if (hId.equals(iId)) {
+ if (f == null || f.isModified(dce, true))
+ conflict(name, dce, h, m);
+ else
+ remove(name);
+ } else
conflict(name, dce, h, m);
- else
- remove(name);
- } else
- conflict(name, dce, h, m);
+ }
} else {
if (!hId.equals(mId) && !hId.equals(iId) && !mId.equals(iId))
conflict(name, dce, h, m);
else if (hId.equals(iId) && !mId.equals(iId)) {
- if (dce != null && (f == null || f.isModified(dce, true)))
+ // For submodules just update the index with the new SHA-1
+ if (dce != null
+ && FileMode.GITLINK.equals(dce.getFileMode())) {
+ update(name, mId, m.getEntryFileMode());
+ } else if (dce != null
+ && (f == null || f.isModified(dce, true))) {
conflict(name, dce, h, m);
- else
+ } else {
update(name, mId, m.getEntryFileMode());
+ }
} else {
keep(dce);
}