Multisection: When You Need to Bisect More Than Once



James E Keenan

The Perl Conference (North America)
June 19 2019


Table of Contents

1. Introduction
2. 'Multisection' eq 'Multiple Bisection'

3. Simple Bisection and Its Limitations
4. Bisection Typically Focuses on Single Commit
5. Bisection Typically Assumes Simple Progression from PASS to FAIL
6. But What If the Progression is Not Simple?
7. What If the Real Progression is Not Simple?

8. Real World Cases: Theory
9. What Infrastructure Would This Application Require?

10. Real World Cases: Practice
11. Porting/bisect.pl
12. Simple Real World Case: Blead Breaks CPAN Module Jcode
13. Identify the Breaking Commit
14. Observe Failing Test Output
15. Karl Williamson to the Rescue!
16. Confirm That Patch Works

17. Complex Real World Case
18. At Issue: Locales on FreeBSD-11
19. FreeBSD Release Cycle
20. Testing FreeBSD-11 in a Virtual Machine
21. lib/locale.t: Failures on FreeBSD-11.0
23. First Diagnostic: Porting/bisect.pl
24. Second Diagnostic: Run Every Intervening Commit
25. Requirements for New Diagnostic Tool

26. Devel-Git-MultiBisect
27. Devel-Git-MultiBisect: Preparation for Multisectioning
28. Devel-Git-MultiBisect: What It Does (Under the Hood)
29. Devel-Git-MultiBisect: Results

30. Analysis
31. Why Did Test Output Change at These Transition Commits?

33. Summary
34. Thank You
35. References

36. Bonus Slides: General
37. Bisection: Divide and Conquer
38. Bisection Method
39. Polynomial Root Problem Solved in Perl

40. Bonus Slides: Simple Bisection
41. Bisection: Calculate Next Commit to Be Tested
42. Bisection: Boolean Decisions
43. Bisection: Back and Forth
44. Bisection: Diagnostic Aid; Not Solution

45. Devel-Git-MultiBisect
46. Process Options
47. Devel::Git::MultiBisect Constructor
48. set_targets()
49. multisect_all_targets()
50. multisect_all_targets(): Commits Being Tested
51. multisect_all_targets(): Configure Command
52. multisect_all_targets(): Build Command
53. multisect_all_targets(): Test Command
54. multisect_all_targets(): Output Files Created
55. multisect_all_targets(): First Bisection Round
56. multisect_all_targets(): Next Bisection Round
58. multisect_all_targets(): Completion of Multisection
59. get_multisected_outputs()
60. inspect_transitions()
61. inspect_transitions(): Differences in md5_hex

62. Bonus Slides: Multisectioning Build-Time Failure
63. Identify the First Bad Commit -- But That's Not Enough
64. Identify Commits with Changes in make Output