copy vs rename detection: avoid unnecessary O(n*m) loops

The core rename detection had some rather stupid code to check if a
pathname was used by a later modification or rename, which basically
walked the whole pathname space for all renames for each rename, in
order to tell whether it was a pure rename (no remaining users) or
should be considered a copy (other users of the source file remaining).

That's really silly, since we can just keep a count of users around, and
replace all those complex and expensive loops with just testing that
simple counter (but this all depends on the previous commit that shared
the diff_filespec data structure by using a separate reference count).

Note that the reference count is not the same as the rename count: they
behave otherwise rather similarly, but the reference count is tied to
the allocation (and decremented at de-allocation, so that when it turns
zero we can get rid of the memory), while the rename count is tied to
the renames and is decremented when we find a rename (so that when it
turns zero we know that it was a rename, not a copy).

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