add: error appropriately on repository with no commits

The previous commit made 'git add' abort when given a repository that doesn't have a commit checked out. However, the output upon failure isn't appropriate: % git add repo warning: adding embedded git repository: repo hint: You've added another git repository inside your current repository. hint: [...] error: unable to index file 'repo/' fatal: adding files failed The hint doesn't apply in this case, and the error message doesn't tell the user why 'repo' couldn't be added to the index. Provide better output by teaching add_to_index() to error when given a git directory where HEAD can't be resolved. To avoid the embedded repository warning and hint, call check_embedded_repo() only after add_file_to_index() succeeds because, in general, its output doesn't make sense if adding to the index fails. Signed-off-by: Kyle Meyer <kyle@kyleam.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Kyle Meyer committed Apr 9, 2019 at 19:07 UTC f937bc2f86ba2c2956b4228bd2386aaafc9afe83
3 files changed +16 -1
builtin/add.c
+2 -1
@@ -374,11 +374,12 @@ static int add_files(struct dir_struct *dir, int flags)
374 }
375
376 for (i = 0; i < dir->nr; i++) {
377 - check_embedded_repo(dir->entries[i]->name);
377 if (add_file_to_index(&the_index, dir->entries[i]->name, flags)) {
378 if (!ignore_add_errors)
379 die(_("adding files failed"));
380 exit_status = 1;
381 + } else {
382 + check_embedded_repo(dir->entries[i]->name);
383 }
384 }
385 return exit_status;
read-cache.c
+3
@@ -702,6 +702,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
702 int add_option = (ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE|
703 (intent_only ? ADD_CACHE_NEW_ONLY : 0));
704 int hash_flags = HASH_WRITE_OBJECT;
705 + struct object_id oid;
706
707 if (flags & ADD_CACHE_RENORMALIZE)
708 hash_flags |= HASH_RENORMALIZE;
@@ -711,6 +712,8 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st,
712
713 namelen = strlen(path);
714 if (S_ISDIR(st_mode)) {
715 + if (resolve_gitlink_ref(path, "HEAD", &oid) < 0)
716 + return error(_("'%s' does not have a commit checked out"), path);
717 while (namelen && path[namelen-1] == '/')
718 namelen--;
719 }
t/t3700-add.sh
+11
@@ -296,6 +296,17 @@ test_expect_success '"git add ." in empty repo' '
296 )
297 '
298
299 +test_expect_success 'error on a repository with no commits' '
300 + rm -fr empty &&
301 + git init empty &&
302 + test_must_fail git add empty >actual 2>&1 &&
303 + cat >expect <<-EOF &&
304 + error: '"'empty/'"' does not have a commit checked out
305 + fatal: adding files failed
306 + EOF
307 + test_i18ncmp expect actual
308 +'
309 +
310 test_expect_success 'git add --dry-run of existing changed file' "
311 echo new >>track-this &&
312 git add --dry-run track-this >actual 2>&1 &&