RegularSuperprojectWriter.java
- /*
- * Copyright (C) 2021, Google Inc. and others
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- package org.eclipse.jgit.gitrepo;
- import static org.eclipse.jgit.lib.Constants.DEFAULT_REMOTE_NAME;
- import static org.eclipse.jgit.lib.Constants.R_REMOTES;
- import java.io.IOException;
- import java.util.List;
- import org.eclipse.jgit.api.Git;
- import org.eclipse.jgit.api.SubmoduleAddCommand;
- import org.eclipse.jgit.api.errors.GitAPIException;
- import org.eclipse.jgit.gitrepo.RepoCommand.ManifestErrorException;
- import org.eclipse.jgit.gitrepo.RepoProject.CopyFile;
- import org.eclipse.jgit.gitrepo.RepoProject.LinkFile;
- import org.eclipse.jgit.gitrepo.internal.RepoText;
- import org.eclipse.jgit.internal.JGitText;
- import org.eclipse.jgit.lib.ObjectId;
- import org.eclipse.jgit.lib.ProgressMonitor;
- import org.eclipse.jgit.lib.Ref;
- import org.eclipse.jgit.lib.Repository;
- import org.eclipse.jgit.revwalk.RevCommit;
- /**
- * Writes .gitmodules and gitlinks of parsed manifest projects into a regular
- * repository (using git submodule commands)
- *
- * To write on a bare repository, use {@link BareSuperprojectWriter}
- */
- class RegularSuperprojectWriter {
- private Repository repo;
- private ProgressMonitor monitor;
- RegularSuperprojectWriter(Repository repo, ProgressMonitor monitor) {
- this.repo = repo;
- this.monitor = monitor;
- }
- RevCommit write(List<RepoProject> repoProjects)
- throws GitAPIException {
- try (Git git = new Git(repo)) {
- for (RepoProject proj : repoProjects) {
- addSubmodule(proj.getName(), proj.getUrl(), proj.getPath(),
- proj.getRevision(), proj.getCopyFiles(),
- proj.getLinkFiles(), git);
- }
- return git.commit().setMessage(RepoText.get().repoCommitMessage)
- .call();
- } catch (IOException e) {
- throw new ManifestErrorException(e);
- }
- }
- private void addSubmodule(String name, String url, String path,
- String revision, List<CopyFile> copyfiles, List<LinkFile> linkfiles,
- Git git) throws GitAPIException, IOException {
- assert (!repo.isBare());
- assert (git != null);
- if (!linkfiles.isEmpty()) {
- throw new UnsupportedOperationException(
- JGitText.get().nonBareLinkFilesNotSupported);
- }
- SubmoduleAddCommand add = git.submoduleAdd().setName(name).setPath(path)
- .setURI(url);
- if (monitor != null) {
- add.setProgressMonitor(monitor);
- }
- Repository subRepo = add.call();
- if (revision != null) {
- try (Git sub = new Git(subRepo)) {
- sub.checkout().setName(findRef(revision, subRepo)).call();
- }
- subRepo.close();
- git.add().addFilepattern(path).call();
- }
- for (CopyFile copyfile : copyfiles) {
- copyfile.copy();
- git.add().addFilepattern(copyfile.dest).call();
- }
- }
- private static String findRef(String ref, Repository repo)
- throws IOException {
- if (!ObjectId.isId(ref)) {
- Ref r = repo.exactRef(R_REMOTES + DEFAULT_REMOTE_NAME + "/" + ref); //$NON-NLS-1$
- if (r != null) {
- return r.getName();
- }
- }
- return ref;
- }
- }