@@ -287,6 +287,9 @@ sub get_last_local_revision {
287
287
return $lastrevision_number ;
288
288
}
289
289
290
+ # Remember the timestamp corresponding to a revision id.
291
+ my %basetimestamps ;
292
+
290
293
sub get_last_remote_revision {
291
294
mw_connect_maybe();
292
295
@@ -300,14 +303,16 @@ sub get_last_remote_revision {
300
303
my $query = {
301
304
action => ' query' ,
302
305
prop => ' revisions' ,
303
- rvprop => ' ids' ,
306
+ rvprop => ' ids|timestamp ' ,
304
307
pageids => $id ,
305
308
};
306
309
307
310
my $result = $mediawiki -> api($query );
308
311
309
312
my $lastrev = pop (@{$result -> {query }-> {pages }-> {$id }-> {revisions }});
310
313
314
+ $basetimestamps {$lastrev -> {revid }} = $lastrev -> {timestamp };
315
+
311
316
$max_rev_num = ($lastrev -> {revid } > $max_rev_num ? $lastrev -> {revid } : $max_rev_num );
312
317
}
313
318
@@ -649,18 +654,32 @@ sub mw_push_file {
649
654
action => ' edit' ,
650
655
summary => $summary ,
651
656
title => $title ,
657
+ basetimestamp => $basetimestamps {$newrevid },
652
658
text => mediawiki_clean($file_content , $page_created ),
653
659
}, {
654
660
skip_encoding => 1 # Helps with names with accentuated characters
655
- }) || die ' Fatal: Error ' .
656
- $mediawiki -> {error }-> {code } .
657
- ' from mediwiki: ' . $mediawiki -> {error }-> {details };
661
+ });
662
+ if (!$result ) {
663
+ if ($mediawiki -> {error }-> {code } == 3) {
664
+ # edit conflicts, considered as non-fast-forward
665
+ print STDERR ' Warning: Error ' .
666
+ $mediawiki -> {error }-> {code } .
667
+ ' from mediwiki: ' . $mediawiki -> {error }-> {details } .
668
+ " .\n " ;
669
+ return ($newrevid , " non-fast-forward" );
670
+ } else {
671
+ # Other errors. Shouldn't happen => just die()
672
+ die ' Fatal: Error ' .
673
+ $mediawiki -> {error }-> {code } .
674
+ ' from mediwiki: ' . $mediawiki -> {error }-> {details };
675
+ }
676
+ }
658
677
$newrevid = $result -> {edit }-> {newrevid };
659
678
print STDERR " Pushed file: $new_sha1 - $title \n " ;
660
679
} else {
661
680
print STDERR " $complete_file_name not a mediawiki file (Not pushable on this version of git-remote-mediawiki).\n "
662
681
}
663
- return $newrevid ;
682
+ return ( $newrevid , " ok " ) ;
664
683
}
665
684
666
685
sub mw_push {
@@ -767,13 +786,25 @@ sub mw_push_revision {
767
786
chomp ($commit_msg );
768
787
# Push every blob
769
788
while (@diff_info_list ) {
789
+ my $status ;
770
790
# git diff-tree -z gives an output like
771
791
# <metadata>\0<filename1>\0
772
792
# <metadata>\0<filename2>\0
773
793
# and we've split on \0.
774
794
my $info = shift (@diff_info_list );
775
795
my $file = shift (@diff_info_list );
776
- $mw_revision = mw_push_file($info , $file , $commit_msg , $mw_revision );
796
+ ($mw_revision , $status ) = mw_push_file($info , $file , $commit_msg , $mw_revision );
797
+ if ($status eq " non-fast-forward" ) {
798
+ # we may already have sent part of the
799
+ # commit to MediaWiki, but it's too
800
+ # late to cancel it. Stop the push in
801
+ # the middle, but still give an
802
+ # accurate error message.
803
+ return error_non_fast_forward($remote );
804
+ }
805
+ if ($status ne " ok" ) {
806
+ die (" Unknown error from mw_push_file()" );
807
+ }
777
808
}
778
809
unless ($dumb_push ) {
779
810
run_git(" notes --ref=$remotename /mediawiki add -m \" mediawiki_revision: $mw_revision \" $sha1_commit " );
0 commit comments