checkout: describe_detached_head: remove ellipsis after committish

We do not want an ellipsis displayed following an (abbreviated) SHA-1 value. The days when this was necessary to indicate the truncation to lower-level Git commands and/or the user are bygone. However, to ease the transition, the ellipsis will still be printed if the user sets the environment variable GIT_PRINT_SHA1_ELLIPSIS to "yes". Correct documentation with respect to what describe_detached_head prints when GIT_PRINT_SHA1_ELLIPSIS is not set as indicated above. Add tests for the old and new behaviour. Signed-off-by: Ann T Ropea <bedhanger@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ann T Ropea committed Dec 6, 2017 at 01:20 UTC ca69d4d5b14245c9ba4535212c4f4a0621e78ffa
3 files changed +132 -3
Documentation/user-manual.txt
+1 -1
@@ -319,7 +319,7 @@ do so (now or later) by using -b with the checkout command again. Example:
319
320 git checkout -b new_branch_name
321
322 -HEAD is now at 427abfa... Linux v2.6.17
322 +HEAD is now at 427abfa Linux v2.6.17
323 ------------------------------------------------
324
325 The HEAD then refers to the SHA-1 of the commit instead of to a branch,
builtin/checkout.c
+8 -2
@@ -400,10 +400,16 @@ static void show_local_changes(struct object *head,
400 static void describe_detached_head(const char *msg, struct commit *commit)
401 {
402 struct strbuf sb = STRBUF_INIT;
403 +
404 if (!parse_commit(commit))
405 pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb);
405 - fprintf(stderr, "%s %s... %s\n", msg,
406 - find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV), sb.buf);
406 + if (print_sha1_ellipsis()) {
407 + fprintf(stderr, "%s %s... %s\n", msg,
408 + find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV), sb.buf);
409 + } else {
410 + fprintf(stderr, "%s %s %s\n", msg,
411 + find_unique_abbrev(commit->object.oid.hash, DEFAULT_ABBREV), sb.buf);
412 + }
413 strbuf_release(&sb);
414 }
415
t/t2020-checkout-detach.sh
+123
@@ -186,4 +186,127 @@ test_expect_success 'no advice given for explicit detached head state' '
186 test_cmp expect.no-advice actual
187 '
188
189 +# Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (new format)
190 +test_expect_success 'describe_detached_head prints no SHA-1 ellipsis when not asked to' "
191 +
192 + # The first detach operation is more chatty than the following ones.
193 + cat >1st_detach <<-'EOF' &&
194 + Note: checking out 'HEAD^'.
195 +
196 + You are in 'detached HEAD' state. You can look around, make experimental
197 + changes and commit them, and you can discard any commits you make in this
198 + state without impacting any branches by performing another checkout.
199 +
200 + If you want to create a new branch to retain commits you create, you may
201 + do so (now or later) by using -b with the checkout command again. Example:
202 +
203 + git checkout -b <new-branch-name>
204 +
205 + HEAD is now at 7c7cd714e262 three
206 + EOF
207 +
208 + # The remaining ones just show info about previous and current HEADs.
209 + cat >2nd_detach <<-'EOF' &&
210 + Previous HEAD position was 7c7cd714e262 three
211 + HEAD is now at 139b20d8e6c5 two
212 + EOF
213 +
214 + cat >3rd_detach <<-'EOF' &&
215 + Previous HEAD position was 139b20d8e6c5 two
216 + HEAD is now at d79ce1670bdc one
217 + EOF
218 +
219 + reset &&
220 + check_not_detached &&
221 +
222 + # Various ways of *not* asking for ellipses
223 +
224 + sane_unset GIT_PRINT_SHA1_ELLIPSIS &&
225 + git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
226 + check_detached &&
227 + test_i18ncmp 1st_detach actual &&
228 +
229 + GIT_PRINT_SHA1_ELLIPSIS="no" git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
230 + check_detached &&
231 + test_i18ncmp 2nd_detach actual &&
232 +
233 + GIT_PRINT_SHA1_ELLIPSIS= git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
234 + check_detached &&
235 + test_i18ncmp 3rd_detach actual &&
236 +
237 + sane_unset GIT_PRINT_SHA1_ELLIPSIS &&
238 +
239 + # We only have four commits, but we can re-use them
240 + reset &&
241 + check_not_detached &&
242 +
243 + # Make no mention of the env var at all
244 + git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
245 + check_detached &&
246 + test_i18ncmp 1st_detach actual &&
247 +
248 + GIT_PRINT_SHA1_ELLIPSIS='nope' &&
249 + git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
250 + check_detached &&
251 + test_i18ncmp 2nd_detach actual &&
252 +
253 + GIT_PRINT_SHA1_ELLIPSIS=nein &&
254 + git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
255 + check_detached &&
256 + test_i18ncmp 3rd_detach actual &&
257 +
258 + true
259 +"
260 +
261 +# Detached HEAD tests for GIT_PRINT_SHA1_ELLIPSIS (old format)
262 +test_expect_success 'describe_detached_head does print SHA-1 ellipsis when asked to' "
263 +
264 + # The first detach operation is more chatty than the following ones.
265 + cat >1st_detach <<-'EOF' &&
266 + Note: checking out 'HEAD^'.
267 +
268 + You are in 'detached HEAD' state. You can look around, make experimental
269 + changes and commit them, and you can discard any commits you make in this
270 + state without impacting any branches by performing another checkout.
271 +
272 + If you want to create a new branch to retain commits you create, you may
273 + do so (now or later) by using -b with the checkout command again. Example:
274 +
275 + git checkout -b <new-branch-name>
276 +
277 + HEAD is now at 7c7cd714e262... three
278 + EOF
279 +
280 + # The remaining ones just show info about previous and current HEADs.
281 + cat >2nd_detach <<-'EOF' &&
282 + Previous HEAD position was 7c7cd714e262... three
283 + HEAD is now at 139b20d8e6c5... two
284 + EOF
285 +
286 + cat >3rd_detach <<-'EOF' &&
287 + Previous HEAD position was 139b20d8e6c5... two
288 + HEAD is now at d79ce1670bdc... one
289 + EOF
290 +
291 + reset &&
292 + check_not_detached &&
293 +
294 + # Various ways of asking for ellipses...
295 + # The user can just use any kind of quoting (including none).
296 +
297 + GIT_PRINT_SHA1_ELLIPSIS="yes" git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
298 + check_detached &&
299 + test_i18ncmp 1st_detach actual &&
300 +
301 + GIT_PRINT_SHA1_ELLIPSIS='yes' git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
302 + check_detached &&
303 + test_i18ncmp 2nd_detach actual &&
304 +
305 + GIT_PRINT_SHA1_ELLIPSIS=yes git -c 'core.abbrev=12' checkout HEAD^ >actual 2>&1 &&
306 + check_detached &&
307 + test_i18ncmp 3rd_detach actual &&
308 +
309 + true
310 +"
311 +
312 test_done