#!/usr/bin/env python3 # This file is part of the LibreOffice project. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. """ Script to generate https://wiki.documentfoundation.org/Development/DispatchCommands 3 types of source files are scanned to identify and describe a list of relevant UNO commands: - .hxx files: containing the symbolic and numeric id's, and the respective modes and groups - .xcu files; containing several english labels as they appear in menus or tooltips - .sdi files: containing a list of potential arguments for the commands, and their types """ import os REPO = 'https://opengrok.libreoffice.org/xref/core/' BLACKLIST = ('_SwitchViewShell0', '_SwitchViewShell1', '_SwitchViewShell2', '_SwitchViewShell3', '_SwitchViewShell4') XCU_DIR = 'officecfg/registry/data/org/openoffice/Office/UI/' XCU_FILES = ( XCU_DIR + 'BasicIDECommands.xcu', XCU_DIR + 'CalcCommands.xcu', XCU_DIR + 'ChartCommands.xcu', XCU_DIR + 'DbuCommands.xcu', XCU_DIR + 'DrawImpressCommands.xcu', XCU_DIR + 'GenericCommands.xcu', XCU_DIR + 'MathCommands.xcu', XCU_DIR + 'ReportCommands.xcu', XCU_DIR + 'WriterCommands.xcu') HXX_DIR = './workdir/SdiTarget/' HXX_FILES = ( HXX_DIR + 'basctl/sdi/basslots.hxx', HXX_DIR + 'sc/sdi/scslots.hxx', HXX_DIR + 'sd/sdi/sdgslots.hxx', HXX_DIR + 'sd/sdi/sdslots.hxx', HXX_DIR + 'sfx2/sdi/sfxslots.hxx', HXX_DIR + 'starmath/sdi/smslots.hxx', HXX_DIR + 'svx/sdi/svxslots.hxx', HXX_DIR + 'sw/sdi/swslots.hxx') SDI_FILES = ( 'sc/sdi/scalc.sdi', 'sd/sdi/sdraw.sdi', 'sfx2/sdi/sfx.sdi', 'starmath/sdi/smath.sdi', 'svx/sdi/svx.sdi', 'sw/sdi/swriter.sdi') # Category is defined by the 1st file where the command has been found. Precedence: 1. xcu, 2. hxx, 3. sdi. MODULES = {'BasicIDE': 'Basic IDE, Forms, Dialogs', 'Calc': 'Calc', 'Chart': 'Charts', 'Dbu': 'Base', 'DrawImpress': 'Draw / Impress', 'Generic': 'Global', 'Math': 'Math', 'Report': 'Reports', 'Writer': 'Writer', 'basslots': 'Basic IDE, Forms, Dialogs', 'scslots': 'Calc', 'sdgslots': 'Draw / Impress', 'sdslots': 'Draw / Impress', 'sfxslots': 'Global', 'smslots': 'Math', 'svxslots': 'Global', 'swslots': 'Writer', 'scalc': 'Calc', 'sdraw': 'Draw / Impress', 'sfx': 'Global', 'smath': 'Math', 'svx': 'Global', 'swriter': 'Writer'} def newcommand(unocommand): cmd = {'unocommand': unocommand, 'module': '', 'xcufile': -1, 'xculinenumber': 0, 'xcuoccurs': 0, 'label': '', 'contextlabel': '', 'tooltiplabel': '', 'hxxfile': -1, 'hxxoccurs': 0, 'hxxlinenumber': 0, 'resourceid': '', 'numericid': '', 'group': '', 'sdifile': -1, 'sdioccurs': 0, 'sdilinenumber': 0, 'mode': '', 'arguments': ''} return cmd def analyze_xcu(all_commands): for filename in XCU_FILES: ln = 0 with open(filename) as fh: popups = False for line in fh: ln += 1 if '' in line: popups = True continue elif popups is True and line == ' ': popups = False continue if '' not in line: try: line = next(fh) ln += 1 except StopIteration: print("Warning: couldn't find '' line in %s" % filename, file=sys.stderr) break if '' in line: labeltext = line.replace('', '').replace('', '').strip() elif ' 0: for p in params.split(','): if len(split) > 0: split += CR elems = p.split() if len(elems) >= 2: split += elems[1] if 'String' in elems[0]: split += ' (string)' elif 'Bool' in elems[0]: split += ' (bool)' elif 'Int16' in elems[0]: split += ' (integer)' elif 'Int32' in elems[0]: split += ' (long)' else: split += ' (' + elems[0].replace('Sfx', '').replace('Svx', '').replace('Item', '').lower() + ')' return split for filename in SDI_FILES: ln = 0 comment, square, command, param = False, False, False, False with open(filename) as fh: for line in fh: ln += 1 line = line.replace(' ', ' ').strip() # Anomaly met in svx/sdi/svx.sdi if line.startswith('//'): pass elif comment is False and line.startswith('/*') and not line.endswith('*/'): comment = True elif comment is True and line.endswith('*/'): comment = False elif comment is False and line.startswith('/*') and line.endswith('*/'): pass elif comment is True: pass elif square is False and line.startswith('['): square = True mode = '' command = False elif square is True and line.endswith(']'): all_commands[command_name]['mode'] = mode square = False elif square is True: squaremode = line.strip(',;').split() if len(squaremode) == 3: mode += 'U' if squaremode[0] == 'AutoUpdate' and squaremode[2] == 'TRUE' else '' mode += 'M' if squaremode[0] == 'MenuConfig' and squaremode[2] == 'TRUE' else '' mode += 'T' if squaremode[0] == 'ToolBoxConfig' and squaremode[2] == 'TRUE' else '' mode += 'A' if squaremode[0] == 'AccelConfig' and squaremode[2] == 'TRUE' else '' elif comment is False and square is False and command is False and len(line) == 0: pass elif command is False: command_name = '.uno:' + line.split(' ')[1] if command_name not in all_commands: all_commands[command_name] = newcommand(command_name) all_commands[command_name]['sdifile'] = SDI_FILES.index(filename) all_commands[command_name]['sdilinenumber'] = ln all_commands[command_name]['sdioccurs'] += 1 if len(all_commands[command_name]['resourceid']) == 0: all_commands[command_name]['resourceid'] = line.split(' ')[2] command = True elif command is True and (line == '' or line == '()'): command = False elif command is True and (param is True or line.startswith('(')) and line.endswith(')'): if param: params += line.strip(' (),').replace(', ', ',') # At least 1 case of ", " in svx/sdi/svx.sdi line 8767 # At least 1 case of "( " in sw/sdi/swriter.sdi line 5477 else: params = line.strip(' (),').replace(', ', ',') # At least 1 case in sw/sdi/swriter.sdi line 7083 all_commands[command_name]['arguments'] = SplitArguments(params) command = False param = False elif command is True and line.startswith('('): # Arguments always on 1 line, except in some cases (cfr.BasicIDEAppear) params = line.strip(' ()').replace(', ', ',') param = True elif param is True: params += line def categorize(all_commands): # Clean black listed commands for command in BLACKLIST: cmd = '.uno:' + command if cmd in all_commands: del all_commands[cmd] # Set category based on the file name where the command was found first for cmd in all_commands: command = all_commands[cmd] cxcu, chxx, csdi = '', '', '' fxcu = command['xcufile'] if fxcu > -1: cxcu = os.path.basename(XCU_FILES[fxcu]).split('.')[0].replace('Commands', '') fhxx = command['hxxfile'] if fhxx > -1: chxx = os.path.basename(HXX_FILES[fhxx]).split('.')[0] fsdi = command['sdifile'] if fsdi > -1: csdi = os.path.basename(SDI_FILES[fsdi]).split('.')[0] # General rule: if len(cxcu) > 0: cat = cxcu elif len(chxx) > 0: cat = chxx else: cat = csdi # Exceptions on general rule if cat == 'Generic' and chxx == 'basslots': cat = chxx command['module'] = MODULES[cat] def print_output(all_commands): def longest(*args): # Return the longest string among the arguments return max(args, key = len) # def sources(cmd): # Build string identifying the sources xcufile, xculinenumber, hxxfile, hxxlinenumber, sdifile, sdilinenumber = 2, 3, 8, 10, 14, 16 src = '' if cmd[xcufile] >= 0: src += '[' + REPO + XCU_FILES[cmd[xcufile]] + '#' + str(cmd[xculinenumber]) + ' XCU]' if cmd[sdifile] >= 0: src += ' [' + REPO + SDI_FILES[cmd[sdifile]] + '#' + str(cmd[sdilinenumber]) + ' SDI]' if cmd[hxxfile] >= 0: file = str(cmd[hxxfile] + 1 + len(XCU_FILES) + len(SDI_FILES)) src += ' [[#hxx' + file + '|HXX]]' return src.strip() # # Sort by category and command name commands_list = [] for cmd in all_commands: cmdlist = tuple(all_commands[cmd].values()) commands_list.append(cmdlist) sorted_by_command = sorted(commands_list, key = lambda cmd: cmd[0]) sorted_by_module = sorted(sorted_by_command, key = lambda cmd: cmd[1]) # # Produce tabular output unocommand, module, label, contextlabel, tooltiplabel, arguments, resourceid, numericid, group, mode = 0, 1, 5, 6, 7, 18, 11, 12, 13, 17 lastmodule = '' for cmd in sorted_by_module: # Format bottom and header if lastmodule != cmd[module]: if len(lastmodule) > 0: print('\n|-\n|}\n') print('') lastmodule = cmd[module] print('=== %s ===\n' % lastmodule) print('') print('{| class="wikitable sortable" width="100%"') print('|-') print('! scope="col" | Dispatch command') print('! scope="col" | Description') print('! scope="col" | Group') print('! scope="col" | Arguments') print('! scope="col" | Internalname (value)') print('! scope="col" | Mode') print('! scope="col" | Sourcefiles') print('|-\n') print('| ' + cmd[unocommand].replace('&', '\n&')) print('| ' + longest(cmd[label], cmd[contextlabel], cmd[tooltiplabel])) print('| ' + cmd[group]) print('| ' + cmd[arguments].replace('\\n', '\n')) if len(cmd[numericid]) == 0: print('| ' + cmd[resourceid]) else: print('| ' + cmd[resourceid] + ' (' + cmd[numericid] + ')') print('| ' + cmd[mode]) print('| ' + sources(cmd)) print('|-\n|}\n') # List the source files print('== Source files ==\n') fn = 0 for i in range(len(XCU_FILES)): fn += 1 print(f'({fn}) {REPO}{XCU_FILES[i]}\n') print('\n') for i in range(len(SDI_FILES)): fn += 1 print(f'({fn}) {REPO}{SDI_FILES[i]}\n') print('\n') for i in range(len(HXX_FILES)): fn += 1 print(f'({fn}) {HXX_FILES[i][2:]}\n') print('') def main(): all_commands = {} analyze_xcu(all_commands) analyze_hxx(all_commands) analyze_sdi(all_commands) categorize(all_commands) print_output(all_commands) if __name__ == '__main__': main() ure/foo'>feature/foo feature/gbuild_cli feature/gccwrapper feature/glyphy feature/go2 feature/gpg4libre feature/gpg4libre-5-4 feature/gpg4libre-6-0 feature/gpg4libre2 feature/graphicobject feature/gsoc-basic-ide-completion-and-other-bits feature/gsoc-calc-enhanced-db-range feature/gsoc-svm-writer feature/gsoc-uitest-2019 feature/gsoc14-colors feature/gsoc14-draw-chained-text-boxes feature/gsoc14-draw-text-background-color feature/gsoc14-libcmis feature/gsoc14-libcmis2 feature/gsoc14-personas feature/gsoc14-personas2 feature/gsoc15-online-update feature/gsoc15-open-remote-files-dialog feature/gsoc17-revamp-customize-dialog feature/gsoc19-chart-style feature/gsoc2011_wizards feature/gsoc24-lua feature/gtk3_kde5 feature/gtk3nativedialogs feature/gtktiledviewer feature/ia2 feature/ia2.2 feature/ia2.3 feature/ia2.4 feature/ia2.5 feature/improvexlsximport feature/instdirlinktargets feature/item_refactor2 feature/jsdialogs feature/jssidebar feature/lfrb-vcl-opengl feature/libffi feature/lok-calc-rtl feature/lok-clipboard feature/lok_cellcursor feature/lok_dialog feature/lok_dialog-backport feature/lok_dialog2 feature/lok_sofficemain feature/lok_sofficemain2 feature/mac-opengl-fixes feature/macOS-weld feature/mailmerge-toolbar feature/mar-updater feature/mariadb feature/misc-vba-rework feature/mork feature/nativealpha feature/notebookbar feature/notes-refactoring feature/ooxml-analyze feature/opengl-canvas-rework feature/opengl-transitions-rework feature/opengl-vcl-text feature/orcus-continuous-integration feature/orcus-odf feature/orcus-odf-rebased feature/orcus-odf-rebased2 feature/orcus-rebased feature/owncloud-provider-for-android feature/pdfium-master feature/perfwork4 feature/perfwork5 feature/pivotcharts feature/print_revamp feature/priorities feature/profilesafemode feature/propose-master-cib feature/pytable feature/pyweb-wizard feature/qt5-win+mac feature/refactor-god-objects feature/rendercontext feature/resolve-comments feature/scaling-geometry-provider feature/screenshotannotation feature/sgexperiment feature/skia feature/slidehack feature/slidehack2 feature/slideshow_onlySprites feature/slideshowprimitives feature/sparklines feature/spellig_popup_SID feature/stub_writer feature/svg-export feature/svg-optimisations feature/svg-optimisations-5-0 feature/sw-delete-undo-rework feature/sw_redlinehide_4a_for_libreoffice-6-2 feature/sw_redlinehide_4b_for_libreoffice-6-2 feature/table-style feature/table-style-rebased feature/table_panel feature/table_rotated_text feature/taggedPDF feature/template_manager_improvements feature/template_manager_improvements2 feature/themesupport feature/themesupport2 feature/tiled-editing feature/tscp3 feature/unitver feature/unocrsrptr feature/unostyles feature/unostyles2 feature/unostyles3 feature/use-ogl-context-in-canvas feature/vcl-opengl feature/vcl-opengl-integration feature/vcl-opengl2 feature/vclptr feature/vlc feature/vlc-rb feature/vs2012 feature/wasm feature/window-iter feature/windows-cross-build feature/windowsupdater feature/xtiledrenderable libreoffice-24-2 libreoffice-24-2-0 libreoffice-24-2-1 libreoffice-24-2-2 libreoffice-24-2-3 libreoffice-24-2-4 libreoffice-24-2-5 libreoffice-24-2-6 libreoffice-24-2-7 libreoffice-24-8 libreoffice-24-8-0 libreoffice-24-8-1 libreoffice-24-8-2 libreoffice-24-8-3 libreoffice-24-8-4 libreoffice-25-2 libreoffice-3-5 libreoffice-3-5-0 libreoffice-3-5-1 libreoffice-3-5-2 libreoffice-3-5-3 libreoffice-3-5-4 libreoffice-3-5-5 libreoffice-3-5-6 libreoffice-3-5-7 libreoffice-3-6 libreoffice-3-6-0 libreoffice-3-6-1 libreoffice-3-6-2 libreoffice-3-6-3 libreoffice-3-6-4 libreoffice-3-6-5 libreoffice-3-6-6 libreoffice-3-6-7 libreoffice-4-0 libreoffice-4-0-0 libreoffice-4-0-1 libreoffice-4-0-2 libreoffice-4-0-3 libreoffice-4-0-4 libreoffice-4-0-5 libreoffice-4-0-6 libreoffice-4-1 libreoffice-4-1-0 libreoffice-4-1-1 libreoffice-4-1-2 libreoffice-4-1-3 libreoffice-4-1-4 libreoffice-4-1-5 libreoffice-4-1-6 libreoffice-4-2 libreoffice-4-2-0 libreoffice-4-2-1 libreoffice-4-2-2 libreoffice-4-2-3 libreoffice-4-2-4 libreoffice-4-2-5 libreoffice-4-2-6 libreoffice-4-2-7 libreoffice-4-2-8 libreoffice-4-3 libreoffice-4-3-0 libreoffice-4-3-1 libreoffice-4-3-2 libreoffice-4-3-3 libreoffice-4-3-4 libreoffice-4-3-5 libreoffice-4-3-6 libreoffice-4-3-7 libreoffice-4-4 libreoffice-4-4-0 libreoffice-4-4-1 libreoffice-4-4-2 libreoffice-4-4-3 libreoffice-4-4-4 libreoffice-4-4-5 libreoffice-4-4-6 libreoffice-4-4-7 libreoffice-5-0 libreoffice-5-0-0 libreoffice-5-0-1 libreoffice-5-0-2 libreoffice-5-0-3 libreoffice-5-0-4 libreoffice-5-0-5 libreoffice-5-0-6 libreoffice-5-1 libreoffice-5-1-0 libreoffice-5-1-1 libreoffice-5-1-2 libreoffice-5-1-3 libreoffice-5-1-4 libreoffice-5-1-5 libreoffice-5-1-6 libreoffice-5-2 libreoffice-5-2-0 libreoffice-5-2-1 libreoffice-5-2-2 libreoffice-5-2-3 libreoffice-5-2-4 libreoffice-5-2-5 libreoffice-5-2-6 libreoffice-5-2-7 libreoffice-5-3 libreoffice-5-3-0 libreoffice-5-3-1 libreoffice-5-3-2 libreoffice-5-3-3 libreoffice-5-3-4 libreoffice-5-3-5 libreoffice-5-3-6 libreoffice-5-3-7 libreoffice-5-4 libreoffice-5-4-0 libreoffice-5-4-1 libreoffice-5-4-2 libreoffice-5-4-3 libreoffice-5-4-4 libreoffice-5-4-5 libreoffice-5-4-6 libreoffice-5-4-7 libreoffice-6-0 libreoffice-6-0-0 libreoffice-6-0-1 libreoffice-6-0-2 libreoffice-6-0-3 libreoffice-6-0-4 libreoffice-6-0-5 libreoffice-6-0-6 libreoffice-6-0-7 libreoffice-6-1 libreoffice-6-1-0 libreoffice-6-1-1 libreoffice-6-1-2 libreoffice-6-1-3 libreoffice-6-1-4 libreoffice-6-1-5 libreoffice-6-1-6 libreoffice-6-2 libreoffice-6-2-0 libreoffice-6-2-1 libreoffice-6-2-2 libreoffice-6-2-3 libreoffice-6-2-4 libreoffice-6-2-5 libreoffice-6-2-6 libreoffice-6-2-7 libreoffice-6-2-8 libreoffice-6-3 libreoffice-6-3-0 libreoffice-6-3-1 libreoffice-6-3-2 libreoffice-6-3-3 libreoffice-6-3-4 libreoffice-6-3-5 libreoffice-6-3-6 libreoffice-6-4 libreoffice-6-4-0 libreoffice-6-4-1 libreoffice-6-4-2 libreoffice-6-4-3 libreoffice-6-4-4 libreoffice-6-4-5 libreoffice-6-4-6 libreoffice-6-4-7 libreoffice-7-0 libreoffice-7-0-0 libreoffice-7-0-1 libreoffice-7-0-2 libreoffice-7-0-3 libreoffice-7-0-4 libreoffice-7-0-5 libreoffice-7-0-6 libreoffice-7-1 libreoffice-7-1-0 libreoffice-7-1-1 libreoffice-7-1-2 libreoffice-7-1-3 libreoffice-7-1-4 libreoffice-7-1-5 libreoffice-7-1-6 libreoffice-7-1-7 libreoffice-7-2 libreoffice-7-2-0 libreoffice-7-2-1 libreoffice-7-2-2 libreoffice-7-2-3 libreoffice-7-2-5 libreoffice-7-2-6 libreoffice-7-2-7 libreoffice-7-3 libreoffice-7-3-0 libreoffice-7-3-1 libreoffice-7-3-2 libreoffice-7-3-3 libreoffice-7-3-4 libreoffice-7-3-5 libreoffice-7-3-6 libreoffice-7-3-7 libreoffice-7-4 libreoffice-7-4-0 libreoffice-7-4-1 libreoffice-7-4-2 libreoffice-7-4-3 libreoffice-7-4-4 libreoffice-7-4-6 libreoffice-7-4-7 libreoffice-7-5 libreoffice-7-5-0 libreoffice-7-5-1 libreoffice-7-5-2 libreoffice-7-5-3 libreoffice-7-5-4 libreoffice-7-5-5 libreoffice-7-5-6 libreoffice-7-5-7 libreoffice-7-5-8 libreoffice-7-5-9 libreoffice-7-6 libreoffice-7-6-0 libreoffice-7-6-1 libreoffice-7-6-2 libreoffice-7-6-3 libreoffice-7-6-4 libreoffice-7-6-5 libreoffice-7-6-6 libreoffice-7-6-7 master ports/macosx10.5/master private/Ashod/cd-5.3-3.2_import_unloaded private/Ashod/cd-5.3-3.2_import_unloaded_share_GfxLink private/Ashod/cd-5.3.3.2 private/Ashod/cp-5.0-preinit private/Ashod/fast-calc-rendering private/Ashod/pdfium private/Ashod/pdfium_on_master private/Ashod/pdfium_on_master_fixed private/EL-SHREIF/ui_logger private/Minion3665/swf-export private/Rosemary/change-tracking private/Sweetshark/killswclient private/Sweetshark/lessdepend private/Sweetshark/multilistenerfix private/ajrhunt/c4 private/ajrhunt/cunit private/ajrhunt/cunitdemo private/ajrhunt/firebird-improvement private/bansan/chardraw private/bubli/textboxchaining private/hcvcastro/preinit private/hcvcastro/undo-row-comment private/jmux/armin-strip-before-squash private/jmux/broken-static-win private/jmux/current-reorga private/jmux/meson private/jmux/meson-gsoc-2021 private/jmux/oss-fuzz private/jmux/oss-fuzz-wip private/jmux/scheduler-fixes private/jmux/shape.odt private/jmux/wasm-for-master private/jmux/wasm-tmp private/jmux/wasm_for_master_catchall private/jmux/win-arm64 private/jmux/win-test-nohang private/juergen/Tests private/juergen/check-cjk private/kendy/condformat-api private/kendy/condformat-fdo82014 private/kendy/mailmerge-04 private/kendy/mailmerge-05 private/kendy/swinterpreter private/kendy/testcl private/khaledhosny/color-fonts private/khaledhosny/vcl-cleanup-font private/kohei/chart-bugs private/kohei/find-replace-all-perf private/kohei/headless-perf private/kohei/if-or-not-if-jump private/kohei/sort-ref-update private/lfrb/opengl-vcl private/lgodard/calc_notes_import_export private/lgodard/tdf#117202 private/llunak/mailmerge private/llunak/mailmerge_01 private/llunak/mailmerge_02 private/llunak/mailmerge_03 private/llunak/munich_12587 private/llunak/skia private/lmamane/basetest private/lmamane/for-julien2412 private/lmamane/for-julien2412-master private/lmamane/tdf110997 private/lmamane/timedate-controls-nanosecond private/lmamane/validation private/mcecchetti/23H1/a11y/paragraph private/mcecchetti/accessibility/paragraph private/mcecchetti/amd/pdf-export-jpeg private/mcecchetti/bitmapcrc64 private/mcecchetti/bitmapcrc64-5-0 private/mcecchetti/calc-perf-unit-test private/mcecchetti/calc-unit-test private/mcecchetti/gl-program-binary private/mert/wip_deepl private/mikekaganski/multicolumn private/mmeeks/aafixes44 private/mmeeks/backports private/mmeeks/binarydatacache private/mmeeks/bitmapcrc64 private/mmeeks/copy-paste private/mmeeks/copypaste private/mmeeks/cp-6.2-bits private/mmeeks/cp64merge private/mmeeks/currency-dropdown private/mmeeks/foo private/mmeeks/formula-iterator private/mmeeks/gldebug private/mmeeks/hidpi-bits private/mmeeks/icontest private/mmeeks/opengl-backbuffer private/mmeeks/opengl-backbuffer2 private/mmeeks/sandbox private/mmeeks/swapdatacontainer private/mmeeks/vcl-opengl3 private/moggi/fix-opengl-context-problems private/moggi/improved-dxf-xls-export private/moggi/opengl-4-4-build-test private/moggi/opengl-preparation private/moggi/opengl-vcl-win private/moggi/orcus-improvements private/moggi/track-win-dc private/moggi/ui-test private/moggi/vcl-opengl3 private/mst/sw_fieldmarkhide private/mst/sw_redlinehide private/mst/sw_redlinehide_2 private/mst/sw_redlinehide_3 private/mst/sw_redlinehide_4a private/mst/sw_redlinehide_4b private/pranavk/modernize_gtktiledviewer private/quwex/gsoc-box2d-experimental private/quwex/notespane-search private/quwex/notespaneflat private/quwex/notespanesquashed private/quwex/tdf59323 private/s.mehrbrodt/colorpicker-backport private/sweetshark/swdepend private/tbsdy/clipping private/tbsdy/drawserverfontlayout private/tbsdy/emf private/tbsdy/osl_getAllEnvironment private/tbsdy/outdev private/tbsdy/printinfomgr private/tbsdy/workbench private/thb/libo-6-1+backports private/thb/libreoffice-5-2+backports private/thb/sw_redlinehide-6-1 private/thb/tdf149754 private/thb/wasm-upstreaming private/timar/cp-6.2-centos7 private/timar/fontconfigcrash private/timar/pythonupgrademsp private/tml/Use-the-iOS-French-and-Italian-dictionaries-for-othe private/tml/android-use-bionic-linker-copy private/tml/android-use-faulty.lib private/tml/cp-6-4-28-1 private/tml/fixwintext private/tml/iculess private/tml/lov-6.1.5.2 private/tml/lov-6.2.1 private/tml/lov-7.0.3.3 private/tml/lov-7.0.4 private/tml/lov-7.1.2 private/tml/opencl-default-1 private/tvajngerl/staging ref/for/distro/collabora/cp-6.2 LibreOffice 核心代码仓库文档基金会 summaryrefslogtreecommitdiff log msg author committer range path: root/store/Module_store.mkAgeCommit message (Expand)Author 2022-05-16store: add unit testsChris Sherlock