+sub gs_fetch_loop_common {
+ my ($self, $base, $head, @gs) = @_;
+ my $inc = 1000;
+ my ($min, $max) = ($base, $head < $base + $inc ? $head : $base + $inc);
+ my $err_handler = $SVN::Error::handler;
+ my $err;
+ $SVN::Error::handler = sub { ($err) = @_; skip_unknown_revs($err); };
+ my @paths = @gs == 1 ? ($gs[0]->{path}) : ('');
+ foreach my $gs (@gs) {
+ if (my $last_commit = $gs->last_commit) {
+ $gs->assert_index_clean($last_commit);
+ }
+ $gs->{path_regex} = qr/^\/\Q$gs->{path}\E\/?/;
+ }
+ while (1) {
+ my @revs;
+ $self->get_log(\@paths, $min, $max, 0, 1, 1,
+ sub { push @revs, [ dup_changed_paths($_[0]), $_[1] ]; });
+ if (! @revs && $err && $max >= $head) {
+ print STDERR "Branch probably deleted:\n ",
+ $err->expanded_message,
+ "\nWill attempt to follow revisions ",
+ "r$min .. r$max ",
+ "committed before the deletion\n";
+ @revs = map { [ undef, $_ ] } ($min .. $max);
+ }
+ foreach (@revs) {
+ my ($paths, $r) = @$_;
+ foreach my $gs (@gs) {
+ if ($paths) {
+ grep /$gs->{path_regex}/, keys %$paths
+ or next;
+ }
+ next if defined $gs->rev_db_get($r);
+ if (my $log_entry = $gs->do_fetch($paths, $r)) {
+ $gs->do_git_commit($log_entry);
+ }
+ }
+ }
+ last if $max >= $head;
+ $min = $max + 1;
+ $max += $inc;
+ $max = $head if ($max > $head);
+ }
+ $SVN::Error::handler = $err_handler;
+}
+