- 1 Introduction
- 2 How does Bibisecting Work?
- 3 Details
- 4 General Instructions
- 5 Limitations
- 6 Versions
- 7 Finding bugs
- 8 Special situations
- 9 Troubleshooting
- 10 Further information
Bibisect stands for "binary bisect". It's a procedure that helps identify commits that have caused regressions. Regressions are a most annoying artifact that unfortunately come with software development and QA. We want to deal with regressions quickly before time passes and they get harder and harder to triage and fix.
How does Bibisecting Work?
Each bibisect package is a git repository populated with hundreds or thousands of builds of LibreOffice. Added to the repository in chronological order, the builds provide a fast and simple way for us to test a bug against many different versions without having to compile LibreOffice each time we switch to a different version.
We can leverage the tools built into git for binary search through commits (e.g. git bisect) as well as benefit from the compression and de-duplication functions included in git. For example, in a series of builds that each might take up 500MB of disk space, through de-duplication we can potentially use only 25MB per additional build.
Watch Effective Bisection and Bibisection (Matthew Francis's talk at LibOCon 2015 on YouTube) for both an introduction, and practical details.
A successful bibisect will leave developers with only a few commits to search through to find the 'culprit' commit that we believe introduced a regression. Depending upon the particular bibisect repository, this range might be 60, 100, or even 2 commits. (We also have some very 'coarse' bibisect repositories that use released versions + beta + RC builds, and these may have ranges spanning multiple hundreds of commits)
QA can go the additional step of fully bisecting (determining the exact commit) or can leave this to the developers. It's often easy to find the commit that caused the issue after bibisecting the bug.
With approximately 10 gigs, you'll have hundreds of builds to work with. A bibisect can take as little as 15 minutes.
Currently, bibisecting is possible on:
Note: Each operating system is different, please read the full instructions that correspond to your specific operating system (GNU/Linux, macOS, or Windows) for more complete instructions, instructional videos, and other related information.
Bibisecting relies on 6 steps:
- Setting up your environment, including installing any extra software
- Downloading the bibisect package
- Bibisecting the bug
- Getting a bibisect log
- Attaching the bibisect log to the bug report
- Remove keyword 'bibisectRequest' from Keywords field and add the keyword 'bibisected'
- If the commit causing the regression has been identified, also add the keyword 'bisected', add the developer as CC and add the comment 'Adding Cc: to <developer's name>'
Some bibisect repositories have ranges of source commits folded into a single chunk. If after completing a bibisect you are presented with only a single one of these chunk commits, you can get the range by first copying the hash (note: not the source hash) and using it in a git log command like so:
git log c3f9dc54188b316a61dd871b63734d49b05f5d7f
Now you can copy the source hashes of the first and previous displayed commits and use them to construct a range query like so: https://cgit.freedesktop.org/libreoffice/core/log/?qt=range&q=5b195fbcf7a441aeb193f6abd08b877e580938e0...7c4d3ea6ba4d42b4dda5148a00c8c411b5d7703d
This will allow you to skim commit messages looking for related subjects. For deeper scrutiny, see the section on detective work.
Performing a bibisect is only possible if we have a repository available for the correct OS, covering the correct range of LibreOffice commits. We have very good coverage on GNU/Linux, and are improving our coverage on Windows and macOS.
Some regressions are difficult to reproduce, and may require multiple test runs for a bug to appear. As you may imagine, trying to bibisect such regressions is very difficult, and requires one to perform many test runs after each checkout of a new version of LibreOffice to give some security / statistics that the bug is indeed present or not present with the given version.
We do not currently have bibisect support for
- LibreOffice for Android
- BSDs (although the GNU/Linux bibisect packages may run, with minor tweaks)
- LibreOffice Online
- LibreOffice Vanilla for Mac (in the Mac App Store)
Versions are listed on each OS page. See #Details above.
Some bugs are not bibisectable. These include
- Bugs that don't show up on a supported platform (see #Limitations)
- Bugs that predate our bibisect builds (We're working on extending the range covered)
- Bugs that depend upon build options not enabled in the TDF builds (e.g. -kde)
If a bug with bibisectRequest Keyword is found to be not bibisectable, leave a comment on the bug explaining why we're not able to use bibisect to track down the introduction of this problem, and replace Keyword bibisectRequest with notBibisectable.
Finding bugs needing bibisect
Following Bugs with Keyword bibisectRequest are waiting for a bibisect:
99 Total; 99 Open (100%); 0 Resolved (0%); 0 Verified (0%);
In addition all unresolved regressions in LibreOffice might benefit from bibisecting.
Finding bugs already bibisected
For the links to bugzilla queries, please see here.
With the above info added to the bug a developer knows that the regression was introduced between the commits fb754a0df859e30255c25af8fa19bfaa75f257e7 (good) and 2d19e9bb07ccff3134f855812dddfda5c07b1fe4 (bad) on master. A:
git log fb754a0df859e30255c25af8fa19bfaa75f257e7..2d19e9bb07ccff3134f855812dddfda5c07b1fe4
on the source repository will then show the 128 commits including the one that introduced the bug, making it a lot easier for the developer to close in on the culprit. For more details, see:
Bibisecting language-specific bugs
The TDF bibisect repositories provided do not include any lang-packs.
To bibisect bugs which work good with english UI, but bad with non-english UI (like CJKs): one should copy-paste the following files, from a release build which has your language, to the same location of the bibisect repo:
1. program/resource/<your_lang_tag> 2. share/registry/Langpack-<your_lang_tag>.xcd 3. share/registry/res/fcfg_langpack_<your_lang_tag>.xcd 4. share/registry/res/registry_<your_lang_tag>.xcd
The suggested language resources you should copy is the one for the same major branch. For example, for the bibisect-linux-64-6.0 repo, you can copy from 220.127.116.11 release.
Running with a separate user profile
To create separate profile directory in /tmp/ (which will be automatically removed during the next machine boot):
If you want to start fresh for each bisect iteration, you can add git commit hash to directory name. For example:
./opt/program/soffice \ -env:UserInstallation=file:///tmp/soffice-bisect-$(git rev-parse HEAD)
Finding a fix
Sometimes a bug is a collateral damage of another (possibly minor) bug, in a non obvious way. In such cases that other bug might be fixed on master, but was not backported to the release branch. To identify a problem-fixing commit you can use:
git bisect start --term-new=fixed --term-old=unfixed git bisect fixed master git bisect unfixed <some-old-sha> # you can use "git log --reverse" to detect the first revision in the bibisected package
As you test, say
git bisect fixed
git bisect unfixed
If the fix is small and important enough, it likely can be easily backported to the release branch.
Checking out a specific commit based on source hash
Sometimes you want to do a sanity check and flip between the blamed commit and the one preceding it.
Copy the source hash and use it to grep in the log like so:
git log --all --grep='29a9f433c268414747d8ec7343fc2b5987971738'
Copy the commit hash of the bibisect repo and do a checkout for it:
git checkout 38758b70f5278d4d8292a2e857e80a9a1130f38e
To see the previous commits and compare, use git log.
Doing detective work inside a commit range
In case your bibisect result is a range of commits and you have trouble locating the offending commit, you might make your life easier by searching with a keyword.
An example for a case, where we know the problem is in Calc's Navigator view:
git log --stat --pretty=short --graph 169bd7718264b0e312052757f9bbd2321e1399c2...ff8b873936aa72b17309da4bfc2775573a5b1f55 | grep -B 10 -A 10 --color=always "sc/source/ui/navipi" | less -R
Adjust the -B and -A grep parameters to control how many lines before and after the hit you want to display. When piping to less, -R preserves the colouring of search results.
Please add your problems and how you solved them. This section covers issues that affect more than one OS. For OS-specific issues, please see the individual OS wiki pages.
Unable to extract files
If you can't extract files (you should get an error message). Try to rename the file from *.tar.lzma to *.tar.xz.
Installed LibreOffice became modified unexpectedly
Problem / Messages:
error: Your local changes to the following files would be overwritten by checkout: opt/program/pythonloader.pyc opt/program/uno.pyc opt/program/unohelper.pyc Please, commit your changes or stash them before you can switch branches. Aborting
git checkout .
will repair the problem. Afterwards you can start the next test run as usual with
git bisect good # or git bisect bad
If that does not solve the problem, you can try
git clean -fd git reset --hard
The ultimate repair is to delete everything except one
hidden folder, and do
git checkout oldest
Unable to start soffice
Problem: Upon trying to run soffice within bibisect you receive the error "unexpected operator terminate called after throwing an instance of 'com::sun::star::uno::DeploymentException'
Solution: Reset your libreoffice profile located in ~/.config/libreoffice. Make sure to backup the folder if you have any settings you'd like to preserve for use with your stable libreoffice release. After you're done with bibisect you can try to return your backed up profile to it's original location (ie. delete the new profile folder and replace it with the backed up one)
How to bisect RTL bugs
In case you need to bisect a RTL ( Right-To-Left ) bug, please import this variable before calling LibreOffice:
For details on how the bibisect archives are generated:
For information on merging all of our bibisect repositories into one big one, see
We want to make a GUI for bibisect: