archimport: remove files from the index before adding/updating
This fixes a bug when importing where a directory gets removed/renamed but is immediately replaced by a file of the same name in the same changeset. This fix only applies to the accurate (default) strategy the moment. This patch should also fix the fast strategy if/when it is updated to handle the cases that would've triggered this bug. This bug was originally found in git-svn, but I remembered I did the same thing with archimport as well. Signed-off-by: Eric Wong <normalperson@yhbt.net> Signed-off-by: Junio C Hamano <junkio@cox.net>maint
							parent
							
								
									772d8a3b63
								
							
						
					
					
						commit
						3ff903bfb9
					
				|  | @ -346,12 +346,10 @@ sub process_patchset_accurate { | ||||||
|     }  |     }  | ||||||
|      |      | ||||||
|     # update the index with all the changes we got |     # update the index with all the changes we got | ||||||
|  |     system('git-diff-files --name-only -z | '. | ||||||
|  |             'git-update-index --remove -z --stdin') == 0 or die "$! $?\n"; | ||||||
|     system('git-ls-files --others -z | '. |     system('git-ls-files --others -z | '. | ||||||
|             'git-update-index --add -z --stdin') == 0 or die "$! $?\n"; |             'git-update-index --add -z --stdin') == 0 or die "$! $?\n"; | ||||||
|     system('git-ls-files --deleted -z | '. |  | ||||||
|             'git-update-index --remove -z --stdin') == 0 or die "$! $?\n"; |  | ||||||
|     system('git-ls-files -z | '. |  | ||||||
|              'git-update-index -z --stdin') == 0 or die "$! $?\n"; |  | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -416,22 +414,14 @@ sub process_patchset_fast { | ||||||
|     # imports don't give us good info |     # imports don't give us good info | ||||||
|     # on added files. Shame on them |     # on added files. Shame on them | ||||||
|     if ($ps->{type} eq 'i' || $ps->{type} eq 't') { |     if ($ps->{type} eq 'i' || $ps->{type} eq 't') { | ||||||
|         system('git-ls-files --others -z | '. |  | ||||||
|                 'git-update-index --add -z --stdin') == 0 or die "$! $?\n"; |  | ||||||
|         system('git-ls-files --deleted -z | '. |         system('git-ls-files --deleted -z | '. | ||||||
|                 'git-update-index --remove -z --stdin') == 0 or die "$! $?\n"; |                 'git-update-index --remove -z --stdin') == 0 or die "$! $?\n"; | ||||||
|  |         system('git-ls-files --others -z | '. | ||||||
|  |                 'git-update-index --add -z --stdin') == 0 or die "$! $?\n"; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     # TODO: handle removed_directories and renamed_directories: |     # TODO: handle removed_directories and renamed_directories: | ||||||
|  |  | ||||||
|     if (my $add = $ps->{new_files}) { |  | ||||||
|         while (@$add) { |  | ||||||
|             my @slice = splice(@$add, 0, 100); |  | ||||||
|             system('git-update-index','--add','--',@slice) == 0 or |  | ||||||
|                             die "Error in git-update-index --add: $! $?\n"; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     |  | ||||||
|     if (my $del = $ps->{removed_files}) { |     if (my $del = $ps->{removed_files}) { | ||||||
|         unlink @$del; |         unlink @$del; | ||||||
|         while (@$del) { |         while (@$del) { | ||||||
|  | @ -462,6 +452,14 @@ sub process_patchset_fast { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     if (my $add = $ps->{new_files}) { | ||||||
|  |         while (@$add) { | ||||||
|  |             my @slice = splice(@$add, 0, 100); | ||||||
|  |             system('git-update-index','--add','--',@slice) == 0 or | ||||||
|  |                             die "Error in git-update-index --add: $! $?\n"; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     if (my $mod = $ps->{modified_files}) { |     if (my $mod = $ps->{modified_files}) { | ||||||
|         while (@$mod) { |         while (@$mod) { | ||||||
|             my @slice = splice(@$mod, 0, 100); |             my @slice = splice(@$mod, 0, 100); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Eric Wong
						Eric Wong