)]}'
{
  "log": [
    {
      "commit": "e77fd08ff9d3a234095ee57bb91f48f29c96fa2c",
      "tree": "6a1d28e478bb82a65c7efb8b2abdb89f1796f1e5",
      "parents": [
        "fc376e8a1056f2452942bacc9b1b57edde8d4e3d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Dec 03 07:28:19 2025 +0000"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Dec 18 10:21:29 2025 +0800"
      },
      "message": "Bump golang.org/x/crypto from 0.21.0 to 0.45.0\n\nBumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.45.0.\n- [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.45.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/crypto\n  dependency-version: 0.45.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "fc376e8a1056f2452942bacc9b1b57edde8d4e3d",
      "tree": "a5489a995e263380ab476a64e978987c6d3d8a00",
      "parents": [
        "928bc567da46e3f27fdaca6532af444d9041dcc7"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Sep 08 11:41:18 2025 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Sep 10 09:42:24 2025 +0800"
      },
      "message": "refactor: Rename module to apache/cloudberry-go-libs\n"
    },
    {
      "commit": "928bc567da46e3f27fdaca6532af444d9041dcc7",
      "tree": "38f90c14948cbd35db2989cc68284453f5dd0ce3",
      "parents": [
        "e8ca939d5c9c430da7dbd77abbdc5c1b00f41a87"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Jul 25 20:02:59 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 25 20:02:59 2025 +0800"
      },
      "message": "fix(dbconn): reduce log level for version initialization (#11)\n\n"
    },
    {
      "commit": "e8ca939d5c9c430da7dbd77abbdc5c1b00f41a87",
      "tree": "368942660323e6569096e615a6b5877d1d1bbcaf",
      "parents": [
        "7e1b684694b9bbb02a2a8853678b2e87ad441a3f"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Jul 25 19:59:01 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 25 19:59:01 2025 +0800"
      },
      "message": "fix(cluster): add database type check for legacy GPDB query (#12)\n\nWhen retrieving the segment configuration, there is special query\nlogic for GreenplumDB (GPDB) versions prior to \"6\".\n\nThe previous implementation only checked the version number. This could\ncause an incorrect query to be executed on a non-GPDB database\n(like CloudberryDB) that might also satisfy the `Before(\"6\")` version\ncheck.\n\nThis commit adds an `IsGPDB()` check to ensure this legacy logic is\ntriggered only when connected to the correct database type, making\nthe function more robust."
    },
    {
      "commit": "7e1b684694b9bbb02a2a8853678b2e87ad441a3f",
      "tree": "07b4ee77edaf8198f3fabc99e8415592128b2680",
      "parents": [
        "87ad28e303e586d188dafea25786a15ac882cccd"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Wed Jul 31 18:31:15 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Retry failed ssh commands in ExecuteClusterCommand\n\nWe pass in maxAttempts and retry until the command passes. If there is an\nerror, we collect it in the command.RetryError variable. We have ways to log\nmessages for commands that were retried but eventually passed, along with\ncontinuing to log failed commands like we used to.\n\nWe test the command retry with a script that increments a number and exits 1\nuntil the number gets high enough to simulate failing and then passing..\n\nHave GenerateAndExecuteCommand use retries by default. This seems to only be\nused by gpbackup and we know we want to use retries in that utility.\n"
    },
    {
      "commit": "87ad28e303e586d188dafea25786a15ac882cccd",
      "tree": "92f505b279f261a8f4b899682d34d95d12be793b",
      "parents": [
        "0ced619f8d1225877158ad387639c49e5edd18bc"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Tue Jul 16 17:45:19 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add ExecuteLocalCommandWithContext\n\nAdding a version to run local commands with context to handle timeouts for long\nrunning commands\n"
    },
    {
      "commit": "0ced619f8d1225877158ad387639c49e5edd18bc",
      "tree": "0563848761e4f3ed85a51c79da226db59cea5400",
      "parents": [
        "330d7a450d2bca68c69e93c7f3cbeb7707ea7ccb"
      ],
      "author": {
        "name": "Brandon Tat",
        "email": "tatb@vmware.com",
        "time": "Wed May 22 14:06:55 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add length check before returning first index of segmentList (#91)\n\nThis commit adds a length check on the segmentList within getSegmentByRole() before returning the first index to avoid panicking."
    },
    {
      "commit": "330d7a450d2bca68c69e93c7f3cbeb7707ea7ccb",
      "tree": "e5e3af79ed0639b70ca01d6b783fa28a1e6963f1",
      "parents": [
        "b93ec131a3574e842a29d0c3e5aef7621adb0c5b"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Mon May 20 11:47:05 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Remove Progress command\n\nThis is only used by gpbackup/gprestore so we will remove it from here and use\nthe new Custom function to implement a wrapper in the codebase where it is used\nto keep this repo more general\n"
    },
    {
      "commit": "b93ec131a3574e842a29d0c3e5aef7621adb0c5b",
      "tree": "7541794c5a08ed6157de7af77b713e4e3c1d566c",
      "parents": [
        "219df422cca51601bbdb74bb51846e755b06b1c1"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Thu May 16 16:54:58 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Use Custom logging for CheckClusterError\n\ngpbackup recently made a change to use verbosity info by default for both shell\noutput and logfile since we were logging too much to files by default. However,\nwith this change we get odd behavior with CheckClusterError. It used to write\nsegment errors to the file with verbosity Verbose which would always show up in\nthe file because we set the file log level to Debug by default. We have a\nmessage that says \"check logfile for complete list of errors\", but when the\nlogfile level is info the segment errors don\u0027t get printed. Since they are\nerrors we should make sure we print them to the file even when the file log\nlevel is lower so customers can see them to debug.\n"
    },
    {
      "commit": "219df422cca51601bbdb74bb51846e755b06b1c1",
      "tree": "148b3995f8555a1b76c1e1d0414a32c3739c2e5d",
      "parents": [
        "ac345b75e8510fab3bbe0160ec6486d699c74a6d"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Thu May 16 18:42:36 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add Custom command for more logging control\n\nThe Progress command was just for doing info level to the logfile and verbose\nlevel to stdout for table progress in gpbackup and gprestore. However, I found\nat least one more place where using different settings for terminal and logfile\nwould be useful. We CheckClusterError in the cluster package for some commands\nand assume we will log details to the file, but not to stdout.\n\nSince this is a more general use case, we can make a more general command that\nlets the caller pass in values for file threshold and shell threshold\nseparately to accommodate more use cases.\n\nKeep Progress command as a wrapper around the Custom command since it is a\nspecific instance of the Custom usage\n"
    },
    {
      "commit": "ac345b75e8510fab3bbe0160ec6486d699c74a6d",
      "tree": "7cd9798ad19477965e705de0b75f5140bd5b2b63",
      "parents": [
        "7a51d647f4bdd1faa2edd68d75955040bec265ca"
      ],
      "author": {
        "name": "Alexander Denissov",
        "email": "denalex@users.noreply.github.com",
        "time": "Fri May 10 13:53:27 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Added separate shell prefix and colorization to gplog (#88)\n\nPXF uses gplog library to output to the console and log messages to the file, however we have the following requirements that are implemented by this PR. All existing functionality is intact, so the changes should be additive only.\n\nHave separate prefixes for console and log file output. We do not want to have users see the \"header\" with timestamps, pids, etc as it pollutes the important message payloads. The prefixes are now separated and I included the default function that would only append logging level for WARNING, ERROR, and CRITICAL message levels.\nWe have colorized output to the console, so this functionality also has been added as a logger flag. When enabled, the colorization will apply to ERROR and CRITICAL messages (red) , WARNING messages (yellow) and INFO messages logged with new Success() method only (green).\n"
    },
    {
      "commit": "7a51d647f4bdd1faa2edd68d75955040bec265ca",
      "tree": "7f405f60eb83726ab88626c61dd037f38216b285",
      "parents": [
        "5c07acc48406edac73d09d718e3090a53d36d6c1"
      ],
      "author": {
        "name": "Nihal Jain",
        "email": "jnihal@vmware.com",
        "time": "Mon May 06 14:48:06 2024 +0530"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add `SelectContext` and `QueryContext` to DBConn\n\nThese new methods allows us to pass a context when executing queries. This can be helpful in situations where we want to cancel a running query by cancelling the context passed.\n"
    },
    {
      "commit": "5c07acc48406edac73d09d718e3090a53d36d6c1",
      "tree": "a4f48aaa4c5a01f0aa04f26327eaf2d8a17153b2",
      "parents": [
        "0e1ad56783079da0252820c4a56c1051f769f3b0"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Fri Apr 19 10:56:00 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Update golang net library to v0.23.0\n"
    },
    {
      "commit": "0e1ad56783079da0252820c4a56c1051f769f3b0",
      "tree": "8b8fc46077016ee4328a67ff2cdf5715eb2ce9f2",
      "parents": [
        "b415c9b4a621a0f1d3d89177cfb3e51fce1832c2"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Tue Apr 16 15:19:01 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add new Progress command for gplog\n\nThis is to be used with progress bars. It uses the prefix DEBUG and logs at\nverbose level to stdout and the prefix INFO and logs at info level to the log\nfile so it won\u0027t disrupt progress bars but will give useful information in the\nlog files.\n"
    },
    {
      "commit": "b415c9b4a621a0f1d3d89177cfb3e51fce1832c2",
      "tree": "48979b68da28ccfc255c2e0313d0598d4bc8ef8b",
      "parents": [
        "a34ff947604613c13be181e5ea8893ae63cb9f68"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Tue Apr 16 15:18:05 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Fix existing tests\n\nDeepEqual was not working in logger tests. Likely because the underlying log\nlibrary had a change. Just check the main values we care about.\n"
    },
    {
      "commit": "a34ff947604613c13be181e5ea8893ae63cb9f68",
      "tree": "eb1a353ced0d17b28d32f527b62b1a110c2c4ab1",
      "parents": [
        "8663557611567e6e13240e9ae17eda9b6a22a2ab"
      ],
      "author": {
        "name": "Alexander Denissov",
        "email": "denalex@users.noreply.github.com",
        "time": "Tue Mar 12 17:50:55 2024 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Bumped pgx to v4.18.2, updated indirect dependencies (#86)\n\n"
    },
    {
      "commit": "8663557611567e6e13240e9ae17eda9b6a22a2ab",
      "tree": "bbf8e374bdc52200f373a7dc6395cb70285d9040",
      "parents": [
        "ad8a6bb595451b811851803b80ea028831b4e760"
      ],
      "author": {
        "name": "Rakesh Sharma",
        "email": "shrakesh@vmware.com",
        "time": "Tue Jan 23 21:31:19 2024 +0530"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Introducing API GetSegmentConfigurationFromFile() for configuration retrieval from file\n\nThis PR introduces an API GetSegmentConfigurationFromFile() to parse the gpsegconfig_dump file to retrieve segment configuration information.\nThe recommended use of the API is to get the contents of gp_segment_configuration when the database is down.\n\nIn the realm of gpdb, the gpsegconfig_dump file holds the crucial segment configuration information. this file is generated in the coordinator\ndata directory through the fts process. gpsegconfig_dump is always in sync with gp_segment_configuration as on each fts probe the file\ngets updated if there is any change in the segment configuration. Various fts gucs govern the frequency of writing to this file.\n\nNote: Since the gpsegconfig_dump file is updated by fts process the information returned by\nthis function can be a bit stale since the user can configure fts to run less frequently\n\nThe gpsegconfig_dump file follows a structured format, as illustrated in the example below:\n1 -1 p p n u 6000 localhost localhost /data/temp1\n2 0 p p n u 6002 localhost localhost /data/temp2\n3 1 p p n u 6003 localhost localhost /data/temp3\n4 2 p p n u 6004 localhost localhost /data/temp4\n\nExample Usage:\n   segments, err :\u003d GetSegmentConfigurationFromFile(\"/path/to/coordinator/data/dir\")\n   if err !\u003d nil {\n       //Handle error\n       return\n   }\n*. if gpsegconfig_dump has the following content ( with data-dir).\n   1 -1 p p n u 6000 localhost localhost /data/qddir\n   2 0 p p n u 6002 localhost localhost /data/seg1\n   SegConfig will have the DataDir field populated\n*. gpsegconfig_dump has the following content ( without data-dir)\n\t1 -1 p p n u 6000 localhost localhost\n    2 0 p p n u 6002 localhost localhost\n    SegConfig will have the DataDir field empty\n\nThe structured data, captured in the gpsegconfig_dump file, is now accessible through the newly added API GetSegmentConfigurationFromFile().\nThis enhancement helps the other utilities to perform some operations even if the database is offline.\n\ne.g.\nIn gpsupport utility if the database is down we can use this API to retrieve the data dirs to perform a log collection.\nor\nIn gpdeletesystem if the database is down the API can be used to perform the database cleanup still.\n\nThe reason to add it in gp-common-go-libs is that this is the growing API library that is being used by almost all the newly created gp modern\nutilities like project spine/ gpdr/ gpupgrade/ gpbackup/gprestore.\n\nAdded test cases to do the unit testing around the following scenario\nwhen the file is valid it should provide valid results.\nwhen the file is invalid it should fail in parsing or reading it.\nadded test cases to cover old and new field counts of gpsegconfig_dump.\nwhen the user passes the wrong coordinatorDataDir argument.\n"
    },
    {
      "commit": "ad8a6bb595451b811851803b80ea028831b4e760",
      "tree": "be55ac8fce9c244d0512512eb67b66ab50faca22",
      "parents": [
        "cfa3f862af9a420ee6a646792a75bfe1c47a13e1"
      ],
      "author": {
        "name": "Rakesh Sharma",
        "email": "shrakesh@vmware.com",
        "time": "Tue Jan 23 21:23:34 2024 +0530"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Updated GetSegmentConfiguration() to populate all remaining fields of segment configuration\n\nUpdated GetSegmentConfiguration() API to popuate following remaining\nfields:\n - preferred_role\n - mode\n - status\n - address\n\nsame fields also added in SegConfig struct in the same order as they\nappear in gp_segment_configuration table.\n\nUpdated unit test cases to deep compair all the configuration fields.\n"
    },
    {
      "commit": "cfa3f862af9a420ee6a646792a75bfe1c47a13e1",
      "tree": "20108445cb695c10ebfe79ce2048e6f49166d17d",
      "parents": [
        "74173a5f7dc019d83b8c80987be9e2f32ef54e2c"
      ],
      "author": {
        "name": "Bradford D. Boyle",
        "email": "bradfordb@vmware.com",
        "time": "Tue Jan 02 11:00:23 2024 -0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Upgrade golang.org/x/crypto to 0.17.0\n\nAuthored-by: Bradford D. Boyle \u003cbradford.boyle@broadcom.com\u003e\n"
    },
    {
      "commit": "74173a5f7dc019d83b8c80987be9e2f32ef54e2c",
      "tree": "66322138a9508df9ab1ee1ad21da90b200dc090b",
      "parents": [
        "39e56beda7fd13cceabd8da2eba0618e92f276d2"
      ],
      "author": {
        "name": "Jianwen Dong",
        "email": "djianwen@vmware.com",
        "time": "Tue Oct 17 09:21:06 2023 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Add error formatting package\n\n- Also add \"conv\" to `show_coverage.sh`\n- Bump Ginkgo from v1 to v2 for consistency with the current testing\n  code\n\nCo-authored-by: Jianwen Dong \u003cdjianwen@vmware.com\u003e\nCo-authored-by: Brandon Tat \u003ctatb@vmware.com\u003e\nCo-authored-by: Stu Pollock \u003cstuartp@vmware.com\u003e\nCo-authored-by: Gaurab Dey \u003cgaurabd@vmware.com\u003e\n"
    },
    {
      "commit": "39e56beda7fd13cceabd8da2eba0618e92f276d2",
      "tree": "84b26298ae7c6a077d6e5405dc462ca27f6c4716",
      "parents": [
        "455394511099aed9cb9daac2c15ef7b78ec101d7"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Thu Oct 12 13:51:37 2023 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Run go mod tidy\n\nAlso use latest version of ginkgo/v2\n"
    },
    {
      "commit": "455394511099aed9cb9daac2c15ef7b78ec101d7",
      "tree": "9f9e09f74d29c988a8821dc67d1733520b5d96e4",
      "parents": [
        "cf68aaf5471b901dc78706d9fd8ef1f083399c31"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Thu Oct 12 13:50:30 2023 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Upgrade golang dependencies for dependabot alerts\n"
    },
    {
      "commit": "cf68aaf5471b901dc78706d9fd8ef1f083399c31",
      "tree": "c734680c3efa4b2bcdc67a9b8534e0f3528e1a24",
      "parents": [
        "0359a65821e217d82bd933936820c1bef88b6084"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Wed Aug 30 03:56:41 2023 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "dbconn: Add SelectInt and SelectIntSlice\n\nSelecting ints can have the same issues as selecting strings (may be\nNULL, may not exist, needs a destination struct, etc.) so for user\nconvenience this commit adds SelectInt and SelectIntSlice functions\nthat work essentially like SelectString and SelectStringSlice.\n"
    },
    {
      "commit": "0359a65821e217d82bd933936820c1bef88b6084",
      "tree": "944bbbf4c394d9148586b9c32f9a3c906aed4c97",
      "parents": [
        "ce8cf9a072c22382bab65ee33f349756d8bad47a"
      ],
      "author": {
        "name": "moonsn",
        "email": "moonsn1994@gmail.com",
        "time": "Wed Apr 19 16:50:25 2023 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Format string after judge level in pglog\n\nThis commit change the behavior of the gplog package when record\ndebug and verbose level logs.\n\nWhen the log level set to \"Info\", a \"Debug\" or \"Verbose\" function\ncall should do less job. The old code will a format for the log\nmessage before judge the log level, buf if the log level is \"Info\",\nthe format call is an redundant operation.\n\nSo, we change it to judge the log level before format the\nformat operation.\n"
    },
    {
      "commit": "ce8cf9a072c22382bab65ee33f349756d8bad47a",
      "tree": "c9f5a62e040b075c46e56b9e77b704980cda6c08",
      "parents": [
        "9bb613e3ab638eb5bec121931eb32bfd18c2ff11"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Wed Apr 12 21:57:40 2023 -0700"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Miscellaneous mirror-related enhancements\n\nThis commit changes cluster behavior in the following ways in order to\nmake it easier to work with mirrors:\n\n1) The ContentIDs array is now deduplicated and sorted in the Cluster\nconstructor, so that a cluster with mirrors won\u0027t have duplicate values\nin that array and segments can be added in any order without affecting\nthe order of ContentIDs.\n\n2) GetSegmentConfiguration can now retrieve only mirror information if\ndesired, so that if some code wants to work with primaries and mirrors\nseparately it can do so without having to retrieve both primary and\nmirror information at once and then manually separate it out into two\nClusters.\n\n3) TestExecutor now supports returning different values on subsequent\ncalls for both ExecuteLocalCommand and ExecuteClusterCommand, in order\nto make it easier to test functions that might make one call to deal\nwith primaries and another to deal with mirrors (or any other use case\ninvolving multiple calls per function, of course).\n"
    },
    {
      "commit": "9bb613e3ab638eb5bec121931eb32bfd18c2ff11",
      "tree": "6c6f29d896f2b7169c11103bb17b4c84e5b30581",
      "parents": [
        "125cedd2856a50fa53f59801c321d7c7eea14fa2"
      ],
      "author": {
        "name": "Huiliang.liu",
        "email": "lhuiliang@vmware.com",
        "time": "Wed Apr 05 10:47:09 2023 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "support kerberos and sslmode prefer (#76)\n\n- add krbsrvname to connect string.\r\n   The application should RegisterGSSProvider() for pgx if it need support kerberos.\r\n- set default sslmode as prefer.\r\n- use another connect string format to handle user name like xxx/host@domain\r\n\r\nCo-authored-by: xiaoxiaoHe-E\r\nCo-authored-by: Adam Lee adlee@vmware.com"
    },
    {
      "commit": "125cedd2856a50fa53f59801c321d7c7eea14fa2",
      "tree": "099c729179e005dd279654308c1b2101f6b168f3",
      "parents": [
        "bdf2613f194c12023a7556d9be25d82e411af4c2"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Wed Mar 01 08:41:51 2023 -0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Wed Jul 23 10:58:10 2025 +0800"
      },
      "message": "Update all dependencies for Go 1.19\n\nThe dependencies for this library were fairly out-of-date, not because\nit relied on anything specific in older versions of any dependencies but\nsimply because they hadn\u0027t been updated in a while.\n\nAs part of a general effort to update GPDB Go projects to 1.19, this\ncommit updates the required Go version and updates all dependencies to\ntheir currently-latest versions.\n"
    },
    {
      "commit": "bdf2613f194c12023a7556d9be25d82e411af4c2",
      "tree": "555ea3dd1b810a9106d16b082b23dd96556539bd",
      "parents": [
        "f7b28a35eb01670948e0ba167f97b518f12309a7"
      ],
      "author": {
        "name": "Hao Wu",
        "email": "gfphoenix78@gmail.com",
        "time": "Mon Jul 14 10:41:19 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 14 10:41:19 2025 +0800"
      },
      "message": "Revert \"Initial commit: add support for CloudberryDB\" (#7)\n\nThis reverts commit 3c26b847cec572251a945dabe22f78bd551f5c94."
    },
    {
      "commit": "f7b28a35eb01670948e0ba167f97b518f12309a7",
      "tree": "6029161bd3cc1559b0c6ef6537dd153c000bff2d",
      "parents": [
        "a41ff61a8a4564b14fb754ef4a6ca235e2998041"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sat Jul 12 21:13:36 2025 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Sat Jul 12 22:35:52 2025 +0800"
      },
      "message": "feat(dbconn): Add support for Apache Cloudberry Database\n\nThis commit refactors the database version parsing logic to support\nmultiple database types, starting with Greenplum and Apache Cloudberry.\nThe previous implementation was tightly coupled to Greenplum Database\nand used a simple string search to extract the version, which was not\nrobust or extensible.\n\nKey changes:\n1. Introduces a DBType enum to identify the database (GPDB, CBDB).\n2. Replaces string manipulation with regular expressions in\nParseVersionInfo for more accurate and reliable version parsing.\n3 . Adds helper functions (IsGPDB(), IsCBDB()) to easily check the\ndatabase type.\n4. Updates unit tests in version_test.go to validate the new parsing\nlogic for both supported databases.\n\nAdditionally, this change lays the groundwork for resolving a similar\nversion detection issue in the apache/cloudberry-gpbackup project.\nThe backup utility currently cannot correctly identify Apache Cloudberry,\nand this foundational fix in the shared library is the first step\ntoward enabling proper support in that tool.\n\nThis new approach makes the system more maintainable and easier to\nextend with support for other database systems in the future.\n"
    },
    {
      "commit": "a41ff61a8a4564b14fb754ef4a6ca235e2998041",
      "tree": "395f481c54ddc405a24ef9f64a3f747abb712df2",
      "parents": [
        "2b8b8470da57b2ceee1f2ae54bad8209f6491f23"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Nov 05 12:01:17 2024 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Mar 28 11:30:21 2025 +0800"
      },
      "message": "Update asf.yaml and README.md\n"
    },
    {
      "commit": "2b8b8470da57b2ceee1f2ae54bad8209f6491f23",
      "tree": "817aeb7d2c8e3c9ea9d9d4e86c334bb4120c00d9",
      "parents": [
        "9b58a432015911d9c8aebed6050dc8b5de11c78c"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Nov 30 16:15:22 2023 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Dec 01 10:05:32 2023 +0800"
      },
      "message": "Update module url to cloudberrydb repo\n"
    },
    {
      "commit": "9b58a432015911d9c8aebed6050dc8b5de11c78c",
      "tree": "25913a8ea16fa664a74f65c9db402c500841647c",
      "parents": [
        "3c26b847cec572251a945dabe22f78bd551f5c94"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Nov 17 11:57:21 2023 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 17 11:57:21 2023 +0800"
      },
      "message": "Update the basic community files (#1)\n\nFor building a healthy community, we add some basic community files like\r\nPR request, issue template, contribution guide, and more."
    },
    {
      "commit": "3c26b847cec572251a945dabe22f78bd551f5c94",
      "tree": "c8b8d9bd2509c64ed52514cf6921473d2e97d989",
      "parents": [
        "ded452dda1bd22336eaac165e593c30857ca767b"
      ],
      "author": {
        "name": "oracle",
        "email": "873988212@qq.com",
        "time": "Wed Feb 22 15:07:30 2023 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Nov 16 14:38:22 2023 +0800"
      },
      "message": "Initial commit: add support for CloudberryDB\n\nThis is one forked repo from the Greenplum gp-common-go-libs since the\ngpbackup utility for CloudberryDB depends on it.\n\nWe change just a few lines, you can see the obvious\nGetSegmentConfiguration() function changes in this commit.\n\n**Acknowledgment**\n\nThanks to all the gp-common-go-libs contributors, more details in its\nGitHub page: https://github.com/greenplum-db/gp-common-go-libs.\n\nAuthored-by: oracle \u003c873988212@qq.com\u003e\n"
    },
    {
      "commit": "ded452dda1bd22336eaac165e593c30857ca767b",
      "tree": "b5adcbf128be7bbb2cbac510c1246fd50e4f4834",
      "parents": [
        "290c53a0b5473b64b11b86121118787c0103cd70"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Mon Dec 19 23:31:02 2022 -0800"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Fri Dec 23 13:35:16 2022 -0800"
      },
      "message": "Change uses of \"master\" to \"coordinator\"\n\nAs part of an effort to use more inclusive terminology, GPDB 7 is\nrenaming the GPDB \"master\" to the \"coordinator\" and the \"master\" branch\nto \"main\", and any related code is to be changed as well.\n\nThis commit adds new INCLUDE_COORDINATOR and EXCLUDE_COORDINATOR scopes\nas synonyms of the existing INCLUDE_MASTER and EXCLUDE_MASTER scopes,\ninstead of renaming them, to maintain backwards compatibility for now.\nAll internal usage of the term is updated, however.\n"
    },
    {
      "commit": "290c53a0b5473b64b11b86121118787c0103cd70",
      "tree": "1970e257a21e5f5616b4255825483652ae30560e",
      "parents": [
        "1be9f403a3d0fc37e342b4e7532f755080c9fcd8"
      ],
      "author": {
        "name": "gp-releng",
        "email": "gp-releng@pivotal.io",
        "time": "Wed Nov 02 12:51:57 2022 +0800"
      },
      "committer": {
        "name": "Wu Ning",
        "email": "ningw@vmware.com",
        "time": "Tue Nov 15 11:06:51 2022 +0800"
      },
      "message": "Add SECURITY.md"
    },
    {
      "commit": "1be9f403a3d0fc37e342b4e7532f755080c9fcd8",
      "tree": "3ad2a9286ee13e794d0fdf54cabd14c4d9784856",
      "parents": [
        "1e6dac8f8360621a46fdecb45478698e158f5fac"
      ],
      "author": {
        "name": "Nikhil Kak",
        "email": "nkak@vmware.com",
        "time": "Thu Aug 04 22:55:01 2022 +0530"
      },
      "committer": {
        "name": "Jimmy Yih",
        "email": "jyih@vmware.com",
        "time": "Fri Aug 19 11:44:21 2022 -0700"
      },
      "message": "Add \"Completed\" field to ShellCommand\n\nAdded this explicit field to make it easier to determine if a command\nhas completed its execution regardless of success or failure.\n"
    },
    {
      "commit": "1e6dac8f8360621a46fdecb45478698e158f5fac",
      "tree": "7b6e2c0b87274bba989c280e5a9ad4fb498f4fad",
      "parents": [
        "21efdd1fe7efb74bae03dd7dd5e35fcba3e3fd67"
      ],
      "author": {
        "name": "Brent Doil",
        "email": "bdoil@vmware.com",
        "time": "Fri May 20 10:50:24 2022 -0400"
      },
      "committer": {
        "name": "Brent Doil",
        "email": "bdoil@vmware.com",
        "time": "Fri May 20 10:56:18 2022 -0400"
      },
      "message": "Update to ginkgo v2\n\nAuthored-by: Brent Doil \u003cbdoil@vmware.com\u003e\n"
    },
    {
      "commit": "21efdd1fe7efb74bae03dd7dd5e35fcba3e3fd67",
      "tree": "1043ce1f15373703bc3a92c4b896cf34e26713b7",
      "parents": [
        "5857b39685d6b48d756b9d1fad3bc45aae541f4c"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Tue Apr 26 16:52:26 2022 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@vmware.com",
        "time": "Wed Apr 27 17:24:32 2022 -0700"
      },
      "message": "dbconn: add the ability to connect in utility mode\n\nThis commit modifies the dbconn.Connect function to take a boolean\nwhich, if set to true, connects in utility mode.  It also adds some\nhelper functions for more explicit invocation.\n\nIn order to test this functionality, it was necessary to modify the\nTestDriver struct to be able to return different errors on different\ncalls, so this commit also makes that change.\n"
    },
    {
      "commit": "5857b39685d6b48d756b9d1fad3bc45aae541f4c",
      "tree": "c46397720d2888e722e560f70e70153c81ae039e",
      "parents": [
        "b48b8813bf940e3428899a6e1973bb7405c6bdfe"
      ],
      "author": {
        "name": "Jimmy Yih",
        "email": "jyih@vmware.com",
        "time": "Wed Apr 20 14:46:54 2022 -0700"
      },
      "committer": {
        "name": "Jimmy Yih",
        "email": "jyih@vmware.com",
        "time": "Mon Apr 25 11:20:00 2022 -0700"
      },
      "message": "Remove ginkgo v1 reference from testhelper package\n\nThe ginkgo v1 reference in testhelper\u0027s function.go was making the\ntesthelper package incompatible with ginkgo v2. Remove the ginkgo v1\nreference and replace the Fail() calls with equivalent gomega Expect\ncalls.\n"
    },
    {
      "commit": "b48b8813bf940e3428899a6e1973bb7405c6bdfe",
      "tree": "f89c2058c8c002ea38017e35e5c42d4305a8f6d3",
      "parents": [
        "c24a3ea9a79bdaec5ec6667d5291d36e5533088a"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@vmware.com",
        "time": "Tue Jan 25 19:03:44 2022 -0800"
      },
      "committer": {
        "name": "Jimmy Yih",
        "email": "jyih@vmware.com",
        "time": "Mon Apr 25 11:19:41 2022 -0700"
      },
      "message": "structmatcher: Use MatchStruct matcher in deprecated implementations\n\nThis also removes the dependency on ginkgo, which will improve\ncompatibility with ginkgo v2.\n\nAuthored-by: David Sharp \u003cdsharp@vmware.com\u003e\n"
    },
    {
      "commit": "c24a3ea9a79bdaec5ec6667d5291d36e5533088a",
      "tree": "15b9d13ae8a7390c2fa9951c6ae114773282e201",
      "parents": [
        "befeba3c7899ddbfd42cf1473b90963cde3702ed"
      ],
      "author": {
        "name": "Brent Doil",
        "email": "bdoil@vmware.com",
        "time": "Wed Jan 19 16:43:06 2022 -0500"
      },
      "committer": {
        "name": "Brent Doil",
        "email": "bdoil@vmware.com",
        "time": "Thu Jan 20 23:52:59 2022 -0500"
      },
      "message": "Update to golang 1.17 and upgrade dependencies.\n\nAdd local targets for linting and formatting using docker\n\nRun `make unit` in pipeline\n\nAdd github action to run `make lint` on PR to master\n\nAuthored-by: Brent Doil \u003cbdoil@vmware.com\u003e\n"
    },
    {
      "commit": "befeba3c7899ddbfd42cf1473b90963cde3702ed",
      "tree": "3c96af717892855639f875cddd706ed6b9e97ed6",
      "parents": [
        "34f4f09ab1ed10b7e9de5ffe767b6b2418bb971d"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@vmware.com",
        "time": "Thu Nov 11 14:41:21 2021 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Wed Dec 01 13:05:18 2021 -0600"
      },
      "message": "Add RemoveAll to operating systems functions\n\nAuthored-by: Kevin Yeap \u003ckyeap@vmware.com\u003e\n"
    },
    {
      "commit": "34f4f09ab1ed10b7e9de5ffe767b6b2418bb971d",
      "tree": "a3ee49b6f1be44ffd416225273aa1b80662db3c7",
      "parents": [
        "53ec91189e034d9d776be00257d26e07d5991d8d"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Fri Aug 20 18:19:02 2021 +0000"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Fri Aug 20 18:19:02 2021 +0000"
      },
      "message": "Fix formatting\n\nAuthored-by: Karen Huddleston \u003ckhuddleston@vmware.com\u003e\n"
    },
    {
      "commit": "53ec91189e034d9d776be00257d26e07d5991d8d",
      "tree": "28fb9ce983a8ef09f0c62d5fbf73240e2a75718f",
      "parents": [
        "958f32fdc2b0766860ad0c9dc894951cd6e96040"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@vmware.com",
        "time": "Mon Nov 02 16:46:18 2020 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Tue Nov 03 18:12:44 2020 -0600"
      },
      "message": "structmatcher: Fix for when an unexported field is a struct\n\nAuthored-by: David Sharp \u003cdsharp@vmware.com\u003e\n"
    },
    {
      "commit": "958f32fdc2b0766860ad0c9dc894951cd6e96040",
      "tree": "c58fa09b8f40ea66a75d7ae4e3aedd10935be41f",
      "parents": [
        "7843a4dd47016cf287e2dfa97e0711ef7776c022"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@vmware.com",
        "time": "Mon Nov 02 16:01:20 2020 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Tue Nov 03 18:12:44 2020 -0600"
      },
      "message": "structmatcher: Support comparing nil pointers\n\nAuthored-by: David Sharp \u003cdsharp@vmware.com\u003e\n"
    },
    {
      "commit": "7843a4dd47016cf287e2dfa97e0711ef7776c022",
      "tree": "c5cf211b29859cbe82e4a990b3cc61091a91b544",
      "parents": [
        "ee3f0135881bfbfe7c1b2e714d2d7bfcad763e7a"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@vmware.com",
        "time": "Mon Nov 02 14:36:36 2020 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Tue Nov 03 18:12:44 2020 -0600"
      },
      "message": "structmatcher: Add missing duplicate coverage for the GomegaMatcher\n\nTrying to keep tests in sync between StructMatcher() and MatchStruct()\n\nAuthored-by: David Sharp \u003cdsharp@vmware.com\u003e\n"
    },
    {
      "commit": "ee3f0135881bfbfe7c1b2e714d2d7bfcad763e7a",
      "tree": "75d93138bcd5edda99a7662d8d6d44272c0ff04b",
      "parents": [
        "f92e59d43c59af6965d8f03160e4fd596d6ef7be"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@vmware.com",
        "time": "Fri Oct 02 21:00:05 2020 -0500"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Mon Oct 05 18:23:58 2020 -0500"
      },
      "message": "Update pgx to v4.9.0 and disable statement caching\n\npgx v4.9.0 exposes a channel that can be used to tell when a query\ncanceled via golang\u0027s context is finished in postgres. This is useful\nfor cleanup when a program has been interrupted and need to cancel\nblocked queries.  Disabled pgx\u0027s automatic statement caching because it\ncauses invalid caching in GPDB4 when creating, destroying, and creating\nthe same object again on the same connection.\n\nAuthored-by: Kevin Yeap \u003ckyeap@vmware.com\u003e\n"
    },
    {
      "commit": "f92e59d43c59af6965d8f03160e4fd596d6ef7be",
      "tree": "ab933d5dda7f014427c06089b10039efede7cf04",
      "parents": [
        "0442c3020f189cbb10f7a71a9c36ba7c5df81893"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@vmware.com",
        "time": "Tue Aug 18 15:25:48 2020 -0500"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-vmware@users.noreply.github.com",
        "time": "Thu Sep 03 19:06:38 2020 -0500"
      },
      "message": "Update pgx to v4.8.1\n\nThe previous pgx version v3.6.2 has a bug. When initializing postgres\nconnections pgx does not check to see if host begins with a slash \u0027/\u0027.\nThis is important because host can either be hostname or a directory\ncontaining the connection socket. Latest pgx version contains the fix to\nthis issue.\n(https://www.postgresql.org/docs/8.4/libpq-connect.html)\n\nAuthored-by: Kevin Yeap \u003ckyeap@vmware.com\u003e\n"
    },
    {
      "commit": "0442c3020f189cbb10f7a71a9c36ba7c5df81893",
      "tree": "e9397fe0d639df229548578533319ee3957e40c1",
      "parents": [
        "b955fb7f9ec008ede2c6e81f31c4224978a9da64"
      ],
      "author": {
        "name": "Kris Macoskey",
        "email": "kmacoskey@gmail.com",
        "time": "Mon Aug 17 10:26:58 2020 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 10:26:58 2020 -0600"
      },
      "message": "Update NOTICE for VMware"
    },
    {
      "commit": "b955fb7f9ec008ede2c6e81f31c4224978a9da64",
      "tree": "9ca9d1ba4c158b335c54246a199c5a17276d31ee",
      "parents": [
        "1a4969cbabb6e2f16bb2db542deccbee9965d33c"
      ],
      "author": {
        "name": "Lav Jain",
        "email": "ljain@pivotal.io",
        "time": "Thu Apr 02 11:54:03 2020 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 11:54:03 2020 -0700"
      },
      "message": "Update dependencies to the latest version (#57)\n\n"
    },
    {
      "commit": "1a4969cbabb6e2f16bb2db542deccbee9965d33c",
      "tree": "60d867fbd92e8097290d8991436eb7a1f9e1f4b2",
      "parents": [
        "1f793c56cc19245e971e59b5bce42a4a1cfc28fe"
      ],
      "author": {
        "name": "Oliver Albertini",
        "email": "oalbertini@pivotal.io",
        "time": "Sat Mar 07 19:26:35 2020 -0800"
      },
      "committer": {
        "name": "Oliver Albertini",
        "email": "oalbertini@pivotal.io",
        "time": "Sun Mar 08 19:36:36 2020 -0700"
      },
      "message": "cluster: obey cluster.EXCLUDE_MIRRORS scope\n\nFor contentID-based commands, including mirrors doesn\u0027t have much\nsignificance since the content ID is the same for mirror/primary.  For\nhost-based commands, the mirror/primary will be on different hosts.\nIn particular the standby master may be on its own host with no segments\nco-located.\n\nThis commit allows exclusion of the standby master host when the scope\nbitmask contains cluster.EXCLUDE_MIRRORS (the default) and there are no\nsegments co-located on the standby master host.\n\nAuthored-by: Oliver Albertini \u003coalbertini@pivotal.io\u003e\n"
    },
    {
      "commit": "1f793c56cc19245e971e59b5bce42a4a1cfc28fe",
      "tree": "e991af36dd375065fb154f63aee57bd4a8537c87",
      "parents": [
        "7b377a72df797037a06cc86af364684b49b6f9ab"
      ],
      "author": {
        "name": "Oliver Albertini",
        "email": "oalbertini@pivotal.io",
        "time": "Fri Mar 06 12:25:42 2020 -0800"
      },
      "committer": {
        "name": "Oliver Albertini",
        "email": "oalbertini@pivotal.io",
        "time": "Fri Mar 06 12:25:42 2020 -0800"
      },
      "message": "cluster: Prevent panic when executing commands\n\nThe cluster.Executor should be set when newing up a cluster object.\n\nAuthored-by: Oliver Albertini \u003coalbertini@pivotal.io\u003e\n"
    },
    {
      "commit": "7b377a72df797037a06cc86af364684b49b6f9ab",
      "tree": "e1b45bbdc70903144df9e5c1a80cea42e988981a",
      "parents": [
        "bfc1672bbd10bd62dc453b11d5750a0cf86a4efc"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Wed May 08 15:26:33 2019 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Feb 21 09:24:56 2020 -0800"
      },
      "message": "cluster: Support mirrors, make scopes bitmasks\n\nThis commit modifies Cluster to be able to hold mirror information.  While most\nutilities only care about primaries, some utilities need access to mirror\ninformation to e.g. copy files to mirror hosts or bring up mirror processes.\n\nTo support this, the following changes are made in this commit:\n\n1) The ByContent map in Cluster now maps a content ID to a pair of segments, in\nthe format [primary, mirror].  The by-content accessor functions now take an\noptional role argument (\"p\" or \"m\") to specify which dbid/host/port/directory a\ncaller wants; they all return primary information by default, to match existing\nbehavior.\n\n2) GetSegmentConfiguration now takes an optional boolean to retrieve mirror\nconfiguration in addition to primary configuration.  Again, by default it only\nretrieves primary configuration to maintain behavior.\n\n3) Because adding scopes for executing commands on mirrors (ON_MIRROR_HOSTS,\nON_MIRROR_HOSTS_AND_MASTER, etc.) would double the number of scope constants and\nlead to very unwieldy names, explicit variables for every combination of scopes\nhave been replaced by \"base\" constants for each possible toggle (segments or\nhosts, on master or remote, with or without master, with or without mirrors)\nwhich can be bitwise-OR\u0027d together to obtain a final desired scope.  This will\nalso make it easier to add further scopes, if that ever becomes necessary.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "bfc1672bbd10bd62dc453b11d5750a0cf86a4efc",
      "tree": "dce285053514e85bac58e878a433be8de68fad77",
      "parents": [
        "974a164cfd33a97f9d7b069bc1d9ec4147c177c9"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Mon Mar 04 23:23:17 2019 -0800"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Feb 21 09:24:56 2020 -0800"
      },
      "message": "cluster: Refactor per-host command execution\n\nPreviously, per-host command execution was essentially a wrapper around\nper-segment execution.  This was problematic for several reasons:\n\n* Treating a set of per-host commands as a set of per-segment commands against\n  an arbitrary subset of the segments in the cluster is hackish at best, and\n  requires a level of indirection when generating per-host commands (taking the\n  host you want, figuring out its content ID, and then passing that in to the\n  generator which can then interpolate the hostname, instead of simply passing\n  in a hostname directly).\n\n* Adding new scopes has made it unsustainable to treat everything like a set of\n  per-segment commands and switch on a bunch of toggles to get the desired end\n  behavior.\n\nThis commit thus does the following:\n\n1) Modify the way a Cluster object stores segments.  Instead of a single map\n   from content to segment, a Cluster now contains a list of segments and two\n   maps into that list, one keyed on content, one keyed on hostname.  The maps\n   use pointers so that changes to a segment in the list or either map will be\n   reflected in the other locations, and so that storage space is minimized in\n   case that would become an issue when storing clusters with many nodes.\n\n2) Modify the way commands and the outputs of commands are stored.  A new\n   ShellCommand encapsulates the necessary information about a command and its\n   output; the same struct can be used for either per-host or per-segment\n   execution, and the appropriate functions will do so intelligently.  The\n   RemoteOutput struct now contains a list of ShellCommands, each with its own\n   output, rather than separately mapping stdout, stderr, and errors for all\n   commands together.\n\n3) Modify the way commands are generated.  Functions passed as arguments to\n   command-generation functions now accept either an int (for per-segment\n   commands, to be interpolated with a content ID) or a string (for per-host\n   commands, to be interpolated with a hostname), as appropriate for the scope\n   of that command.  This allows all of the switch(scope) statements to be\n   replaced with more generalized logic.\n\n4) Add appropriate helper functions.  Since the Cluster now contains a\n   host-to-segment map, Get[Foo]ForHost functions are added, and several\n   functions for checking scope are added as well.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "974a164cfd33a97f9d7b069bc1d9ec4147c177c9",
      "tree": "b98db1e71fcf4cce899b504b9428d847e73a67eb",
      "parents": [
        "5a59b262039fc09f51c69afef5aed475bd0f35a9"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Wed Feb 19 11:15:44 2020 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-pivotal@users.noreply.github.com",
        "time": "Wed Feb 19 16:07:34 2020 -0800"
      },
      "message": "Fix catalog version query on dbconn initialization\n\nDatabase connection version intialization will fail to return the\ncatalog version if other schemas containing a `version()` function is\nreferenced first in the search path. Fully qualify the version function\ncall to ensure pg_catalog\u0027s version is returned.\n\nAuthored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\n"
    },
    {
      "commit": "5a59b262039fc09f51c69afef5aed475bd0f35a9",
      "tree": "a0ccf1814742b5ed9b61d0ded68e0bf1ae88bd70",
      "parents": [
        "fdbcf7e9e47c3c764ec57d8ee9f66a80073198b8"
      ],
      "author": {
        "name": "Wang Hao",
        "email": "haowang@pivotal.io",
        "time": "Thu Jan 09 14:03:16 2020 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 09 14:03:16 2020 +0800"
      },
      "message": "Add Conv utility functions (#52)\n\nThis commit provides utility functions for converting golang data types with high performance. These functions pursuit maximum performance for building data-intensive applications. See README and tests for more details.\r\n"
    },
    {
      "commit": "fdbcf7e9e47c3c764ec57d8ee9f66a80073198b8",
      "tree": "ea04e746fd90482695e2075292ca6035dc5183db",
      "parents": [
        "b92aee6435b153358b6141edd452d0fe79a02386"
      ],
      "author": {
        "name": "Wang Hao",
        "email": "haowang@pivotal.io",
        "time": "Thu Jan 09 13:44:40 2020 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 09 13:44:40 2020 +0800"
      },
      "message": "Migrate to go mod and golangci-lint (#51)\n\nReviewed-by: Ru Yang \u003cruyang@pivotal.io\u003e\r\nReviewed-by: David Sharp \u003cdsharp@pivotal.io\u003e"
    },
    {
      "commit": "b92aee6435b153358b6141edd452d0fe79a02386",
      "tree": "ad00a9c95a570451ad8903b8935f7de9b9a96623",
      "parents": [
        "2693d62bd70016cc5e85b123769c771ac84ba8a6"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Fri Dec 13 17:11:40 2019 -0800"
      },
      "committer": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Fri Dec 13 17:11:40 2019 -0800"
      },
      "message": "structmatcher: Fallback on Equal() for opaque structures\n\nThe reflect package will not allow calling Interface() on unexported\nfields within a structure. So to continue comparing these structures,\ninstead call Equal() on any structure containing a field on which we\ncannot call Interface().\n\nAuthored-by: David Sharp \u003cdsharp@pivotal.io\u003e\n"
    },
    {
      "commit": "2693d62bd70016cc5e85b123769c771ac84ba8a6",
      "tree": "922c312c09b66bf77dcabee861cd01e5123a2982",
      "parents": [
        "b7ebed7ebd0f38d06cd5f5dc3e9d9db2cb5e597d"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Wed Nov 13 14:33:51 2019 -0800"
      },
      "committer": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Mon Dec 09 16:56:38 2019 -0800"
      },
      "message": "structmatcher: Add full field path to error message (e.g. Foo.Bar[1].Baz)\n\nCo-authored-by: David Sharp \u003cdsharp@pivotal.io\u003e\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "b7ebed7ebd0f38d06cd5f5dc3e9d9db2cb5e597d",
      "tree": "39e2d082aa98d50990b9c03d91ed406b3cf2586f",
      "parents": [
        "f95d3159bf3ad039be5411079f08fa26791e3011"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Wed Nov 13 14:13:05 2019 -0800"
      },
      "committer": {
        "name": "Jason Vigil",
        "email": "jvigil@pivotal.io",
        "time": "Mon Dec 09 16:44:30 2019 -0800"
      },
      "message": "structmatcher: Recurse into nested structs\n\nCo-authored-by: David Sharp \u003cdsharp@pivotal.io\u003e\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "f95d3159bf3ad039be5411079f08fa26791e3011",
      "tree": "da8fef4f31599a18cb059750b6aa83fba0563646",
      "parents": [
        "7aa15b49c33a90443fee7ac07e448869b2a38942"
      ],
      "author": {
        "name": "Ed Espino",
        "email": "eespino@pivotal.io",
        "time": "Mon Dec 02 12:23:38 2019 -0800"
      },
      "committer": {
        "name": "Ed Espino",
        "email": "eespino@pivotal.io",
        "time": "Mon Dec 02 12:23:38 2019 -0800"
      },
      "message": "Fix gofmt detectecd error.\n"
    },
    {
      "commit": "7aa15b49c33a90443fee7ac07e448869b2a38942",
      "tree": "80ec09c816d3049523b722ae98f6a1a3da7d34a4",
      "parents": [
        "7f408d257e14cc8eefdfc111deea7cd930e29c17"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Wed Nov 13 12:06:41 2019 -0800"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Wed Nov 13 12:06:41 2019 -0800"
      },
      "message": "structmatcher: Mark ExpectStructsToMatch...() as Deprecated\n\n[#169584624]\n\nCo-authored-by: David Sharp \u003cdsharp@pivotal.io\u003e\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "7f408d257e14cc8eefdfc111deea7cd930e29c17",
      "tree": "581a06aec50614b6225a45d009f19dbe7aa0d56e",
      "parents": [
        "39fae54f0b400719275e6c5ae58d0499e6e217d8"
      ],
      "author": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Thu Nov 07 14:19:48 2019 -0800"
      },
      "committer": {
        "name": "David Sharp",
        "email": "dsharp@pivotal.io",
        "time": "Wed Nov 13 12:06:17 2019 -0800"
      },
      "message": "structmatcher: Add a GomegaMatcher\n\nAuthored-by: David Sharp \u003cdsharp@pivotal.io\u003e\n"
    },
    {
      "commit": "39fae54f0b400719275e6c5ae58d0499e6e217d8",
      "tree": "0f6638113f21cc95cf1225234604682514540446",
      "parents": [
        "f202136a631cec22471807320592b76b2aa3c127"
      ],
      "author": {
        "name": "Jimmy Yih",
        "email": "jyih@pivotal.io",
        "time": "Mon Oct 07 15:14:36 2019 -0700"
      },
      "committer": {
        "name": "Jimmy Yih",
        "email": "jyih@pivotal.io",
        "time": "Fri Oct 11 12:29:57 2019 -0700"
      },
      "message": "Add DBConn.ExecContext\n\nContext allows queries to be cancelled. This can be used when we\nexpect a SIGINT/SIGTERM could occur during a query that could block\n(e.g. trying to SELECT from a table but some other session explicitly\ngrabbed an AccessExclusiveLock and will not be giving it up anytime\nsoon). Without the ability to cancel queries, exiting Go programs\ncould lead to SQL session leaks. Simply closing the SQL connection\nDOES NOT cancel the query for you.\n"
    },
    {
      "commit": "f202136a631cec22471807320592b76b2aa3c127",
      "tree": "87f94abe0ef485ad684279f1a6b0ed19c569b733",
      "parents": [
        "c535ba3a6e07217feb463f1c6152c934f65f1f36"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Thu Sep 19 12:17:55 2019 -0700"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-pivotal@users.noreply.github.com",
        "time": "Mon Sep 23 15:29:37 2019 -0700"
      },
      "message": "Point go-sqlmock dependency to github repo\n\nWARNING: This is a breaking change. If your project uses this library as\na dependency there is a good chance this change will affect your\nproject.  There are functions in testhelper whose inputs are\ngo-sqlmock.v1 objects.  This would result in your project trying to pass\na go-sqlmock.v1 object into a function that requires a go-sqlmock object\n\nThis is a workaround for an issue the gopkg.in repo is causing with go\nmodules.\n\nAuthored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\n"
    },
    {
      "commit": "c535ba3a6e07217feb463f1c6152c934f65f1f36",
      "tree": "6eb9d0ead9efcc3f9be321ee14e1aa54f823bbfe",
      "parents": [
        "0a52505c069c837670f37306658ce68e60239324"
      ],
      "author": {
        "name": "Jialun",
        "email": "jdu@pivotal.io",
        "time": "Fri May 24 10:04:13 2019 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 24 10:04:13 2019 +0800"
      },
      "message": "Add two features in gplog (#43)\n\n* Add two features in gplog\r\n\r\n- A new function FatalWithoutPanic, same as Fatal but will not\r\n  panic and will exit(1)\r\n- Enable user to customize the log file name\r\n\r\n* Add comment and change FatalWithoutPanic errorCode to 2.\r\n\r\n* Add test cases \u0026 FatalWithoutPanic can mock exit function\r\n"
    },
    {
      "commit": "0a52505c069c837670f37306658ce68e60239324",
      "tree": "c98d99415f6f140ae031a6ede2a165638790b322",
      "parents": [
        "af9b9ccfb5023361967a789a306fedc1cc02055f"
      ],
      "author": {
        "name": "Larry Hamel",
        "email": "lhamel@pivotal.io",
        "time": "Mon Apr 29 13:32:41 2019 -0700"
      },
      "committer": {
        "name": "Larry Hamel",
        "email": "larhamel+github@gmail.com",
        "time": "Mon Apr 29 15:25:29 2019 -0700"
      },
      "message": "Close file after reading\n\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Larry Hamel \u003clhamel@pivotal.io\u003e\n"
    },
    {
      "commit": "af9b9ccfb5023361967a789a306fedc1cc02055f",
      "tree": "2faef1b2f789c748e2c58e3b987dcd07b66c88b7",
      "parents": [
        "aca9c3dc9103695d2b991c80eca40c1aeb67c38a"
      ],
      "author": {
        "name": "Larry Hamel",
        "email": "lhamel@pivotal.io",
        "time": "Fri Apr 19 10:18:49 2019 -0700"
      },
      "committer": {
        "name": "Larry Hamel",
        "email": "larhamel+github@gmail.com",
        "time": "Fri Apr 19 13:42:28 2019 -0700"
      },
      "message": "OpenFileForWriting(): add flag to truncate any existing content\n\n* Callers of OpenFileForWriting() expect to overwrite any existing content, so add the os.O_TRUNC flag. Otherwise, if an existing file is opened with existing content, the caller will find that the any original content that was *longer* than newly written content will be left behind.\n\nAuthored-by: Larry Hamel \u003clhamel@pivotal.io\u003e\n"
    },
    {
      "commit": "aca9c3dc9103695d2b991c80eca40c1aeb67c38a",
      "tree": "b389b529279c2171e573a0706a8e59118079f211",
      "parents": [
        "afc498a415c4e67b08b3bd26fbaeef8e52f239a0"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Apr 12 14:46:32 2019 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Apr 19 10:53:07 2019 -0700"
      },
      "message": "Add the ability to set logfile verbosity in gplog\n\nTo enable utilities using gplog to modify the verbosity of messages going to the\nlog file, this commit splits the verbosity field in Logger into shellVerbosity\nand fileVerbosity, and functions have been added and modified to take advantage\nof it.\n\nHowever, this commit does not modify InitializeLogging to enable specifying the\nlogfile verbosity and makes logfile verbosity an optional argument to NewLogger,\nas the initial reasons for wanting the logfile to default to LOGDEBUG still\napply (namely, that it is important to log messages even if the user wants to\nsuppress terminal output so that re-running utilities on error for better log\noutput is not necessary) and leaving the logfile verbosity at LOGDEBUG instead\nof simply setting both shell and logfile verbosity to the same level should be\ndiscouraged.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "afc498a415c4e67b08b3bd26fbaeef8e52f239a0",
      "tree": "a7e6015a0b7e84f6282e74c0ceee4ad3e2a335c0",
      "parents": [
        "23ae09d7e42505a58bc7ea22c03f7b59c664bcf7"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Tue Mar 05 18:11:03 2019 -0800"
      },
      "committer": {
        "name": "Trevor Yacovone",
        "email": "38438025+tyacovone@users.noreply.github.com",
        "time": "Fri Mar 08 11:14:20 2019 -0800"
      },
      "message": "Update CheckClusterError to handle new scopes\n\nAuthored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nAuthored-by: Trevor Yacovone \u003ctyacovone@pivotal.io\u003e\n"
    },
    {
      "commit": "23ae09d7e42505a58bc7ea22c03f7b59c664bcf7",
      "tree": "3daff0c2ea9b6a0714bbafa6b62750760c53d86f",
      "parents": [
        "a87b557106c30e5b25bf434cd10d5115f3fa471b"
      ],
      "author": {
        "name": "Trevor Yacovone",
        "email": "tyacovone@pivotal.io",
        "time": "Thu Mar 07 00:53:48 2019 +0000"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Thu Mar 07 00:53:48 2019 +0000"
      },
      "message": "Add TempFile system function pointer\n\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Trevor Yacovone \u003ctyacovone@pivotal.io\u003e\n"
    },
    {
      "commit": "a87b557106c30e5b25bf434cd10d5115f3fa471b",
      "tree": "5f7e221edffd60548236705867e7c9993d6d5080",
      "parents": [
        "4f37a6ab3aaa9058fa80c8227737657c98356e36"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Mon Mar 04 10:45:40 2019 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-pivotal@users.noreply.github.com",
        "time": "Tue Mar 05 11:09:14 2019 -0800"
      },
      "message": "Add function to run local commands pertaining to segments\n\nWhile we have a way to generate ssh commands to run commands on remote\nhosts, we do not have a way to run local commands pertaining to hosts. A\ngood example of how this could be used is if we needed to copy a file\nfrom master to all segments\n\nAuthored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\n"
    },
    {
      "commit": "4f37a6ab3aaa9058fa80c8227737657c98356e36",
      "tree": "794e57a747c595e55f0b39f62d7ac53880d622df",
      "parents": [
        "4580a3f68ffe89bcd3ed5ff87ba27d3df6d47bd3"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Mon Mar 04 11:48:08 2019 -0800"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-pivotal@users.noreply.github.com",
        "time": "Tue Mar 05 09:36:00 2019 -0800"
      },
      "message": "Update GenerateSSHCommandMapForSegments tests to match description\n\nAuthored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\n"
    },
    {
      "commit": "4580a3f68ffe89bcd3ed5ff87ba27d3df6d47bd3",
      "tree": "32fd2d0d8f7aff6a94df0589899c70dddb377f33",
      "parents": [
        "dc5314443bdb1cf8187e69bec712349a69d6918e"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Thu Feb 28 17:35:35 2019 +0000"
      },
      "committer": {
        "name": "Kevin Yeap",
        "email": "36176870+kyeap-pivotal@users.noreply.github.com",
        "time": "Fri Mar 01 10:08:35 2019 -0800"
      },
      "message": "Add Remove system function pointer\n\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Trevor Yacovone \u003ctyacovone@pivotal.io\u003e\n"
    },
    {
      "commit": "dc5314443bdb1cf8187e69bec712349a69d6918e",
      "tree": "c866092d2b95d377e7b63435860565b24311f85a",
      "parents": [
        "459655a5c915e633b3a15987ae469ab64b3405a4"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Wed Feb 06 12:18:17 2019 -0800"
      },
      "committer": {
        "name": "Trevor Yacovone",
        "email": "tyacovone@pivotal.io",
        "time": "Wed Feb 06 12:18:17 2019 -0800"
      },
      "message": "Update LICENSE and NOTICE files\n\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Trevor Yacovone \u003ctyacovone@pivotal.io\u003e\n"
    },
    {
      "commit": "459655a5c915e633b3a15987ae469ab64b3405a4",
      "tree": "f269838a29339e5ca98f838d616c09a96ea51e3a",
      "parents": [
        "e3e578d3260ecfcf64773bf793d6a04cf127776f"
      ],
      "author": {
        "name": "Adam Lee",
        "email": "ali@pivotal.io",
        "time": "Mon Oct 15 16:09:47 2018 +0800"
      },
      "committer": {
        "name": "Adam Lee",
        "email": "adam8157@gmail.com",
        "time": "Tue Oct 16 09:14:36 2018 +0800"
      },
      "message": "Log host and port info in dbconn errors\n\nIt\u0027s useful to spot the error when trying to connect multiple clusters\nat the same time.\n"
    },
    {
      "commit": "e3e578d3260ecfcf64773bf793d6a04cf127776f",
      "tree": "74e128190885606804272fe84abb748356867d03",
      "parents": [
        "a4c1451bfc1915756bd22dc1fc0632c9b5b7d367"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Wed Oct 03 14:55:32 2018 -0700"
      },
      "committer": {
        "name": "Nadeem Ghani",
        "email": "ghani_nadeem@yahoo.com",
        "time": "Thu Oct 04 12:21:53 2018 -0700"
      },
      "message": "Fix dbconn to properly handle database names with special characters\n\nIn commit 7b9de4e07bbf939f16877a9e7cc5c32bb5f82c46, we switched from\nusing libpq to pgx. This involved using a different format of the\nconnection string that does not require escaping the database or\nuser.\n\nAdditionally, remove the EscapeConnectionParam function since it is\nerror-prone and unused in the gpdb repos as far as I can tell.\n\nCo-authored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\n"
    },
    {
      "commit": "a4c1451bfc1915756bd22dc1fc0632c9b5b7d367",
      "tree": "76dde4454f863ef7ac58244fce596bc7e78800ac",
      "parents": [
        "4e4542430302c7f243701ebea15a888520643260"
      ],
      "author": {
        "name": "Kevin Yeap",
        "email": "kyeap@pivotal.io",
        "time": "Wed Sep 26 10:25:50 2018 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Wed Sep 26 10:25:50 2018 -0700"
      },
      "message": "Fix linting error\n\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "4e4542430302c7f243701ebea15a888520643260",
      "tree": "6fc6e171cdbfd234bac799fd7c15c070a12214e1",
      "parents": [
        "6ae0bc3408913019c4d3520f761858a4ef6c6979"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Tue Sep 25 11:02:33 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Tue Sep 25 11:03:02 2018 -0700"
      },
      "message": "Fix Fatal to not print same error message twice\n\nPreviously Fatal messages with verbose mode would print error messages\ntwice.\n\nThis effectively reverts commit\n2c6adb05fb43d30fc468a9da61c9dc09be14f124, but does not filter the stack\ntrace.\n\nCo-authored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\nCo-authored-by: Kevin Yeap \u003ckyeap@pivotal.io\u003e\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "6ae0bc3408913019c4d3520f761858a4ef6c6979",
      "tree": "f0249f2cceca213a9887318811761178bd116bf5",
      "parents": [
        "d77bf5c27646a07c35b4e7b9774297fe8702afbc"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Tue Aug 21 11:50:56 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Tue Aug 21 12:54:34 2018 -0700"
      },
      "message": "Add Query and QueryWithArgs functions\n\nThese two functions provide transaction-aware wrappers for sqlx.Queryx, to allow\nretrieving sqlx.Rows directly when necessary, and updates SelecStringSlice to\nuse them.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "d77bf5c27646a07c35b4e7b9774297fe8702afbc",
      "tree": "799d73b623c4ed55ac3df4375b3f508f0e53d5a3",
      "parents": [
        "2c6adb05fb43d30fc468a9da61c9dc09be14f124"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Aug 17 12:20:52 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Mon Aug 20 16:34:10 2018 -0700"
      },
      "message": "Improve GPDB version handling in dbconn\n\nPreviously, after connecting to GPDB with DBConn.Connect, a separate call to\nDBConn.Version.Initialize(DBConn) was required to retrieve and set the version.\nThe original reasons for requiring a separate step to get the version no longer\napply, and having to make an extra call every time is irritating, so this commit\nmodifies DBConn.Connect to retrieve and set the version automatically.\n\nIt also adds a few new helper functions:\n\n- dbconn.NewDBVersion, for creating sample GPDBVersions in tests.\n- testhelper.CreateMockDBConn, for when you want to create a connection but\n  don\u0027t want to connect yet.\n- testhelper.ExpectVersionQuery, for setting a database version for a function\n  that will Connect to a mock database with a DBConn.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "2c6adb05fb43d30fc468a9da61c9dc09be14f124",
      "tree": "e1c96294ffdb76dba1c557829035af1fd81a6679",
      "parents": [
        "168dd9c8bfe5cacf98c6cc48b0058a315978161e"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Thu Aug 02 09:50:50 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Tue Aug 07 10:16:27 2018 -0700"
      },
      "message": "Remove filtering from stack trace\n\nPreviously, we filtered out lines of the stack trace that are not\nrelated to the codebase. However, we should not ever have any doubt that\nrelevant or important information may have been filtered out.\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "168dd9c8bfe5cacf98c6cc48b0058a315978161e",
      "tree": "e46718f7b90f4ff26dfd66c1dd80df1fbbf25161",
      "parents": [
        "bcd40cae9af9f3c6829b61fe78e56d1cd0080b5e"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Wed Jul 18 15:53:17 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Mon Jul 23 17:02:35 2018 -0700"
      },
      "message": "Improve SelectString and SelectStringSlice\n\nPreviously, these two functions used a generic struct with a \"String\" field to\nexecute the provided query with sqlx.Select.  This required any queries passed\nto them to be of the form \"SELECT [field] AS string\" so that the results would\nmatch the struct, and any fields that could not be aliased that way (such as\nselecting GUCs with \"SHOW [name]\") could not be selected with these functions.\n\nThis commit modifies the functions to execute the query with Queryx instead of\nSelect, then scans in values from the underlying sql.Rows into sql.NullStrings,\nwhich removes the need to alias fields in queries and allows for selecting GUCs\nand NULL values with these functions.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "bcd40cae9af9f3c6829b61fe78e56d1cd0080b5e",
      "tree": "658a895bc0e42f8f9d911d5d34f0a962a2f5d256",
      "parents": [
        "b0813d635a7c7cbbc79fe0d6644dc93999792ed7"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Sun Jul 15 21:02:05 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Mon Jul 16 09:16:03 2018 -0700"
      },
      "message": "Update dependencies\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "b0813d635a7c7cbbc79fe0d6644dc93999792ed7",
      "tree": "d7448e89e698a996fb1add6ada1dcc0facbcbde3",
      "parents": [
        "a7607ee6ff3cc7f300061f883f7eba6a894ac07a"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Sun Jul 15 20:57:58 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Mon Jul 16 09:16:03 2018 -0700"
      },
      "message": "Add -keepGoing flag to tests to ensure all tests run even in case of failure\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "a7607ee6ff3cc7f300061f883f7eba6a894ac07a",
      "tree": "803a3b49f8315999603d92ad99c18c78e67693bf",
      "parents": [
        "22094fda72d894cd61d5db7b989b3ff6c812a0f8"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Sun Jul 15 20:57:00 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Mon Jul 16 09:16:03 2018 -0700"
      },
      "message": "Use latest released version of `dep` instead of HEAD\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "22094fda72d894cd61d5db7b989b3ff6c812a0f8",
      "tree": "ef337d6434e335034c7187630de2719b2c238f85",
      "parents": [
        "7b9de4e07bbf939f16877a9e7cc5c32bb5f82c46"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Sun Jul 15 20:53:41 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Mon Jul 16 09:14:37 2018 -0700"
      },
      "message": "Remove build target from makefile\n\nThere is no build target, so `make` should not attempt to execute that\ntarget.\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "7b9de4e07bbf939f16877a9e7cc5c32bb5f82c46",
      "tree": "f41dbcc98b39b23b243699af969932e709ba5482",
      "parents": [
        "a51003cc3ea7222978cb52aaab8232f8fffb5c27"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Thu Jul 12 16:27:21 2018 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Fri Jul 13 11:31:27 2018 -0700"
      },
      "message": "Use pgx postgres driver instead of pq\n\npq had an issue with character encoding for Thai characters, but pgx does\nnot seem to have the same issue. Performance seems to be the same and\nthe amount of code we need to change is very minimal.\n\nAuthored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "a51003cc3ea7222978cb52aaab8232f8fffb5c27",
      "tree": "8f22cf38bd71756f068c2165e4a832fea996aa06",
      "parents": [
        "d278d13f83f762fada9f9044d2b7527d02133891"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Jun 29 14:20:53 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri Jun 29 16:44:51 2018 -0700"
      },
      "message": "Add LocalOutput to TestExecutor\n\nCo-authored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\nCo-authored-by: Nadeem Ghani \u003cnghani@pivotal.io\u003e\n"
    },
    {
      "commit": "d278d13f83f762fada9f9044d2b7527d02133891",
      "tree": "f2091c6aeb4be27b088a81aab17143f94c2afafc",
      "parents": [
        "da96f869c4d2d4903b1f7428607227b0f6d15990"
      ],
      "author": {
        "name": "Jim Doty",
        "email": "jdoty@pivotal.io",
        "time": "Tue Jun 19 18:01:43 2018 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 19 18:01:43 2018 -0600"
      },
      "message": "Update README after concourse domain change"
    },
    {
      "commit": "da96f869c4d2d4903b1f7428607227b0f6d15990",
      "tree": "fdd2ec1ed975d15eb690081bb76f8201d338f72e",
      "parents": [
        "e1ff11c5bc81a9412a4cf9484e0131c781fa031e"
      ],
      "author": {
        "name": "Jim Doty",
        "email": "jdoty@pivotal.io",
        "time": "Fri Jun 15 11:47:31 2018 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 15 11:47:31 2018 -0600"
      },
      "message": "Update README.md\n\nPipeline hosting location changed."
    },
    {
      "commit": "e1ff11c5bc81a9412a4cf9484e0131c781fa031e",
      "tree": "202d8885a18c474729ac25f1034529f167c71603",
      "parents": [
        "b8292cc5bc422661e0e5d58c33a79333a66247b4"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Mon Jun 04 17:30:07 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Thu Jun 07 15:01:01 2018 -0700"
      },
      "message": "Update cluster to include dbid and port\n\nThis commit adds extra fields to cluster.Cluster and updates the query in\nGetSegmentConfiguration to retrieve that information.  It also modifies the\nstructure of Cluster and its accessor functions to make it easier to add more\nfields in the future if they\u0027re needed by any utilities.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "b8292cc5bc422661e0e5d58c33a79333a66247b4",
      "tree": "aec0fe80e6ea22743f69a86aa63131adafb48d8b",
      "parents": [
        "53587d89a34e6270573b27f0ab0cb792f7ef4d16"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Tue May 29 15:10:28 2018 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Tue Jun 05 14:43:56 2018 -0700"
      },
      "message": "Update dependencies\n\nWe can finally use the new release of Ginkgo rather than using the\nmaster branch.\n\nAuthored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\n"
    },
    {
      "commit": "53587d89a34e6270573b27f0ab0cb792f7ef4d16",
      "tree": "ea99fc98cf5afe15e2d959c80b940098e4d483df",
      "parents": [
        "26097cb0b6c1a5fd473bcea25dddffe2ad492b5a"
      ],
      "author": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Wed May 23 14:33:13 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Fri May 25 09:45:10 2018 -0700"
      },
      "message": "Add errcheck linter\n\nThis linter ensures that we check the error on functions that return an\nerror. This will help prevent bugs where we assume that a function such\nas Chmod or Open is successful, but forget to check that no error is\nreturned.\n\nIn cases where we do intentionally want to ignore the error, we will now\nneed to assign it to an empty identifier, such as _ \u003d os.Chmod().\n\nAuthored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "26097cb0b6c1a5fd473bcea25dddffe2ad492b5a",
      "tree": "53272c4f8a1c9492100700448912d6030b5612a3",
      "parents": [
        "febb6623eb95d4ebc306153cbb25ea594e17d5ef"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri May 04 14:21:00 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Wed May 16 15:49:06 2018 -0700"
      },
      "message": "Add iohelper package for file reading and writing\n\nThis commit adds a new \"iohelper\" package containing various helper functions\nthat make use of the OpenFileRead and OpenFileWrite functions in the operating\npackage, to simplify common file reading and writing operations.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "febb6623eb95d4ebc306153cbb25ea594e17d5ef",
      "tree": "e085073cad4c3c7656ff714ea62cf9f77ff45840",
      "parents": [
        "a12838729e161094ee8bf27f429a8ec6b1ebf710"
      ],
      "author": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Fri May 04 14:18:36 2018 -0700"
      },
      "committer": {
        "name": "Jamie McAtamney",
        "email": "jmcatamney@pivotal.io",
        "time": "Tue May 15 09:53:36 2018 -0700"
      },
      "message": "Modify GetSegmentConfiguration\n\nThis commit changes GetSegmentConfiguration to return an error instead of using\ngplog.FatalOnError, and adds a MustGetSegmentConfiguration function with the\nold behavior, to allow it to be called in places where a panic on error is not\ndesired.\n\nAuthored-by: Jamie McAtamney \u003cjmcatamney@pivotal.io\u003e\n"
    },
    {
      "commit": "a12838729e161094ee8bf27f429a8ec6b1ebf710",
      "tree": "a471d47e4f412398dc1e81f04259780e9ddb8075",
      "parents": [
        "f90a90e6bcbae015365f7db9db7f6cebad1fa3a5"
      ],
      "author": {
        "name": "Peifeng Qiu",
        "email": "pqiu@pivotal.io",
        "time": "Tue May 08 10:11:53 2018 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 08 10:11:53 2018 +0800"
      },
      "message": "Support custom prefix in gplog (#14)\n\nUse SetLogPrefixFunc() to set a custom prefix function. By default,\r\nthe prefix function is nil and gplog use default log prefix as\r\n\"timestamp header level\", which is the same as before."
    },
    {
      "commit": "f90a90e6bcbae015365f7db9db7f6cebad1fa3a5",
      "tree": "2ed7ea07191fa42a85dbff4b96e07245cb9bbc14",
      "parents": [
        "4e0db4e233bfdee1f2c8ba4dc7bd8ed22a0e7e63"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Tue Apr 24 10:30:09 2018 -0700"
      },
      "committer": {
        "name": "Chris Hajas",
        "email": "chajas@pivotal.io",
        "time": "Mon May 07 09:44:50 2018 -0700"
      },
      "message": "Vendor tools such as ginkgo and goimports\n\nThis will help us to have reproducible  builds as upstream linters and test frameworks change. Also, remove the \"go get\" for golint since it is vendored with\ngometalinter.\n\nCo-authored-by: Karen Huddleston \u003ckhuddleston@pivotal.io\u003e\nCo-authored-by: Chris Hajas \u003cchajas@pivotal.io\u003e\n"
    },
    {
      "commit": "4e0db4e233bfdee1f2c8ba4dc7bd8ed22a0e7e63",
      "tree": "60d70ba692a2e55b7e850428768526b8db2ce2fb",
      "parents": [
        "e418f5d7963021c20fd3713f93f3046764cc86a0"
      ],
      "author": {
        "name": "Peifeng Qiu",
        "email": "pqiu@pivotal.io",
        "time": "Thu Apr 26 10:08:37 2018 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 26 10:08:37 2018 +0800"
      },
      "message": "Add GetWithArgs and SelectWithArgs method to dbconn (#12)\n\nPassing query argument is supported in lib/pq like this\r\n\r\nq:\u003d `SELECT a from t WHERE b \u003d $1`\r\ndb.Query(q, arg1)\r\n\r\nAdd query argument support for Get and Select.\r\nOnly one varadic parameter is allowed for function, the whichConn\r\nparameters is hardcoded to 0.\r\n"
    },
    {
      "commit": "e418f5d7963021c20fd3713f93f3046764cc86a0",
      "tree": "c9bc7675a6a5b77c22a82a7d629c93e9d535f392",
      "parents": [
        "1172893e7cae78257eb7bba0e598e7da7f667efc"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@pivotal.io",
        "time": "Wed Apr 25 14:44:22 2018 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 25 14:44:22 2018 -0700"
      },
      "message": "Add pipeline location in README"
    }
  ],
  "next": "1172893e7cae78257eb7bba0e598e7da7f667efc"
}
