From: Matthieu Moy <Matthieu.Moy@imag.fr>
To: git@vger.kernel.org, gitster@pobox.com
Cc: Asheesh Laroia <asheesh@asheesh.org>,
Matthieu Moy <Matthieu.Moy@imag.fr>
Subject: [PATCH 4/8] git-remote-mediawiki: get rid of O(N^2) loop
Date: Mon, 16 Jul 2012 21:46:38 +0200 [thread overview]
Message-ID: <1342468002-31818-5-git-send-email-Matthieu.Moy@imag.fr> (raw)
In-Reply-To: <1342468002-31818-1-git-send-email-Matthieu.Moy@imag.fr>
The algorithm to find a path from the local revision to the remote one
was calling "git rev-list" and parsing its output N times. Run rev-list
only once, and fill a hashtable with the result to optimize the body of
the loop.
Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
---
contrib/mw-to-git/git-remote-mediawiki | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/contrib/mw-to-git/git-remote-mediawiki b/contrib/mw-to-git/git-remote-mediawiki
index 8e46e4e..fb1e9e0 100755
--- a/contrib/mw-to-git/git-remote-mediawiki
+++ b/contrib/mw-to-git/git-remote-mediawiki
@@ -1196,16 +1196,26 @@ sub mw_push_revision {
if ($last_local_revid > 0) {
my $parsed_sha1 = $remoteorigin_sha1;
# Find a path from last MediaWiki commit to pushed commit
+ print STDERR "Computing path from local to remote ...\n";
+ my @local_ancestry = split(/\n/, run_git("rev-list --boundary --parents $local ^$parsed_sha1"));
+ my %local_ancestry;
+ foreach my $line (@local_ancestry) {
+ if (my ($child, $parents) = $line =~ m/^-?([a-f0-9]+) ([a-f0-9 ]+)/) {
+ foreach my $parent (split(' ', $parents)) {
+ $local_ancestry{$parent} = $child;
+ }
+ } elsif (!$line =~ m/^([a-f0-9]+)/) {
+ die "Unexpected output from git rev-list: $line";
+ }
+ }
while ($parsed_sha1 ne $HEAD_sha1) {
- my @commit_info = grep(/^$parsed_sha1/, split(/\n/, run_git("rev-list --children $local")));
- if (!@commit_info) {
+ my $child = $local_ancestry{$parsed_sha1};
+ if (!$child) {
+ printf STDERR "Cannot find a path in history from remote commit to last commit\n";
return error_non_fast_forward($remote);
}
- my @commit_info_split = split(/ |\n/, $commit_info[0]);
- # $commit_info_split[1] is the sha1 of the commit to export
- # $commit_info_split[0] is the sha1 of its direct child
- push(@commit_pairs, \@commit_info_split);
- $parsed_sha1 = $commit_info_split[1];
+ push(@commit_pairs, [$parsed_sha1, $child]);
+ $parsed_sha1 = $child;
}
} else {
# No remote mediawiki revision. Export the whole
--
1.7.11.2.258.g5ff3cdf.dirty
next prev parent reply other threads:[~2012-07-16 19:48 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-16 12:00 [PATCH 0/8] git-remote-mediawiki: fixes, optimizations, and progress report Matthieu Moy
2012-07-16 12:00 ` [PATCH 1/8] git-remote-mediawiki: don't split namespaces with spaces Matthieu Moy
2012-07-16 18:25 ` Junio C Hamano
2012-07-16 12:00 ` [PATCH 2/8] git-remote-mediawiki: actually send empty comment when they're empty Matthieu Moy
2012-07-16 18:13 ` Junio C Hamano
2012-07-16 19:06 ` Matthieu Moy
2012-07-16 19:17 ` Junio C Hamano
2012-07-16 12:00 ` [PATCH 3/8] git-remote-mediawiki: make mediafiles export optional Matthieu Moy
2012-07-16 18:15 ` Junio C Hamano
2012-07-16 19:40 ` Matthieu Moy
2012-07-16 12:00 ` [PATCH 4/8] git-remote-mediawiki: get rid of O(N^2) loop Matthieu Moy
2012-07-16 18:19 ` Junio C Hamano
2012-07-16 19:31 ` Matthieu Moy
2012-07-16 12:00 ` [PATCH 5/8] git-remote-mediawiki: use --force when adding notes Matthieu Moy
2012-07-16 12:00 ` [PATCH 6/8] git-remote-mediawiki: show progress information when listing pages Matthieu Moy
2012-07-16 12:00 ` [PATCH 7/8] git-remote-mediawiki: show progress information when getting last remote revision Matthieu Moy
2012-07-16 12:00 ` [PATCH 8/8] git-remote-mediawiki: properly deal with invalid remote revisions Matthieu Moy
2012-07-16 18:52 ` [PATCH 0/8] git-remote-mediawiki: fixes, optimizations, and progress report Junio C Hamano
2012-07-16 19:46 ` [PATCH 0/8 v2] " Matthieu Moy
2012-07-16 19:46 ` [PATCH 1/8] git-remote-mediawiki: don't split namespaces with spaces Matthieu Moy
2012-07-16 19:46 ` [PATCH 2/8] git-remote-mediawiki: actually send empty comment when they're empty Matthieu Moy
2012-07-16 19:46 ` [PATCH 3/8] git-remote-mediawiki: make mediafiles export optional Matthieu Moy
2012-07-16 19:46 ` Matthieu Moy [this message]
2012-07-16 19:46 ` [PATCH 5/8] git-remote-mediawiki: use --force when adding notes Matthieu Moy
2012-07-16 19:46 ` [PATCH 6/8] git-remote-mediawiki: show progress information when listing pages Matthieu Moy
2012-07-16 19:46 ` [PATCH 7/8] git-remote-mediawiki: show progress information when getting last remote revision Matthieu Moy
2012-07-16 19:46 ` [PATCH 8/8] git-remote-mediawiki: properly deal with invalid remote revisions Matthieu Moy
2012-07-16 19:56 ` [PATCH 0/8 v2] git-remote-mediawiki: fixes, optimizations, and progress report Junio C Hamano
2012-07-17 14:05 ` [PATCH 0/2] git-remote-mediawiki: two more fixes Matthieu Moy
2012-07-17 14:05 ` [PATCH 1/2] git-remote-mediawiki: fix incorrect test usage in test Matthieu Moy
2012-07-17 14:06 ` [PATCH 2/2] git-remote-mediawiki: allow page names with a ':' Matthieu Moy
2012-07-20 21:11 ` Dan Johnson
2012-07-23 7:42 ` Matthieu Moy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1342468002-31818-5-git-send-email-Matthieu.Moy@imag.fr \
--to=matthieu.moy@imag.fr \
--cc=asheesh@asheesh.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).