Skip to content
Snippets Groups Projects
  • Ben Coburn's avatar
    71726d78
    scalable changelog redesign · 71726d78
    Ben Coburn authored
    This patch provides a rewritten changelog system that is designed to run
    efficiently on both small and large wikis. The patch includes a plugin to
    convert changelogs from the current format. The conversion is
    non-destructive and happens automatically. For more information on the new
    changelog format see "http://wiki.splitbrain.org/wiki:changelog".
    
    Structure
    In short the changelog is now stored in per-page changelog files, with a
    recent changes cache. The recent changes cache is kept in
    "/data/meta/_dokuwiki.changes" and trimmed daily. The per-page changelogs
    are kept in "/data/meta/<ns>/<page_id>.changes" files. To preserve
    revision information for revisions stored in the attic, the "*.changes"
    files are not removed when their page is deleted. This allows the full
    life-cycle of page creation, deletion, and reversion to be tracked.
    
    Format
    The changelog line format now uses a general "line type" field in place of
    the special "minor" change syntax. There is also an extra field that can
    be used to store arbitrary data associated with special line types. The
    reverted line type (R) is a good example. There the extra field holds the
    revision date used as the source for reverting the page. See the wiki for
    the complete syntax description.
    
    Code Notes
    The changelog functions have been rewritten to load the whole file only if
    it is small. For larger files, the function loads only the relevant
    chunk(s). Parsed changelog lines are cached in memory to speed future
    function calls.
    
    getRevisionInfo
    A binary search is used to locate the chunk expected to contain the
    requested revision. The whole chunk is parsed, and adjacent lines are
    optimistically cached to speed consecutive calls.
    
    getRevisions
    Reads the changelog file backwards (newest first) in chunks until the
    requested number of lines have been read. Parsed changelog lines are
    cached for subsequent calls to getRevisionInfo. Because revisions are read
    from the changelog they are no longer guaranteed to exist in the attic.
    
    (Note: Even with lines of arbitrary length getRevisionInfo and
    getRevisions never split changelog lines while reading. This is done by
    sliding the "file pointer" forward to the end of a line after each blind
    seek.)
    
    isMinor
    Removed. To detect a minor edit check the type as follows:
    $parsed_logline['type']
    
    darcs-hash:20060830182753-05dcb-1c5ea17f581197a33732a8d11da223d809c03506.gz
    71726d78
    History
    scalable changelog redesign
    Ben Coburn authored
    This patch provides a rewritten changelog system that is designed to run
    efficiently on both small and large wikis. The patch includes a plugin to
    convert changelogs from the current format. The conversion is
    non-destructive and happens automatically. For more information on the new
    changelog format see "http://wiki.splitbrain.org/wiki:changelog".
    
    Structure
    In short the changelog is now stored in per-page changelog files, with a
    recent changes cache. The recent changes cache is kept in
    "/data/meta/_dokuwiki.changes" and trimmed daily. The per-page changelogs
    are kept in "/data/meta/<ns>/<page_id>.changes" files. To preserve
    revision information for revisions stored in the attic, the "*.changes"
    files are not removed when their page is deleted. This allows the full
    life-cycle of page creation, deletion, and reversion to be tracked.
    
    Format
    The changelog line format now uses a general "line type" field in place of
    the special "minor" change syntax. There is also an extra field that can
    be used to store arbitrary data associated with special line types. The
    reverted line type (R) is a good example. There the extra field holds the
    revision date used as the source for reverting the page. See the wiki for
    the complete syntax description.
    
    Code Notes
    The changelog functions have been rewritten to load the whole file only if
    it is small. For larger files, the function loads only the relevant
    chunk(s). Parsed changelog lines are cached in memory to speed future
    function calls.
    
    getRevisionInfo
    A binary search is used to locate the chunk expected to contain the
    requested revision. The whole chunk is parsed, and adjacent lines are
    optimistically cached to speed consecutive calls.
    
    getRevisions
    Reads the changelog file backwards (newest first) in chunks until the
    requested number of lines have been read. Parsed changelog lines are
    cached for subsequent calls to getRevisionInfo. Because revisions are read
    from the changelog they are no longer guaranteed to exist in the attic.
    
    (Note: Even with lines of arbitrary length getRevisionInfo and
    getRevisions never split changelog lines while reading. This is done by
    sliding the "file pointer" forward to the end of a line after each blind
    seek.)
    
    isMinor
    Removed. To detect a minor edit check the type as follows:
    $parsed_logline['type']
    
    darcs-hash:20060830182753-05dcb-1c5ea17f581197a33732a8d11da223d809c03506.gz
Code owners
Assign users and groups as approvers for specific file changes. Learn more.