)]}'
{
  "log": [
    {
      "commit": "23a47485a6231a6bf67fee784e0da2b4b40098ec",
      "tree": "de45cc38994cf76a2a78925a8efa45903ca891d5",
      "parents": [
        "ce5aaa6d692571a2b4283dc992c1e908df84096c"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Jul 24 14:03:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 14:03:52 2026 +0800"
      },
      "message": "Add convenience package build workflow for cloudberry-backup (#108)\n\nIntroduce a manually-triggered GitHub Actions workflow that builds\nportable tar.gz packages for Apache cloudberry-backup from its\nofficial source release tarball, and tests them against Apache\nCloudberry built from its own official source release.\n\nKey design decisions:\n- cloudberry-backup binaries are built on Rocky 8 (glibc 2.28)\n  to maximise compatibility across Linux distributions.\n- Cloudberry is built per-platform from its source release\n  tarball (~8 min), avoiding dependence on pre-built Docker\n  images or external DEB/RPM repositories.\n- Build-and-test are fused into one job per platform: after\n  Cloudberry compiles, gpdemo spins up directly in the same\n  container, eliminating artifact packaging, transfer, and a\n  separate test job.\n- Only .sha512 checksums are generated; .asc signatures remain\n  a release manager local step."
    },
    {
      "commit": "ce5aaa6d692571a2b4283dc992c1e908df84096c",
      "tree": "61913e68458940539684cc2c5300f5c20e3704d9",
      "parents": [
        "509edb458da2a776e6db22c556fcd13f65f5beb4"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Wed Jul 15 18:36:45 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Jul 16 11:13:06 2026 +0800"
      },
      "message": "Bump dependencies to fix Dependabot alerts.\nBump golang.org/x/crypto to v0.52.0.\nBump golang.org/x/net  to v0.55.0.\nBump other dependencies.\n"
    },
    {
      "commit": "509edb458da2a776e6db22c556fcd13f65f5beb4",
      "tree": "8f3e5b2cba5b8e125b5b5593d09847ec4d5e348a",
      "parents": [
        "cffa009d52381db4af0331ca81fcf406b118ecd3"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Mon Jun 29 15:41:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 15:41:42 2026 +0800"
      },
      "message": "Bump Go from 1.24 to 1.25 (#99)\n\n* Bump Go from 1.24 to 1.25\n\n* Update go version in README.md\n\n* Upgrade go-libs to the latest\n\n* Fix unit end_to_end test\n\n* Fix deadlock e2e test transaction handling.\nThe test held locks with raw BEGIN/COMMIT SQL on DBConn and then reused the\nsame connection for polling. With pgx v5 this can release the raw transaction\nlock, so gpbackup was not blocked and the test observed 0 deadlock traps.\n\nUse explicit DBConn transactions, separate polling connections, wait for\ngoroutines before closing connections, and wait for the expected 2 blocked\nAccessExclusiveLock requests.\n\n* Fix pgx v5 PgError handling.\nAfter moving to pgx v5, database errors are returned as\npgx/v5/pgconn.PgError. The old jackc/pgconn type assertions no longer\nmatched, so backup lock handling could treat unexpected errors as\nlock-not-available, and restore COPY errors could lose their CONTEXT.\n\nUse errors.As with pgx/v5 pgconn in backup and restore code, update the\nrestore test, and remove the old pgconn dependency.\n\n* Fix lock e2e test transaction handling.\nThe deadlock and signal handler e2e tests still held locks with raw BEGIN/COMMIT SQL on DBConn and reused those connections for pg_locks polling.\nWith pgx v5 this can release the raw transaction lock or leave goroutines polling on closed connections, causing missing blocked-lock counts and DBConn.Get panics.\nUse explicit transactions, dedicated lock and polling connections, and synchronize goroutines before closing test connections.\n\n* Fix gp_segment_configuration lock e2e test.\n\nThe test intended to verify that gpbackup does not keep a lock on\npg_catalog.gp_segment_configuration after passing that metadata query and\nblocking later on pg_catalog.pg_trigger. However, the old test did not actually\nexercise that state: it used raw BEGIN/COMMIT SQL through DBConn, committed before gpbackup was started, queried pg_locks in an unsynchronized goroutine, and ignored query errors while scanning SELECT * into an int.\n\nUse an explicit DBConn transaction on a dedicated lock connection, start\ngpbackup while the pg_trigger lock is still held, wait until gpbackup is visibly\nblocked on pg_trigger, and then synchronously assert that no\ngp_segment_configuration locks remain. Finally release pg_trigger and verify\ngpbackup completes successfully.\n\n---------\n\nCo-authored-by: woblerr \u003cantkurochkin@gmail.com\u003e"
    },
    {
      "commit": "cffa009d52381db4af0331ca81fcf406b118ecd3",
      "tree": "2139b16403310466174ca6f081c0a8997a8f4cd0",
      "parents": [
        "deeb0946cb0d0ae2e42619c1bcf55f3607043b1c"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Jun 11 14:51:19 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Jun 12 09:06:50 2026 +0800"
      },
      "message": "NOTICE: add the original gpbackup NOTICE\n\nIn our 2.1.0-rc2 review round, Jean Baptiste Onofre suggested we can\ninclude the original gpbackup NOTICE file content to the NOTICE. I also\ncheck the ASF docs, and find that we should do as the suggestion.\n\nYou can see more details here:\n- https://lists.apache.org/thread/s3r9zmkt90cjnx8921mvmojw2zdfgh8k\n- https://infra.apache.org/licensing-howto.html#mod-notice\n"
    },
    {
      "commit": "deeb0946cb0d0ae2e42619c1bcf55f3607043b1c",
      "tree": "48f725d4e38f07e5b6d17773d06c78af953b6ae1",
      "parents": [
        "2f74ca93081484faf13457d484a8cca6489b9cae"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Jun 11 16:08:49 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Jun 11 22:29:55 2026 +0800"
      },
      "message": "CI: pin Cloudberry branch to `REL_2_STABLE`\n\nSwitch the CI Cloudberry checkout from `main` to `REL_2_STABLE branch`.\n\nCloudberry main has upgraded to the PG16 kernel, whose tightened role\ngrant permission checks (GRANT ... GRANTED BY now requires ADMIN OPTION)\nbreak multiple backup integration tests.  `REL_2_STABLE` still runs PG14\nand passes the full test suite without these failures.\n\nAdd a TODO to revert to main once Cloudberry 3.x stabilizes with PG16.\n\nSee: https://github.com/apache/cloudberry-backup/issues/103\n"
    },
    {
      "commit": "2f74ca93081484faf13457d484a8cca6489b9cae",
      "tree": "1aac49d0b2a22ed2423547c5b66e46c4c2e5a7f7",
      "parents": [
        "253159b7da96c927e2585a432c9d8e2d7a14395a"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri May 15 17:31:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 17:31:44 2026 +0800"
      },
      "message": "Package: extract install script generation to template file (#95)\n\nExtract install script generation from Makefile to a separate template\nfile for better maintainability and readability.\n\n- Add install.sh.template with Apache License header\n- Simplify Makefile package target using sed for template substitution"
    },
    {
      "commit": "253159b7da96c927e2585a432c9d8e2d7a14395a",
      "tree": "128ca8157cfc35bffa47caeaae2aa29795f0b802",
      "parents": [
        "7741382a40f0e77739b559075385fc34d311597a"
      ],
      "author": {
        "name": "Anton Kurochkin",
        "email": "45575813+woblerr@users.noreply.github.com",
        "time": "Tue May 12 08:33:06 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 13:33:06 2026 +0800"
      },
      "message": "Add gpbackup_exporter — a Prometheus exporter for gpbackup history database. (#87)\n\n* Port gpbackup_exporter to cloudberry-backup.\nIntroduce the Prometheus metrics exporter as a new standalone binary within the repository.\n\n- Create gpbackup_exporter.go entry point with CLI flags and collection loop.\n- Port core exporter logic to the new `exporter/` package.\n- Adapt type system to use `*history.BackupConfig` directly, aligning with the cloudberry-backup architecture.\n- Switch receiver methods to standalone gpbckpconfig helpers.\n- Add Prometheus and Kingpin dependencies to `go.mod`.\n- Update Makefile to support building, testing, and packaging.\n- Port unit tests to Ginkgo/Gomega.\n\n* Add end-to-end tests for gpbackup_exporter.\nAdd e2e test that runs  gpbackup commands and validates that gpbackup_exporter correctly reads history database and exposes metrics.\n\nAlso remove dead gpbackmanPath assignment from useOldBackupVersion in e2e tests.\nAnd suppress noisy test logger output by writing to bytes.Buffer instead of os.Stdout in exporter unit tests.\n\n* Add README for gpbackup_exporter.\n\n* Add additional tools section to README.\n\n* Add smoke tests for gpbackup_exporter in CI.\n\n* Fix smoke test for gpbackup_exporter in install target.\n\n* Graceful shutdown with  exit status 0.\nSIGINT means \"interrupt,\" signaling a user wants to stop the current operation. SIGTERM means \"terminate,\" requesting a polite program shutdown. So\u0027 it\u0027s correct to consider as graceful shutdown\n\n* Fix port in test.\n\n* Prevent panic and make exit.\nTo prevent a panic with an error like \"panic: http: invalid pattern\",  exit in case of an empty endpoint.\n\n* Remove unused getDataSuccessStatus and simplify GetGPBackupInfo.\n\nRemove unused getDataSuccessStatus.\n\nClarify include/exclude handling:\n* DB present in both dbInclude and dbExclude - warn and emit gpbackup_exporter_status\u003d0.\n* DB only in dbExclude - skip, emit no metrics.\n* dbInclude empty or DB in dbInclude -  process and emit full backup metrics.\n\nAdd unit tests.\n\n* Ensure command starts successfully in gpbackup_exporter end-to-end tests.\n\n* Update gpbackup_exporter_status metric description.\n\n* Fix expected error message in exporter test for missing history DB.\nThis aligns the test with the recent behavior change in commit 1035fb84.\n`OpenHistoryDB()` now fails fast on missing files during the open stage,\nrather than failing later during the first SQL query."
    },
    {
      "commit": "7741382a40f0e77739b559075385fc34d311597a",
      "tree": "544508d4c29fb22e224d281fa6767c96323b572d",
      "parents": [
        "f9e80483583e14fefad0bb467c95e72aed97bc44"
      ],
      "author": {
        "name": "chenqiang",
        "email": "chenqiang@hashdata.cn",
        "time": "Wed Apr 29 20:48:53 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 30 09:16:33 2026 +0800"
      },
      "message": "gpbackman: drop MASTER_DATA_DIRECTORY from history-db env-var fallback.\n\nCloudberry switched from MASTER_DATA_DIRECTORY to COORDINATOR_DATA_DIRECTORY\nstarting around release 1.5.4, and the standard environment scripts no\nlonger export the legacy variable. Maintaining a fallback for it in\ngpbackman just adds surface area (constants, help text, docs, tests) for\na value that should not exist in a current Cloudberry install.\n\nDrop MASTER_DATA_DIRECTORY entirely from the resolution chain, the flag\nhelp, the per-command long help strings, README/COMMANDS docs, and the\ncorresponding test cases. The flag description is shortened in root.go\nto match the concise wording already used in README. The lingering\n\"Cloudberry/Greenplum\" comment in constants.go is updated to \"Cloudberry\"\nin the same pass.\n\nResolution chain after this change:\n  explicit --history-db\n    -\u003e $COORDINATOR_DATA_DIRECTORY (only when --auto-load-history-db is set)\n      -\u003e current working directory (default)\n\nAddresses review feedback from woblerr, tuhaihe, and MisterRaindrop on\nPR #97. The pre-existing MASTER_DATA_DIRECTORY reference in\n.github/workflows/cloudberry-backup-ci.yml predates this PR and is\nunrelated to history-db resolution; it is left for a separate cleanup.\n"
    },
    {
      "commit": "f9e80483583e14fefad0bb467c95e72aed97bc44",
      "tree": "8ea6c81ba476502d443c963cde18d8715d7f5734",
      "parents": [
        "de5a244925cada1ba94f2084336b9a830d3858d3"
      ],
      "author": {
        "name": "chenqiang",
        "email": "chenqiang@hashdata.cn",
        "time": "Wed Apr 29 16:17:57 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 30 09:16:33 2026 +0800"
      },
      "message": "gpbackman: wrap non-NotExist os.Stat error with path context in OpenHistoryDB.\n\nPreviously a permission-denied or I/O failure on the history DB path\nreturned the bare os.Stat error, which gave no hint about which\noperation or path failed. Wrap it with fmt.Errorf using %w so\nerrors.Is/As still work while surfacing \"stat history db \u003cpath\u003e\"\nin the message, matching the friendly tone of the ErrNotExist branch.\n"
    },
    {
      "commit": "de5a244925cada1ba94f2084336b9a830d3858d3",
      "tree": "9e40dabc551115f21dfad8158735caea9ee56fa3",
      "parents": [
        "e86cc03c2e21e7deef9a0f758df5dd721f0c9011"
      ],
      "author": {
        "name": "chenqiang",
        "email": "chenqiang@hashdata.cn",
        "time": "Wed Apr 29 15:35:38 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 30 09:16:33 2026 +0800"
      },
      "message": "gpbackman: gate history-db env-var fallback behind --auto-load-history-db opt-in.\n\nAddress review feedback on the original PR:\n\n* The env-var fallback ($COORDINATOR_DATA_DIRECTORY then\n  $MASTER_DATA_DIRECTORY) is now opt-in via a new persistent flag\n  --auto-load-history-db. The default behaviour (current-directory\n  lookup) is unchanged from upstream main, so destructive subcommands\n  (backup-delete, backup-clean, history-clean) cannot silently target\n  the wrong cluster\u0027s history DB on a multi-cluster jump host.\n* Drop the \"Greenplum\" mention in the comment for getHistoryDBPath\n  to keep wording aligned with the Cloudberry environment scripts.\n* Trim the verbose --history-db description in gpbackman/README.md\n  and add a separate --auto-load-history-db line.\n* Refine the not-found error message in OpenHistoryDB to mention the\n  new flag rather than implying that setting env vars alone helps.\n* Tests updated to cover the opt-in matrix: env vars are ignored when\n  the flag is off, honoured when on, and an explicit --history-db\n  still wins regardless.\n\nThe OpenHistoryDB safe-open change (os.Stat pre-check + mode\u003drw URI\nto avoid silently creating an empty SQLite file) is preserved as-is.\n\nSigned-off-by: chenqiang \u003cchenqiang@hashdata.cn\u003e\n"
    },
    {
      "commit": "e86cc03c2e21e7deef9a0f758df5dd721f0c9011",
      "tree": "84da5aea593539b1cd883c2a07cf0c398069ae33",
      "parents": [
        "1035fb84eb85222b4df9b0ecaeb597f21d7a2b53"
      ],
      "author": {
        "name": "chenqiang",
        "email": "chenqiang@hashdata.cn",
        "time": "Wed Apr 29 12:45:52 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 30 09:16:33 2026 +0800"
      },
      "message": "gpbackman: document history-db env-var fallback in COMMANDS.md and README.md.\n\nReplace the \"current directory\" wording everywhere it appeared with the\nnew resolution order: $COORDINATOR_DATA_DIRECTORY, $MASTER_DATA_DIRECTORY,\nthen the current directory.\n\nSigned-off-by: chenqiang \u003cchenqiang@hashdata.cn\u003e\n"
    },
    {
      "commit": "1035fb84eb85222b4df9b0ecaeb597f21d7a2b53",
      "tree": "00fff4188beb891ae459879b4fa25e627ea94ced",
      "parents": [
        "c58b07c9960fd2f8e381c719cbd55cea0c3abb59"
      ],
      "author": {
        "name": "chenqiang",
        "email": "chenqiang@hashdata.cn",
        "time": "Wed Apr 29 12:45:47 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 30 09:16:33 2026 +0800"
      },
      "message": "gpbackman: fall back to coordinator data dir for history db, fail loud when missing.\n\nTwo improvements to how gpbackman locates and opens gpbackup_history.db:\n\n1. When --history-db is empty, fall back (in priority order) to\n   $COORDINATOR_DATA_DIRECTORY and $MASTER_DATA_DIRECTORY before the\n   current directory. These variables are exported by the standard\n   Cloudberry/Greenplum environment scripts, so users running gpbackman\n   from a sourced cluster shell no longer need to repeat --history-db\n   on every invocation.\n\n2. OpenHistoryDB now pre-checks the file with os.Stat and opens the\n   SQLite database with the rw URI mode. A missing file produces a\n   friendly error pointing at --history-db and the env vars, instead of\n   silently creating an empty file that later fails with \"no such table:\n   backups\" when callers issue queries.\n\nThe previous cwd-only fallback is preserved as a last resort. Tests\ncover the new env-var resolution order and the safe-open behaviour.\n\nSigned-off-by: chenqiang \u003cchenqiang@hashdata.cn\u003e\n"
    },
    {
      "commit": "c58b07c9960fd2f8e381c719cbd55cea0c3abb59",
      "tree": "8fe4b19222e36876692b1ad54830a21e76d95d9d",
      "parents": [
        "6b40b13354e7ee2ff8f75262892d2f3d6004604e"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Mon Apr 27 23:40:00 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Apr 28 14:55:00 2026 +0800"
      },
      "message": "Speed up column permissions query.\n\nUse a top-level `unnest(CASE ...) AS privileges` instead of `LEFT JOIN LATERAL`.\nThis removes an extra join and per-array expansion, reducing planner/executor work when scanning large catalogs.\n\nRelated to https://github.com/apache/cloudberry-backup/issues/88\n"
    },
    {
      "commit": "6b40b13354e7ee2ff8f75262892d2f3d6004604e",
      "tree": "c61a312c85184e056a0c8d777f309c561f9363b6",
      "parents": [
        "996ef68aa6b5116665e2da93e54dc92ae382ebcf"
      ],
      "author": {
        "name": "yangyu@hashdata.cn",
        "email": "yangyu@hashdata.cn",
        "time": "Fri Apr 24 18:16:50 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Sat Apr 25 09:05:15 2026 +0800"
      },
      "message": "Fix: gprestore --resize-cluster fails with --jobs \u003e 1\n\nWhen restoring with --resize-cluster from a larger to smaller segment\ncount, gprestore expands the oid list into (oid, batch) pairs in\noid-major order ([T1B0, T1B1, T2B0, T2B1, ...]) and preloads\nmin(NumConns, len(oidList)) segment pipes before starting the helpers.\n\nCoordinator workers take one task per table and iterate batches\nsequentially inside restoreSingleTableData, so the k-th worker\u0027s first\nCOPY targets oidList index k*batches. When batches \u003e\u003d 2 and --jobs \u003e 1\n(NumConns \u003e 1), workers beyond NumConns/batches race ahead of helper\npipe creation and fail with:\n\n  ERROR: command error message: cat: .../\u003cpipe\u003e_\u003coid\u003e_0: No such file\n  or directory\n\nand the restore only succeeds with --jobs 1. This matches the known\nupstream gpbackup issue fixed in 1.30.6.\n\nPreload NumConns*batches pipes (clamped to len(oidList)) so every\nconcurrent worker\u0027s first batch is covered. The helper then rolls its\nqueue forward one pipe per completed batch, and since a worker must\nfinish all batches of its current table before pulling the next task,\nhelper progress stays ahead of worker demand. For batches \u003d\u003d 1 the\nbehavior is unchanged.\n\nFixes #92\n"
    },
    {
      "commit": "996ef68aa6b5116665e2da93e54dc92ae382ebcf",
      "tree": "65b9eefc7290bea3b86446c88463364691476398",
      "parents": [
        "59748f99f6bee01da0e84fabded4503359996417"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Mon Apr 20 11:15:21 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Apr 22 11:05:07 2026 +0800"
      },
      "message": "Align release artifact naming with Apache incubator conventions\n\nUse base version (without -rcN suffix) for release tarball filename\nto align with Apache incubator release conventions.\n\nChanges:\n- Modified TAR_NAME to use ${VERSION_FILE} instead of ${TAG}\n- Tarball filename now follows pattern:\n  apache-cloudberry-backup-${VERSION_FILE}-incubating-src.tar.gz\n- Example: apache-cloudberry-backup-2.0.0-incubating-src.tar.gz\n  (instead of apache-cloudberry-backup-2.0.0-incubating-rc1-src.tar.gz)\n\nBenefits:\n- Enables direct \u0027svn mv\u0027 to release repository after voting without\n  renaming artifacts\n- Aligns with Apache release best practices where RC identifiers are\n  used only for Git tags and voting process, not in final artifact names\n- Maintains consistency between tarball filename and extracted\n  directory name\n\nThe extracted directory name remains unchanged:\napache-cloudberry-backup-${VERSION_FILE}-incubating/\n"
    },
    {
      "commit": "59748f99f6bee01da0e84fabded4503359996417",
      "tree": "2c3535227062bff051a20f663217ab9d257b24b3",
      "parents": [
        "ff44dc65e1f19bd08e819d6a5770434e1bf418f1"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 16 10:25:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 10:25:19 2026 +0800"
      },
      "message": "Docs: update installation command to use specific version tag (#89)\n\nUpdate the installation instructions in README.md to use the specific\nversion tag @2.1.0-incubating instead of @latest.\n\nThe @latest tag resolves to v1.0.2 due to Go modules semantic versioning\nrules, which only recognizes version tags with \u0027v\u0027 prefix (v1.0.0, v1.0.1,\nv1.0.2). The 2.1.0-incubating tag, while functional when specified directly,\nis not recognized as a semantic version by Go modules.\n\nAdded a note to clarify why users should use the specific version tag to\navoid confusion and ensure they install the correct latest version."
    },
    {
      "commit": "ff44dc65e1f19bd08e819d6a5770434e1bf418f1",
      "tree": "04cfa8bb8c4ce822570dcad16decf0beba4edc30",
      "parents": [
        "f00ef9773ddc7db0dac17c1f4907ea8f58fb9ca6"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 22:14:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 22:14:24 2026 +0800"
      },
      "message": "CI: add smoke test for command validation (#84)\n\nAdd smoke tests to verify all cloudberry-backup commands (gpbackup,\ngprestore, gpbackup_helper, gpbackup_s3_plugin, gpbackman) can be\nbuilt and executed with --version and --help flags.\n\n- build_and_unit_test.yml: Test from GOPATH/bin after build\n- cloudberry-backup-ci.yml: Test from GPHOME/bin after install\n\nThis provides fast feedback on basic functionality before running\nmore expensive integration tests."
    },
    {
      "commit": "f00ef9773ddc7db0dac17c1f4907ea8f58fb9ca6",
      "tree": "7a0b83449101933f1cd4398d0ff430808c04a131",
      "parents": [
        "070a94d42c57e5256aeeb799e3f7a9067b224416"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 11:08:53 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 17:17:52 2026 +0800"
      },
      "message": "Bump VERSION to 2.2.0 for main\n"
    },
    {
      "commit": "070a94d42c57e5256aeeb799e3f7a9067b224416",
      "tree": "525c2cdd4b3383d776da2a21e6bba2a8a50d3faf",
      "parents": [
        "9a05ef17a92aac7b29276dcc2918ae4ab9be5ce6"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Wed Apr 08 10:24:45 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Add ASF license header to golangci.yml.\n"
    },
    {
      "commit": "9a05ef17a92aac7b29276dcc2918ae4ab9be5ce6",
      "tree": "0e9d2da98d9e9b8f05a2e590f68a0a208dd1ef01",
      "parents": [
        "731b4e03f40ad30dfb964b8216c9e79713189a2f"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 22:51:30 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Replace deprecated io/ioutil.\nThe io/ioutil package has been deprecated since Go 1.16. All usages are replaced with their recommended alternatives from os and io packages.\nChanges:\n- ioutil.ReadFile -\u003e os.ReadFile\n- ioutil.WriteFile -\u003e os.WriteFile\n- ioutil.TempFile -\u003e os.CreateTemp\n- ioutil.TempDir -\u003e os.MkdirTemp\n- ioutil.ReadAll -\u003e io.ReadAll\n- ioutil.ReadDir -\u003e os.ReadDir\n\nThe os.ReadDir returns []os.DirEntry instead of []os.FileInfo, but all call sites only use .Name(), which is available on both interfaces.\n"
    },
    {
      "commit": "731b4e03f40ad30dfb964b8216c9e79713189a2f",
      "tree": "37968ed761140de223822e55c3c4e38b0fc08428",
      "parents": [
        "ba97796aa4409a0bdf164f6f827053a57f4358a3"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 19:45:14 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Remove legacy `// +build` directives.\nThe legacy `// +build` form is no longer needed.\n"
    },
    {
      "commit": "ba97796aa4409a0bdf164f6f827053a57f4358a3",
      "tree": "219f3d8761f8d8e34dc6b7a3d97bd94d5d28c061",
      "parents": [
        "8238ddae059dc2fd72fe40f1dba60d5d08b71a6d"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 19:38:59 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Bump setup-go action to v5 and go to 1.24.\n"
    },
    {
      "commit": "8238ddae059dc2fd72fe40f1dba60d5d08b71a6d",
      "tree": "0a11f8148fa0f64238902a6ce2442265f3b1c574",
      "parents": [
        "c365317a5fc436af3e4f950678b5edd81a341e8c"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 14:56:54 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Fix lint issues introduced by golangci-lint v2 migration.\n\nChanges:\n- Fix variable shadowing and declaring variables before use (backup_helper.go, restore_helper.go, history.go, s3plugin.go, data.go).\n- Fix in testutils/functions.go where :\u003d was shadowing the host parameter, preventing PGHOST env var from being applied.\n- Remove unused test helper functions batchMapToString and contentMapToString from restore/data_test.go.\n- Add lint exclusion rules in .golangci.yml for test files: govet shadow, errcheck, and unparam — these are pre-existing issues in tests, not regressions from the v2 migration.\n\nPre-existing issues are not fixed here and will be addressed separately.\n"
    },
    {
      "commit": "c365317a5fc436af3e4f950678b5edd81a341e8c",
      "tree": "d5b165a60d3475ddac641c4721b1ca6731b44d80",
      "parents": [
        "4a3cfd915c0d1751489b17ad2619263a7d040982"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 12:46:12 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Migrate golangci-lint from v1 to v2.\n\nUpdate golangci-lint from 1.16.0 to 2.10.1 in Makefile.\nCreate .golangci.yml with v2 configuration format.\nRemove obsolete gometalinter.config.\n\nLinter mapping from gometalinter.config:\n- golint -\u003e revive (with shadow check enabled)\n- vet -\u003e govet\n- varcheck -\u003e unused\n- unparam and errcheck remain unchanged\n\nTODO: consider enabling additional linters in a follow-up PR:\ndupl, gochecknoinits, gocritic, gocyclo, gosec, ineffassign,\nmisspell, nakedret, prealloc, staticcheck, unconvert.\n\nCurrent goal is to migrate the existing config as-is.\n"
    },
    {
      "commit": "4a3cfd915c0d1751489b17ad2619263a7d040982",
      "tree": "975144bee3a9619ae26ac7c9da1f2f74969425c2",
      "parents": [
        "6a4cb4abd35d9ab445bf536bb210b5acf07ad956"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 11:49:21 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Fix go vet issue.\n"
    },
    {
      "commit": "6a4cb4abd35d9ab445bf536bb210b5acf07ad956",
      "tree": "f6b92f2725e92f63585d8bd9d82796c8209aa786",
      "parents": [
        "23c6b9c8e3f5cec8a9bf6f3336951036f5fbf2ec"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Apr 07 11:43:18 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Apr 09 10:21:27 2026 +0800"
      },
      "message": "Bump Go version from 1.21 to 1.24.\n\nUpdate Go to 1.24.\n\nFix non-constant format string errors for Go 1.24.\n\nFix patterns applied:\n- func(err.Error()) -\u003e func(\"%s\", err.Error())\n- func(fmt.Sprintf(\"...\", args)) -\u003e func(\"...\", args)\n"
    },
    {
      "commit": "23c6b9c8e3f5cec8a9bf6f3336951036f5fbf2ec",
      "tree": "05af27c6f2bfa342c4da49ac7218313c21228a34",
      "parents": [
        "4e2a801dc5f035575577c29bbb0b6317d16d933e"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Apr 08 10:19:02 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Apr 08 15:48:12 2026 +0800"
      },
      "message": "asf.yaml: add woblerr as a collaborator\n"
    },
    {
      "commit": "4e2a801dc5f035575577c29bbb0b6317d16d933e",
      "tree": "f9230914795ae277a0e8fe74858393017f3f19b1",
      "parents": [
        "fe20fd0982868983edff9f717ccc2f9bfb652657"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Apr 08 15:16:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:16:33 2026 +0800"
      },
      "message": "Include Apache compliance files in binary packages (#81)\n\nAdd LICENSE, NOTICE, and DISCLAIMER files to the package target\nin Makefile to ensure Apache project compliance requirements are\nmet when distributing binary releases.\n\nThese files are now copied to the package directory alongside the\nbinaries and install script, and will be included in the final\ntar.gz distribution."
    },
    {
      "commit": "fe20fd0982868983edff9f717ccc2f9bfb652657",
      "tree": "b17d5ac7b51eb77058a837feea406ee7fac7ec81",
      "parents": [
        "91b00ad3a10336a0715cdc652291daf626ee3093"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Apr 01 12:09:21 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 12:09:21 2026 +0800"
      },
      "message": "Fix release tarball base version naming\n\nFor RC tags like X.Y.Z-incubating-rcN, generate the source tarball\nfilename and top-level directory using VERSION_FILE (without -rcN).\n\n$VERSION_FILE is input from the file VERSION.\n\nThis keeps the voted bits ready for promotion without rebuilding and\navoids -rcN showing up in the extracted source directory."
    },
    {
      "commit": "91b00ad3a10336a0715cdc652291daf626ee3093",
      "tree": "19e3ca4f982917ae9787fa2505ceb7e1cc6461da",
      "parents": [
        "2881580ea16bdb28f487b725ab376e9fbcfdff63"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Mon Mar 30 16:10:06 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Add Apache License header to  files in gpBackMan.\n"
    },
    {
      "commit": "2881580ea16bdb28f487b725ab376e9fbcfdff63",
      "tree": "350ad361d47e4aef7469ca11b9225f4469f18321",
      "parents": [
        "949a19202da30a63ea45e2ee02626bd3685ed98d"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Thu Mar 26 17:54:48 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Add documentation for gpBackMan.\n"
    },
    {
      "commit": "949a19202da30a63ea45e2ee02626bd3685ed98d",
      "tree": "2ac959654317a346c1ccd54b090815751a0accc2",
      "parents": [
        "174aac7802bc0dab5c4c344981ff9d92facf27aa"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 22 15:58:17 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Refactor backup deletion commands to use direct SSH execution.\n"
    },
    {
      "commit": "174aac7802bc0dab5c4c344981ff9d92facf27aa",
      "tree": "4ab296151f5f291ef02287587f75572049998b1d",
      "parents": [
        "f640411477928a648a5b04a2cd800b75e207e020"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 22 15:36:42 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Add gpbackman path setup and skip condition for old backup version tests.\n"
    },
    {
      "commit": "f640411477928a648a5b04a2cd800b75e207e020",
      "tree": "5eb611a366bf68e7d6e404083682c05587c14f08",
      "parents": [
        "efd4a5a79def08b0a16d549e30e80ebe611629a3"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 22 15:28:18 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Fix typo in flag names and function for backup clean and history clean commands.\n"
    },
    {
      "commit": "efd4a5a79def08b0a16d549e30e80ebe611629a3",
      "tree": "f8fc2ebad82608743a9a9b7d07b08f763163cff2",
      "parents": [
        "2ce09e06cf888fd30062644df375f6bd0096585c"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 22 15:12:36 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Add end-to-end tests for gpbackman functionality.\n\nAlso add vscode to gitignore.\n"
    },
    {
      "commit": "2ce09e06cf888fd30062644df375f6bd0096585c",
      "tree": "e3af414d99cf16df93fa145400317650cd68e595",
      "parents": [
        "142f62b384be10132aac7292cfc4f1145d339e22"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 22 14:46:03 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Disable auto-formatting for table headers in backup-info command.\n"
    },
    {
      "commit": "142f62b384be10132aac7292cfc4f1145d339e22",
      "tree": "23a20a5065bb050df23e44e7f7d982ac8ea63222",
      "parents": [
        "0e3cd2e1b26af5f293c3e5cc677ca85d362a805d"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Mar 17 21:51:55 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Use same style as other main files.\n"
    },
    {
      "commit": "0e3cd2e1b26af5f293c3e5cc677ca85d362a805d",
      "tree": "2c83c63c7c4684f4be27c7ac7ca237c1b9dec0a0",
      "parents": [
        "eb698c0be0608572bc6deea6ca7b4d1e323531dd"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Tue Mar 17 21:46:27 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Replace duplicate utility functions.\n\n- Replace searchFilter() with utils.Exists() in gpbckpconfig/helpers.go\n- Remove searchFilter() from gpbckpconfig/utils.go and its test\n- Replace getCurrentTimestamp() with history.CurrentTimestamp() in cmd/backup_delete.go\n- Remove getCurrentTimestamp() from cmd/wrappers.go and its test\n"
    },
    {
      "commit": "eb698c0be0608572bc6deea6ca7b4d1e323531dd",
      "tree": "d2429759368361261fc05b4e78d800a0a882f84c",
      "parents": [
        "20d294a10be5be9dfe7a16d07a60e44f7bf3be39"
      ],
      "author": {
        "name": "woblerr",
        "email": "antkurochkin@gmail.com",
        "time": "Sun Mar 15 23:10:13 2026 +0300"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 31 16:20:15 2026 +0800"
      },
      "message": "Add gpbackman in the cloudberry-backup.\n\nIntegrate gpbackman (https://github.com/woblerr/gpbackman) — a CLI utility for managing gpbackup backups — into the cloudberry-backup repo.\nYAML functionality (history-migrate, converters, utils_file) is not ported.\n\nKey changes:\n- Add gpbackman.go entry point with //go:build gpbackman tag\n- Create gpbackman/cmd/, gpbackman/gpbckpconfig/, gpbackman/textmsg/\n- Migrate imports: greenplum-db/* → apache/cloudberry-*\n- Remove converter layer — use history.BackupConfig directly\n- Extract 11 BackupConfig methods into standalone functions (helpers.go)\n- Replace go-pretty/v6 with olekukonko/tablewriter\n- Add gpbackman to all Makefile targets (build/install/clean/package)\n- Version via ldflags: -X gpbackman/cmd.version\n- Rewrite unit tests from stdlib testing to Ginkgo/Gomega\n\nCLI subcommands: backup-info, backup-delete, backup-clean, history-clean, report-info.\n"
    },
    {
      "commit": "20d294a10be5be9dfe7a16d07a60e44f7bf3be39",
      "tree": "226f7832e88523376791bfcaf741dee05d20d3fe",
      "parents": [
        "d2ea4491bc9338ead71999b2dc66e7a1c5bfa571"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Mon Mar 16 14:36:06 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Mar 18 18:10:57 2026 +0800"
      },
      "message": "ASF: updates for Apache license compliance\n\n- Add `.github/workflows/apache-rat-audit.yml` for automated checking.\n- Configure `apache-rat-plugin` in `pom.xml` with necessary exclusions.\n- Update `LICENSE` file with correct open-source attributions.\n- Add `README.apache.md` to document the binary files allowlist.\n- Add `*.log` to `.gitignore` to prevent false positives during audits.\n"
    },
    {
      "commit": "d2ea4491bc9338ead71999b2dc66e7a1c5bfa571",
      "tree": "4541614c5ad71c61a164829cdb633a29fe360372",
      "parents": [
        "578dbf6d659600fda1cb79f12f9ad4ee18493076"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Mar 03 15:57:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 03 15:57:16 2026 +0800"
      },
      "message": "CI: refactor CI workflow for cloudberry-backup (#69)\n\n- build Cloudberry from source and publish the install as an artifact\n- run unit/integration/end_to_end/s3_plugin/scale tests in parallel jobs\n- add Apache header to the workflow file\n- capture logs and upload artifacts on failure with a test summary\n\nReviewed by Robert Mu \u003cdbx_c@hotmail.com\u003e"
    },
    {
      "commit": "578dbf6d659600fda1cb79f12f9ad4ee18493076",
      "tree": "b889d58f43a100312cb0fd3594f812371b9e0f2a",
      "parents": [
        "84944b146387e0fd1376db98d0ed36518279b88c"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sat Feb 28 17:52:56 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Mon Mar 02 18:29:04 2026 +0800"
      },
      "message": "fix: correct comment syntax for external tables in GPDB 7+ and Cloudberry\n\nIn GPDB 7.0+ and Cloudberry Database, external tables are implemented as\nforeign tables under the hood. When gpbackup exports metadata for an\nexternal table with a comment, using the traditional \"TABLE\" object type\ncauses an error during gprestore because the database expects\n\"FOREIGN TABLE\" syntax for these objects.\n\nThis change updates the GetMetadataEntry logic to correctly identify\nexternal tables as \"FOREIGN TABLE\" in newer database versions.\n\nSQL Comparison:\n\nBefore (Fails on GPDB 7+ / Cloudberry):\n--------------------------------------------------\nCOMMENT ON TABLE public.my_ext_table IS \u0027this is an external table comment\u0027;\n\nAfter (Executes successfully):\n--------------------------------------------------\nCOMMENT ON FOREIGN TABLE public.my_ext_table IS \u0027this is an external table comment\u0027;\n"
    },
    {
      "commit": "84944b146387e0fd1376db98d0ed36518279b88c",
      "tree": "6b9cb89779b4e9110b23fbaf175ae335fbde77a1",
      "parents": [
        "47171422be883f500efcaffc53d370028153f458"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Feb 27 16:54:48 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Mon Mar 02 18:00:16 2026 +0800"
      },
      "message": "Add cloudberry-backup ASF release script\n"
    },
    {
      "commit": "47171422be883f500efcaffc53d370028153f458",
      "tree": "aa5231082b3e1a6a744670043e61fb52ad2b85bd",
      "parents": [
        "e9c49746cefb14629b66f047002a4ef59700aeae"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sat Feb 28 16:57:03 2026 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Sat Feb 28 18:00:10 2026 +0800"
      },
      "message": "feat: support STATISTIC_KIND_NDV_BY_SEGMENTS in Cloudberry 2.1.0\n\nCloudberry 2.1.0 introduced a new statistic kind (stakind\u003d8) to store\nthe sum of local NDVs across all segments. Unlike other statistic kinds,\nthis always stores an int8 array regardless of the column\u0027s underlying\ndata type.\n"
    },
    {
      "commit": "e9c49746cefb14629b66f047002a4ef59700aeae",
      "tree": "16bea4151f4d37d12164ca94bbe13e8b7a38c1e1",
      "parents": [
        "90e80bd3d33e4912c25bba6742ce696ac4fd80d5"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Sep 25 14:19:43 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Feb 26 12:20:08 2026 +0800"
      },
      "message": "Remove unused Concourse CI files\n"
    },
    {
      "commit": "90e80bd3d33e4912c25bba6742ce696ac4fd80d5",
      "tree": "37212d0c3d4e8533040c23b06d73273c3f1cc5f7",
      "parents": [
        "27fbd5ebf612fe589fe6ab3c210dbd1b38682f08"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Feb 13 19:05:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 19:05:34 2026 +0800"
      },
      "message": "Package: add .tar.gz package for Linux platforms\n\n"
    },
    {
      "commit": "27fbd5ebf612fe589fe6ab3c210dbd1b38682f08",
      "tree": "dafcd2c01866755648acf503dd71f86a15c334d6",
      "parents": [
        "b60130e8062e0b2a0a031b959bc742869ceedf5d"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Fri Feb 13 07:44:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 13 07:44:11 2026 +0800"
      },
      "message": "Docs: README and NOTICE udpate\n\nMain changes are included in this commit:\n* Update NOTICE year to 2026\n* Update README.md for a clear installation guide\n* Update brand name for a general format"
    },
    {
      "commit": "b60130e8062e0b2a0a031b959bc742869ceedf5d",
      "tree": "bb12aac07747a7649ff33503a9bb07d6d29a7295",
      "parents": [
        "4648d84ec126c540678b462ceb57ae099f943a81"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Oct 15 17:44:05 2025 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Mon Oct 20 14:52:12 2025 +0800"
      },
      "message": "fix(relations): Ensure materialized view access method is restored\n\nOn Cloudberry, Greenplum 7+, materialized views must be created with\na specific access method (e.g., \u0027heap\u0027, \u0027ao_row\u0027) and associated storage\noptions in the \u0027WITH\u0027 clause (e.g., \u0027compresstype\u003dzstd\u0027).\n\nThe prior implementation did not back up the \u0027USING\u0027 clause.\nDuring restore, the database would default to another access method\n(e.g., \u0027heap\u0027) which might not support the view\u0027s storage options.\nThis incompatibility caused the \u0027CREATE MATERIALIZED VIEW\u0027 command\nto fail validation.\n\nThis commit corrects the failure by:\n- Updating the view query for Cloudberry, GPDB 7+ to fetch the access method.\n- Modifying DDL generation to include the \u0027USING\u0027 clause.\n- Updating integration tests to verify the fix.\n\nFixes #61\n"
    },
    {
      "commit": "4648d84ec126c540678b462ceb57ae099f943a81",
      "tree": "284362b268cbca96ab5bfef89599b0e88adac4c2",
      "parents": [
        "aec11cc05e08545a465a031562ec01cab5671647"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Oct 15 18:01:19 2025 +0800"
      },
      "committer": {
        "name": "Max Yang",
        "email": "79948451+my-ship-it@users.noreply.github.com",
        "time": "Fri Oct 17 17:49:19 2025 +0800"
      },
      "message": "fix(test): Prevent panic in AfterSuite when BeforeSuite fails\n\nIf the BeforeSuite hook fails before the database connection is\ninitialized, the `connectionPool` variable remains nil. A common cause\nis a misconfigured test environment, such as when `greenplum_path.sh`\nis not sourced, leading to a \"command not found\" error for `createdb`.\n\nThe previous AfterSuite logic would then attempt to dereference this\nnil pointer, causing a panic.\n\n```\nRunning Suite: database query tests - /home/cbdb/Projects/gpbackup/integration\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nRandom Seed: 1760521199 - will randomize all specs\n\nWill run 549 of 552 specs\n------------------------------\n[BeforeSuite] [FAILED] [0.003 seconds]\n[BeforeSuite]\n/home/cbdb/Projects/gpbackup/integration/integration_suite_test.go:54\n\n  [FAILED] Cannot create database testdb; is GPDB running?\n  In [BeforeSuite] at: /home/cbdb/Projects/gpbackup/integration/integration_suite_test.go:58 @ 10/15/25 17:40:06.839\n------------------------------\n[AfterSuite] [PANICKED] [0.000 seconds]\n[AfterSuite]\n/home/cbdb/Projects/gpbackup/integration/integration_suite_test.go:127\n\n  [PANICKED] Test Panicked\n  In [AfterSuite] at: /usr/lib/go-1.23/src/runtime/panic.go:262 @ 10/15/25 17:40:06.839\n\n  runtime error: invalid memory address or nil pointer dereference\n\n  Full Stack Trace\n    github.com/apache/cloudberry-backup/integration.init.func10()\n    \t/home/cbdb/Projects/gpbackup/integration/integration_suite_test.go:129 +0x26\n------------------------------\n\nSummarizing 2 Failures:\n  [FAIL] [BeforeSuite]\n  /home/cbdb/Projects/gpbackup/integration/integration_suite_test.go:58\n  [PANICKED!] [AfterSuite]\n  /usr/lib/go-1.23/src/runtime/panic.go:262\n\nRan 0 of 552 Specs in 0.023 seconds\nFAIL! -- A BeforeSuite node failed so all tests were skipped.\n--- FAIL: TestQueries (0.03s)\nFAIL\n\nGinkgo ran 1 suite in 7.163251311s\n```\n"
    },
    {
      "commit": "aec11cc05e08545a465a031562ec01cab5671647",
      "tree": "a67951b94508b965225bc6f6c4d4891b4ee623cb",
      "parents": [
        "a23f26871aa26fadaf4154bc634ec52e3cf02999"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Oct 15 11:58:03 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Oct 16 15:01:21 2025 +0800"
      },
      "message": "Add pull request template\n"
    },
    {
      "commit": "a23f26871aa26fadaf4154bc634ec52e3cf02999",
      "tree": "e463f00863e2372d7b48d0b02cc01b9f0b143192",
      "parents": [
        "4a23f3025993abbca3ec9e4f09717bdf4b0c4ecf"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Oct 15 11:50:46 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Oct 16 15:01:21 2025 +0800"
      },
      "message": "ASF: add DISCLAIMER file\n"
    },
    {
      "commit": "4a23f3025993abbca3ec9e4f09717bdf4b0c4ecf",
      "tree": "a2e48acad58336f3624047cf65f46354ccc6f114",
      "parents": [
        "536e38510738e2d656f149c36eb18015ff2e4d82"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Oct 13 21:59:30 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Oct 15 09:31:16 2025 +0800"
      },
      "message": "feat(testing): Improve multi-DB compatibility in unit tests\n\nRefactor the unit test framework to properly support running tests\nagainst different database types (GPDB and CBDB) and versions.\n\n- Introduce `TEST_DB_TYPE` and rename `TEST_GPDB_VERSION` to\n  `TEST_DB_VERSION` in the Makefile for clearer test configuration.\n\n- Update test utilities to use these new environment variables to\n  set up the correct database context for each test run.\n\n- Dynamically generate test data in `restore/wrappers_test.go` to\n  prevent version compatibility panics when running the full\n  test suite.\n\nThis makes our testing more robust and easier to maintain.\n\nFixes #57\n"
    },
    {
      "commit": "536e38510738e2d656f149c36eb18015ff2e4d82",
      "tree": "0ce4a7915695dd902776361b51b105d58f4d4cb0",
      "parents": [
        "3acccdf4b600b7d2356a2b02fae67b10fae9b948"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Sat Oct 11 13:40:57 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Oct 14 11:31:41 2025 +0800"
      },
      "message": "Update format using make format\n"
    },
    {
      "commit": "3acccdf4b600b7d2356a2b02fae67b10fae9b948",
      "tree": "02f111dcf98ddac0464864a63e252e94119b18b8",
      "parents": [
        "d07ce985d794008a44182a237e20e0ea2eaffa0c"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Oct 13 22:49:42 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Tue Oct 14 10:46:41 2025 +0800"
      },
      "message": "docs: Update Go version requirement to 1.21\n"
    },
    {
      "commit": "d07ce985d794008a44182a237e20e0ea2eaffa0c",
      "tree": "0fc3ef874c72520d50a20681fa4dddf017cf59df",
      "parents": [
        "7fc4d67115c46314660ec081010f23ef3e839822"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sat Oct 11 10:17:44 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Sat Oct 11 17:58:13 2025 +0800"
      },
      "message": "Bump Go version to 1.21 in build workflow\n"
    },
    {
      "commit": "7fc4d67115c46314660ec081010f23ef3e839822",
      "tree": "7f6f729ea213f4be0d28cbbf61ee6e91f4101755",
      "parents": [
        "59f10ac645528e9c94d963bf3eaca466a30e9ad2"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sat Oct 11 10:11:21 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Sat Oct 11 17:58:13 2025 +0800"
      },
      "message": "Use dynamic GOPATH in build_and_unit_test.yml\n"
    },
    {
      "commit": "59f10ac645528e9c94d963bf3eaca466a30e9ad2",
      "tree": "7b4fe32c739474de064bfa7bc944f97bd293b997",
      "parents": [
        "d1059fe38156176ca8137567d3ae6f697c929054"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Sun Sep 28 20:58:48 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Oct 09 15:09:09 2025 +0800"
      },
      "message": "Merge gpbackup-s3-plugin-archive into plugins/s3plugin directory\n\n* Integrate S3 storage plugin functionality into main repository\n* Add gpbackup_s3_plugin executable target to Makefile\n* Update build system to include S3 plugin compilation and\n  installation\n* Include comprehensive S3 plugin configuration and usage\n  documentation\n* Add unit tests for S3 plugin functionality\n\nThe S3 plugin allows users to backup and restore Cloudberry and\nGreenplum databases to Amazon S3 compatible storage systems. This\nintegration eliminates the need for a separate plugin repository\nand simplifies deployment and maintenance.\n\nPreviously located at:\nhttps://github.com/greenplum-db/gpbackup-s3-plugin-archive\n"
    },
    {
      "commit": "d1059fe38156176ca8137567d3ae6f697c929054",
      "tree": "0c85fffd2280f6de6c9b436a49e1302ae7f6f64e",
      "parents": [
        "723ba54f281b5728804668c37047c7c62610ca5d"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Sep 24 11:58:48 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Sep 25 15:04:26 2025 +0800"
      },
      "message": "Update basic community files for repo\n"
    },
    {
      "commit": "723ba54f281b5728804668c37047c7c62610ca5d",
      "tree": "9d151d81d947ace4c981616b143f4d47e351325a",
      "parents": [
        "ae1c4c4a5df5238c31ab063d36287e740f2db847"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Sep 24 11:19:58 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Sep 25 15:02:35 2025 +0800"
      },
      "message": "Rename cloudberry-gpbackup to cloudberry-backup\n"
    },
    {
      "commit": "ae1c4c4a5df5238c31ab063d36287e740f2db847",
      "tree": "85446bacf34d5369ba1044bb11f7844b463a3bd2",
      "parents": [
        "e8cc91473d068f94b52b135a08618fac4049ce71"
      ],
      "author": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Sep 11 17:37:59 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Sep 24 10:35:02 2025 +0800"
      },
      "message": "Rebrand Greenplum to Apache Cloudberry\n"
    },
    {
      "commit": "e8cc91473d068f94b52b135a08618fac4049ce71",
      "tree": "6ffc9f618af043ea4082fd331a4f373401b18606",
      "parents": [
        "10d4482aff400b8b7f15721cd48bb5fbeb01ba63"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Sep 11 09:25:15 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Thu Sep 11 17:14:34 2025 +0800"
      },
      "message": "refactor: Rename module from greenplum-db/gpbackup to apache/cloudberry-gpbackup\n"
    },
    {
      "commit": "10d4482aff400b8b7f15721cd48bb5fbeb01ba63",
      "tree": "4b9ec4f0fe83363b851279c164b86a5a4b892b34",
      "parents": [
        "fad286f33d2ef98500130efe9c786389cf00ec53"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Sep 10 10:35:07 2025 +0800"
      },
      "committer": {
        "name": "Dianjin Wang",
        "email": "wangdianjin@gmail.com",
        "time": "Wed Sep 10 17:33:02 2025 +0800"
      },
      "message": "deps: Update cloudberry-go-libs to Apache repository\n\nMigrate dependency from github.com/cloudberrydb/gp-common-go-libs\nto github.com/apache/cloudberry-go-libs v1.0.12-0.20250910014224-fc376e8a1056\n"
    },
    {
      "commit": "fad286f33d2ef98500130efe9c786389cf00ec53",
      "tree": "e5269cf50ba71f65cf9b909e2b2a7a7156e29a17",
      "parents": [
        "285f5d33edee536539d8aeb14dd193af8985e974"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Sep 08 10:30:30 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 10:30:30 2025 +0800"
      },
      "message": "fix(test): Handle plpython3u cleanup for Cloudberry compatibility (#40)\n\nIn Cloudberry (based on PostgreSQL 14), CREATE LANGUAGE plpython3u\nis implemented as a wrapper around CREATE EXTENSION. This means the\nlanguage cannot be dropped directly and requires dropping the\nextension instead.\n\nUpdated plugin tests to use DROP EXTENSION IF EXISTS plpython3u for\nCloudberry databases while maintaining backward compatibility with\nGPDB versions that use DROP PROCEDURAL LANGUAGE.\n\nThis resolves test failures where Cloudberry would error with:\n\"cannot drop language plpython3u because extension plpython3u\nrequires it\""
    },
    {
      "commit": "285f5d33edee536539d8aeb14dd193af8985e974",
      "tree": "82d402c1046dd38bdfc5212805036d04de48c4a9",
      "parents": [
        "af682b271f923031088778692b3e7231e632b82a"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Sep 08 10:29:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 10:29:38 2025 +0800"
      },
      "message": "fix(test): Exclude Cloudberry from gpdb6_objects.sql execution (#39)\n\nCloudberry database does not support enum types as distribution keys.\nThe gpdb6_objects.sql file contains a legacy_enum table that uses an\nenum column as distribution key, causing test failures in Cloudberry\nenvironments.\n\nUpdated plugin tests to only execute GPDB 6+ specific objects on\nactual GPDB 6+ installations, while Cloudberry continues using GPDB\n5+ compatible objects without enum distribution keys.\n\nSee: https://github.com/apache/cloudberry/issues/1300"
    },
    {
      "commit": "af682b271f923031088778692b3e7231e632b82a",
      "tree": "9dc358e70f302f68c718b508d4a3672309aa39cd",
      "parents": [
        "5b97df864e13244f55cb837df2e73f93bef14681"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Sep 08 10:28:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 10:28:13 2025 +0800"
      },
      "message": "fix(test): Skip tests for Cloudberry due to ENUM distribution key issue (#37)\n\nThe test will be re-enabled once the upstream issue with ENUM\ndistribution keys is resolved in Cloudberry.\n\nSee: https://github.com/apache/cloudberry/issues/1300"
    },
    {
      "commit": "5b97df864e13244f55cb837df2e73f93bef14681",
      "tree": "1fad96a9e9dd798d65b27c2acb4a9e7cec08a58a",
      "parents": [
        "fd7f6903d1c05c7b09038775f8f2e3935c910e7a"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Mon Sep 08 10:26:57 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Sep 08 10:26:57 2025 +0800"
      },
      "message": "fix(tests): Use compatible operator for legacy script (#38)\n\nThe `gpdb4_objects.sql` script failed on certain database versions\nas it defined a postfix operator, a feature no longer supported.\n\nTo ensure compatibility, the unsupported postfix operator has been\nreplaced with a standard binary operator definition. This allows the\ntest to validate the backup and restore of operator metadata across\nall supported database versions.\n\nThis change is safe as the test\u0027s purpose is to check the handling of\nthe operator\u0027s metadata, not its runtime functionality."
    },
    {
      "commit": "fd7f6903d1c05c7b09038775f8f2e3935c910e7a",
      "tree": "609450ef8fc16cf0e709fe12a36b7f9ada76a30d",
      "parents": [
        "993cce7ba109dee8f220efa280322b2c67f36810"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 15:43:54 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 15:43:54 2025 +0800"
      },
      "message": "docs: Update S3 plugin repository link to Apache Cloudberry (#43)\n\nUpdated gpbackup_s3_plugin repository URL from greenplum-db\norganization to apache/cloudberry-gpbackup-s3-plugin to reflect\nthe plugin\u0027s migration to the Apache Cloudberry project."
    },
    {
      "commit": "993cce7ba109dee8f220efa280322b2c67f36810",
      "tree": "8cbe379b3e31c9a459a96f1f9f61cd88336a51fd",
      "parents": [
        "29f14b6f60025045887b4bddb25cf45730238f88"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 15:41:46 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 15:41:46 2025 +0800"
      },
      "message": "deps: Update gp-common-go-libs to latest commit (#42)\n\nUpdated github.com/cloudberrydb/gp-common-go-libs from commit\n7e1b684694b9 (2025-07-23) to 928bc567da46 (2025-07-25) to\nensure compatibility with latest Cloudberry and Greenplum\ndatabase version detection APIs.\n\nThis update maintains access to IsGPDB() method and other\ndatabase identification functionality required by the\nbackup/restore logic."
    },
    {
      "commit": "29f14b6f60025045887b4bddb25cf45730238f88",
      "tree": "3c2eb2787419d42eb501e8f6e036adfd6592690f",
      "parents": [
        "af1fedf7c0ddda9ddea7ec7114210f9d90593302"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 15:41:05 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 15:41:05 2025 +0800"
      },
      "message": "fix(test): Update test resources with prefixed database version strings (#41)\n\nPreviously, config.yaml in test resources contained stripped\nversion strings like \"6.0.0\" for Greenplum database backups.\n\nAfter introducing Cloudberry support, config.yaml now stores\nfull prefixed version strings to distinguish database vendors:\n- Greenplum: \"Greenplum Database 6.0.0\"\n- Cloudberry: \"Cloudberry Database 1.0.0\"\n\nWithout this update, end-to-end tests fail to correctly identify\nthat resources/*.tar.gz files originated from Greenplum database\nbackups, causing test failures in database vendor detection logic.\n\nUpdated test resource archives to include properly prefixed\nversion strings in their embedded config.yaml files."
    },
    {
      "commit": "af1fedf7c0ddda9ddea7ec7114210f9d90593302",
      "tree": "a0ccc26b01ab4f49ae2220bd083c4a7a575c1b5b",
      "parents": [
        "3cd0f88d8c2a7c7b90783a1598bca7059af5753c"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 15:17:17 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 15:17:17 2025 +0800"
      },
      "message": "fix(test): Skip resize cluster test for Cloudberry due to replicated table issue (#36)\n\nSkip resize cluster test in end-to-end suite for Cloudberry due to\nCOPY FROM ON SEGMENT issue with replicated tables. Add detailed TODO\ncomment in restore/data.go explaining the root cause of row count\nvalidation failures during resize operations.\n\nReferences Cloudberry issue #1298 for tracking the upstream fix.\nEnsures test stability while maintaining compatibility with\nGreenplum behavior.\n\nThe test is temporarily disabled for Cloudberry until the upstream\nissue with COPY command returning incorrect row counts for replicated\ntables is resolved.\n\nSee: https://github.com/apache/cloudberry/issues/1298"
    },
    {
      "commit": "3cd0f88d8c2a7c7b90783a1598bca7059af5753c",
      "tree": "c3246410a8a232e6f36d60695d63e5e7ee26b24c",
      "parents": [
        "d86c16a71e2d5d3da51bf49b72c73302421555a9"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 15:11:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 15:11:47 2025 +0800"
      },
      "message": "fix(backup): Enable modern sequence and constraint features for Cloudberry (#35)\n\nThe logic for handling modern sequence definitions (`AS \u003ctype\u003e`) and\nrenaming constraints on exchanged partitions was previously gated for\nGPDB 7+ only.\n\nThis caused incorrect backups on Cloudberry, which supports these\nmodern PostgreSQL capabilities but was not included in the version check.\nConsequently, sequence types could be lost, and exchanged partition\nconstraints could have incorrect names, leading to potential restore failures.\n\nThis commit updates the version checks to the standard\n`(IsGPDB() \u0026\u0026 AtLeast(\"7\")) || IsCBDB()` pattern. This ensures these\ncritical features execute correctly for Cloudberry, improving backup\ncorrectness and reliability."
    },
    {
      "commit": "d86c16a71e2d5d3da51bf49b72c73302421555a9",
      "tree": "db3538279f72a529e42bd5213194d0207b9ad351",
      "parents": [
        "d8f3b943ff04f2b0974f414d2644c07a2f76c4ac"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 14:44:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 14:44:16 2025 +0800"
      },
      "message": "refactor(restore): Adapt legacy backup detection for multi-database support (#34)\n\nThe original logic for detecting pre-GPDB6 backups was designed for a\nGreenplum-only environment. In that context, the `gpbackup` process\nstripped the `(Greenplum Database ...)` prefix, and the restore logic\ncorrectly parsed the raw version number from `config.yaml`.\n\nWith the introduction of support for Cloudberry, `config.yaml` now\nretains the full, prefixed version string to differentiate between\ndatabase vendors. The existing restore logic was not designed to handle\nthese prefixed strings and would fail to parse the major version\ncorrectly, leading to improper `gp_use_legacy_hashops` settings and\ndata distribution errors.\n\nThis commit refactors the detection mechanism to be database-aware.\nIt now uses the standard `dbconn.GPDBVersion.ParseVersionInfo` to robustly\nhandle various version formats. The logic now explicitly checks if the\nbackup is from Greenplum (`IsGPDB()`) before checking if it is a legacy\nversion (`Before(\"6\")`).\n\nThis ensures restore operations are reliable in a multi-database\nenvironment, correctly applying legacy settings only to actual legacy\nGreenplum backups while properly handling modern Cloudberry and Greenplum\nbackups."
    },
    {
      "commit": "d8f3b943ff04f2b0974f414d2644c07a2f76c4ac",
      "tree": "10e3354d3c972e430d09ec7a6cd2fa627fee9f11",
      "parents": [
        "e1f966e35db015b2ac8ee829fc49dde1145ec841"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 14:37:43 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 14:37:43 2025 +0800"
      },
      "message": "Fix: Normalize operator class storagetype for different DB versions (#33)\n\nThis commit addresses a test failure in the `GetOperatorClasses` integration\ntests, which was observed on newer database versions like Cloudberry\n(based on PG14).\n\nThe investigation revealed an inconsistency in how Greenplum 7 (based on PG12)\nand Cloudberry handle the `storagetype` for operator classes. When an operator\nclass\u0027s `STORAGE` type is the same as its `FOR TYPE` and `opckeytype` is not 0:\n- In GPDB7, the expression `opckeytype::regtype` evaluates to \"-\".\n- In CBDB, the same expression evaluates to the actual type name (e.g., \"integer\").\n\nThis change introduces a `CASE` statement to explicitly check if\n`opcintype` equals `opckeytype`. This normalizes the behavior across\nboth database versions, ensuring that `storagetype` is consistently\nrepresented as \"-\" when the storage type is the same as the input type,\nwhich allows the failing test to pass."
    },
    {
      "commit": "e1f966e35db015b2ac8ee829fc49dde1145ec841",
      "tree": "be73778b79fc447f6b7b4d49f8b7e6819986d27a",
      "parents": [
        "1cbdec5c4f747c8b22e4af037a672bf42367bbb1"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Fri Sep 05 09:40:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 05 09:40:18 2025 +0800"
      },
      "message": "fix(test): adjust GetProceduralLanguages test expectations for Cloudberry (#29)\n\nThe `GetProceduralLanguages` integration test was failing on Cloudberry\n(PostgreSQL 14) because it expected a manually created procedural\nlanguage to be returned, but the function was correctly filtering it out.\n\nIn PostgreSQL 14, `CREATE LANGUAGE plpython3u` implicitly links the\nlanguage to the `plpython3u` extension, registering it in `pg_depend`\nwith `deptype \u003d \u0027e\u0027` (core extension member). The `GetProceduralLanguages`\nfunction is designed to filter out these members to prevent duplicate\nentries during backup, as they are restored via `CREATE EXTENSION`.\n\nThis commit adapts the test to reflect this correct behavior on\nCloudberry:\n- The test now asserts that `GetProceduralLanguages` returns a list\n  of length 0 on Cloudberry, validating the filtering logic.\n- The cleanup logic is updated to use `DROP EXTENSION` instead of\n  `DROP LANGUAGE` on Cloudberry, as the latter would fail.\n\nThis change makes the test more robust by verifying the distinct\nlanguage handling behaviors between GPDB and Cloudberry."
    },
    {
      "commit": "1cbdec5c4f747c8b22e4af037a672bf42367bbb1",
      "tree": "d369bf992556c5219972604dd3bf921512c24e4f",
      "parents": [
        "2d0880a56016eca247292633075968555570d892"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:54:42 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:54:42 2025 +0800"
      },
      "message": "Fix: Correctly handle base array type creation on Cloudberry (#32)\n\nThe integration test for user-created array types was failing on\nCloudberry. This was due to two related issues stemming from Cloudberry\nbeing based on a newer PostgreSQL version (PG14) than Greenplum 7\n(PG12).\n\nFirst, creating a base type with an `ELEMENT` attribute on Cloudberry\nrequires a `SUBSCRIPT` function to be provided, a stricter requirement\nthan in Greenplum. The integration test in `predata_types_queries_test.go`\nis updated to add this `SUBSCRIPT` function only when running against\na Cloudberry instance.\n\nSecond, the `pg_type` system catalog in Cloudberry contains a\n`typsubscript` column which is absent in Greenplum 7. The previous\nmetadata query was failing to retrieve this information. A dedicated\nquery for Cloudberry has been added in `backup/queries_types.go` to\nfetch this field, with the `GetBaseTypes` function now using the\nappropriate query based on the database connection."
    },
    {
      "commit": "2d0880a56016eca247292633075968555570d892",
      "tree": "7389a5b67d74f0bec6b505fdbc0ae12379f58589",
      "parents": [
        "93f7821f7bbb16c8b815320c8cd07413844785b7"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:45:41 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:45:41 2025 +0800"
      },
      "message": "fix(test): Adapt operator metadata test for Cloudberry support (#31)\n\nThis commit modifies the operator metadata integration test to\nsupport Cloudberry in addition to the original Greenplum support.\n\nThe original test created a unary prefix operator, which worked\nfine for Greenplum. However, Cloudberry (based on PostgreSQL 14)\nno longer supports user-defined unary operators, causing the test\nto fail.\n\nTo ensure compatibility across both platforms, the test now uses\na binary operator approach universally, which is supported by\nboth Greenplum and Cloudberry. This eliminates the need for\nconditional logic while maintaining the same test coverage.\n\nChanges:\n- Replace unary prefix operator with binary operator\n- Use `binary_op_func(bigint, bigint)` instead of `numeric_fac`\n- Update operator syntax to `(LEFTARG \u003d bigint, RIGHTARG \u003d bigint)`\n- Remove database-specific conditional branching\n\nThis change ensures the test passes on both Greenplum and\nCloudberry without compromising the metadata validation logic."
    },
    {
      "commit": "93f7821f7bbb16c8b815320c8cd07413844785b7",
      "tree": "735bf30c64f598ade7e81a0f9d8b95e674e4adfc",
      "parents": [
        "2bc6f7aadb71435e0fe61ad973ad3dcca54b9bb3"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:44:25 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:44:25 2025 +0800"
      },
      "message": "fix(test): Adapt base type creation test for Cloudberry (#30)\n\nThis commit resolves an integration test failure for\nPrintCreateBaseTypeStatement when running against Cloudberry, which is\nbased on PostgreSQL 14.\n\nPostgreSQL 14 enforces stricter validation for `CREATE TYPE`. It now\nrequires that a type specified with an `ELEMENT` parameter must also\nhave an associated subscripting function. This requirement is not\nenforced in PostgreSQL 12 (on which GPDB 7 is based), which allowed\n`ELEMENT` as a metadata-only attribute.\n\nTo ensure compatibility, this change conditionally modifies the `baseType`\nstruct in the `BeforeEach` block. When running on Cloudberry, the\n`Element` field is set to an empty string. This ensures that the\nauto-generated `CREATE TYPE` statement is valid for PostgreSQL 14,\nallowing the test to pass while preserving the original logic for GPDB 7."
    },
    {
      "commit": "2bc6f7aadb71435e0fe61ad973ad3dcca54b9bb3",
      "tree": "2987f5eb9febed1c77bfc5b9ba14d2b1c17408d9",
      "parents": [
        "66a170d9ee54ca19431b6232df10ea7cad05865f"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:40:09 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:40:09 2025 +0800"
      },
      "message": "fix(backup): Use standard LOCK TABLE syntax for Cloudberry (#28)\n\nTemporarily modifies the table locking logic to use a standard\n`LOCK TABLE ... IN ACCESS SHARE MODE` command when running against\nCloudberry.\n\nThis change is necessary because Cloudberry, which is based on\nPostgreSQL 14, does not support the `COORDINATOR ONLY` clause that was\nintroduced in GPDB 7 as a performance optimization. The use of this\nunsupported syntax was causing `gpbackup` to panic during the initial\ntable locking phase.\n\nA TODO comment has been added to both modified functions (`LockTables`\nand `LockTableNoWait`) to indicate that this is a workaround. The logic\nshould be reverted to use the `COORDINATOR ONLY` optimization once\nCloudberry implements this feature for feature and performance parity\nwith GPDB 7.\n\nSee https://github.com/apache/cloudberry/issues/1265"
    },
    {
      "commit": "66a170d9ee54ca19431b6232df10ea7cad05865f",
      "tree": "8cdaf157de9417ca49b5fe40585b65280e9e41b8",
      "parents": [
        "78fda017373877a8ec0905edd8d0405b08a88a9f"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:37:51 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:37:51 2025 +0800"
      },
      "message": "fix(test): Remove ELEMENT parameter for Cloudberry compatibility (#27)\n\nThis commit fixes the \"base type with custom configuration\" test\nto handle stricter validation in Cloudberry (based on PostgreSQL 14).\n\nCloudberry enforces stricter CREATE TYPE validation requiring that\ntypes with ELEMENT parameters must have subscripting functions,\nwhile Greenplum 7 (based on PostgreSQL 12) was more lenient. Since\nthis test focuses on verifying backup of custom type properties\nrather than array functionality, the ELEMENT parameter is removed\nfor Cloudberry to comply with validation while preserving test\ncoverage."
    },
    {
      "commit": "78fda017373877a8ec0905edd8d0405b08a88a9f",
      "tree": "61b28d14a4f263c9c4b3522e3550898549fc2da3",
      "parents": [
        "a0ff77b7d2dc06f712df4518c0ac5c09fb9eaf6d"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:35:01 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:35:01 2025 +0800"
      },
      "message": "fix(test): adjust stored procedure test expectations for Cloudberry (#26)\n\nThe integration test for stored procedures was failing on Cloudberry\ndue to differences in pg_get_function_arguments behavior compared to\nGPDB 7.\n\nIn Cloudberry (PostgreSQL 14), pg_get_function_arguments includes\nparameter modes (e.g., \"IN\") in the returned arguments string, while\nGPDB 7 omits them.\n\nThis commit updates the test to expect the correct format for each\ndatabase version:\n- Cloudberry: \"IN a integer, IN b integer\"\n- GPDB 7: \"a integer, b integer\"\n\nThe underlying gpbackup functionality works correctly on both platforms;\nonly the test expectations needed adjustment.\n\nFixes: Integration test failure in predata_functions_queries_test.go"
    },
    {
      "commit": "a0ff77b7d2dc06f712df4518c0ac5c09fb9eaf6d",
      "tree": "22c215695e848c2d1fbae422c26fd912b481e0f5",
      "parents": [
        "62fc64dd41fca426856515fc0e2c5937b1c969ef"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:30:48 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:30:48 2025 +0800"
      },
      "message": "fix(test): adapt procedural language test for Cloudberry behavior (#24)\n\nThe integration test for procedural languages was failing on Cloudberry\ndue to differences in dependency handling compared to GPDB 7.\n\nIn Cloudberry (based on PostgreSQL 14), extension-created languages are\nmarked as \"core extension members\" and are correctly filtered out by the\nexisting GetProceduralLanguages() function to avoid backup duplication.\n\nThis commit updates the test to:\n1. Create the extension first in Cloudberry to make handlers available\n2. Use appropriate cleanup strategy (DROP EXTENSION vs DROP LANGUAGE)\n3. Expect length 0 for Cloudberry (filtered) vs length 1 for GPDB\n\nThe changes ensure test compatibility while confirming that the backup\nlogic correctly handles different PostgreSQL dependency models.\n\nFixes: Integration test failure in predata_functions_create_test.go"
    },
    {
      "commit": "62fc64dd41fca426856515fc0e2c5937b1c969ef",
      "tree": "10cde5e9517aa18808d4ef37ffddcb7afa696746",
      "parents": [
        "3a1b2575b64146deea730433734d1518381bc53e"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 28 20:30:10 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 28 20:30:10 2025 +0800"
      },
      "message": "fix(test): Skip failing storage options query test on Cloudberry (#25)\n\nTemporarily skips the `GetTableStorage` integration test on Cloudberry.\nThe test fails because Cloudberry, unlike GPDB 7, does not persist\ndefault storage options to `pg_class.reloptions` when an append-optimized\ntable is created with only `appendonly\u003dtrue`.\n\nThis inconsistency causes the test to fail as it expects the default\nstorage option string but receives an empty one from the query.\n\nA TODO comment has been added to re-enable the test once the underlying\nissue in Cloudberry is resolved.\n\nSee: https://github.com/apache/cloudberry/issues/1260"
    },
    {
      "commit": "3a1b2575b64146deea730433734d1518381bc53e",
      "tree": "01be4cd2d0f3da8f03ee75960b9353f5a08c2c6f",
      "parents": [
        "553ced873ee26c6e9966c91eb91c792e671e2cb3"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Aug 27 17:04:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 27 17:04:13 2025 +0800"
      },
      "message": "fix(test): skip AO table test on Cloudberry due to checksum persistence issue (#23)\n\nThe integration test for creating append-optimized (AO) tables fails\non Cloudberry due to an upstream bug in storage options handling.\n\nCloudberry shows checksum\u003dtrue in gp_default_storage_options but fails\nto persist this default to pg_class.reloptions when creating tables.\nThis causes gpbackup to read metadata without the checksum option,\nleading to test failures when compared against GPDB 7+ expectations.\n\nThe test is temporarily skipped for Cloudberry until the upstream\nissue is resolved.\n\nSee: https://github.com/apache/cloudberry/issues/1254"
    },
    {
      "commit": "553ced873ee26c6e9966c91eb91c792e671e2cb3",
      "tree": "9afe1fae12d942885837ca90d013e2ae50317ba6",
      "parents": [
        "60d609116b66b48d3a9e386059e59b6dd792d22e"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Aug 27 17:01:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 27 17:01:47 2025 +0800"
      },
      "message": "fix(test): Adapt role password test for Cloudberry (#20)\n\nThe integration test for `GetDatabaseRoles` was failing on Cloudberry\nbecause the expected password hash format did not match the actual\nvalue returned by the database.\n\nThe test was hard-coded to expect an MD5 password hash, but the\nCloudberry instance uses the more secure SCRAM-SHA-256 by default(PostgreSQL 14).\nThis resulted in a string mismatch failure.\n\nThis commit adapts the test to handle this difference specifically for\nCloudberry. When running against a Cloudberry instance, the test now:\n1. Asserts that the returned password hash has the \"SCRAM-SHA-256$\"\n   prefix, confirming the correct algorithm is used.\n2. Clears the password fields from both the expected and actual structs\n   before the final comparison, as the full salted hash is unpredictable.\n\nThe test logic for all Greenplum DB versions remains unchanged, preserving\nthe original MD5 hash validation for those environments."
    },
    {
      "commit": "60d609116b66b48d3a9e386059e59b6dd792d22e",
      "tree": "2f069ff00501900357cd9bcfb24d85881d48190e",
      "parents": [
        "183c842ea0cb5d09599aaff37869e4271a4fdb60"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 26 16:25:58 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 16:25:58 2025 +0800"
      },
      "message": "fix(test): Use DROP EXTENSION to clean up language in Cloudberry (#22)\n\nThe test for procedural language metadata was failing during cleanup\non Cloudberry. The test creates a procedural language (e.g., plpython3u)\nand defers a `DROP LANGUAGE` command to clean it up.\n\nThis fails because Cloudberry, being based on a newer PostgreSQL\nversion (14), treats `CREATE LANGUAGE` as a wrapper for `CREATE\nEXTENSION`. This creates a dependency where the language is owned by the\nextension and cannot be dropped directly. The correct cleanup command\nis `DROP EXTENSION`.\n\nThis commit adapts the test\u0027s cleanup logic. It now checks if the\ndatabase is Cloudberry:\n- If it is, it defers `DROP EXTENSION`.\n- Otherwise, it continues to use `DROP LANGUAGE` for compatibility with\n  older Greenplum versions.\n\nThis ensures the test cleans up correctly on both platforms."
    },
    {
      "commit": "183c842ea0cb5d09599aaff37869e4271a4fdb60",
      "tree": "c24b549376bd8bd4fcb2fa9d389bdbff75b455da",
      "parents": [
        "b1d073928341f75817214868c8b6d07667b0d3bf"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 26 16:25:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 16:25:13 2025 +0800"
      },
      "message": "fix(test): Enable operator metadata schema test on Cloudberry (#21)\n\nThe test for schema-filtered operator metadata would previously fail\non Cloudberry instances. This was because its setup relied on creating\npostfix (unary) operators, a feature Cloudberry does not support.\n\nThis commit refactors the test to use a binary operator, which is\ncompatible with both Greenplum and Cloudberry. This change fixes the\nfailing test and ensures this core functionality is now tested across\nall platforms, increasing our test coverage."
    },
    {
      "commit": "b1d073928341f75817214868c8b6d07667b0d3bf",
      "tree": "0835338caedf9ba16b2fec783f321b6123cc3934",
      "parents": [
        "ad2fdc3f6e7399d085ee97be088858551717d0a6"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 26 14:26:52 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 14:26:52 2025 +0800"
      },
      "message": "fix(test): Make column encoding check order-insensitive (#19)\n\nThe integration test for `GetColumnDefinitions` was failing on\nCloudberry because it returned column encoding options in a different\norder than Greenplum 7. For example, for a default encoding, GPDB7\nreturned \"...,blocksize\u003d32768,compresslevel\u003d0\" while Cloudberry returned\n\"...,compresslevel\u003d0,blocksize\u003d32768\".\n\nThe test was performing a strict string comparison on the `Encoding`\nfield, making it brittle and dependent on ordering.\n\nThis commit fixes the test by making the comparison order-insensitive.\nInstead of comparing the `Encoding` string directly, the test now:\n1. Splits the expected and actual encoding strings into slices of\n   key-value pairs.\n2. Uses `gomega.ConsistOf` to assert that both slices contain the\n   same elements, regardless of their order.\n3. Continues to use `structmatcher` for all other fields in the\n   `ColumnDefinition` struct.\n\nThis approach makes the test more robust and correctly validates the\nencoding options across different database environments without being\naffected by ordering differences."
    },
    {
      "commit": "ad2fdc3f6e7399d085ee97be088858551717d0a6",
      "tree": "2eb961e7694f3eb032041a7cb99ec95b7ada2c71",
      "parents": [
        "5d9ec2572802301d222019a3b91d2814d7a658ed"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 26 14:20:59 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 14:20:59 2025 +0800"
      },
      "message": "fix(test): Enable operator schema filter test on Cloudberry (#18)\n\nThe test for schema-filtered operators would previously fail when run\nagainst a Cloudberry instance. This was because it relied on creating\na postfix (unary) operator, a feature not supported by Cloudberry.\n\nThis commit refactors the test to use a binary operator instead.\nBinary operators are supported by both Greenplum and Cloudberry, which\nallows the test for this core schema-filtering functionality to run\nsuccessfully on all platforms.\n\nThis change fixes a failing test and increases test coverage for\na core feature on Cloudberry."
    },
    {
      "commit": "5d9ec2572802301d222019a3b91d2814d7a658ed",
      "tree": "fdf6c06077da8d7dc0aa52e1bad3c8312c3a03eb",
      "parents": [
        "91a99d518f279ba1f9d1fe80383542fa0c58f3be"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 26 14:19:30 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 26 14:19:30 2025 +0800"
      },
      "message": "fix(test): Skip postfix operator tests on Cloudberry (#17)\n\nThe integration tests for creating postfix operators were failing on\nCloudberry because it does not support creating an operator with only\na LEFTARG. This is an intentional design difference from Greenplum 7,\nas Cloudberry is based on a newer PostgreSQL version (14) that removed\nthis feature.\n\nInstead of adapting the tests to assert an error, which would be testing\na negative case, this commit modifies them to be skipped entirely when\nrunning against Cloudberry.\n\nThis approach is cleaner because the feature being tested is fundamentally\nabsent on this platform. It keeps the test suite passing on Cloudberry\nwhile preserving the original test logic for Greenplum 7 and other\ncompatible databases."
    },
    {
      "commit": "91a99d518f279ba1f9d1fe80383542fa0c58f3be",
      "tree": "93d47c9422c708c4196a82386c4a43a2439694cb",
      "parents": [
        "ea618100095ac1518d7dc7e6dc9ff80a7fff5860"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 21 08:53:11 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 21 08:53:11 2025 +0800"
      },
      "message": "feat(backup): Add support for Cloudberry remote storage objects (#16)\n\nThis commit introduces comprehensive support for backing up and restoring\nCloudberry-specific remote storage objects, including remote\ntablespaces, storage servers, and storage user mappings.\n\nKey changes include:\n\n1.Generic Option Parsing Refactoring\n2.Enhanced Tablespace Backup\n3.Storage Server \u0026 User Mapping Support\n4.Comprehensive Testing"
    },
    {
      "commit": "ea618100095ac1518d7dc7e6dc9ff80a7fff5860",
      "tree": "83e1a38621b5c639744f7e0c69db8a295d5e2a1d",
      "parents": [
        "1a786a1cc466fd225dc7016513a81e4f33cdc553"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Thu Aug 07 11:14:32 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 07 11:14:32 2025 +0800"
      },
      "message": "Fix: Schema pg_ext_aux already exists error (#15)\n\nThe namespace pg_ext_aux change to system table and Pax will store some aux table in it.\nshould not create it in gpbackup, because after preload pax, the table under pg_ext_aux\nwill be created.\n\nCo-authored-by: zhoujiaqi \u003czhoujiaqi@hashdata.cn\u003e"
    },
    {
      "commit": "1a786a1cc466fd225dc7016513a81e4f33cdc553",
      "tree": "d146f2b1a825452098d5b2a310a40ba1172036d2",
      "parents": [
        "b3883aeccb3417b6daa28f7c5c68e0dbadff0456"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Tue Aug 05 10:08:51 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 05 10:08:51 2025 +0800"
      },
      "message": "feat(backup): Implement database-specific logic for Cloudberry (#14)\n\nFollowing the introduction of database type detection (GPDB vs. CBDB)\nin the underlying common library, this commit applies that new\ncapability throughout the gpbackup codebase.\n\nPreviously, all version-based feature checks implicitly assumed the\ntarget database was Greenplum. This was insufficient and could lead\nto incorrect behavior when running against Apache Cloudberry Database,\nas features might be enabled or disabled based on a versioning\nscheme that doesn\u0027t apply.\n\nThis change systematically updates version-sensitive conditional\nlogic to be database-aware. It uses the new `IsGPDB()` and `IsCBDB()`\nhelpers to create compound checks.\n\nFor example, logic previously guarded by `version.AtLeast(\"7\")` is now\nupdated to `(version.IsGPDB() \u0026\u0026 version.AtLeast(\"7\")) || version.IsCBDB()`.\nThis correctly scopes features to specific GPDB versions while\nenabling them by default for Cloudberry where appropriate.\n\nThis is a critical step to ensure that gpbackup functions reliably\nand generates correct backup files for both Greenplum and Cloudberry\nenvironments."
    },
    {
      "commit": "b3883aeccb3417b6daa28f7c5c68e0dbadff0456",
      "tree": "1e1f7e93a0ed4792bc0f17ed86a25629b406359b",
      "parents": [
        "78ca03548f57c7beaed97699d150749a80144876"
      ],
      "author": {
        "name": "Robert Mu",
        "email": "dbx_c@hotmail.com",
        "time": "Wed Jul 30 10:46:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 30 10:46:38 2025 +0800"
      },
      "message": "feat: Enable Cloudberry DB support via new dependency (#13)\n\nSwitch from the upstream `gp-common-go-libs` to the `cloudberrydb` fork.\n\nThis is necessary to import new version-parsing logic that allows the tool\nto correctly differentiate between Greenplum and Apache Cloudberry Database,\nwhich is a prerequisite for proper Cloudberry DB backup support."
    },
    {
      "commit": "78ca03548f57c7beaed97699d150749a80144876",
      "tree": "390722d696ebb4d198f43a3cd0b64c3d7cab69c1",
      "parents": [
        "9344de8afd635cd37049c8b52746b2e62d56aed6"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Mon May 20 17:16:42 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Mon May 20 17:16:42 2024 -0700"
      },
      "message": "Revert \"Revert \"Change MEMORY_LIMIT to MEMORY_QUOTA in end to end test for gp7\"\"\n\nThis reverts commit 3301ac8fd4192672133ad54680f17ce319f3b76f.\n\nThe gpdb changes for all OS platforms have now passed tests so we have access\nto the new behavior in all versions\n"
    },
    {
      "commit": "9344de8afd635cd37049c8b52746b2e62d56aed6",
      "tree": "5ea72875c466e3d175be048fdb603e3d0b464c83",
      "parents": [
        "89daab1885b316b4087e0bc04954fe9caab8e8c2"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Mon May 20 12:16:30 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "karen.huddleston@broadcom.com",
        "time": "Mon May 20 14:00:27 2024 -0700"
      },
      "message": "Move Progress log to gpbackup\n\nWe had previously added a Progress command to gplog that would let us log at INFO\nlevel to the log file and VERBOSE level to stdout. Then we found other places\nwhere controlling different levels to shell and log file would be useful to we\nadded a new Custom function to be more general. Since gpbackup is the only\nproject that uses this Progress command, we can move the function here and use the\nnew Custom function to implement it.\n"
    },
    {
      "commit": "89daab1885b316b4087e0bc04954fe9caab8e8c2",
      "tree": "2254feeffb4e719b2b54ec02f57d8068409af7f7",
      "parents": [
        "a379159c7900f702ad2584aec703f113bee6038b"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Wed May 15 18:23:45 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "karen.huddleston@broadcom.com",
        "time": "Fri May 17 14:26:02 2024 -0700"
      },
      "message": "Modify scale test data to better exercise discovered slowdown\n\nWe found a slowdown with a customer caused by us polling on ENXIO errors while\nwaiting for a previous COPY command to finish and connect with the next one. We\nmight wait up to a minute. To see this we need a good number of tables and we\nneed them to be large enough to trigger the backoff. Testing by creating a\npartition table with 100 partitions and loading around 14GB of data. We make it\nuneven across partitions so some are larger than others.\n\nIf we have this table we can remove the smaller 100 tables we had before and\nalso reduce the number of tiny tables we had.\n"
    },
    {
      "commit": "a379159c7900f702ad2584aec703f113bee6038b",
      "tree": "cc9cbce2c6c4caf78eebe0eb32b743862964c2d9",
      "parents": [
        "5dc476e89a4eeca4a796e3fb3d25cce20b975610"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Fri May 10 15:12:36 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "karen.huddleston@broadcom.com",
        "time": "Fri May 17 14:01:26 2024 -0700"
      },
      "message": "Enable verbose logging for end to end gprestore commands\n\nSwitch gprestore calls that should be successful to use gprestore() helper\nfunction that adds --verbose internally. Add --verbose to arg lists for ones\nthat are expected to fail.\n"
    },
    {
      "commit": "5dc476e89a4eeca4a796e3fb3d25cce20b975610",
      "tree": "2161ed00d67bdeb08f7b5d133a76d37c3ece6f1d",
      "parents": [
        "65853d7fa2b75b094216f5a3c8e9328fce4835a6"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Thu May 16 13:35:44 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "karen.huddleston@broadcom.com",
        "time": "Fri May 17 14:01:26 2024 -0700"
      },
      "message": "Replace backoff while waiting for pipe with short static sleep\n\nWe added this backoff wait when we were having test hangs caused by other\nerrors. The backoff didn\u0027t end up helping and introduced a potentially serious\nperformance regression when running restore with many tables. Replace the\nbackoff with a static sleep of 50ms while we wait for COPY to connect to the\npipe. This returns to similar behavior from older gpbackup versions. The 50ms\nsleep should also prevent the CPU from being too busy while we wait.\n"
    },
    {
      "commit": "65853d7fa2b75b094216f5a3c8e9328fce4835a6",
      "tree": "e8f5df2d01bc48172452f1cbbdbeec41ea95f942",
      "parents": [
        "3301ac8fd4192672133ad54680f17ce319f3b76f"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Fri May 10 16:35:51 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "karen.huddleston@broadcom.com",
        "time": "Tue May 14 14:14:11 2024 -0700"
      },
      "message": "Check for \"Cleanup complete\" in tests\n\nIf the process hasn\u0027t gotten far enough before termination, gpbackup or\ngprestore might skip calling helper cleanup functions. Our tests may flake if\nthey don\u0027t expect that. We should trust the cleanup function to do the cleanup\nit needs so checking for \"Cleanup complete\" is enough. We still check that the\nartifacts are actually cleaned, just not the log messages.\n"
    },
    {
      "commit": "3301ac8fd4192672133ad54680f17ce319f3b76f",
      "tree": "736e3bd617c3e19deda2683a1d2afc28bb917b68",
      "parents": [
        "8335cfa651f6871bff9d1115eb05d878f1e07250"
      ],
      "author": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Tue May 14 11:32:59 2024 -0700"
      },
      "committer": {
        "name": "Karen Huddleston",
        "email": "khuddleston@vmware.com",
        "time": "Tue May 14 11:32:59 2024 -0700"
      },
      "message": "Revert \"Change MEMORY_LIMIT to MEMORY_QUOTA in end to end test for gp7\"\n\nThis reverts commit 8335cfa651f6871bff9d1115eb05d878f1e07250.\n\nThe change hasn\u0027t passed the pipeline for all os versions yet so will revert it\nfor now and pin to an older gpdb version until that gets fixed.\n"
    }
  ],
  "next": "8335cfa651f6871bff9d1115eb05d878f1e07250"
}
