git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

From
Jeff King <peff@peff.net>
Date
Aug 25, 2015, 17:12 UTC
Message-ID
<20150825171238.GB9674@sigill.intra.peff.net>
In-Reply-To
<CANy2qHdngVjH_tPE6=Aao-A2JWrVb_wt2wdu4EzZDQwM6-t_=Q@mail.gmail.com>
On Tue, Aug 25, 2015 at 05:01:01PM +0200, Gabor Bernat wrote:
Show 10 quoted lines
> So it would be great if the filter-branch beside the Rewrite
> f8f0b351ae35ff7ac4bd58078cbba1aa34243779 (523/22625), would also
> append a basic ETA signaling the end of the operation.
> 
> It could be as simple as the the average number of milliseconds per
> step up to this point multiplied with the remaining number of steps,
> then convert this into a day:hour:minutes:seconds format. It sound
> simple enough, but really handy for long running filter branch
> operations. I could also contribute if one could direct me towards the
> appropriate files this should go to.

Yeah, I agree the current filter-branch progress reporting is pretty simplistic. The line you want to tweak is in git-filter-branch.sh:

  printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits)"

But the real trick is getting accurate timing in a shell script. You can probably do the math within a "$(())" arithmetic block if you're OK with integers. But you'd have to run `date` on each loop iteration to get the current time, which may have a noticeable speed impact.

Of course, filter-branch is so slow in the first place, maybe it would not matter. :)

Something like this seems to work:
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index 5b3f63d..04e45bc 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -276,10 +276,21 @@ test $commits -eq 0 && die "Found nothing to rewrite"
 
 # Rewrite the commits
 
+start=$(date +%s)
 git_filter_branch__commit_count=0
 while read commit parents; do
 	git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))
-	printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits)"
+	now=$(date +%s)
+	elapsed=$(($now - $start))
+	# work in integer percentages as a sort of fixed-point
+	pct=$(($git_filter_branch__commit_count * 100 / $commits))
+	if test $pct -eq 0; then
+		remain=
+	else
+		eta=$(($elapsed * 100 / $pct))
+		remain="($(($eta - $elapsed)) seconds remaining)   "
+	fi
+	printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits) $remain"
 
 	case "$filter_subdir" in
 	"")

but the time jumps around early on because of the lack of precision. And
of course there's no smoothing, and no emphasis on recent history versus
the whole operation. I'll leave those as an exercise to the reader. :)

-Peff
Previous: Gabor BernatNext: Junio C Hamano
Message 2 of 24 in “[FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning”
  1. Gabor BernatAug 25, 2015
  2. Jeff KingAug 25, 2015
  3. Junio C HamanoAug 25, 2015
  4. Jeff KingAug 25, 2015
  5. Jeff KingAug 25, 2015
  6. Gabor BernatAug 25, 2015
  7. Eric SunshineAug 25, 2015
  8. Jeff KingAug 26, 2015
  9. Gabor BernatAug 29, 2015
  10. Gabor BernatAug 29, 2015
  11. Eric SunshineAug 30, 2015
  12. Gabor BernatAug 30, 2015
  13. Eric SunshineAug 30, 2015
  14. Mikael MagnussonAug 30, 2015
  15. Gabor BernatAug 30, 2015
  16. Mikael MagnussonAug 30, 2015
  17. Eric SunshineAug 30, 2015
  18. Junio C HamanoAug 30, 2015
  19. Gabor BernatAug 30, 2015
  20. Mikael MagnussonAug 30, 2015
  21. Eric SunshineAug 30, 2015
  22. Eric SunshineAug 30, 2015
  23. Eric SunshineAug 30, 2015
  24. Junio C HamanoAug 31, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.