View Javadoc
1   /*
2    * Copyright (C) 2010, Robin Stocker <robin@nibor.org> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  package org.eclipse.jgit.merge;
11  
12  import static org.junit.Assert.assertEquals;
13  
14  import java.io.IOException;
15  import java.util.Arrays;
16  import java.util.List;
17  
18  import org.eclipse.jgit.lib.ObjectId;
19  import org.eclipse.jgit.lib.ObjectIdRef;
20  import org.eclipse.jgit.lib.Ref;
21  import org.eclipse.jgit.lib.Ref.Storage;
22  import org.eclipse.jgit.lib.RefUpdate;
23  import org.eclipse.jgit.lib.SymbolicRef;
24  import org.eclipse.jgit.test.resources.SampleDataRepositoryTestCase;
25  import org.junit.Before;
26  import org.junit.Test;
27  
28  /**
29   * Test construction of merge message by {@link MergeMessageFormatter}.
30   */
31  public class MergeMessageFormatterTest extends SampleDataRepositoryTestCase {
32  
33  	private MergeMessageFormatter formatter;
34  
35  	@Override
36  	@Before
37  	public void setUp() throws Exception {
38  		super.setUp();
39  
40  		RefUpdate createRemoteRefA = db
41  				.updateRef("refs/remotes/origin/remote-a");
42  		createRemoteRefA.setNewObjectId(db.resolve("refs/heads/a"));
43  		createRemoteRefA.update();
44  
45  		RefUpdate createRemoteRefB = db
46  				.updateRef("refs/remotes/origin/remote-b");
47  		createRemoteRefB.setNewObjectId(db.resolve("refs/heads/b"));
48  		createRemoteRefB.update();
49  
50  		formatter = new MergeMessageFormatter();
51  	}
52  
53  	@Test
54  	public void testOneBranch() throws IOException {
55  		Ref a = db.exactRef("refs/heads/a");
56  		Ref master = db.exactRef("refs/heads/master");
57  		String message = formatter.format(Arrays.asList(a), master);
58  		assertEquals("Merge branch 'a'", message);
59  	}
60  
61  	@Test
62  	public void testTwoBranches() throws IOException {
63  		Ref a = db.exactRef("refs/heads/a");
64  		Ref b = db.exactRef("refs/heads/b");
65  		Ref master = db.exactRef("refs/heads/master");
66  		String message = formatter.format(Arrays.asList(a, b), master);
67  		assertEquals("Merge branches 'a' and 'b'", message);
68  	}
69  
70  	@Test
71  	public void testThreeBranches() throws IOException {
72  		Ref c = db.exactRef("refs/heads/c");
73  		Ref b = db.exactRef("refs/heads/b");
74  		Ref a = db.exactRef("refs/heads/a");
75  		Ref master = db.exactRef("refs/heads/master");
76  		String message = formatter.format(Arrays.asList(c, b, a), master);
77  		assertEquals("Merge branches 'c', 'b' and 'a'", message);
78  	}
79  
80  	@Test
81  	public void testRemoteBranch() throws Exception {
82  		Ref remoteA = db.exactRef("refs/remotes/origin/remote-a");
83  		Ref master = db.exactRef("refs/heads/master");
84  		String message = formatter.format(Arrays.asList(remoteA), master);
85  		assertEquals("Merge remote-tracking branch 'origin/remote-a'", message);
86  	}
87  
88  	@Test
89  	public void testMixed() throws IOException {
90  		Ref c = db.exactRef("refs/heads/c");
91  		Ref remoteA = db.exactRef("refs/remotes/origin/remote-a");
92  		Ref master = db.exactRef("refs/heads/master");
93  		String message = formatter.format(Arrays.asList(c, remoteA), master);
94  		assertEquals("Merge branch 'c', remote-tracking branch 'origin/remote-a'",
95  				message);
96  	}
97  
98  	@Test
99  	public void testTag() throws IOException {
100 		Ref tagA = db.exactRef("refs/tags/A");
101 		Ref master = db.exactRef("refs/heads/master");
102 		String message = formatter.format(Arrays.asList(tagA), master);
103 		assertEquals("Merge tag 'A'", message);
104 	}
105 
106 	@Test
107 	public void testCommit() throws IOException {
108 		ObjectId objectId = ObjectId
109 				.fromString("6db9c2ebf75590eef973081736730a9ea169a0c4");
110 		Ref commit = new ObjectIdRef.Unpeeled(Storage.LOOSE,
111 				objectId.getName(), objectId);
112 		Ref master = db.exactRef("refs/heads/master");
113 		String message = formatter.format(Arrays.asList(commit), master);
114 		assertEquals("Merge commit '6db9c2ebf75590eef973081736730a9ea169a0c4'",
115 				message);
116 	}
117 
118 	@Test
119 	public void testPullWithUri() throws IOException {
120 		String name = "branch 'test' of http://egit.eclipse.org/jgit.git";
121 		ObjectId objectId = ObjectId
122 				.fromString("6db9c2ebf75590eef973081736730a9ea169a0c4");
123 		Ref remoteBranch = new ObjectIdRef.Unpeeled(Storage.LOOSE, name,
124 				objectId);
125 		Ref master = db.exactRef("refs/heads/master");
126 		String message = formatter.format(Arrays.asList(remoteBranch), master);
127 		assertEquals("Merge branch 'test' of http://egit.eclipse.org/jgit.git",
128 				message);
129 	}
130 
131 	@Test
132 	public void testIntoOtherThanMaster() throws IOException {
133 		Ref a = db.exactRef("refs/heads/a");
134 		Ref b = db.exactRef("refs/heads/b");
135 		String message = formatter.format(Arrays.asList(a), b);
136 		assertEquals("Merge branch 'a' into b", message);
137 	}
138 
139 	@Test
140 	public void testIntoHeadOtherThanMaster() throws IOException {
141 		Ref a = db.exactRef("refs/heads/a");
142 		Ref b = db.exactRef("refs/heads/b");
143 		SymbolicRef head = new SymbolicRef("HEAD", b);
144 		String message = formatter.format(Arrays.asList(a), head);
145 		assertEquals("Merge branch 'a' into b", message);
146 	}
147 
148 	@Test
149 	public void testIntoSymbolicRefHeadPointingToMaster() throws IOException {
150 		Ref a = db.exactRef("refs/heads/a");
151 		Ref master = db.exactRef("refs/heads/master");
152 		SymbolicRef head = new SymbolicRef("HEAD", master);
153 		String message = formatter.format(Arrays.asList(a), head);
154 		assertEquals("Merge branch 'a'", message);
155 	}
156 
157 	@Test
158 	public void testFormatWithConflictsNoFooter() {
159 		String originalMessage = "Header Line\n\nCommit body\n";
160 		String message = formatter.formatWithConflicts(originalMessage,
161 				List.of("path1"), '#');
162 		assertEquals("Header Line\n\nCommit body\n\n# Conflicts:\n#\tpath1\n",
163 				message);
164 	}
165 
166 	@Test
167 	public void testFormatWithConflictsNoFooterNoLineBreak() {
168 		String originalMessage = "Header Line\n\nCommit body";
169 		String message = formatter.formatWithConflicts(originalMessage,
170 				List.of("path1"), '#');
171 		assertEquals("Header Line\n\nCommit body\n\n# Conflicts:\n#\tpath1\n",
172 				message);
173 	}
174 
175 	@Test
176 	public void testFormatWithConflictsCustomCharacter() {
177 		String originalMessage = "Header Line\n\nCommit body";
178 		String message = formatter.formatWithConflicts(originalMessage,
179 				List.of("path1"), ';');
180 		assertEquals("Header Line\n\nCommit body\n\n; Conflicts:\n;\tpath1\n",
181 				message);
182 	}
183 
184 	@Test
185 	public void testFormatWithConflictsWithFooters() {
186 		String originalMessage = "Header Line\n\nCommit body\n\nChangeId:"
187 				+ " I123456789123456789123456789123456789\nBug:1234567\n";
188 		String message = formatter.formatWithConflicts(originalMessage,
189 				List.of("path1"), '#');
190 		assertEquals(
191 				"Header Line\n\nCommit body\n\n# Conflicts:\n#\tpath1\n\n"
192 						+ "ChangeId: I123456789123456789123456789123456789\nBug:1234567\n",
193 				message);
194 	}
195 
196 	@Test
197 	public void testFormatWithConflictsWithFooterlikeLineInBody() {
198 		String originalMessage = "Header Line\n\nCommit body\nBug:1234567\nMore Body\n\nChangeId:"
199 				+ " I123456789123456789123456789123456789\nBug:1234567\n";
200 		String message = formatter.formatWithConflicts(originalMessage,
201 				List.of("path1"), '#');
202 		assertEquals(
203 				"Header Line\n\nCommit body\nBug:1234567\nMore Body\n\n# Conflicts:\n#\tpath1\n\n"
204 						+ "ChangeId: I123456789123456789123456789123456789\nBug:1234567\n",
205 				message);
206 	}
207 }