)]}'
{
  "log": [
    {
      "commit": "a239c4a93093d9f3e0e34ea4d254bde463ad38b1",
      "tree": "7cc55ab1e494df698ec98f759d5b984fc9a59b15",
      "parents": [
        "a1db57ea9b22c72f65b06c8f00f246dbea97bb30"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Wed Jan 04 09:56:31 2023 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Wed Jan 04 09:56:31 2023 -0500"
      },
      "message": "Copy in 1.1.30 and 1.2.3 changes\n"
    },
    {
      "commit": "a1db57ea9b22c72f65b06c8f00f246dbea97bb30",
      "tree": "82e2c7663fdd4e8439801b02599cff42f3612784",
      "parents": [
        "91b537703903f7ea725450011aa6273ac7ca822c"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Jan 04 08:51:19 2023 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "github-yf@yf.bsdclub.org",
        "time": "Wed Jan 04 09:30:03 2023 +0900"
      },
      "message": "issue #311: escape copied from path, too.\n\n* lib/viewvc.py (view_revision)\n\nfound by: Jun Omae \u003cjun66j5{_AT_}gmail.com\u003e\n"
    },
    {
      "commit": "91b537703903f7ea725450011aa6273ac7ca822c",
      "tree": "f3ffeacc5dc5658d7b1ae866e31599a3b14398eb",
      "parents": [
        "27b93ff235ba99d6b2fdff19982b81070f34e9ad"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Tue Jan 03 13:33:58 2023 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Tue Jan 03 13:33:58 2023 -0500"
      },
      "message": "Copy in changes from 1.1.29 and 1.2.2.\n"
    },
    {
      "commit": "27b93ff235ba99d6b2fdff19982b81070f34e9ad",
      "tree": "5a67ff1f7f6a00f37bf4248b6d5e14c092735555",
      "parents": [
        "cf136ba4e3cf987eb1a3a70946f01d66cb3bf689",
        "708f295861166c749800cea1ddd3a96ed7b6aadc"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Tue Jan 03 09:07:38 2023 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 03 09:07:38 2023 -0500"
      },
      "message": "Merge pull request #312 from viewvc/issue-311-escape-paths-in-changeset\n\nissue #311: HTML escape paths in change set."
    },
    {
      "commit": "708f295861166c749800cea1ddd3a96ed7b6aadc",
      "tree": "5a67ff1f7f6a00f37bf4248b6d5e14c092735555",
      "parents": [
        "cf136ba4e3cf987eb1a3a70946f01d66cb3bf689"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Jan 03 13:05:29 2023 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Jan 03 13:54:38 2023 +0900"
      },
      "message": "issue #311: HTML escape paths in change set.\n\n* lib/viewvc.py: (view_revision)\n"
    },
    {
      "commit": "cf136ba4e3cf987eb1a3a70946f01d66cb3bf689",
      "tree": "91465a17bf432d5443d64466c7b294045290b47a",
      "parents": [
        "8e8b6711a218df880f4255668c139935f8dac437"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Mon Jan 02 10:51:12 2023 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@digital.ai",
        "time": "Mon Jan 02 10:51:12 2023 -0500"
      },
      "message": "Bump copyright years\n"
    },
    {
      "commit": "8e8b6711a218df880f4255668c139935f8dac437",
      "tree": "4006b2fa06077d3865714403eb78842bde694877",
      "parents": [
        "3f923fd12893c1c53af96d79be0114d1fa554c34",
        "25bc22633e37f60a66e3c9bb5a57628fa037313e"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Dec 24 19:18:23 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 24 19:18:23 2022 +0900"
      },
      "message": "Merge pull request #259 from viewvc/issue-213-py3-cvsdb-support\n\nissue #213: Begin working on commits database support for Python 3"
    },
    {
      "commit": "25bc22633e37f60a66e3c9bb5a57628fa037313e",
      "tree": "4006b2fa06077d3865714403eb78842bde694877",
      "parents": [
        "2aabd5f78cfa5c57a9f66e8c27bc651646597f1a",
        "3f923fd12893c1c53af96d79be0114d1fa554c34"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Dec 03 04:18:46 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Dec 03 04:18:46 2022 +0900"
      },
      "message": "Merge branch \u0027master\u0027 into issue-213-py3-cvsdb-support\n"
    },
    {
      "commit": "3f923fd12893c1c53af96d79be0114d1fa554c34",
      "tree": "da2374ee4c5e87c9487b0ba5884217dc70da2c22",
      "parents": [
        "afbd7cadff0d8ed8e4a5522d188ee4c07780fe97"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Dec 03 03:59:13 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Dec 03 03:59:13 2022 +0900"
      },
      "message": "Update CHANGES file.\n\n* CHANGES\n  log that issue #275, #109(Tigris #500) #301 were fixed.\n"
    },
    {
      "commit": "afbd7cadff0d8ed8e4a5522d188ee4c07780fe97",
      "tree": "fd65b0736a6d7e793c73297859cd98398298a496",
      "parents": [
        "b1478f23ee0cb9f65e104635f7885ca6ae73e2b8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Dec 02 23:33:56 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "github-yf@yf.bsdclub.org",
        "time": "Sat Dec 03 00:29:13 2022 +0900"
      },
      "message": "issue #303: vclib.Repository: make rootpath simple attribute.\n\nIn vclib.Repository abstract class, rootpath() was defined as a\nmethod, however its implementation in subclasses were all broken:\neach __init__() methods of subclasses substitute self.rootpath\nmethod with rootpath paramer value passed by caller.  Also users\nof vclib.Repository class already uses the value of\nRepository.rootpath instead of return value of Repository.rootpath().\n\nSo we turn Repository.rootpath method into required attribute.\n\n* lib/vclib/__init__.py\n  (Repository): Add description for required attribute(s) in doc string.\n  (Repository.rootpath): Remove method definition.\n\n* lib/vclib/ccvs/bincvs.py\n  (BaseCVSRepository.rootpath): Remove method definition.\n\n* lib/vclib/svn/svn_ra.py\n  (RemoteSubversionRepository.rootpath): Remove method definition.\n\n* lib/vclib/svn/svn_repos.py\n  (LocalSubversionRepository.rootpath): Remove method definition.\n"
    },
    {
      "commit": "b1478f23ee0cb9f65e104635f7885ca6ae73e2b8",
      "tree": "107c635e2ade19721de75c6a968d4a29516a43ff",
      "parents": [
        "4a23e0d2bebdbf26cf5c8cf294958d105d98634d"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Nov 02 22:56:22 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "github-yf@yf.bsdclub.org",
        "time": "Thu Dec 01 01:25:58 2022 +0900"
      },
      "message": "issue #301: Fix content encoding handling on diff view and on patch.\n\nIn revision diff view, ViewVC should show the diff as UTF-8 encoded\nUnicode HTML, by transcoding if the file contents is encoded in some\nencoding other than UTF-8 or ASCII. On the other hand, with generate\npatch mode, ViewVC should provide a raw diff without transcoding.\n\nThose were not done because vclib._diff_fp(), which is used in\ndiff view without highlighting of intraline changes and generate\npatch mode, always decoded the file content as UTF-8.\n\nWith this commit, we add a new argument to specify the encoding\nto decode the diff stream, and make the code path to handle the\ndiff content without decoding/encoding, includes vclib._diff_fp().\n\nTo accomplish it, we also add a new argument \"is_text\" to rawdiff()\nmethod in vclib.Repository base class and its discendants.\n\n* lib/vclib/__init__.py\n  (Repository.rawdiff):\n    - Rename argument \"type\" to \"diff_type\", not to hide the \"type\"\n      class.\n    - Add new argument \"is_text\" to specify the stream returned\n      by the method should be a decoded stream or raw bytes stream.\n  (_diff_fp.__init__):\n    Add new argument \"encoding\" which is used to decode (or not\n    decode if it is None) the diff stream from diff utility.\n  (_diff_fp.read, _diff_fp.readline, _check_process_errors):\n    Fix to work with both of bytes and str stream.\n\n* lib/vclib/ccvs/bincvs.py (BaseCVSRepository.rawdiff),\n  lib/vclib/ccvs/ccvs.py (CCVSRepository.rawdiff),\n  lib/vclib/svn/svn_ra.py (RemoteSubversionRepository.raw_diff),\n  lib/vclib/svn/svn_repos.py (LocalSubversionRepository.rawdiff):\n    Impliment the change of specification on base class.\n\n* lib/viewvc.py\n  (diff_parse_headers):\n    Add new argument is_text to allow bytes stream for \"fp\".\n  (view_patch):\n    Handle the diff stream \"fp\" as bytes stream, without any\n    decode/encode by Python.\n  (DiffDescription._content_fp):\n    Request diff stream as str explicitly.\n  (DiffDescription._prop_fp):\n    Request diff stream decoded with the repository\u0027s content encoding.\n"
    },
    {
      "commit": "4a23e0d2bebdbf26cf5c8cf294958d105d98634d",
      "tree": "e43b3ffdc0ec7ff4a7be5ae248a26eb6293a5524",
      "parents": [
        "90e5e1c2b7d430805e036280ae8a2224af83afd5",
        "19900dd8de7b2b2721f3525235b46f499b3365ee"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Dec 01 00:29:02 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 01 00:29:02 2022 +0900"
      },
      "message": "Merge pull request #299 from viewvc/issue-109-non-ascii-repos-path\n\nissue #109: Introduce path encoding for repositories."
    },
    {
      "commit": "19900dd8de7b2b2721f3525235b46f499b3365ee",
      "tree": "58bfdf5f7117e08d77543a73c2599c0ea3e6e09a",
      "parents": [
        "4a5b2099b547a2cec8d3028db7311754429b7468"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Nov 08 20:30:40 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Nov 08 20:34:46 2022 +0900"
      },
      "message": "conf/viewvc.conf.dist: Revise comments about \"root_path_locale\"\nand the preamble.\n\nSuggested by: cmpilato\n"
    },
    {
      "commit": "4a5b2099b547a2cec8d3028db7311754429b7468",
      "tree": "5a15567e7a819e1027a8d426724d62d718607851",
      "parents": [
        "14e7719fe9bd7a8b0002ca17dac0f6910d77f1ac"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Nov 08 17:44:03 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Nov 08 17:44:03 2022 +0900"
      },
      "message": "Rename config option \u0027repos_locale\u0027 to \u0027root_path_locale\u0027.\n\nNo functional change.\n\nSuggested by: cmpilato\n"
    },
    {
      "commit": "14e7719fe9bd7a8b0002ca17dac0f6910d77f1ac",
      "tree": "2b29828051d770b1b9609a1d8c90f293ef204c7c",
      "parents": [
        "e752deeaf4bb2665fa98db7e3722ccae4f5a2310"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Nov 06 18:33:44 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Nov 06 19:21:47 2022 +0900"
      },
      "message": "issue #109: Fix the case of root_parents and/or their children.\n\nIn root_parents config parameter, it can be also specified non-ascii\npaths and/or their children\u0027s name can be non-ascii.  In those case\non POSIX system, those path should be interpreted in charset/encoding\nof the locale which specified by repos_locale (or system locale).\nIf the encoding of repos_locale is not same one of system locale,\nwe can\u0027t rely on the default encode/decode with file system encoding.\n\nThis commit fix their handling.\n\n* lib/vclib/__init__.py\n  (_getfspath, os_listdir):\n    Moved from lib/vclib/ccvs/bincvs.py. They are also used by\n    vclib.svn module.\n\n* lib/vclib/ccvs/__init__.py\n  (): Import helper functions from vclib.\n  (_is_cvsroot, expand_root_parent, find_root_in_parent):\n    Add argument \u0027path_encoding\u0027 and check the path with this\n    encoding.\n  (expand_root_parent):\n    Move _is_cvsroot() check of parent_path out of the loop.\n\n* lib/vclib/ccvs/bincvs.py\n  (BaseCVSRepository.__init__):\n    Use vclib.ccvs._is_cvsroot() for checking rootpath.\n  (everywhere):\n    Use vclib._getfspath and vclib.os_listdir instead of _getfspath and\n    os_listdir.\n\n* lib/vclib/svn/__init__.py\n  (): Import helper functions from vclib.\n  (_strpath):\n    New, for converting paths returned from Python API of Subversion,\n    into str.\n  (_canonicalize_path): Use it.\n  (expand_root_parent, find_root_in_parent):\n    Add argument \u0027path_encoding\u0027 and check the path with this\n    encoding.\n\n* lib/vclib/svn/svn_ra.py\n  (): import _strpath instead of _to_str\n  (everywhere):\n    Use _strpath() instead of _to_str()\n\n* lib/vclib/svn/svn_repos.py\n  (): import _strpath\n  (_to_str): Remove.\n  (_kind2type): Fix a typo in a comment.\n  (LocalSubversionRepository.dirlogs,\n  LocalSubversionRepository.itemlog):\n    Use _normalize_property_value() to decode lock.owner. Using _to_str\n    for the purpose were incorrect.\n  (LocalSubversionRepository.itemlog._revinfo _revinfohelper):\n    Use _normalize_property_value() to decode msg and author. Using\n    _to_str for the purpose were incorrect.\n  (everywhere in use of _to_str other than above):\n    Use _strpath() instead of _to_str()\n\n* lib/viewvc.py\n  (expand_root_parents):\n    Get path_encoding from cfg and pass it to vclib.ccvs.expand_root_parent\n    and vclib.svn.expand_root_parent.\n  (find_root_in_parents)\n    Get path_encoding from cfg and pass it to vclib.ccvs.find_root_in_parent\n    and vclib.svn.find_root_in_parent.\n"
    },
    {
      "commit": "e752deeaf4bb2665fa98db7e3722ccae4f5a2310",
      "tree": "40954d22a96116e6022a13ca9c53b6ec6186ec17",
      "parents": [
        "8ee2c7e69af86dd1b1fdf29a7e828fd49ec3dc5f"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Nov 05 02:50:21 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Nov 05 02:50:21 2022 +0900"
      },
      "message": "* conf/viewvc.conf.dist (options.repos_local): Fix a typo in comment.\n"
    },
    {
      "commit": "8ee2c7e69af86dd1b1fdf29a7e828fd49ec3dc5f",
      "tree": "602d33bab15a53fde859ac54f1314186bca59454",
      "parents": [
        "f7e9d56bc09d70f5e32716158ad248fc930ce8d9"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Nov 05 02:38:08 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Nov 05 02:38:08 2022 +0900"
      },
      "message": "Fix the case that repos_locale is not set.\n\n* lib/common.py\n  ():\n    Call setlocale() explicitly.\n  (DEFAULT_LC_CTYPE):\n    New.\n  (get_repos_encoding):\n    Use DEFAULT_LC_CTYPE if repos_locale is not set in config file.\n"
    },
    {
      "commit": "90e5e1c2b7d430805e036280ae8a2224af83afd5",
      "tree": "67d77ac71df0b3f8b227f1ca1c8ba427ba69ab63",
      "parents": [
        "5b014de8b9fe41334239a8f49bca0a1cfd11d0da",
        "74ce710c62ec78b81adda180bbc3db32e5de9787"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Nov 01 03:18:24 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 01 03:18:24 2022 +0900"
      },
      "message": "Merge pull request #278 from rpluem/cvsdb_fnmatch_fix\n\n* lib/cvsdb.py  (CheckinDatabase.SQLQueryListString):\r\n  Fix regular expression returned by fnmatch.translate"
    },
    {
      "commit": "5b014de8b9fe41334239a8f49bca0a1cfd11d0da",
      "tree": "ed7f61c64dcfa99bdce98634aa5491b90d819487",
      "parents": [
        "d320bf554db5f10d0494080afe8d7c8f9e093093"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 30 02:10:04 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "github-yf@yf.bsdclub.org",
        "time": "Mon Oct 31 09:26:46 2022 +0900"
      },
      "message": "standalone: Allow config overlay.\n\n* bin/standalone.py (ViewVCHTTPRequestHandler.run_viewvc):\n  Make a copy of config and pass it.\n"
    },
    {
      "commit": "f7e9d56bc09d70f5e32716158ad248fc930ce8d9",
      "tree": "2cd2b5886ae7c4559c8a9f5f7366a09c070f31a0",
      "parents": [
        "ed8e466c04bce082d20b246309f6e5d8dfa7de23"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 30 07:44:03 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 30 07:44:03 2022 +0900"
      },
      "message": "cvsdbadmin: Use locale encoding to access CVSRepository\n\n* bin/cvsdbadmin (): As above\n"
    },
    {
      "commit": "ed8e466c04bce082d20b246309f6e5d8dfa7de23",
      "tree": "a90aa0a8f439d9f4c0d106029d61ff827a6dc43a",
      "parents": [
        "1d45afc405f0fd9c9cdb3880bc9e52594acdd6d8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 23:42:55 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 30 00:07:55 2022 +0900"
      },
      "message": "issue #109: Pass the \u0027path_encoding\u0027 argument to LocalSubversionRepository\n\nIn LocalSubversionRepository, path_encoding is need only for the\ncheck if rootpath is a directory and has \u0027format\u0027 file in it on\nPOSIX system.\n\n* lib/vclib/svn/__init__.py (SubversionRepository):\n  Add argument \u0027path_encoding\u0027 and pass it to LocalSubversionRepository.\n\n* lib/vclib/svn/svn_repos.py (LocalSubversionRepository.__init__):\n  On POSIX system, check rootpath against its representation in bytes.\n\n* lib/viewvc.py (Request.run_viewvc, list_roots):\n  Pass path_encoding to SubversionRepository\n"
    },
    {
      "commit": "1d45afc405f0fd9c9cdb3880bc9e52594acdd6d8",
      "tree": "859497fd71871fec5982690f8695e9cf32eb48c0",
      "parents": [
        "e5c88a3607f857dd8e5f48170cb9e1713cfd7029"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 05:10:46 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 18:59:52 2022 +0900"
      },
      "message": "Add cvsgraph wrapper as a method of BaseCVSRepository\n\n* lib/vclib/ccvs/bincvs.py (BaseCVSRepository.cvsgraph_popen): New.\n\n* lib/viewvc.py\n  (view_cvsgraph_image, view_cvsgraph): Use it.\n  (): Don\u0027t import unused module popen\n"
    },
    {
      "commit": "e5c88a3607f857dd8e5f48170cb9e1713cfd7029",
      "tree": "950d67e750536a233d88aeb90cf63191bccaa854",
      "parents": [
        "3a94b548fe3b5334ecf44faf32cfb15c8dab88ab"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 28 02:14:00 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 18:59:52 2022 +0900"
      },
      "message": "issue #109: Introduce path encoding for repositories.\n\n* lib/vclib/ccvs/__init__.py\n  (CVSRepository):\n    - Rename argument \u0027encoding\u0027 to \u0027content_encoding\u0027\n    - Add argument \u0027path_encoding\u0027\n\n* lib/vclib/ccvs/bincvs.py\n  (_get_log_path):\n    Add argument \u0027encoding\u0027.\n  (_get_logs):\n    Add repos.path_encoding as \u0027encoding\u0027 argument of _log_path().\n  (_getfspath):\n    New function to botain paths on local file system in bytes.\n  (os_listdir):\n    New function. Wrapper of os.listdir for str path encoded in \u0027encoding\u0027.\n  (_check_path):\n    - Add argument \u0027encoding\u0027.\n    - Check paths with _getfspath() wrapper.\n  (_newest_file):\n    - Add argument \u0027encoding\u0027.\n    - Check paths with _getfspath() wrapper.\n    - Use os_listdir instead of os.listdir.\n\n  (BaseCVSRepository.conent_encoding):\n    Renamed from .encoding\n  (BaseCVSRepository.path_encoding):\n    New attribute.\n  (BaseCVSRepository.__init__):\n    - Add argument to specify path_encoding and initialize .path_encoding.\n    - Check rootpath with _getfspath() wrapper.\n  (BaseCVSRepository.itemtype, BaseCVSRepository.rcsfile,\n  BaseCVSRepository.isexecutable):\n    Check paths with _getfspath() wrapper.\n  (BaseCVSRepository.listdir):\n    Check directry entries as str path encoded in self.path_encoding.\n  (BaseCVSRepository._getfspath):\n    New. Use global function _getfspath() with self.path_encoding.\n\n  (BinCVSRepository.openfile):\n    Use .content_encoding instead of .encoding\n  (BinCVSRepository.rcs_popen):\n    - Use bytes for cmd and args on POSIX system.\n    - Use .content_encoding instead of .encoding.\n  (BinCVSRepository.annotate):\n    - Apply ._getfspath() to obtain path on the file system.\n    - Use .content_encoding instead of .encoding\n\n* lib/vclib/ccvs/ccvs.py\n  (CCVSRepository.dirlogs, CCVSRepository.itemlog,\n  CCVSRepository.openfile, CCVSRepository.annotate):\n    - Apply ._getfspath() to obtain path on the file system.\n    - Use .content_encoding instead of .encoding\n  (CCVSRepository.dirlogs):\n    Add self.path_encoding as \u0027encoding\u0027 argument of _log_path().\n\n* lib/vclib/svn_ra.py\n  (RemoteSubversionRepository):\n    Rename an attribute from .encoding to .content_encoding\n  (RemoteSubversionRepository.itemlog):\n    Fix abuse of self.encoding. Item paths are always UTF-8 here.\n\n* lib/vclib/svn_repos.py\n  (LocalSubversionRepository):\n    Rename an attribute from .encoding to .content_encoding\n\n* lib/viewvc.py\n  (): import get_repos_encodings() from common.py\n  (Request.run_viewvc):\n    Set encodings for the repos\u0027s path and for its content files.\n  (list_roots):\n    Set encodings for the repos\u0027s path and for its content files,\n    for each Svn roots and CVS roots.\n  (transcode_path_for_display): Removed\n  (nav_path, common_template_data, view_directory):\n   Don\u0027t call transcode_path_for_display. All path and path_parts in\n   \u0027cvs\u0027 repo are now valid str.\n  (markup_or_annotate, DiffDescription._content_lines, view_revision):\n    Rename from .encoding to .content_encoding in Repository classes.\n"
    },
    {
      "commit": "3a94b548fe3b5334ecf44faf32cfb15c8dab88ab",
      "tree": "207b3a7d11c0a0fffb9171e768eb2a4f773ed3ff",
      "parents": [
        "d320bf554db5f10d0494080afe8d7c8f9e093093"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Oct 27 15:44:36 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 18:59:52 2022 +0900"
      },
      "message": "Add new config variable \u0027options.repos_locale\u0027\n\nIt determines the encoding of repository paths on the local system.\nAlso it can be appropriate for the default encoding of the file\ncontents in the repository.  However it can be the case that the\nencoding of the repository path and the encoding of the most files\u0027\ncontent is different.  So we only change the default of config\nvariable \u0027options.default_encoding\u0027 from \u0027utf-8\u0027 to None, which\nmeans using locale encoding.\n\n* conf/viewvc.conf.dist\n  (options.repos_locale):\n    New.\n  (options.default_encoding):\n    Change default value and add comment for default value\n\n* lib/config.py\n  (Config.set_defaults):\n    Set new default values for \u0027options.repos_locale\u0027 and\n    \u0027options.default_encoding\u0027\n\n* lib/common.py\n  (locale_tuple_to_name, get_current_lc_ctype):\n    New. Those are helper functions for get_repos_encodings().\n  (get_repos_encodings):\n    New.\n"
    },
    {
      "commit": "d320bf554db5f10d0494080afe8d7c8f9e093093",
      "tree": "2d2e2469e8872b42abbfb4f6d8f2de7238723c14",
      "parents": [
        "a2054e278a9f79f1e3be0b500af8a60a5ae4c9d9"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 18:48:09 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 29 18:48:09 2022 +0900"
      },
      "message": "ezt: Fix issue on file like object values.\n\nThe fix in b2791a576ca6549a321279de73c356f94cde156c is incorrect,\nbecause ob can be file like object which support __next__ method\nand it should not be wrapped by list.\n\n* lib/ezt.py (_get_value): Return ob it self if it is a file like object.\n"
    },
    {
      "commit": "a2054e278a9f79f1e3be0b500af8a60a5ae4c9d9",
      "tree": "261b334eb62620d8922c34499244251e9bdbec24",
      "parents": [
        "a0231b00b52baea893a05619f825d26435cee05d"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 21 15:10:00 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 21 15:10:00 2022 +0900"
      },
      "message": "Update CHANGES file.\n\n* CHANGES\n  Note that new \u0027max_context\u0027 was added to fix the issue #293.\n"
    },
    {
      "commit": "a0231b00b52baea893a05619f825d26435cee05d",
      "tree": "41918dcd8baa2180804566251ecba30da2aafa5b",
      "parents": [
        "6b19c781ba90327f9fa90acedd6da8c39b07a536",
        "1cad6499cf480b950351dde81ffb9ae94cfd1cde"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Oct 19 03:56:07 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 19 03:56:07 2022 +0900"
      },
      "message": "Merge pull request #298 from futatuki/issue-275-fix\n\nIssue #275: Fix unified and side-by-side diff view in the case hr_intraline \u003d 1\r\n\r\nThe problems were:\r\n\r\n1. get_line parameter for DiffDescription._get_diff() should be a function\r\n    that returns a list of str, but we passed a function that returns a list of bytes.\r\n2. In ezt.py, the type of return value _get_value() should not be a generator \r\n    object, but there were some cases they were.\r\n\r\nThe fix for 2. can be two options, ezt.py or its caller.  However as the former\r\nis easier, We\u0027d taken it."
    },
    {
      "commit": "1cad6499cf480b950351dde81ffb9ae94cfd1cde",
      "tree": "dbca3db8daa1b32033b889dde467b5454559fa66",
      "parents": [
        "2b030ba769f311d2e87a31883278a7d748b7f52c"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 21:37:54 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 21:45:50 2022 +0900"
      },
      "message": "Rename local variable name for readability. No functional change.\n\n* lib/viewvc.py (DiffDescription._content_lines):\n  Use full spell of the word \u0027line\u0027 for variable in a list comprehension.\n\nSuggested by: cmpilato\n"
    },
    {
      "commit": "6b19c781ba90327f9fa90acedd6da8c39b07a536",
      "tree": "ca9c5c16d3f99abaaadffb474ddc779d454b5ff4",
      "parents": [
        "9023accd162f91733350eded17fcded3a46e86a2",
        "6f7c0d2f1db140e49a50ef945eaca188f16bfbde"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 21:16:01 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 17 21:16:01 2022 +0900"
      },
      "message": "Merge pull request #297 from futatuki/issue-293-fix-full-colored-diff\n\nissue #293: Make diff --unified option parameter configurable."
    },
    {
      "commit": "6f7c0d2f1db140e49a50ef945eaca188f16bfbde",
      "tree": "93f11503ee8716be0ecd25656396393da9b6d1ae",
      "parents": [
        "2f74c2f9c34735d836ddc36de10496fc83e08b7e"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 21:04:43 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 21:04:43 2022 +0900"
      },
      "message": "conf/viewvc.conf.dist: Revise comments for users.\n\nPatched by: cmpilato\n"
    },
    {
      "commit": "2b030ba769f311d2e87a31883278a7d748b7f52c",
      "tree": "a5df455e5bd2e91679e52abb180a27deea84c367",
      "parents": [
        "b2791a576ca6549a321279de73c356f94cde156c"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 00:28:20 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Mon Oct 17 00:28:20 2022 +0900"
      },
      "message": "Follow up to previous: Add comment. No functional change.\n\n* lib/ezt.py (_get_value)\n"
    },
    {
      "commit": "b2791a576ca6549a321279de73c356f94cde156c",
      "tree": "0d3f9de6941941894c12d06946993906a20eda32",
      "parents": [
        "70ee2b024eafc4eb01edd376f83fb95b126f3779"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 01:53:38 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "issue #275: ezt: Make a generator return value into a list in _get_value()\n\n* lib/ezt (_get_value)\n"
    },
    {
      "commit": "70ee2b024eafc4eb01edd376f83fb95b126f3779",
      "tree": "33353a96c42572f7c33a7417aad70f124d3d0475",
      "parents": [
        "e9b75733353eeffd91a32c6786f80b95f81feb5b"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 00:47:04 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "* lib/ezt.py (everywhere): Rename local variable \u0027list\u0027 to \u0027vlist\u0027\n"
    },
    {
      "commit": "e9b75733353eeffd91a32c6786f80b95f81feb5b",
      "tree": "76622f02291c7a032b2132e0e359261bde9a8d4b",
      "parents": [
        "82ed6ba46219ae05be6f9305c85abbc6e38fdb4b"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 00:32:12 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "issue #275: Get_lines parameter of DiffDescription._get_diff should be\na function returns a list of str.\n\n* lib/viewvc.py\n  (DiffDescription._content_lines, DiffDescriptions._prop_lines): As above.\n"
    },
    {
      "commit": "82ed6ba46219ae05be6f9305c85abbc6e38fdb4b",
      "tree": "5515221cc95522e73c1b7133aa06b3f25387e844",
      "parents": [
        "05b5dfadce419e28860fe169abd2f7bf11f76794"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 15 20:18:10 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "* lib/vclib/__init__.py (Repository.rawdiff, _diff_fp): Clarify it uses str I/O\n"
    },
    {
      "commit": "05b5dfadce419e28860fe169abd2f7bf11f76794",
      "tree": "61e43addadb66cd40f6509eecb4bbecd7aecfc2a",
      "parents": [
        "1d8cb2ffd879655a2c13dd82acb797a3c058e8cc"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Jul 30 20:34:36 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "Mention that Repository.openfile() returns binary file like object.\n\n* lib/vclib/__init__.py (Repository.openfile):\n  In doc string, mention that it returns binary file like object.\n  No functional change.\n"
    },
    {
      "commit": "1d8cb2ffd879655a2c13dd82acb797a3c058e8cc",
      "tree": "3455dc654ee5ffec68877650d76403d41aab5542",
      "parents": [
        "9023accd162f91733350eded17fcded3a46e86a2"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Jul 30 15:30:26 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:48:19 2022 +0900"
      },
      "message": "vclib/svn: Fix bytes/str mismatch in FileContentsPipe\n\n* lib/vclib/svn/svn_repos.py\n  (FileContentsPipe.read): Use BytesIO instead of StringIO\n"
    },
    {
      "commit": "9023accd162f91733350eded17fcded3a46e86a2",
      "tree": "83d23bdd92fda3ad3ad3a3109df6e38cc57b8674",
      "parents": [
        "d020f38edeb280674f1d70a061b2d2945b0b7b38"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 02:03:30 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Oct 16 03:43:21 2022 +0900"
      },
      "message": "lib/vclib/svn/svn_repos.py: Fix styles pointed out by flask8.\n\nNo functional changes.\n\n* lib/vclib/svn/svn_repos.py\n  (): Don\u0027t import unused function common.cmp\n  (): Remove extra white space\n  (_simple_auth_check.LocalSubversionRepository): fold a long line.\n"
    },
    {
      "commit": "2f74c2f9c34735d836ddc36de10496fc83e08b7e",
      "tree": "0018866b8a3368fb542e2575432b40ecfbc687c6",
      "parents": [
        "d020f38edeb280674f1d70a061b2d2945b0b7b38"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 15 01:59:34 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Oct 15 02:30:27 2022 +0900"
      },
      "message": "issue #293: Make diff --unified option parameter configurable.\n\n* conf/viewvc.conf.dist\n  (utilities.max_context):\n    New option\n  (options.diff_format):\n    In comment, excuse \"Full human readable\" is not truely \"full\"\n\n* lib/config.py\n  (Config.set_defaults):\n    Set default value for new option \"utilities.max_context\"\n\n* lib/vclib/__init__.py\n  (_diff_args):\n    Remove special case of options[\"context\"] is None. It should be\n    set an integer value now.\n\n* lib/viewvc.py\n  (DiffDescription.__init__, DiffDescription.get_content_diff,\n   DiffDescription.get_prop_diff):\n    Use None instead of -1 for the flag DiffDescription.context is not set.\n  (DiffDescription.__init__):\n    Set config \"utilities.max_context\" value as context option value\n    for \"Full human readable\" diff format.\n"
    },
    {
      "commit": "d020f38edeb280674f1d70a061b2d2945b0b7b38",
      "tree": "fe5c56ba6188842e3801095c8c887ed20a18469a",
      "parents": [
        "c22eb71b192f82bb5fb28c251fce14d2aee6bd42",
        "a3aeeff8a574c3a51e5025f6fa3da84c474b4c73"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 14 02:37:47 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 14 02:37:47 2022 +0900"
      },
      "message": "Merge pull request #296 from futatuki/issue-293-check-diff-error\n\nIssue #293: Check the error from external diff utility and report it"
    },
    {
      "commit": "a3aeeff8a574c3a51e5025f6fa3da84c474b4c73",
      "tree": "fe5c56ba6188842e3801095c8c887ed20a18469a",
      "parents": [
        "de64f5521f5f391280305f0df014659d048a5c32"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 14 02:22:18 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Oct 14 02:22:18 2022 +0900"
      },
      "message": "* lib/vclib/__init__.py (_diff_fp):\n  Move common block in _diff_fp.read() and in _diff_fp.readline() into\n  _diff_fp._check_process_errors, with comments.\n\nSuggested by: cmpilato\n"
    },
    {
      "commit": "de64f5521f5f391280305f0df014659d048a5c32",
      "tree": "23afbf8108dafd1eb3e47865b90352689032031e",
      "parents": [
        "fae60cc16a977000949fa1cde0dcfc33f18a910e"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Oct 13 13:56:12 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Oct 13 13:56:12 2022 +0900"
      },
      "message": "issue #293: Check ExternalDiffError and report it as ViewVCException.\n\n* lib/viewvc.py (diff_parse_headers)\n"
    },
    {
      "commit": "fae60cc16a977000949fa1cde0dcfc33f18a910e",
      "tree": "dee37c67d33d64836d83cbe9f4e6c33ca8bc2c27",
      "parents": [
        "c22eb71b192f82bb5fb28c251fce14d2aee6bd42"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Oct 13 13:31:02 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Oct 13 13:53:37 2022 +0900"
      },
      "message": "issue #293: Check external diff error\n\n* lib/vclib/__init__.py\n  (): Don\u0027t import unused module \u0027io\u0027\n\n  (ExternalDiffError): New exception.\n  (_diff_fp.__init__):\n    - Specify str I/O explicitly in to communicate to subprocess and remove\n      extra code for Python 2\n    - Prepare to read from stderr\n\n  (_diff_fp.read):\n    Rename parameter, so as not to override global class name \u0027bytes\u0027\n\n  (_diff_fp.read, _diff_fp.readline):\n    Check stderr and exit code at EOF on stdout to detect error and\n    raise ExternalDifferror if it occurs.\n"
    },
    {
      "commit": "c22eb71b192f82bb5fb28c251fce14d2aee6bd42",
      "tree": "3440997e810289423e15067726eca7e7fcb6ee5a",
      "parents": [
        "b9c4d2381dd18a10856b61b8fc5ca4f36317d8be",
        "a62d036cb5a23b57e7b827c34ee8a53a58391e58"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 10 14:36:26 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 10 14:36:26 2022 +0900"
      },
      "message": "Merge pull request #291 from futatuki/use-key-instead-of-cmp-in-sort\n\nFollow up to issue #288: Remove _logsort_date_cmp and _logsort_rev_cmp to reduce the use of cmp()"
    },
    {
      "commit": "b9c4d2381dd18a10856b61b8fc5ca4f36317d8be",
      "tree": "bc2e453bfe92d00c4f44582421578783af68f096",
      "parents": [
        "658e9eef9871bb8dcac821b9493e4d64bbe633b0",
        "f556f012a7020de3857db1739b5d4ab0896e5f93"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 10 14:35:31 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 10 14:35:31 2022 +0900"
      },
      "message": "Merge pull request #290 from futatuki/remove-_compare_paths-function\n\nFollow up to issue #288: Remove _compare_paths() to reduce the use of cmp()"
    },
    {
      "commit": "658e9eef9871bb8dcac821b9493e4d64bbe633b0",
      "tree": "c31035ad2cc2d7c2b809e1f85976c5b7b473432f",
      "parents": [
        "f2c203ca1a3e0e96761f07838cb8fe930cd211b8",
        "c7d49e6c0bfafe7ac8d966ba588ebf5c8c3986fb"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 10 07:20:08 2022 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 10 07:20:08 2022 +0900"
      },
      "message": "Merge pull request #292 from futatuki/use-key-instead-of-cmp-in-sort-viewvc.py\n\nFollow up to issue #288: Use native key function in sort in viewvc.py"
    },
    {
      "commit": "c7d49e6c0bfafe7ac8d966ba588ebf5c8c3986fb",
      "tree": "c31035ad2cc2d7c2b809e1f85976c5b7b473432f",
      "parents": [
        "fe90efdad97117c92d7edc439be3769c4a0a0a05"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 17:46:03 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 18:05:46 2022 +0900"
      },
      "message": "Follow up to issue #288: Use native key function in sort.\n\nIt was easy for porting old way for sorting, using cmp parameter, into\nPython 3 by using cmp_to_key() converter function. However it had\ndisadvantage in overhead. So we re-implement them into native \u0027key\u0027\nfunction.\n\n* lib/viewvc.py\n  (): Don\u0027t import unused module, and function.\n  (sort_file_data): Totally re-implement for using native key function\n    in sorting.\n  (revcmp): Removed.\n  (revcmpkey): New. Converted revcmp() into sort key function.\n  (setup_diff): Use above to compare two revisions.\n"
    },
    {
      "commit": "fe90efdad97117c92d7edc439be3769c4a0a0a05",
      "tree": "9892df27005a33e90d2ee03ea3a24eb74f42e9c0",
      "parents": [
        "ecba8a95963b057368efc1227e5a58748f1a09a8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 13:02:16 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 13:55:58 2022 +0900"
      },
      "message": "Update very old comment, which has been out of context today.\n\nThe comment here was for the context that we got the file data here.\nWe get them before calling sort_file_data now, so the information\nneeds here is that there are such files that don\u0027t have revison info,\nand it can be only in cvs repo. No functional change.\n\n* lib/viewvc.py (sort_file_data)\n"
    },
    {
      "commit": "ecba8a95963b057368efc1227e5a58748f1a09a8",
      "tree": "df6817e91e75b156e05ca0b2415a9969b76539e7",
      "parents": [
        "a65ae785ef082bec574b0d9d1dfe836111f929ee"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Sep 06 21:16:37 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 13:55:58 2022 +0900"
      },
      "message": "Add new method sortkey() to DirEntry, to retrieve an attribute value.\n\n* lib/vclib/__init__.py\n  (DirEntry.sortkey): New method to retrive an attibute value as sort key.\n\n* lib/viewvc.py\n  (sort_file_data): Use it, for those attributes which can be None.\n"
    },
    {
      "commit": "a65ae785ef082bec574b0d9d1dfe836111f929ee",
      "tree": "caf28ea7e4ec969fbc9b8db59ae4baf545e02a65",
      "parents": [
        "662899feb16a61c1441c2d55f827ce0007b466a6"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Sep 06 04:22:02 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Sep 08 13:55:44 2022 +0900"
      },
      "message": "Use reverse keyword parameter to specify sort direction\n\n* lib/viewvc.py (sort_file_data)\n"
    },
    {
      "commit": "662899feb16a61c1441c2d55f827ce0007b466a6",
      "tree": "a1af0d2d2d852cf71b648ce194928ff8ba332b4e",
      "parents": [
        "818d6ef47440252ec9bd02ca5d5f144b9da1bf6d"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 23:36:37 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 23:36:37 2022 +0900"
      },
      "message": "Follow up to issue #288: Use attrgetter to acquire sort keys.\n\n* lib/viewvc.py\n  (): import attergetter() from operator module\n  (prep_tags, generate_tarball, view_revision):\n    Use attrgetter to acquire sort keys. In those case, all items\n    in sort target has the attribute specified for sort key, and\n    its values in sort target items are all same type.\n  (view_revision): Remove changes_sort_by_path(), which is to be unused.\n"
    },
    {
      "commit": "818d6ef47440252ec9bd02ca5d5f144b9da1bf6d",
      "tree": "ea1d9896431cb5376035e90bcaba3aa0b7e8f8ba",
      "parents": [
        "f2c203ca1a3e0e96761f07838cb8fe930cd211b8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 21:11:31 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 21:11:31 2022 +0900"
      },
      "message": "Follow up to issue #288: Remove icmp() and use str.lower directly.\n\n* lib/viewvc.py\n  (viewroots, view_directory): Use str.lower directly instead of\n    using cmp_to_key with icmp(). They are safe because icmp also\n    apply str.lower to items before applying cmp().\n  (icmp): Removed.\n"
    },
    {
      "commit": "a62d036cb5a23b57e7b827c34ee8a53a58391e58",
      "tree": "8a5aa501d2d4361e1a471f2e96f96545f3db3b9f",
      "parents": [
        "f2c203ca1a3e0e96761f07838cb8fe930cd211b8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 03:50:15 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sun Sep 04 03:50:15 2022 +0900"
      },
      "message": "Follow up to issue #288: Remove _logsort_date_cmp and _logsort_rev_cmp\nto reduce the use of cmp()\n\nIn bincvs.py and ccvs.py, we used _logsort_date_cmp() and\n_logsort_rev_cmp() as cmp parameter for list.sort() method in Python 2,\nfor sorting CVS logs.  However it can be done by using key parameter for\nlist.sort(), with operator.attrgetter(), as \"Sorting HOW TO\"[1] document\nshows.\n\nSo we use it and then remove _logsort_date_cmp and _logsort_rev_cmp\nfunctions.\n\n[1] https://docs.python.org/3/howto/sorting.html\n\n* lib/vclib/ccvs/bincvs.py\n  (_logsort_date_cmp, _logsort_rev_cmp): Removed.\n\n* lib/vclib/ccvs/bincvs.py (BinCVSRepository.itemlog),\n  lib/vclib/ccvs/ccvs.py (CCVSRepository.itemlog):\n    Use operator.attrgetter() as key parameter for sorting.\n"
    },
    {
      "commit": "f556f012a7020de3857db1739b5d4ab0896e5f93",
      "tree": "490890c436ed08a73b88939609720cb077ca0b13",
      "parents": [
        "909d87da701ec1864af6c905fe99530f172bc501"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 03 20:17:37 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 03 20:17:37 2022 +0900"
      },
      "message": "Remove unused function _compare_paths.\n\n* lib/vclib/svn/svn_repos.py (_compare_paths): Removed.\n"
    },
    {
      "commit": "909d87da701ec1864af6c905fe99530f172bc501",
      "tree": "5dcaf6c176ebba8153a95031ebf93c7dc2ca0eb4",
      "parents": [
        "f2c203ca1a3e0e96761f07838cb8fe930cd211b8"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 03 20:04:05 2022 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Sat Sep 03 20:04:05 2022 +0900"
      },
      "message": "Make key function of paths for sort simple.\n\n* lib/vclib/svn/svn_ra.py\n  (): Don\u0027t import unused modules functools, svn_repos._compare_paths\n  (_sort_key_path, _sort_key_pathb): New.\n  (LogCollector.add_log, RemoteSubversionRepository._revinfo_fetch):\n    Use above instead of lambda using _compare_paths.\n"
    },
    {
      "commit": "f2c203ca1a3e0e96761f07838cb8fe930cd211b8",
      "tree": "5e4dcdf154b9bffe41f94f7881d2dc3b61751acd",
      "parents": [
        "7c5795c7596243d8cc8737ac33f4f9fa35062609",
        "5a3d062715bdde5bfa02bde3bb9e5fcea35e4eb5"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Sep 02 08:22:18 2022 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 02 08:22:18 2022 -0400"
      },
      "message": "Merge pull request #289 from viewvc/fix_issue_288\n\nFix issue #288: cmp() workaround cannot handle None input"
    },
    {
      "commit": "5a3d062715bdde5bfa02bde3bb9e5fcea35e4eb5",
      "tree": "5e4dcdf154b9bffe41f94f7881d2dc3b61751acd",
      "parents": [
        "7c5795c7596243d8cc8737ac33f4f9fa35062609"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Sep 01 10:21:34 2022 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Sep 01 10:21:34 2022 -0400"
      },
      "message": "Fix issue #288: cmp() workaround cannot handle None input\n\nPython2\u0027s `cmp()` function no longer exists in Python3, so when we\nconverted to Python3 we reproduced the seemingly relevant bits of\n`cmp()` as a utility method.  Unfortunately, the naive suggestion from\nPython\u0027s own upgrade docs:\n\n    def cmp(a, b):\n        return (a \u003e b) - (a \u003c b)\n\n...is a bit *too* naive.  Python2\u0027s `cmp()` supports `None` input values as\nwell as comparisons between differing types of input values.  We don\u0027t\nneed the latter, but it seems in some cases we do need the former.  So\nthis change trades multiple replicas of the naive `cmp()` workaround for\na single shared slightly-less-naive implementation that handles `None`\ninputs the way Python2\u0027s `cmp()` does.\n"
    },
    {
      "commit": "7c5795c7596243d8cc8737ac33f4f9fa35062609",
      "tree": "a3f9a3d2a7908582c20cae89de4e20d61850a38d",
      "parents": [
        "73d453c27cb9e383cc6291962fb2f5a4b3e2939a"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Feb 24 11:42:15 2022 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Feb 24 13:30:30 2022 -0500"
      },
      "message": "issue #280: Remove unnecessary Subversion compat code\n"
    },
    {
      "commit": "73d453c27cb9e383cc6291962fb2f5a4b3e2939a",
      "tree": "3da790a0002c8fa1de0efea7588d8d908ff40226",
      "parents": [
        "d85819dac65c5f45b563c2c3c02956ae585576b4",
        "ea32d73c99813af43e6a6f219013b49f781f6f03"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Feb 24 12:53:55 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Feb 24 12:53:55 2022 -0500"
      },
      "message": "Merge pull request #279 from viewvc/issue-277-fix\n\nissue #277: Convert some paths to strings before splitting into parts"
    },
    {
      "commit": "ea32d73c99813af43e6a6f219013b49f781f6f03",
      "tree": "3da790a0002c8fa1de0efea7588d8d908ff40226",
      "parents": [
        "d85819dac65c5f45b563c2c3c02956ae585576b4"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Tue Feb 22 19:39:05 2022 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Feb 24 11:46:09 2022 -0500"
      },
      "message": "Fix issue #277: Convert some paths to strings before splitting\n"
    },
    {
      "commit": "74ce710c62ec78b81adda180bbc3db32e5de9787",
      "tree": "b28c6f780d788fc16977d864600b6cee09ea5cb6",
      "parents": [
        "d85819dac65c5f45b563c2c3c02956ae585576b4"
      ],
      "author": {
        "name": "Ruediger Pluem",
        "email": "r.pluem@gmx.de",
        "time": "Mon Feb 07 11:58:03 2022 +0100"
      },
      "committer": {
        "name": "Ruediger Pluem",
        "email": "r.pluem@gmx.de",
        "time": "Mon Feb 07 11:58:03 2022 +0100"
      },
      "message": "Fix regular expression returned by fnmatch.translate\n\nLater versions of Python (at least 3.6) enclose the whole regular expression in\n(?s:.....)\\Z which is also not understood by MySQL. Remove ?s: and replace\n\\Z with \u0027$\u0027.\n"
    },
    {
      "commit": "d85819dac65c5f45b563c2c3c02956ae585576b4",
      "tree": "d11b2ff6868c54148f8093814a544c44c70a8eaf",
      "parents": [
        "f97ea6135e45692c5458ef8168ee763312a6807b",
        "54135174120d6c3b20b6f131df64e190fa830a56"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@red-bean.com",
        "time": "Thu Jan 13 09:14:27 2022 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 13 09:14:27 2022 -0500"
      },
      "message": "Merge pull request #276 from robjerome/master\n\nFix \u0027Revision Graph\u0027 for CVS repository to work with Python 3"
    },
    {
      "commit": "54135174120d6c3b20b6f131df64e190fa830a56",
      "tree": "d11b2ff6868c54148f8093814a544c44c70a8eaf",
      "parents": [
        "da7697d59f8fd7568e73e34168de3f73648fc7ff"
      ],
      "author": {
        "name": "ukrje",
        "email": "ukrje@softwareag.com",
        "time": "Wed Jan 12 14:14:47 2022 +0000"
      },
      "committer": {
        "name": "ukrje",
        "email": "ukrje@softwareag.com",
        "time": "Wed Jan 12 14:14:47 2022 +0000"
      },
      "message": "Fix \"TypeError: write() argument must be str, not bytes\" error for CVS revision graph\n"
    },
    {
      "commit": "da7697d59f8fd7568e73e34168de3f73648fc7ff",
      "tree": "f68aaccb8fe83305afe48140c8b2ab7cd3dd57a9",
      "parents": [
        "f97ea6135e45692c5458ef8168ee763312a6807b"
      ],
      "author": {
        "name": "ukrje",
        "email": "ukrje@softwareag.com",
        "time": "Wed Jan 12 10:50:41 2022 +0000"
      },
      "committer": {
        "name": "ukrje",
        "email": "ukrje@softwareag.com",
        "time": "Wed Jan 12 10:50:41 2022 +0000"
      },
      "message": "Fix \"TypeError: write() argument must be str, not bytes\" error for CVS revision graph\n"
    },
    {
      "commit": "f97ea6135e45692c5458ef8168ee763312a6807b",
      "tree": "390920423edde3c4077fef2d6b969e215b878d5d",
      "parents": [
        "18154d42116f43962cf2236c71f579d9fb57ef9c",
        "2d0d67aa571c413b3b2cbdc95a39d1136959b041"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Dec 02 00:46:24 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Dec 02 00:46:24 2021 +0900"
      },
      "message": "Merge pull request #273 from futatuki/fix-rcsparse-irregular-rcsdiff\n\nissue #272: ccvs module: Fix issue on checkout caused by adding incomplete line."
    },
    {
      "commit": "2d0d67aa571c413b3b2cbdc95a39d1136959b041",
      "tree": "390920423edde3c4077fef2d6b969e215b878d5d",
      "parents": [
        "7c7794b907b9f7eb9c8e6c05319bd742d4f2dd3d"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Dec 02 00:32:44 2021 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Dec 02 00:32:44 2021 +0900"
      },
      "message": "Update CHANGES file.\n\n* CHANGES\n  Note that the issue #272 was fixed.\n"
    },
    {
      "commit": "7c7794b907b9f7eb9c8e6c05319bd742d4f2dd3d",
      "tree": "e2f773ee41847d06f756cf757cb317da933a4765",
      "parents": [
        "18154d42116f43962cf2236c71f579d9fb57ef9c"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Nov 25 15:20:17 2021 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Thu Nov 25 15:20:17 2021 +0900"
      },
      "message": "(WIP)rcsparse: Fix issue on checkout caused by adding incomplete line.\n\nIt seems some CVS implementation can produce RCS diff outputs that\nadd an incomplete line which is not terminated by LF code.\nHowever our code was don\u0027t care whether the lines are complete or not.\n\nTo fix it, we treat \"text\" in StreamText, without removing trailing LF code.\n\n* lib/vclib/ccvs/ccvs.py\n  (CCVSRepository.openfile):\n    Connect contents of StreamText without completion of LF.\n  (_msplit): New.\n  (StreamText.d_command, StreamText.a_command): Be stricter.\n  (StreamText.__init__, StreamText.command):\n    Don\u0027t assume LF code for each end of lines.\n"
    },
    {
      "commit": "2aabd5f78cfa5c57a9f66e8c27bc651646597f1a",
      "tree": "62c1d5b9769cff8fe38e39849bdefd630cf1e198",
      "parents": [
        "b02b52fdfd67e8c713296bf4e598a722c943e8aa"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Sat Jul 17 00:26:37 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Sat Jul 17 00:26:37 2021 -0400"
      },
      "message": "issue #213: Stub out some CHANGES and upgrade instructions\n"
    },
    {
      "commit": "b02b52fdfd67e8c713296bf4e598a722c943e8aa",
      "tree": "8ff4f4be29fb7c8efbd774efd5e4e37b9659210a",
      "parents": [
        "18154d42116f43962cf2236c71f579d9fb57ef9c"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Jul 15 17:09:53 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Jul 15 17:09:53 2021 -0400"
      },
      "message": "issue #213: Begin working on commits database support for Python 3\n\n* `/bin/cvsdbadmin -\u003e /bin/db/cvsdbadmin`\n* `/bin/svndbadmin -\u003e /bin/db/svndbadmin`\n* `/bin/loginfo-handler -\u003e /bin/db/loginfo-handler`\n  Move some scripts into a new db/ directory.\n\n* `/bin/make-database -\u003e /bin/db/make-database`\n  Move this file and abstract the various schema details out of it and\n  into separate .sql files.  Fix up the handling of `--version`.\n\n* `/bin/db/schema_0.sql`\n* `/bin/db/schema_1.sql`\n  Abstracted out of make-database.\n\n* `/bin/db/schema_2.sql`\n  New schema which switches to InnoDB and employs UTF-8 encoding.\n\n* `lib/cvsdb.py`\n  Drop support for schema versions older than 2.  Don\u0027t try to\n  .decode() query data.\n\n* `/lib/dbi.py`\n  Use pymysql instead of MySQLdb.\n\n* `viewvc-install`\n  Update install files and locations.\n"
    },
    {
      "commit": "18154d42116f43962cf2236c71f579d9fb57ef9c",
      "tree": "973c7afcffb2fdfe8d9114bfe5b8d5b70f18aa42",
      "parents": [
        "727c70d87bb3df94d0efef753bebf394d89edf76",
        "a7d2e2c0c3f425d78dfe9caec8db7696cc6e4973"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@red-bean.com",
        "time": "Thu Jul 15 17:03:58 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 15 17:03:58 2021 -0400"
      },
      "message": "Merge pull request #258 from viewvc/issue-257-fix-double-escaped-error-output\n\nissue #257: Try to avoid double-HTML-escaping error information"
    },
    {
      "commit": "a7d2e2c0c3f425d78dfe9caec8db7696cc6e4973",
      "tree": "973c7afcffb2fdfe8d9114bfe5b8d5b70f18aa42",
      "parents": [
        "727c70d87bb3df94d0efef753bebf394d89edf76"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Jul 15 17:00:37 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Thu Jul 15 17:01:02 2021 -0400"
      },
      "message": "issue #257: Try to avoid double-HTML-escaping error information\n\n* `lib/common.py`\n  (`print_exception_data`): Don\u0027t escape strings -- our callers should\n    manage that.\n\n* `lib/sapi.py`\n  (start_response): Add a message when raising ServerUsageError().\n\n* `lib/viewvc.py`\n  (`view_error`): When generating error output through the template\n    system, don\u0027t escape error strings.  But if we fall back to the\n    print-to-stream direct approach, do.\n"
    },
    {
      "commit": "727c70d87bb3df94d0efef753bebf394d89edf76",
      "tree": "51912c30f6d016e712e321211f5a58e78fab50c5",
      "parents": [
        "cc9fce428b8caebb772dc0ca4370108ab454707d",
        "da505da72bad5f9bf212f454fabf77b3eff35c8b"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@red-bean.com",
        "time": "Thu Jul 15 11:03:53 2021 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 15 11:03:53 2021 -0400"
      },
      "message": "Merge pull request #255 from viewvc/issue-228-black-formatting\n\nIssue #228: black-compliant code formatting"
    },
    {
      "commit": "da505da72bad5f9bf212f454fabf77b3eff35c8b",
      "tree": "51912c30f6d016e712e321211f5a58e78fab50c5",
      "parents": [
        "ae876149cd6de221f4a8db85a27cdbca431bf37c"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 12:23:19 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 12:23:19 2021 -0400"
      },
      "message": "issue #228:  Install black in our linting workflow.\n"
    },
    {
      "commit": "ae876149cd6de221f4a8db85a27cdbca431bf37c",
      "tree": "1cc5c8a3fa1c7d6d1d9adf205e95ece7efabe697",
      "parents": [
        "cc9fce428b8caebb772dc0ca4370108ab454707d"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 11:33:40 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 12:20:38 2021 -0400"
      },
      "message": "issue #228:  More code formatting consistency improvements\n\nThis change moves our code closer into full compliance with Black\n(\"the uncompromising code formatter\"; see https://github.com/psf/black).\n"
    },
    {
      "commit": "cc9fce428b8caebb772dc0ca4370108ab454707d",
      "tree": "031083a84c559ed0b18705dc83cb3ebbfb6590a1",
      "parents": [
        "dfced57415062e0b58472db12de5ce09de55f733"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 10:58:20 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 10:58:20 2021 -0400"
      },
      "message": "Add Emacs mode hints to Markdown files.\n"
    },
    {
      "commit": "dfced57415062e0b58472db12de5ce09de55f733",
      "tree": "a9e5ae2020c1c0b4b07256e94a8c6ace227055f9",
      "parents": [
        "3ed6f396ca69f8ec240da6771626cfe29252b7ea"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 09:18:24 2021 -0400"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Wed Jul 14 09:19:19 2021 -0400"
      },
      "message": "issue #216: Fix a typo in configuration comments\n"
    },
    {
      "commit": "3ed6f396ca69f8ec240da6771626cfe29252b7ea",
      "tree": "a253eebdb4f4a33728ccddffe500ac5474751c09",
      "parents": [
        "581659025138c05525eec8ce796f77764f80bea1",
        "172d45d38f930d41ec5e8f26a58c85da9a01f708"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Fri Jun 18 17:03:18 2021 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 18 17:03:18 2021 +0900"
      },
      "message": "Merge pull request #253 from pkl97/python3_type_error\n\nIssue #252: Fixed error due to changed return type of map() function in Python 3"
    },
    {
      "commit": "172d45d38f930d41ec5e8f26a58c85da9a01f708",
      "tree": "a253eebdb4f4a33728ccddffe500ac5474751c09",
      "parents": [
        "581659025138c05525eec8ce796f77764f80bea1"
      ],
      "author": {
        "name": "Peter Klotz",
        "email": "peter.klotz99@gmail.com",
        "time": "Fri Jun 18 09:29:57 2021 +0200"
      },
      "committer": {
        "name": "Peter Klotz",
        "email": "peter.klotz99@gmail.com",
        "time": "Fri Jun 18 09:29:57 2021 +0200"
      },
      "message": "Fixed error due to changed return type of map() function in Python 3\n"
    },
    {
      "commit": "581659025138c05525eec8ce796f77764f80bea1",
      "tree": "bb62ecbdd5ac440c8b9c2632e1e05bcedaf9c739",
      "parents": [
        "bd865674967433d1414213b3bcd7112a4e2a2a2c"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Mar 01 11:30:16 2021 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Mar 01 11:31:01 2021 -0500"
      },
      "message": "issue #243: Highlight #target table rows\n"
    },
    {
      "commit": "bd865674967433d1414213b3bcd7112a4e2a2a2c",
      "tree": "48edd52bd0056bcc44c3f10501dbed75b9f2fb4e",
      "parents": [
        "a497c6c944b60c16109d064f4265041b66ebf982"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:44:41 2021 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:44:41 2021 -0500"
      },
      "message": "Fix lint errors.\n"
    },
    {
      "commit": "a497c6c944b60c16109d064f4265041b66ebf982",
      "tree": "7353a52025155a441fba1acf605044ec194cbefb",
      "parents": [
        "c184f3bd1e2d0cec4a7053d2d5fb5a0d1bf7917a"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:05:48 2021 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:05:48 2021 -0500"
      },
      "message": "Bump copyright years.\n"
    },
    {
      "commit": "c184f3bd1e2d0cec4a7053d2d5fb5a0d1bf7917a",
      "tree": "46931c26b06a1b99658c06e88497e1bfaa5beed7",
      "parents": [
        "802a1f6cd17cbbb76af538cea93c384b15dfa071"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:05:22 2021 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Jan 04 10:05:22 2021 -0500"
      },
      "message": "Make bump-copyright-years a bit more resilient and efficient.\n"
    },
    {
      "commit": "802a1f6cd17cbbb76af538cea93c384b15dfa071",
      "tree": "e6ca692a39b1b40f0864c2988a868b9602e6913d",
      "parents": [
        "648002452934d5582bf7d077a85300b2d14c0678"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Dec 30 10:42:27 2020 +0900"
      },
      "committer": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Dec 30 10:48:31 2020 +0900"
      },
      "message": "lib/config.py: Remove extra check only needed for Python 2\n"
    },
    {
      "commit": "648002452934d5582bf7d077a85300b2d14c0678",
      "tree": "e85814a245fc4ea9e9c327b817c3ad8868c64207",
      "parents": [
        "6e7b358e9e347c1a3a90649c128be794092ca617",
        "f4a92f2a5e22fc826ccba97329c71cedd0b36a7a"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Wed Dec 30 09:48:33 2020 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 30 09:48:33 2020 +0900"
      },
      "message": "Merge pull request #240 from douglaswth/fix_svnauthz_python3\n\nvcauth/svnauthz: Fix for Python 3 support"
    },
    {
      "commit": "f4a92f2a5e22fc826ccba97329c71cedd0b36a7a",
      "tree": "e85814a245fc4ea9e9c327b817c3ad8868c64207",
      "parents": [
        "1eadcc72b20994891118744c7ea8aaa1df8e676c"
      ],
      "author": {
        "name": "Douglas Thrift",
        "email": "douglas@douglasthrift.net",
        "time": "Tue Dec 29 14:24:46 2020 -0800"
      },
      "committer": {
        "name": "Douglas Thrift",
        "email": "douglas@douglasthrift.net",
        "time": "Tue Dec 29 14:24:46 2020 -0800"
      },
      "message": "Only import configparser for Python 3\n\n- Remove trying to import `ConfigParser` since Python 2 is no longer\n  supported.\n"
    },
    {
      "commit": "1eadcc72b20994891118744c7ea8aaa1df8e676c",
      "tree": "2ddc20230a4939db2ab849876a791969171bff5b",
      "parents": [
        "6e7b358e9e347c1a3a90649c128be794092ca617"
      ],
      "author": {
        "name": "Douglas Thrift",
        "email": "douglas@douglasthrift.net",
        "time": "Mon Dec 28 17:57:13 2020 -0800"
      },
      "committer": {
        "name": "Douglas Thrift",
        "email": "douglas@douglasthrift.net",
        "time": "Mon Dec 28 17:57:13 2020 -0800"
      },
      "message": "Fix svnauthz to work in Python 3\n\n- Try to import `ConfigParser` from `configparser` instead of\n  `ConfigParser` before falling back.\n"
    },
    {
      "commit": "6e7b358e9e347c1a3a90649c128be794092ca617",
      "tree": "a3adc64e7b6e73b0ac538ea6fe2308001e730488",
      "parents": [
        "c7407f3d2af2ffe68e1bcb5f5d5f4b0573f52c81",
        "7b9aaa0588256ce9ff66822da31abfed4c137c98"
      ],
      "author": {
        "name": "FUTATSUKI Yasuhito",
        "email": "futatuki@yf.bsdclub.org",
        "time": "Tue Dec 15 01:14:29 2020 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 15 01:14:29 2020 +0900"
      },
      "message": "Merge pull request #238 from viewvc/issue-228-consistent-code-formatting\n\nIssue 228 consistent code formatting"
    },
    {
      "commit": "c7407f3d2af2ffe68e1bcb5f5d5f4b0573f52c81",
      "tree": "802d559a37652bc3a1b6f57876dd2455da0a805a",
      "parents": [
        "8be6b2a151c198556f0c9273dc64e3d0ca2df7ce"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Dec 14 10:35:28 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Dec 14 10:35:28 2020 -0500"
      },
      "message": "Bump minimum Python version for 1.3.0 to Python 3.6.\n"
    },
    {
      "commit": "7b9aaa0588256ce9ff66822da31abfed4c137c98",
      "tree": "5cb5e304858cc43bf04f9581ee985ece57a6e272",
      "parents": [
        "fe10292e66d7f4192b70af4632fa3ca378a6b8c8"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Dec 14 10:28:39 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Mon Dec 14 10:28:39 2020 -0500"
      },
      "message": "Allow W605 warning, and fix instances where it\u0027s triggered.\n"
    },
    {
      "commit": "fe10292e66d7f4192b70af4632fa3ca378a6b8c8",
      "tree": "01dc25e608f954348ef49f8bb19e4639c9e1b729",
      "parents": [
        "95b2bb01c6cb16505871720ed96d3502497ae8f0"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 12:55:41 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 12:55:41 2020 -0500"
      },
      "message": "Apply lint checks to all branches besides pre-1.3 stuff.\n"
    },
    {
      "commit": "95b2bb01c6cb16505871720ed96d3502497ae8f0",
      "tree": "1beeeea6edfaef21f8d02b86b0830fd91a79de19",
      "parents": [
        "1f24f754c34576f5fc93cdab66abea56e6165ed0"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 12:41:05 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 12:41:05 2020 -0500"
      },
      "message": "Finish first pass at syntax cleanup (and hoping nothing broke).\n"
    },
    {
      "commit": "1f24f754c34576f5fc93cdab66abea56e6165ed0",
      "tree": "94adf2570660f1dc69657178a036efacc5ed8625",
      "parents": [
        "156a98a120b5b57da14e3eff459324148ebe6ac3"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:35:57 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:35:57 2020 -0500"
      },
      "message": "Clean up syntax in most of lib/ directory (all but viewvc.py).\n"
    },
    {
      "commit": "156a98a120b5b57da14e3eff459324148ebe6ac3",
      "tree": "e6440126a507b4d9e49aef2981ce95241c52837f",
      "parents": [
        "d945343d9c6b156c62a1f56aec48843e21672e8d"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:12:36 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:12:36 2020 -0500"
      },
      "message": "Clean up syntax in the lib/vcauth/ directory.\n"
    },
    {
      "commit": "d945343d9c6b156c62a1f56aec48843e21672e8d",
      "tree": "a9a239f0096865f18efe2d8336b9314e73c02857",
      "parents": [
        "7e21e8f91f8d54a5bd7d4554e49ef0b0345b2220"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:06:14 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 11:06:14 2020 -0500"
      },
      "message": "Clean up syntax in the rest of the lib/vclib/ directory.\n"
    },
    {
      "commit": "7e21e8f91f8d54a5bd7d4554e49ef0b0345b2220",
      "tree": "9445ac833df0929f616e93536bc8f47e9e76d2e6",
      "parents": [
        "d68d0efd6bbd05351ea1c2c32f6eb1b6ba2a9bc9"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:59:30 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:59:30 2020 -0500"
      },
      "message": "Clean up syntax in the lib/vclib/ccvs/rcsparse/ directory.\n"
    },
    {
      "commit": "d68d0efd6bbd05351ea1c2c32f6eb1b6ba2a9bc9",
      "tree": "84ac6d1ba05269595b73343d967f2fe8f927b1fc",
      "parents": [
        "9dbfe00335158f5ec2a4008d5fb55161f7c00db8"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:58:14 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:58:14 2020 -0500"
      },
      "message": "Clean up syntax in the lib/vclib/svn/ directory.\n"
    },
    {
      "commit": "9dbfe00335158f5ec2a4008d5fb55161f7c00db8",
      "tree": "f666ec6c782ee0655c9b85ad058742278c839b42",
      "parents": [
        "ad0f0325472c51bc04948f346fabc05eceb9055d"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:54:33 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:54:33 2020 -0500"
      },
      "message": "Clean up syntax in the tools/ directory.\n"
    },
    {
      "commit": "ad0f0325472c51bc04948f346fabc05eceb9055d",
      "tree": "4a8d0e78c687fe3f5149d468559657a69979bcff",
      "parents": [
        "14cd6b5b1ca66663f0f531d4466bd94549502998"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:54:05 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:54:05 2020 -0500"
      },
      "message": "Clean up syntax in the bin/ directory.\n"
    },
    {
      "commit": "14cd6b5b1ca66663f0f531d4466bd94549502998",
      "tree": "4a6fbeec85010ff8055340b37253e085ff65f186",
      "parents": [
        "6e4e1ab156f4a6d973ef801e50cd1457a6decc71"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:39:52 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 10:39:52 2020 -0500"
      },
      "message": "Suppress warnings about the oft-used module-level import not at top of file.\n"
    },
    {
      "commit": "6e4e1ab156f4a6d973ef801e50cd1457a6decc71",
      "tree": "836df37929e0cab2f952f32146437f4f0e3cd1dd",
      "parents": [
        "03c3b7cadfcf8adaaeb5fe6dc9fde80eac5bd295"
      ],
      "author": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 08:47:20 2020 -0500"
      },
      "committer": {
        "name": "C. Michael Pilato",
        "email": "cmpilato@collab.net",
        "time": "Fri Dec 11 08:47:20 2020 -0500"
      },
      "message": "Simplify our flake8 command invocation.\n"
    }
  ],
  "next": "03c3b7cadfcf8adaaeb5fe6dc9fde80eac5bd295"
}
