RepoProject: read the 'dest-branch' attribute of a project

The manifest spec [1] defines a "dest-branch" attribute. Parse its
value and store it in the RepoProject. Also, create a getter/setter
for dest-branch.

[1] https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md#Element-project

Change-Id: I8ad83b0fec59d2b0967864e4de4fefde4ab971ff
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/ManifestParserTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/ManifestParserTest.java
index 76176fe..fca27d3 100644
--- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/ManifestParserTest.java
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/ManifestParserTest.java
@@ -177,6 +177,36 @@ public void testPinProjectWithUpstream() throws Exception {
 		assertNull(bar.getUpstream());
 	}
 
+	@Test
+	public void testWithDestBranch() throws Exception {
+		StringBuilder xmlContent = new StringBuilder();
+		xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
+				.append("<manifest>")
+				.append("<remote name=\"remote1\" fetch=\".\" />")
+				.append("<default revision=\"master\" remote=\"remote1\" />")
+				.append("<project path=\"foo\" name=\"foo\"")
+				.append("  dest-branch=\"branchX\"/>")
+				.append("<project path=\"bar\" name=\"bar\"/>")
+				.append("</manifest>");
+
+		ManifestParser parser = new ManifestParser(null, null, "master",
+				"https://git.google.com/", null, null);
+		parser.read(new ByteArrayInputStream(
+				xmlContent.toString().getBytes(UTF_8)));
+
+		Map<String, RepoProject> repos = parser.getProjects().stream().collect(
+				Collectors.toMap(RepoProject::getName, Function.identity()));
+		assertEquals(2, repos.size());
+
+		RepoProject foo = repos.get("foo");
+		assertEquals("foo", foo.getName());
+		assertEquals("branchX", foo.getDestBranch());
+
+		RepoProject bar = repos.get("bar");
+		assertEquals("bar", bar.getName());
+		assertNull(bar.getDestBranch());
+	}
+
 	void testNormalize(String in, String want) {
 		URI got = ManifestParser.normalizeEmptyPath(URI.create(in));
 		if (!got.toString().equals(want)) {
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
index 7402c76..b033177 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java
@@ -178,6 +178,8 @@ public void startElement(
 					.setRecommendShallow(attributes.getValue("clone-depth"));
 			currentProject
 					.setUpstream(attributes.getValue("upstream"));
+			currentProject
+					.setDestBranch(attributes.getValue("dest-branch"));
 			break;
 		case "remote":
 			String alias = attributes.getValue("alias");
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
index 09ce283..d8fec78 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java
@@ -39,6 +39,7 @@ public class RepoProject implements Comparable<RepoProject> {
 	private final List<CopyFile> copyfiles;
 	private final List<LinkFile> linkfiles;
 	private String upstream;
+	private String destBranch;
 	private String recommendShallow;
 	private String url;
 	private String defaultRevision;
@@ -402,6 +403,17 @@ public String getUpstream() {
 	}
 
 	/**
+	 * Return the dest-branch attribute of the project
+	 *
+	 * @return the dest-branch value if present, null otherwise.
+	 *
+	 * @since 7.0
+	 */
+	public String getDestBranch() {
+		return this.destBranch;
+	}
+
+	/**
 	 * Set the upstream attribute of the project
 	 *
 	 * Name of the git ref in which a sha1 can be found, when the revision is a
@@ -416,6 +428,20 @@ public void setUpstream(String upstream) {
 		this.upstream = upstream;
 	}
 
+	/**
+	 * Set the dest-branch attribute of the project
+	 *
+	 * Name of a Git branch.
+	 *
+	 * @param destBranch
+	 *            value of the attribute in the manifest
+	 *
+	 * @since 7.0
+	 */
+	public void setDestBranch(String destBranch) {
+		this.destBranch = destBranch;
+	}
+
 	private String getPathWithSlash() {
 		if (path.endsWith("/")) { //$NON-NLS-1$
 			return path;