Merge "RepoCommand: Move building the index for base repos to its own method"
This commit is contained in:
commit
db032edd8f
|
@ -577,120 +577,9 @@ public RevCommit call() throws GitAPIException {
|
||||||
List<RepoProject> renamedProjects = renameProjects(filteredProjects);
|
List<RepoProject> renamedProjects = renameProjects(filteredProjects);
|
||||||
|
|
||||||
DirCache index = DirCache.newInCore();
|
DirCache index = DirCache.newInCore();
|
||||||
DirCacheBuilder builder = index.builder();
|
|
||||||
ObjectInserter inserter = repo.newObjectInserter();
|
ObjectInserter inserter = repo.newObjectInserter();
|
||||||
try (RevWalk rw = new RevWalk(repo)) {
|
try (RevWalk rw = new RevWalk(repo)) {
|
||||||
Config cfg = new Config();
|
prepareIndex(renamedProjects, index, inserter);
|
||||||
StringBuilder attributes = new StringBuilder();
|
|
||||||
for (RepoProject proj : renamedProjects) {
|
|
||||||
String name = proj.getName();
|
|
||||||
String path = proj.getPath();
|
|
||||||
String url = proj.getUrl();
|
|
||||||
ObjectId objectId;
|
|
||||||
if (ObjectId.isId(proj.getRevision())) {
|
|
||||||
objectId = ObjectId.fromString(proj.getRevision());
|
|
||||||
} else {
|
|
||||||
objectId = callback.sha1(url, proj.getRevision());
|
|
||||||
if (objectId == null && !ignoreRemoteFailures) {
|
|
||||||
throw new RemoteUnavailableException(url);
|
|
||||||
}
|
|
||||||
if (recordRemoteBranch) {
|
|
||||||
// "branch" field is only for non-tag references.
|
|
||||||
// Keep tags in "ref" field as hint for other tools.
|
|
||||||
String field = proj.getRevision().startsWith(
|
|
||||||
R_TAGS) ? "ref" : "branch"; //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
cfg.setString("submodule", name, field, //$NON-NLS-1$
|
|
||||||
proj.getRevision());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (recordShallowSubmodules && proj.getRecommendShallow() != null) {
|
|
||||||
// The shallow recommendation is losing information.
|
|
||||||
// As the repo manifests stores the recommended
|
|
||||||
// depth in the 'clone-depth' field, while
|
|
||||||
// git core only uses a binary 'shallow = true/false'
|
|
||||||
// hint, we'll map any depth to 'shallow = true'
|
|
||||||
cfg.setBoolean("submodule", name, "shallow", //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (recordSubmoduleLabels) {
|
|
||||||
StringBuilder rec = new StringBuilder();
|
|
||||||
rec.append("/"); //$NON-NLS-1$
|
|
||||||
rec.append(path);
|
|
||||||
for (String group : proj.getGroups()) {
|
|
||||||
rec.append(" "); //$NON-NLS-1$
|
|
||||||
rec.append(group);
|
|
||||||
}
|
|
||||||
rec.append("\n"); //$NON-NLS-1$
|
|
||||||
attributes.append(rec.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
URI submodUrl = URI.create(url);
|
|
||||||
if (targetUri != null) {
|
|
||||||
submodUrl = relativize(targetUri, submodUrl);
|
|
||||||
}
|
|
||||||
cfg.setString("submodule", name, "path", path); //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
cfg.setString("submodule", name, "url", //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
submodUrl.toString());
|
|
||||||
|
|
||||||
// create gitlink
|
|
||||||
if (objectId != null) {
|
|
||||||
DirCacheEntry dcEntry = new DirCacheEntry(path);
|
|
||||||
dcEntry.setObjectId(objectId);
|
|
||||||
dcEntry.setFileMode(FileMode.GITLINK);
|
|
||||||
builder.add(dcEntry);
|
|
||||||
|
|
||||||
for (CopyFile copyfile : proj.getCopyFiles()) {
|
|
||||||
RemoteFile rf = callback.readFileWithMode(
|
|
||||||
url, proj.getRevision(), copyfile.src);
|
|
||||||
objectId = inserter.insert(Constants.OBJ_BLOB,
|
|
||||||
rf.getContents());
|
|
||||||
dcEntry = new DirCacheEntry(copyfile.dest);
|
|
||||||
dcEntry.setObjectId(objectId);
|
|
||||||
dcEntry.setFileMode(rf.getFileMode());
|
|
||||||
builder.add(dcEntry);
|
|
||||||
}
|
|
||||||
for (LinkFile linkfile : proj.getLinkFiles()) {
|
|
||||||
String link;
|
|
||||||
if (linkfile.dest.contains("/")) { //$NON-NLS-1$
|
|
||||||
link = FileUtils.relativizeGitPath(
|
|
||||||
linkfile.dest.substring(0,
|
|
||||||
linkfile.dest.lastIndexOf('/')),
|
|
||||||
proj.getPath() + "/" + linkfile.src); //$NON-NLS-1$
|
|
||||||
} else {
|
|
||||||
link = proj.getPath() + "/" + linkfile.src; //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
|
|
||||||
objectId = inserter.insert(Constants.OBJ_BLOB,
|
|
||||||
link.getBytes(UTF_8));
|
|
||||||
dcEntry = new DirCacheEntry(linkfile.dest);
|
|
||||||
dcEntry.setObjectId(objectId);
|
|
||||||
dcEntry.setFileMode(FileMode.SYMLINK);
|
|
||||||
builder.add(dcEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String content = cfg.toText();
|
|
||||||
|
|
||||||
// create a new DirCacheEntry for .gitmodules file.
|
|
||||||
final DirCacheEntry dcEntry = new DirCacheEntry(Constants.DOT_GIT_MODULES);
|
|
||||||
ObjectId objectId = inserter.insert(Constants.OBJ_BLOB,
|
|
||||||
content.getBytes(UTF_8));
|
|
||||||
dcEntry.setObjectId(objectId);
|
|
||||||
dcEntry.setFileMode(FileMode.REGULAR_FILE);
|
|
||||||
builder.add(dcEntry);
|
|
||||||
|
|
||||||
if (recordSubmoduleLabels) {
|
|
||||||
// create a new DirCacheEntry for .gitattributes file.
|
|
||||||
final DirCacheEntry dcEntryAttr = new DirCacheEntry(Constants.DOT_GIT_ATTRIBUTES);
|
|
||||||
ObjectId attrId = inserter.insert(Constants.OBJ_BLOB,
|
|
||||||
attributes.toString().getBytes(UTF_8));
|
|
||||||
dcEntryAttr.setObjectId(attrId);
|
|
||||||
dcEntryAttr.setFileMode(FileMode.REGULAR_FILE);
|
|
||||||
builder.add(dcEntryAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.finish();
|
|
||||||
ObjectId treeId = index.writeTree(inserter);
|
ObjectId treeId = index.writeTree(inserter);
|
||||||
|
|
||||||
long prevDelay = 0;
|
long prevDelay = 0;
|
||||||
|
@ -726,6 +615,125 @@ public RevCommit call() throws GitAPIException {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void prepareIndex(List<RepoProject> projects, DirCache index,
|
||||||
|
ObjectInserter inserter) throws IOException, GitAPIException {
|
||||||
|
Config cfg = new Config();
|
||||||
|
StringBuilder attributes = new StringBuilder();
|
||||||
|
DirCacheBuilder builder = index.builder();
|
||||||
|
for (RepoProject proj : projects) {
|
||||||
|
String name = proj.getName();
|
||||||
|
String path = proj.getPath();
|
||||||
|
String url = proj.getUrl();
|
||||||
|
ObjectId objectId;
|
||||||
|
if (ObjectId.isId(proj.getRevision())) {
|
||||||
|
objectId = ObjectId.fromString(proj.getRevision());
|
||||||
|
} else {
|
||||||
|
objectId = callback.sha1(url, proj.getRevision());
|
||||||
|
if (objectId == null && !ignoreRemoteFailures) {
|
||||||
|
throw new RemoteUnavailableException(url);
|
||||||
|
}
|
||||||
|
if (recordRemoteBranch) {
|
||||||
|
// "branch" field is only for non-tag references.
|
||||||
|
// Keep tags in "ref" field as hint for other tools.
|
||||||
|
String field = proj.getRevision().startsWith(R_TAGS) ? "ref" //$NON-NLS-1$
|
||||||
|
: "branch"; //$NON-NLS-1$
|
||||||
|
cfg.setString("submodule", name, field, //$NON-NLS-1$
|
||||||
|
proj.getRevision());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (recordShallowSubmodules
|
||||||
|
&& proj.getRecommendShallow() != null) {
|
||||||
|
// The shallow recommendation is losing information.
|
||||||
|
// As the repo manifests stores the recommended
|
||||||
|
// depth in the 'clone-depth' field, while
|
||||||
|
// git core only uses a binary 'shallow = true/false'
|
||||||
|
// hint, we'll map any depth to 'shallow = true'
|
||||||
|
cfg.setBoolean("submodule", name, "shallow", //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (recordSubmoduleLabels) {
|
||||||
|
StringBuilder rec = new StringBuilder();
|
||||||
|
rec.append("/"); //$NON-NLS-1$
|
||||||
|
rec.append(path);
|
||||||
|
for (String group : proj.getGroups()) {
|
||||||
|
rec.append(" "); //$NON-NLS-1$
|
||||||
|
rec.append(group);
|
||||||
|
}
|
||||||
|
rec.append("\n"); //$NON-NLS-1$
|
||||||
|
attributes.append(rec.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
URI submodUrl = URI.create(url);
|
||||||
|
if (targetUri != null) {
|
||||||
|
submodUrl = relativize(targetUri, submodUrl);
|
||||||
|
}
|
||||||
|
cfg.setString("submodule", name, "path", path); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
cfg.setString("submodule", name, "url", //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
submodUrl.toString());
|
||||||
|
|
||||||
|
// create gitlink
|
||||||
|
if (objectId != null) {
|
||||||
|
DirCacheEntry dcEntry = new DirCacheEntry(path);
|
||||||
|
dcEntry.setObjectId(objectId);
|
||||||
|
dcEntry.setFileMode(FileMode.GITLINK);
|
||||||
|
builder.add(dcEntry);
|
||||||
|
|
||||||
|
for (CopyFile copyfile : proj.getCopyFiles()) {
|
||||||
|
RemoteFile rf = callback.readFileWithMode(url,
|
||||||
|
proj.getRevision(), copyfile.src);
|
||||||
|
objectId = inserter.insert(Constants.OBJ_BLOB,
|
||||||
|
rf.getContents());
|
||||||
|
dcEntry = new DirCacheEntry(copyfile.dest);
|
||||||
|
dcEntry.setObjectId(objectId);
|
||||||
|
dcEntry.setFileMode(rf.getFileMode());
|
||||||
|
builder.add(dcEntry);
|
||||||
|
}
|
||||||
|
for (LinkFile linkfile : proj.getLinkFiles()) {
|
||||||
|
String link;
|
||||||
|
if (linkfile.dest.contains("/")) { //$NON-NLS-1$
|
||||||
|
link = FileUtils.relativizeGitPath(
|
||||||
|
linkfile.dest.substring(0,
|
||||||
|
linkfile.dest.lastIndexOf('/')),
|
||||||
|
proj.getPath() + "/" + linkfile.src); //$NON-NLS-1$
|
||||||
|
} else {
|
||||||
|
link = proj.getPath() + "/" + linkfile.src; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
objectId = inserter.insert(Constants.OBJ_BLOB,
|
||||||
|
link.getBytes(UTF_8));
|
||||||
|
dcEntry = new DirCacheEntry(linkfile.dest);
|
||||||
|
dcEntry.setObjectId(objectId);
|
||||||
|
dcEntry.setFileMode(FileMode.SYMLINK);
|
||||||
|
builder.add(dcEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String content = cfg.toText();
|
||||||
|
|
||||||
|
// create a new DirCacheEntry for .gitmodules file.
|
||||||
|
DirCacheEntry dcEntry = new DirCacheEntry(
|
||||||
|
Constants.DOT_GIT_MODULES);
|
||||||
|
ObjectId objectId = inserter.insert(Constants.OBJ_BLOB,
|
||||||
|
content.getBytes(UTF_8));
|
||||||
|
dcEntry.setObjectId(objectId);
|
||||||
|
dcEntry.setFileMode(FileMode.REGULAR_FILE);
|
||||||
|
builder.add(dcEntry);
|
||||||
|
|
||||||
|
if (recordSubmoduleLabels) {
|
||||||
|
// create a new DirCacheEntry for .gitattributes file.
|
||||||
|
DirCacheEntry dcEntryAttr = new DirCacheEntry(
|
||||||
|
Constants.DOT_GIT_ATTRIBUTES);
|
||||||
|
ObjectId attrId = inserter.insert(Constants.OBJ_BLOB,
|
||||||
|
attributes.toString().getBytes(UTF_8));
|
||||||
|
dcEntryAttr.setObjectId(attrId);
|
||||||
|
dcEntryAttr.setFileMode(FileMode.REGULAR_FILE);
|
||||||
|
builder.add(dcEntryAttr);
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.finish();
|
||||||
|
}
|
||||||
|
|
||||||
private RevCommit commitTreeOnCurrentTip(ObjectInserter inserter,
|
private RevCommit commitTreeOnCurrentTip(ObjectInserter inserter,
|
||||||
RevWalk rw, ObjectId treeId)
|
RevWalk rw, ObjectId treeId)
|
||||||
throws IOException, ConcurrentRefUpdateException {
|
throws IOException, ConcurrentRefUpdateException {
|
||||||
|
|
Loading…
Reference in New Issue