In trunk I believe that retriving logs and revisions are pipelined (or will be soon).  That something you might want to take into consideration, since you'd have to update 2 status lines at once.  Pehaps the status for logs and commits can be folded into one line somehow. Something like this might work I suppose (though the wording could be changed):
<br><br>Syncing from <a href="file://localhost/home/jon/test_parrot">file://localhost/home/jon/test_parrot</a><br>
Metadata 50% (5032/10456) data 25% (2541/10436)<br>
<br>
Michael<br><br><div><span class="gmail_quote">On 12/18/06, <b class="gmail_sendername">Jonathan Rockway</b> &lt;<a href="mailto:jon@jrock.us">jon@jrock.us</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I tried git for the first time this weekend, and while I won't be<br>switching from svk to git any time soon, I did like the progress<br>indication that's output during &quot;git clone&quot;.&nbsp;&nbsp;So, I've added it to<br>SVN::Mirror (patch on RT), and SVK::Mirror in trunk of svk. 
<br></blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Instead of:<br> svk sync //test_parrot/mirror<br> Syncing <a href="file://localhost/home/jon/test_parrot">
file://localhost/home/jon/test_parrot</a><br> Retrieving log information from 106 to 10561<br>&nbsp;&nbsp;&lt;really long wait with no feedback&gt;<br> Committed revision 107 from 106<br> Committed revision 108 from 107<br>&nbsp;&nbsp;&lt;snip 10000 lines of useless information&gt;
<br><br>You get:<br> Syncing <a href="file://localhost/home/jon/test_parrot">file://localhost/home/jon/test_parrot</a><br> Retrieving log information from 106 to 10561<br>&nbsp;&nbsp;100% (10456/10456)<br> Downloading revision information...
<br>&nbsp;&nbsp; 29% (3070/10456)<br><br>My patch isn't without problems, though.&nbsp;&nbsp;The tests that expect<br>&quot;Committed ## from ##&quot; all fail, obviously, since that's not printed<br>anymore.&nbsp;&nbsp;I'd like to somehow add a log level called &quot;progress&quot; and then
<br>let the user pick whether he wants the verbose information, or if he<br>wants a nice progress bar instead.&nbsp;&nbsp;(people running pullmi [or is that<br>pushyu; i'm confused] will not want the progress bar, for example).&nbsp;&nbsp;I'm
<br>not sure how to best do this, though.<br><br>Also, the callback that prints the progress meter after &quot;Downloading<br>revision number&quot; can't currently get at $torev if it's &quot;HEAD&quot;, so I<br>added a nasty hack to change that.&nbsp;&nbsp;However, it can easily be made less
<br>nasty if this is the best way to do it (add a torev accessor, and then<br>pass it to the callback as my patch does, sort of).<br><br>Finally, the &quot;Retrieving log information from 1 to 10561<br> 100% (10561/10561)
<br>Downloading revision information...&quot; part is specific to the RA backend,<br>which seems non-optimal to me (but I can live with it for now, because<br>it's the only backend).<br><br>Anyway, suggestions welcome.&nbsp;&nbsp;If people like this, I'm going to add the
<br>same thing to checkout (for the initial checkout), because nobody ever<br>reads the list of files from svk checkout anyway (but they do want to<br>know how long it's going to take).&nbsp;&nbsp;After that's done, I plan to add a
<br>&quot;clone&quot; operation, so you can write:<br><br>$ svk clone <a href="http://svn.somewhere.com/repos/foo">http://svn.somewhere.com/repos/foo</a><br><br>and have svk do:<br> svk mirror //mirror/foo <a href="http://svn.somewhere.com/repos/foo">
http://svn.somewhere.com/repos/foo</a><br> svk sync //mirror/foo<br> svk copy //mirror/foo //local/foo<br> svk co //local/foo<br><br>The output will look like:<br><br>Syncing <a href="http://svn.somewhere.com/repos/foo">http://svn.somewhere.com/repos/foo
</a><br>Mirroring <a href="http://svn.somewhere.com/repos/foo">http://svn.somewhere.com/repos/foo</a> to //mirror/foo<br>Retrieving log information from 1 to 10561<br> 100% (10561/10561)<br>Downloading revision information...
<br> 100% (10561/10561)<br>Creating local branch...<br>Checking out a working copy...<br> 100% (1234/1234)<br>$ cd foo<br>$ # start your work<br><br>Yes, this is completely stolen from git, but it's a good idea :)<br>Comments welcome (especially about the //mirror and //local naming
<br>conventions) before I start hacking on this.<br><br>Regards,<br>Jonathan Rockway<br><br>--<br>package JAPH;use Catalyst qw/-Debug/;($;=JAPH)-&gt;config(name =&gt; do {<br>$,.=reverse qw[Jonathan tsu rehton lre rekca Rockway][$_].[split //,
<br>&quot;;$;&quot;]-&gt;[$_].q; ;for 1..4;$,=~s;^.;;;$,});$;-&gt;setup;<br><br><br>==== Patch &lt;svk_sync_progress&gt; level 2<br>Source: d7608cd0-831c-0410-93c0-e5b306c3c028:/local/svk:13011<br>Target: 4ccb8a5b-8ae0-0310-9b02-86531366991d:/:2240
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<a href="http://code.bestpractical.com/svk">http://code.bestpractical.com/svk</a>)<br>Log:<br> r12556@foo:&nbsp;&nbsp;jon | 2006-12-16 19:20:44 -0600<br> local branch of svk<br> r13010@foo:&nbsp;&nbsp;jon | 2006-12-18 14:49:19 -0600
<br> added progress bar for svn sync; both log info and revision commits<br> r13011@foo:&nbsp;&nbsp;jon | 2006-12-18 16:04:35 -0600<br> sync meter off-by-one, and also off-by-looking-at-the-wrong-counter.&nbsp;&nbsp;fixed.<br><br>=== trunk/lib/SVK/Mirror.pm
<br>==================================================================<br>--- trunk/lib/SVK/Mirror.pm&nbsp;&nbsp;&nbsp;&nbsp; (revision 2240)<br>+++ trunk/lib/SVK/Mirror.pm&nbsp;&nbsp;&nbsp;&nbsp; (patch svk_sync_progress level 2)<br>@@ -363,15 +363,27 @@<br><br>
&nbsp;&nbsp;&nbsp;&nbsp; $logger-&gt;info(loc(&quot;Syncing %1&quot;, $self-&gt;url).($self-&gt;_backend-&gt;_relayed ? loc(&quot; via %1&quot;, $self-&gt;server_url) : &quot;&quot;));<br><br>+&nbsp;&nbsp;&nbsp;&nbsp;my $fromrev = $self-&gt;fromrev;<br>+&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;_show_progress(0, $torev-$fromrev+1) if $torev;
<br>&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;mirror_changesets($torev,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ( $changeset, $rev ) = @_;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$logger-&gt;info(&quot;Committed revision $rev from revision $changeset.&quot;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my ( $changeset, $rev, $torev ) = @_;
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #$logger-&gt;info(&quot;Committed revision $rev from revision $changeset.&quot;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;_show_progress($changeset-$fromrev, $torev-$fromrev);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; );<br>+&nbsp;&nbsp;&nbsp;&nbsp;print &quot;\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp; die $@ if $@;<br> }<br><br>+sub _show_progress {<br>+&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;<br>+&nbsp;&nbsp;&nbsp;&nbsp;my ($current, $to) = @_;<br>+&nbsp;&nbsp;&nbsp;&nbsp;local $| = 1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;$to ||= 1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;printf &quot; %3d%% (%d/%d)\r&quot;, int(100*$current/$to), $current, $to;
<br>+}<br>+<br> sub sync_snapshot {<br>&nbsp;&nbsp;&nbsp;&nbsp; my ($self, $snapshot) = @_;<br>&nbsp;&nbsp;&nbsp;&nbsp; $logger-&gt;warn(loc(&quot;<br>=== trunk/lib/SVK/Mirror/Backend/SVNRa.pm<br>==================================================================
<br>--- trunk/lib/SVK/Mirror/Backend/SVNRa.pm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (revision 2240)<br>+++ trunk/lib/SVK/Mirror/Backend/SVNRa.pm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (patch svk_sync_progress level 2)<br>@@ -287,7 +287,7 @@<br><br>&nbsp;&nbsp;&nbsp;&nbsp; my $err;<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local $SVN::Error::handler = sub { $err = $_[0]; die \'error handled' };
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local $SVN::Error::handler = sub { $err = $_[0]; die \'error handled' }; #'}; # pacify emacs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( eval { $ra-&gt;replay( 0, 0, 0, SVK::Editor-&gt;new ); 1 } ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;_ra_finished($ra);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $self-&gt;_has_replay(1);<br>@@ -408,15 +408,19 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; my $ra = $self-&gt;_new_ra;<br>&nbsp;&nbsp;&nbsp;&nbsp; $to = $ra-&gt;get_latest_revnum() if $to == -1;<br>&nbsp;&nbsp;&nbsp;&nbsp; return if $from &gt; $to;<br>+&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;{torev} = $to; # XXX hack
<br>&nbsp;&nbsp;&nbsp;&nbsp; print &quot;Retrieving log information from $from to $to\n&quot;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;mirror-&gt;_show_progress(0, $to-$from+1);<br>&nbsp;&nbsp;&nbsp;&nbsp; eval {<br>&nbsp;&nbsp;&nbsp;&nbsp; $ra-&gt;get_log([''], $from, $to, 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0, 1,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ($paths, $rev, $author, $date, $msg, $pool) = @_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$code-&gt;($rev, { author =&gt; $author, date =&gt; $date, message =&gt; $msg });<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;mirror-&gt;_show_progress($rev-$from+1,$to-$from+1);
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br>&nbsp;&nbsp;&nbsp;&nbsp; };<br>+&nbsp;&nbsp;&nbsp;&nbsp;print &quot;\n&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;_ra_finished($ra);<br>&nbsp;&nbsp;&nbsp;&nbsp; die $@ if $@;<br> }<br>@@ -436,7 +440,9 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $t-&gt;repos-&gt;fs-&gt;change_rev_prop( $_[0], 'svn:date',
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $metadata-&gt;{date} );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;fromrev( $_[0] );<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$callback-&gt;( $changeset, $_[0] ) if $callback;<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # XXX: torev is a hack<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$callback-&gt;( $changeset, $_[0], $self-&gt;{torev} ) if $callback;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; );<br><br>@@ -536,6 +542,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;refresh;<br>&nbsp;&nbsp;&nbsp;&nbsp; my @revs;<br>&nbsp;&nbsp;&nbsp;&nbsp; $self-&gt;traverse_new_changesets( sub { push @revs, [@_] }, $torev );<br>+&nbsp;&nbsp;&nbsp;&nbsp;$torev = $self-&gt;{torev}; # XXX do this more cleanly
<br>&nbsp;&nbsp;&nbsp;&nbsp; return unless @revs;<br><br>&nbsp;&nbsp;&nbsp;&nbsp; # prepare generator for pipelined ra<br>@@ -550,6 +557,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ra = SVK::Mirror::Backend::SVNRaPipe-&gt;new( $ra, sub { shift @gen } );<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Downloading revision information...\n&quot;;
<br>&nbsp;&nbsp;&nbsp;&nbsp; my $pool = SVN::Pool-&gt;new_default;<br>&nbsp;&nbsp;&nbsp;&nbsp; for (@revs) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $pool-&gt;clear;<br><br>==== BEGIN SVK PATCH BLOCK ====<br>Version: svk 1.99_05 (linux)<br><br>eJyNVt2O20QUzgUXECGeAKRh68AujZMZ/9tRo4ifvQEqVEpVtUXR2B4npo4nGju7jeqVdtUKCW64
<br>6QVPwQ2v0Ct4BFRueAkkbjgzsb3ZJdvFipSZM+d858fnO55DcXc0IdV4jCuN4Orre58HwVe0jOY9<br>YlWaU7E4LbnQ7CpjRyzTzCrjM82qcrpgcFrwlYjkoqRixkq5SKPHrByPCcB5G7jPFEQDq1BDWvK8<br>0HwFPy0FYxqpvIlfTUz5m2rErwoGJwp2KthRWqQ8hzCIiQkBFdAnYM+XLJ8Kzkt5ZNi2PTGkNa6i
<br>jBdsKuFBMrGlvqFBSsogTgWLIKY1WJVilT9WaA2C8m/XCOeqoNJCmTug/A3UMEtD5exaOKOFs3bA<br>EfMcbwh1VF6vxTRlARWm3VQnSTOmGZfQhl+mQnAxWC6U+wZXWTo7ojHwTvsLxlcGZW0SVad0uczW<br>05I9KWOWlVQFahqVgYllGqETkiiMQubZkUXMyDfsGDMXE0+zXRO66Xan88f7r6q3n/c6v73XOYW/
<br>n4LfZ4s10hLBF9Am6BbSCpYl+rgWjLoInlo2Leb8eLoUfCZYUezjPtIgRHakN+Y3yQFKk1p6wXSh<br>8p1Gc5rPGLRmsb9R6isl+RSrED3tviWXENA+0lpdcCM1a1h0AEFOpqON6g0NCDVjQh+necL39z7h<br>i0ValixGTdMrYyQD3BK12IO9gxppd47nmm2S/8n6YNQmcaJWtWAp0rxEe4/yvc0+ThnSJqpAk1H3
<br>pNuVKV/0BxWoC6DCgUyLeZqUo0YK8ayEYHmpgmgqIQ8zHtEMaRWISF35kqOqarcqmgTtoZ4Z93po<br>vxcPe/HBI7HXR3CwTzD+qAEfSmzwsO1rYm0PBkWKpvcYwRZ2rBjT0LRs3yVxZIWGH0Vhkjih2dLU<br>3UUMbycxhh9TmIN5rOh0LUGc1oV3gbWm+1pwEN2+Qzccdq/34r6Whp4sBTUTajBqho7tex4NXTtM
<br>HBobie16cWi5muX7Gxqeff/F2Q8f9J/5nZeHnRedn998eXh69k7n7N6rN04fdJ7TP6PTR50X5l/5<br>r51nD/9+95fOjw/+EejGhycjdAMtaZQma8QWNCrqtn2qWvJE8rfkUuf+/ftoDnlud+IdVooUOJDP<br>oF1mSDJGLGgpGaH4oRoaQdsARtu1Fwh8xQzYUEGy/1oDrWXOTdLfNgUaAg9Pau6cXKaQ4mjNeZlc
<br>gDbTIC0QPU+0eTQgQxaCVB9fmiTTh/jbPrpYtXqw3LokbsoYc1TOwc8CpCjKGM2zdR3Yp/w4zziN<br>ZUnb6bJV18FgIAu5kzyqY1hsY5+Enstc308odgmJbMPGxCeObarvuqGZ2KmQkO3pTBLOA4S+AzcV<br>MjB2dGLoxEHEDwwcWBbSsYNxtx4HoaB5NEc8QcURFEjIrz/eDeEhYgWWHxC/gaBxDGO0nUwhFQjy
<br>AqQcFes8GqGQl/O2kRDNt2ZupMZwUbskV7p0AmwFpt24lLhowUomIOZED9c6z1lfQdOs4I0w4/wx<br>VFynpV7OmX4sOGwivsrBcIBQkj5h8aCrEbeCtKcStO2/8dioNMPY3KzuqutREHyTp0dMFDTrORVc<br>zpa0nMNNDZKBzWqVxvLVDVVFhwDY3KI006li18FeFGPdM0mkY4tg3TcjrDM7hJcWwdLwxgdGdSVw
<br>NYSlYVhYolkwMj1qh7pHGdaxKdFCbOgetAIxHcf3SazZ5v/yGpwHHKhw/wXQ/1d9<br>==== END SVK PATCH BLOCK ====<br><br><br>_______________________________________________<br>svk-devel mailing list<br><a href="mailto:svk-devel@bestpractical.com">
svk-devel@bestpractical.com</a><br><a href="http://lists.bestpractical.com/cgi-bin/mailman/listinfo/svk-devel">http://lists.bestpractical.com/cgi-bin/mailman/listinfo/svk-devel</a><br><br><br></blockquote></div><br>