Do not expect unlink(2) to fail on a directory.

When "git checkout-index" checks out path A/B/C, it makes sure A
and A/B are truly directories; if there is a regular file or
symlink at A, we prefer to remove it.

We used to do this by catching an error return from mkdir(2),
and on EEXIST did unlink(2), and when it succeeded, tried
another mkdir(2).

Thomas Glanzmann found out the above does not work on Solaris
for a root user, as unlink(2) was so old fashioned there that it
allowed to unlink a directory.

As pointed out, this still doesn't guarantee that git won't call
"unlink()" on a directory (race conditions etc), but that's
fundamentally true (there is no "funlink()" like there is
"fstat()"), and besides, that is in no way git-specific (ie it's
true of any application that gets run as root).

Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 file changed
tree: 76c39fedea03cac74bbfd31bb373f40cd3fe3e3c
  1. arm/
  2. compat/
  3. contrib/
  4. Documentation/
  5. git-gui/
  6. gitweb/
  7. mozilla-sha1/
  8. perl/
  9. ppc/
  10. t/
  11. templates/
  12. xdiff/
  13. .gitignore
  14. .mailmap
  15. alloc.c
  16. archive-tar.c
  17. archive-zip.c
  18. archive.h
  19. attr.c
  20. attr.h
  21. base85.c
  22. blob.c
  23. blob.h
  24. builtin-add.c
  25. builtin-annotate.c
  26. builtin-apply.c
  27. builtin-archive.c
  28. builtin-blame.c
  29. builtin-branch.c
  30. builtin-bundle.c
  31. builtin-cat-file.c
  32. builtin-check-attr.c
  33. builtin-check-ref-format.c
  34. builtin-checkout-index.c
  35. builtin-commit-tree.c
  36. builtin-config.c
  37. builtin-count-objects.c
  38. builtin-describe.c
  39. builtin-diff-files.c
  40. builtin-diff-index.c
  41. builtin-diff-tree.c
  42. builtin-diff.c
  43. builtin-fetch--tool.c
  44. builtin-fmt-merge-msg.c
  45. builtin-for-each-ref.c
  46. builtin-fsck.c
  47. builtin-gc.c
  48. builtin-grep.c
  49. builtin-init-db.c
  50. builtin-log.c
  51. builtin-ls-files.c
  52. builtin-ls-tree.c
  53. builtin-mailinfo.c
  54. builtin-mailsplit.c
  55. builtin-merge-base.c
  56. builtin-merge-file.c
  57. builtin-mv.c
  58. builtin-name-rev.c
  59. builtin-pack-objects.c
  60. builtin-pack-refs.c
  61. builtin-prune-packed.c
  62. builtin-prune.c
  63. builtin-push.c
  64. builtin-read-tree.c
  65. builtin-reflog.c
  66. builtin-rerere.c
  67. builtin-rev-list.c
  68. builtin-rev-parse.c
  69. builtin-revert.c
  70. builtin-rm.c
  71. builtin-runstatus.c
  72. builtin-shortlog.c
  73. builtin-show-branch.c
  74. builtin-show-ref.c
  75. builtin-stripspace.c
  76. builtin-symbolic-ref.c
  77. builtin-tar-tree.c
  78. builtin-unpack-objects.c
  79. builtin-update-index.c
  80. builtin-update-ref.c
  81. builtin-upload-archive.c
  82. builtin-verify-pack.c
  83. builtin-write-tree.c
  84. builtin.h
  85. cache-tree.c
  86. cache-tree.h
  87. cache.h
  88. check-builtins.sh
  89. check-racy.c
  90. color.c
  91. color.h
  92. combine-diff.c
  93. commit.c
  94. commit.h
  95. config.c
  96. config.mak.in
  97. configure.ac
  98. connect.c
  99. convert-objects.c
  100. convert.c
  101. copy.c
  102. COPYING
  103. csum-file.c
  104. csum-file.h
  105. ctype.c
  106. daemon.c
  107. date.c
  108. decorate.c
  109. decorate.h
  110. delta.h
  111. diff-delta.c
  112. diff-lib.c
  113. diff.c
  114. diff.h
  115. diffcore-break.c
  116. diffcore-delta.c
  117. diffcore-order.c
  118. diffcore-pickaxe.c
  119. diffcore-rename.c
  120. diffcore.h
  121. dir.c
  122. dir.h
  123. dump-cache-tree.c
  124. entry.c
  125. environment.c
  126. exec_cmd.c
  127. exec_cmd.h
  128. fast-import.c
  129. fetch-pack.c
  130. fetch.c
  131. fetch.h
  132. generate-cmdlist.sh
  133. git-add--interactive.perl
  134. git-am.sh
  135. git-applymbox.sh
  136. git-applypatch.sh
  137. git-archimport.perl
  138. git-bisect.sh
  139. git-checkout.sh
  140. git-clean.sh
  141. git-clone.sh
  142. git-commit.sh
  143. git-compat-util.h
  144. git-cvsexportcommit.perl
  145. git-cvsimport.perl
  146. git-cvsserver.perl
  147. git-fetch.sh
  148. git-instaweb.sh
  149. git-lost-found.sh
  150. git-ls-remote.sh
  151. git-merge-octopus.sh
  152. git-merge-one-file.sh
  153. git-merge-ours.sh
  154. git-merge-resolve.sh
  155. git-merge-stupid.sh
  156. git-merge.sh
  157. git-mergetool.sh
  158. git-p4import.py
  159. git-parse-remote.sh
  160. git-pull.sh
  161. git-quiltimport.sh
  162. git-rebase.sh
  163. git-relink.perl
  164. git-remote.perl
  165. git-repack.sh
  166. git-request-pull.sh
  167. git-reset.sh
  168. git-send-email.perl
  169. git-sh-setup.sh
  170. git-svn.perl
  171. git-svnimport.perl
  172. git-tag.sh
  173. git-verify-tag.sh
  174. GIT-VERSION-GEN
  175. git.c
  176. git.spec.in
  177. gitk
  178. grep.c
  179. grep.h
  180. hash-object.c
  181. help.c
  182. http-fetch.c
  183. http-push.c
  184. http.c
  185. http.h
  186. ident.c
  187. imap-send.c
  188. index-pack.c
  189. INSTALL
  190. interpolate.c
  191. interpolate.h
  192. list-objects.c
  193. list-objects.h
  194. local-fetch.c
  195. lockfile.c
  196. log-tree.c
  197. log-tree.h
  198. mailmap.c
  199. mailmap.h
  200. Makefile
  201. match-trees.c
  202. merge-file.c
  203. merge-index.c
  204. merge-recursive.c
  205. merge-tree.c
  206. mktag.c
  207. mktree.c
  208. object-refs.c
  209. object.c
  210. object.h
  211. pack-check.c
  212. pack-redundant.c
  213. pack-write.c
  214. pack.h
  215. pager.c
  216. patch-delta.c
  217. patch-id.c
  218. patch-ids.c
  219. patch-ids.h
  220. path-list.c
  221. path-list.h
  222. path.c
  223. peek-remote.c
  224. pkt-line.c
  225. pkt-line.h
  226. progress.c
  227. progress.h
  228. quote.c
  229. quote.h
  230. reachable.c
  231. reachable.h
  232. read-cache.c
  233. README
  234. receive-pack.c
  235. reflog-walk.c
  236. reflog-walk.h
  237. refs.c
  238. refs.h
  239. revision.c
  240. revision.h
  241. rsh.c
  242. rsh.h
  243. run-command.c
  244. run-command.h
  245. send-pack.c
  246. server-info.c
  247. setup.c
  248. sha1_file.c
  249. sha1_name.c
  250. shallow.c
  251. shell.c
  252. show-index.c
  253. sideband.c
  254. sideband.h
  255. ssh-fetch.c
  256. ssh-pull.c
  257. ssh-push.c
  258. ssh-upload.c
  259. strbuf.c
  260. strbuf.h
  261. symlinks.c
  262. tag.c
  263. tag.h
  264. tar.h
  265. test-chmtime.c
  266. test-date.c
  267. test-delta.c
  268. test-genrandom.c
  269. test-match-trees.c
  270. test-sha1.c
  271. test-sha1.sh
  272. trace.c
  273. tree-diff.c
  274. tree-walk.c
  275. tree-walk.h
  276. tree.c
  277. tree.h
  278. unpack-file.c
  279. unpack-trees.c
  280. unpack-trees.h
  281. update-server-info.c
  282. upload-pack.c
  283. usage.c
  284. utf8.c
  285. utf8.h
  286. var.c
  287. write_or_die.c
  288. wt-status.c
  289. wt-status.h
  290. xdiff-interface.c
  291. xdiff-interface.h