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