1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-12 10:04:14 +02:00

Backup key/value annotations.

Allow key/value annotations to be added with the backup command and added/modified/removed with the new annotate command.

Annotations can be viewed with the info command in text mode when --set is specified and are always included in JSON output.
This commit is contained in:
Stefan Fercot 2022-08-24 16:52:33 +02:00 committed by GitHub
parent b05d31f531
commit 381fd0a5a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 977 additions and 11 deletions

View File

@ -16,6 +16,21 @@
<release-list>
<release date="XXXX-XX-XX" version="2.41dev" title="UNDER DEVELOPMENT">
<release-core-list>
<release-feature-list>
<release-item>
<github-issue id="1709"/>
<github-pull-request id="1724"/>
<release-item-contributor-list>
<release-item-ideator id="adam.berlin"/>
<release-item-contributor id="stefan.fercot"/>
<release-item-reviewer id="david.steele"/>
</release-item-contributor-list>
<p>Backup key/value annotations.</p>
</release-item>
</release-feature-list>
<release-improvement-list>
<release-item>
<github-issue id="1816"/>
@ -11399,6 +11414,11 @@
<contributor-id type="github">abubakarm94</contributor-id>
</contributor>
<contributor id="adam.berlin">
<contributor-name-display>Adam Berlin</contributor-name-display>
<contributor-id type="github">berlin-ab</contributor-id>
</contributor>
<contributor id="adam.brusselback">
<contributor-name-display>Adam Brusselback</contributor-name-display>
<contributor-id type="github">Tostino</contributor-id>

View File

@ -1566,6 +1566,53 @@
<p>While file bundling is generally more efficient, the downside is that it is more difficult to manually retrieve files from the repository. It may not be ideal for deduplicated storage since each full backup will arrange files in the bundles differently. Lastly, file bundles cannot be resumed, so be careful not to set <br-option>repo-bundle-size</br-option> too high.</p>
</section>
<!-- =================================================================================================================== -->
<section id="annotate">
<title>Backup Annotations</title>
<p>Users can attach informative key/value pairs to the backup. This option may be used multiple times to attach multiple annotations.</p>
<execute-list host="{[host-pg1]}">
<title>Perform a full backup with annotations</title>
<execute user="postgres">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-annotation=source="demo backup"
{[dash]}-annotation=key=value {[dash]}-type=full backup</exe-cmd>
</execute>
</execute-list>
<p>Annotations are output by the <cmd>info</cmd> command text output when a backup is specified with <br-option>--set</br-option> and always appear in the JSON output.</p>
<execute-list host="{[host-pg1]}">
<title>Get info for the {[postgres-cluster-demo]} cluster</title>
<execute user="postgres" show="n" variable-key="backup-annotate-last">
<exe-cmd>{[cmd-backup-last]}</exe-cmd>
</execute>
<execute user="postgres" filter="n" output="y">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-set={[backup-annotate-last]} info</exe-cmd>
<exe-highlight>annotation</exe-highlight>
</execute>
</execute-list>
<p>Annotations included with the <cmd>backup</cmd> command can be added, modified, or removed afterwards using the <cmd>annotate</cmd> command.</p>
<execute-list host="{[host-pg1]}">
<title>Change backup annotations</title>
<execute user="postgres">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-set={[backup-annotate-last]}
{[dash]}-annotation=key= {[dash]}-annotation=new_key=new_value annotate</exe-cmd>
</execute>
<execute user="postgres" filter="n" output="y">
<exe-cmd>{[project-exe]} {[dash]}-stanza={[postgres-cluster-demo]} {[dash]}-set={[backup-annotate-last]} info</exe-cmd>
<exe-highlight>annotation</exe-highlight>
</execute>
</execute-list>
</section>
</section>
<!-- ======================================================================================================================= -->

View File

@ -52,6 +52,7 @@ SRCS_COMMON = \
storage/write.c
SRCS = \
command/annotate/annotate.c \
command/archive/common.c \
command/archive/get/file.c \
command/archive/get/get.c \

View File

@ -31,6 +31,14 @@
# then the command is responsible for ensuring that the parameters are valid.
####################################################################################################################################
command:
annotate:
command-role:
remote: {}
lock-remote-required: true
lock-required: true
lock-type: backup
log-file: false
archive-get:
command-role:
async: {}
@ -320,6 +328,8 @@ option:
type: string
required: false
command:
annotate:
required: true
expire: {}
info:
depend:
@ -335,6 +345,7 @@ option:
stanza:
type: string
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -478,6 +489,7 @@ option:
required: false
allow-range: [0, 1024]
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -505,6 +517,7 @@ option:
- pg
- repo
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -614,6 +627,7 @@ option:
- 8MiB
- 16MiB
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -690,6 +704,7 @@ option:
default: 3
allow-range: [0, 9]
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -789,6 +804,7 @@ option:
type: path
default: /tmp/pgbackrest
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -806,6 +822,7 @@ option:
type: boolean
default: true
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -845,6 +862,7 @@ option:
default: 1830
allow-range: [0.1, 604800]
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -1002,6 +1020,7 @@ option:
type: boolean
default: false
command:
annotate: {}
archive-get: {}
archive-push: {}
backup: {}
@ -1079,6 +1098,17 @@ option:
# Backup options
#---------------------------------------------------------------------------------------------------------------------------------
annotation:
section: global
type: hash
required: false
command:
annotate:
required: true
backup: {}
command-role:
main: {}
archive-check:
section: global
type: boolean
@ -1520,6 +1550,10 @@ option:
required: false
allow-range: [1, 256]
command:
annotate:
command-role:
main: {}
remote: {}
archive-get:
command-role:
async: {}
@ -1595,6 +1629,7 @@ option:
internal: true
default: false
command:
annotate: {}
archive-get: {}
archive-push: {}
backup:
@ -1630,6 +1665,10 @@ option:
- posix
- s3
command:
annotate:
command-role:
main: {}
remote: {}
archive-get:
command-role:
async: {}
@ -1928,6 +1967,7 @@ option:
type: string
required: false
command:
annotate: {}
archive-get: {}
archive-push: {}
check: {}

View File

@ -1060,6 +1060,18 @@
</text>
<config-key-list>
<config-key id="annotation" name="Backup annotation(s)">
<summary>Annotate backup with user-defined key/value pairs.</summary>
<text>
<p>Users can attach informative key/value pairs to the backup. This option may be used multiple times to attach multiple annotations.</p>
<p>Annotations are output by the <cmd>info</cmd> command text output when a backup is specified with <br-option>--set</br-option> and always appear in the JSON output.</p>
</text>
<example>source="Sunday backup for website database"</example>
</config-key>
<config-key id="archive-check" name="Check Archive">
<summary>Check that WAL segments are in the archive before backup completes.</summary>
@ -1794,6 +1806,26 @@
</operation-general>
<command-list title="Commands">
<command id="annotate" name="Annotate">
<summary>Add or modify backup annotation.</summary>
<text>
<p>Annotations included with the <cmd>backup</cmd> command can be added, modified, or removed afterwards using the <cmd>annotate</cmd> command.</p>
</text>
<option-list>
<option id="set" name="Set">
<summary>Backup set to annotate.</summary>
<text>
<p>The backup set to annotate.</p>
</text>
<example>20150131-153358F_20150131-153401I</example>
</option>
</option-list>
</command>
<command id="backup" name="Backup">
<summary>Backup a database cluster.</summary>

View File

@ -0,0 +1,98 @@
/***********************************************************************************************************************************
Annotate Command
***********************************************************************************************************************************/
#include "build.auto.h"
#include <string.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
#include "command/annotate/annotate.h"
#include "command/backup/backup.h"
#include "common/debug.h"
#include "common/log.h"
#include "common/memContext.h"
#include "common/regExp.h"
#include "config/config.h"
#include "common/crypto/cipherBlock.h"
#include "info/infoBackup.h"
#include "storage/helper.h"
/**********************************************************************************************************************************/
void
cmdAnnotate(void)
{
FUNCTION_LOG_VOID(logLevelDebug);
MEM_CONTEXT_TEMP_BEGIN()
{
// Initialize the repo index
unsigned int repoIdxMin = 0;
unsigned int repoIdxMax = cfgOptionGroupIdxTotal(cfgOptGrpRepo) - 1;
// If the repo was specified then set index to the array location and max to loop only once
if (cfgOptionTest(cfgOptRepo))
{
repoIdxMin = cfgOptionGroupIdxDefault(cfgOptGrpRepo);
repoIdxMax = repoIdxMin;
}
// Check the backup label format
const String *const backupLabel = cfgOptionStr(cfgOptSet);
if (!regExpMatchOne(backupRegExpP(.full = true, .differential = true, .incremental = true), backupLabel))
THROW_FMT(OptionInvalidValueError, "'%s' is not a valid backup label format", strZ(backupLabel));
// Track the number of backup sets to update in the backup info file and any errors that may occur
unsigned int backupTotalProcessed = 0;
unsigned int errorTotal = 0;
for (unsigned int repoIdx = repoIdxMin; repoIdx <= repoIdxMax; repoIdx++)
{
TRY_BEGIN()
{
// Attempt to load the backup info file
const CipherType repoCipherType = cfgOptionIdxStrId(cfgOptRepoCipherType, repoIdx);
InfoBackup *infoBackup = infoBackupLoadFileReconstruct(
storageRepoIdx(repoIdx), INFO_BACKUP_PATH_FILE_STR, repoCipherType,
cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx));
if (infoBackupLabelExists(infoBackup, backupLabel))
{
// Backup label found in backup.info
backupTotalProcessed++;
LOG_INFO_FMT(
"backup set '%s' to annotate found in %s",
strZ(backupLabel), cfgOptionGroupName(cfgOptGrpRepo, repoIdx));
// Update annotations
infoBackupDataAnnotationSet(infoBackup, backupLabel, cfgOptionKv(cfgOptAnnotation));
// Write the updated backup info
infoBackupSaveFile(
infoBackup, storageRepoWrite(), INFO_BACKUP_PATH_FILE_STR, repoCipherType,
cfgOptionIdxStrNull(cfgOptRepoCipherPass, repoIdx));
}
}
CATCH_ANY()
{
LOG_ERROR_FMT(errorTypeCode(errorType()), "%s: %s", cfgOptionGroupName(cfgOptGrpRepo, repoIdx), errorMessage());
errorTotal++;
}
TRY_END();
}
// Error if any errors encountered on one or more repos
if (errorTotal > 0)
THROW_FMT(CommandError, CFGCMD_ANNOTATE " command encountered %u error(s), check the log file for details", errorTotal);
if (backupTotalProcessed == 0)
THROW(BackupSetInvalidError, "no backup set to annotate found");
}
MEM_CONTEXT_TEMP_END();
FUNCTION_LOG_RETURN_VOID();
}

View File

@ -0,0 +1,13 @@
/***********************************************************************************************************************************
Annotate Command
***********************************************************************************************************************************/
#ifndef COMMAND_ANNOTATE_ANNOTATE_H
#define COMMAND_ANNOTATE_ANNOTATE_H
/***********************************************************************************************************************************
Functions
***********************************************************************************************************************************/
// Add or modify backup annotations
void cmdAnnotate(void);
#endif

View File

@ -2284,7 +2284,8 @@ cmdBackup(void)
backupStopResult.lsn, backupStopResult.walSegmentName, infoPg.id, infoPg.systemId, backupStartResult.dbList,
cfgOptionBool(cfgOptArchiveCheck), cfgOptionBool(cfgOptArchiveCopy), cfgOptionUInt(cfgOptBufferSize),
cfgOptionUInt(cfgOptCompressLevel), cfgOptionUInt(cfgOptCompressLevelNetwork), cfgOptionBool(cfgOptRepoHardlink),
cfgOptionUInt(cfgOptProcessMax), cfgOptionBool(cfgOptBackupStandby));
cfgOptionUInt(cfgOptProcessMax), cfgOptionBool(cfgOptBackupStandby),
cfgOptionTest(cfgOptAnnotation) ? cfgOptionKv(cfgOptAnnotation) : NULL);
// The primary db object won't be used anymore so free it
dbFree(backupData->dbPrimary);

View File

@ -34,6 +34,7 @@ VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MIN_VAR, "min");
VARIANT_STRDEF_STATIC(ARCHIVE_KEY_MAX_VAR, "max");
VARIANT_STRDEF_STATIC(BACKREST_KEY_FORMAT_VAR, "format");
VARIANT_STRDEF_STATIC(BACKREST_KEY_VERSION_VAR, "version");
VARIANT_STRDEF_STATIC(BACKUP_KEY_ANNOTATION_VAR, "annotation");
VARIANT_STRDEF_STATIC(BACKUP_KEY_BACKREST_VAR, "backrest");
VARIANT_STRDEF_STATIC(BACKUP_KEY_ERROR_VAR, "error");
VARIANT_STRDEF_STATIC(BACKUP_KEY_ERROR_LIST_VAR, "error-list");
@ -469,6 +470,10 @@ backupListAdd(
kvPut(lsnInfo, KEY_STOP_VAR, VARSTR(backupData->backupLsnStop));
}
// Add annotations to json output or --set text
if ((outputJson || backupLabelMatch) && backupData->backupAnnotation != NULL)
kvPut(varKv(backupInfo), BACKUP_KEY_ANNOTATION_VAR, backupData->backupAnnotation);
// If a backup label was specified and this is that label, then get the data from the loaded manifest
if (backupLabelMatch)
{
@ -955,6 +960,25 @@ formatTextBackup(const DbGroup *dbGroup, String *resultStr)
else
strCatZ(resultStr, " error(s) detected during backup\n");
}
// Annotations metadata
if (kvGet(backupInfo, BACKUP_KEY_ANNOTATION_VAR) != NULL)
{
const KeyValue *const annotationKv = varKv(kvGet(backupInfo, BACKUP_KEY_ANNOTATION_VAR));
const StringList *const annotationKeyList = strLstNewVarLst(kvKeyList(annotationKv));
String *const annotationStr = strNew();
for (unsigned int keyIdx = 0; keyIdx < strLstSize(annotationKeyList); keyIdx++)
{
const String *const key = strLstGet(annotationKeyList, keyIdx);
const String *const value = varStr(kvGet(annotationKv, VARSTR(key)));
ASSERT(value != NULL);
strCatFmt(annotationStr, " %s: %s\n", strZ(key), strZ(value));
}
strCatFmt(resultStr, " annotation(s)\n%s", strZ(annotationStr));
}
}
FUNCTION_TEST_RETURN_VOID();

View File

@ -331,3 +331,38 @@ kvGetList(const KeyValue *const this, const Variant *const key)
FUNCTION_TEST_RETURN(VARIANT_LIST, result);
}
/**********************************************************************************************************************************/
KeyValue *
kvRemove(KeyValue *this, const Variant *key)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(KEY_VALUE, this);
FUNCTION_TEST_PARAM(VARIANT, key);
FUNCTION_TEST_END();
ASSERT(this != NULL);
ASSERT(key != NULL);
// Find the key
unsigned int listIdx = kvGetIdx(this, key);
// If the key was found, remove it
if (listIdx != KEY_NOT_FOUND)
{
// Free the key/value being removed and remove from the list
KeyValuePair *const pair = (KeyValuePair *)lstGet(this->list, listIdx);
varFree(pair->key);
varFree(pair->value);
lstRemoveIdx(this->list, listIdx);
// Remove from the key list (index must be the same as the key/value list)
ASSERT(varEq(key, varLstGet(this->pub.keyList, listIdx)));
varFree(varLstGet(this->pub.keyList, listIdx));
lstRemoveIdx((List *)this->pub.keyList, listIdx);
}
FUNCTION_TEST_RETURN(KEY_VALUE, this);
}

View File

@ -80,6 +80,9 @@ kvKeyExists(const KeyValue *const this, const Variant *const key)
// Get a value as a list (even if there is only one value) using the key
VariantList *kvGetList(const KeyValue *this, const Variant *key);
// Remove a key/value pair
KeyValue *kvRemove(KeyValue *this, const Variant *key);
/***********************************************************************************************************************************
Destructor
***********************************************************************************************************************************/

View File

@ -9,6 +9,7 @@ Automatically generated by 'build-code config' -- do not modify directly.
/***********************************************************************************************************************************
Command constants
***********************************************************************************************************************************/
#define CFGCMD_ANNOTATE "annotate"
#define CFGCMD_ARCHIVE_GET "archive-get"
#define CFGCMD_ARCHIVE_PUSH "archive-push"
#define CFGCMD_BACKUP "backup"
@ -32,7 +33,7 @@ Command constants
#define CFGCMD_VERIFY "verify"
#define CFGCMD_VERSION "version"
#define CFG_COMMAND_TOTAL 22
#define CFG_COMMAND_TOTAL 23
/***********************************************************************************************************************************
Option group constants
@ -42,6 +43,7 @@ Option group constants
/***********************************************************************************************************************************
Option constants
***********************************************************************************************************************************/
#define CFGOPT_ANNOTATION "annotation"
#define CFGOPT_ARCHIVE_ASYNC "archive-async"
#define CFGOPT_ARCHIVE_CHECK "archive-check"
#define CFGOPT_ARCHIVE_COPY "archive-copy"
@ -128,7 +130,7 @@ Option constants
#define CFGOPT_TYPE "type"
#define CFGOPT_VERBOSE "verbose"
#define CFG_OPTION_TOTAL 156
#define CFG_OPTION_TOTAL 157
/***********************************************************************************************************************************
Option value constants
@ -317,6 +319,7 @@ Command enum
***********************************************************************************************************************************/
typedef enum
{
cfgCmdAnnotate,
cfgCmdArchiveGet,
cfgCmdArchivePush,
cfgCmdBackup,
@ -356,6 +359,7 @@ Option enum
***********************************************************************************************************************************/
typedef enum
{
cfgOptAnnotation,
cfgOptArchiveAsync,
cfgOptArchiveCheck,
cfgOptArchiveCopy,

View File

@ -328,6 +328,21 @@ Command parse data
static const ParseRuleCommand parseRuleCommand[CFG_COMMAND_TOTAL] =
{
PARSE_RULE_COMMAND // cmd/annotate
( // cmd/annotate
PARSE_RULE_COMMAND_NAME("annotate"), // cmd/annotate
PARSE_RULE_COMMAND_LOCK_REQUIRED(true), // cmd/annotate
PARSE_RULE_COMMAND_LOCK_REMOTE_REQUIRED(true), // cmd/annotate
PARSE_RULE_COMMAND_LOCK_TYPE(lockTypeBackup), // cmd/annotate
PARSE_RULE_COMMAND_LOG_LEVEL_DEFAULT(logLevelInfo), // cmd/annotate
// cmd/annotate
PARSE_RULE_COMMAND_ROLE_VALID_LIST // cmd/annotate
( // cmd/annotate
PARSE_RULE_COMMAND_ROLE(cfgCmdRoleMain) // cmd/annotate
PARSE_RULE_COMMAND_ROLE(cfgCmdRoleRemote) // cmd/annotate
), // cmd/annotate
), // cmd/annotate
// -----------------------------------------------------------------------------------------------------------------------------
PARSE_RULE_COMMAND // cmd/archive-get
( // cmd/archive-get
PARSE_RULE_COMMAND_NAME("archive-get"), // cmd/archive-get
@ -663,6 +678,35 @@ Option parse data
static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
{
PARSE_RULE_OPTION // opt/annotation
( // opt/annotation
PARSE_RULE_OPTION_NAME("annotation"), // opt/annotation
PARSE_RULE_OPTION_TYPE(cfgOptTypeHash), // opt/annotation
PARSE_RULE_OPTION_RESET(true), // opt/annotation
PARSE_RULE_OPTION_REQUIRED(false), // opt/annotation
PARSE_RULE_OPTION_SECTION(cfgSectionGlobal), // opt/annotation
PARSE_RULE_OPTION_MULTI(true), // opt/annotation
// opt/annotation
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/annotation
( // opt/annotation
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/annotation
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/annotation
), // opt/annotation
// opt/annotation
PARSE_RULE_OPTIONAL // opt/annotation
( // opt/annotation
PARSE_RULE_OPTIONAL_GROUP // opt/annotation
( // opt/annotation
PARSE_RULE_FILTER_CMD // opt/annotation
( // opt/annotation
PARSE_RULE_VAL_CMD(cfgCmdAnnotate), // opt/annotation
), // opt/annotation
// opt/annotation
PARSE_RULE_OPTIONAL_REQUIRED(), // opt/annotation
), // opt/annotation
), // opt/annotation
), // opt/annotation
// -----------------------------------------------------------------------------------------------------------------------------
PARSE_RULE_OPTION // opt/archive-async
( // opt/archive-async
PARSE_RULE_OPTION_NAME("archive-async"), // opt/archive-async
@ -1076,6 +1120,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/buffer-size
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/buffer-size
( // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/buffer-size
@ -1113,6 +1158,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/buffer-size
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/buffer-size
( // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/buffer-size
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/buffer-size
@ -1353,6 +1399,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/compress-level-network
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/compress-level-network
( // opt/compress-level-network
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/compress-level-network
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/compress-level-network
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/compress-level-network
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/compress-level-network
@ -1453,6 +1500,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/config
( // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config
@ -1492,6 +1540,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/config
( // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config
@ -1530,6 +1579,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config-include-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/config-include-path
( // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config-include-path
@ -1569,6 +1619,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config-include-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/config-include-path
( // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config-include-path
@ -1607,6 +1658,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/config-path
( // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config-path
@ -1646,6 +1698,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/config-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/config-path
( // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/config-path
@ -1852,6 +1905,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/exec-id
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/exec-id
( // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/exec-id
@ -1891,6 +1945,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/exec-id
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/exec-id
( // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/exec-id
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/exec-id
@ -2029,6 +2084,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/io-timeout
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/io-timeout
( // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/io-timeout
@ -2066,6 +2122,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/io-timeout
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/io-timeout
( // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/io-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/io-timeout
@ -2297,6 +2354,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/lock-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/lock-path
( // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/lock-path
@ -2326,6 +2384,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/lock-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/lock-path
( // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/lock-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/lock-path
@ -2358,6 +2417,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-console
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-level-console
( // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-console
@ -2397,6 +2457,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-console
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-level-console
( // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-console
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-console
@ -2448,6 +2509,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-file
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-level-file
( // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-file
@ -2487,6 +2549,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-file
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-level-file
( // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-file
@ -2538,6 +2601,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-level-stderr
( // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-stderr
@ -2577,6 +2641,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-level-stderr
( // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-level-stderr
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-level-stderr
@ -2628,6 +2693,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-path
( // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-path
@ -2667,6 +2733,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-path
( // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-path
@ -2707,6 +2774,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-subprocess
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-subprocess
( // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-subprocess
@ -2741,6 +2809,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-subprocess
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-subprocess
( // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-subprocess
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-subprocess
@ -2781,6 +2850,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-timestamp
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/log-timestamp
( // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-timestamp
@ -2820,6 +2890,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/log-timestamp
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/log-timestamp
( // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/log-timestamp
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/log-timestamp
@ -2892,6 +2963,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/neutral-umask
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/neutral-umask
( // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/neutral-umask
@ -2928,6 +3000,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/neutral-umask
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/neutral-umask
( // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/neutral-umask
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/neutral-umask
@ -3935,6 +4008,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/process
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/process
( // opt/process
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/process
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/process
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/process
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/process
@ -4017,6 +4091,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/protocol-timeout
( // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/protocol-timeout
@ -4052,6 +4127,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/protocol-timeout
( // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/protocol-timeout
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/protocol-timeout
@ -4189,6 +4265,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/remote-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/remote-type
( // opt/remote-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/remote-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/remote-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/remote-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/remote-type
@ -4228,6 +4305,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo
( // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdExpire) // opt/repo
@ -4257,6 +4335,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo
( // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo
@ -4299,6 +4378,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-account
( // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-account
@ -4334,6 +4414,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-account
( // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-account
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-account
@ -4375,6 +4456,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-container
( // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-container
@ -4410,6 +4492,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-container
( // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-container
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-container
@ -4452,6 +4535,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-endpoint
( // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-endpoint
@ -4487,6 +4571,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-endpoint
( // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-endpoint
@ -4534,6 +4619,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-key
( // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-key
@ -4569,6 +4655,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-key
( // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-key
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-key
@ -4610,6 +4697,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-key-type
( // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-key-type
@ -4645,6 +4733,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-key-type
( // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-key-type
@ -4698,6 +4787,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-azure-uri-style
( // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-azure-uri-style
@ -4733,6 +4823,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-azure-uri-style
( // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-azure-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-azure-uri-style
@ -4896,6 +4987,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-cipher-pass
( // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-cipher-pass
@ -4931,6 +5023,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-cipher-pass
( // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-cipher-pass
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-cipher-pass
@ -4973,6 +5066,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-cipher-type
( // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-cipher-type
@ -5008,6 +5102,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-cipher-type
( // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-cipher-type
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-cipher-type
@ -5055,6 +5150,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-gcs-bucket
( // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-gcs-bucket
@ -5090,6 +5186,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-gcs-bucket
( // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-gcs-bucket
@ -5130,6 +5227,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-gcs-endpoint
( // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-gcs-endpoint
@ -5165,6 +5263,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-gcs-endpoint
( // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-gcs-endpoint
@ -5211,6 +5310,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-gcs-key
( // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-gcs-key
@ -5246,6 +5346,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-gcs-key
( // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-key
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-gcs-key
@ -5288,6 +5389,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-gcs-key-type
( // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-gcs-key-type
@ -5323,6 +5425,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-gcs-key-type
( // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-gcs-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-gcs-key-type
@ -5412,6 +5515,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host
( // opt/repo-host
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host
@ -5470,6 +5574,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-ca-file
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-ca-file
( // opt/repo-host-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host-ca-file
@ -5528,6 +5633,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-ca-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-ca-path
( // opt/repo-host-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host-ca-path
@ -5586,6 +5692,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-cert-file
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-cert-file
( // opt/repo-host-cert-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-cert-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-cert-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-cert-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host-cert-file
@ -5644,6 +5751,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-cmd
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-cmd
( // opt/repo-host-cmd
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-cmd
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-cmd
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-cmd
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-cmd
@ -5698,6 +5806,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-config
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-config
( // opt/repo-host-config
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-config
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-config
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-config
@ -5757,6 +5866,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-config-include-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-config-include-path
( // opt/repo-host-config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-config-include-path
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-config-include-path
@ -5816,6 +5926,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-config-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-config-path
( // opt/repo-host-config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-config-path
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-config-path
@ -5875,6 +5986,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-key-file
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-key-file
( // opt/repo-host-key-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-key-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-key-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-key-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host-key-file
@ -5933,6 +6045,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-port
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-port
( // opt/repo-host-port
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-port
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-port
@ -5993,6 +6106,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-type
( // opt/repo-host-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-host-type
@ -6063,6 +6177,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-host-user
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-host-user
( // opt/repo-host-user
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-host-user
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-host-user
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-host-user
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-host-user
@ -6123,6 +6238,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-local
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-local
( // opt/repo-local
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-local
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-local
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-local
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-local
@ -6181,6 +6297,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-path
( // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-path
@ -6216,6 +6333,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-path
( // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-path
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-path
@ -6444,6 +6562,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-bucket
( // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-bucket
@ -6479,6 +6598,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-bucket
( // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-bucket
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-bucket
@ -6521,6 +6641,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-endpoint
( // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-endpoint
@ -6556,6 +6677,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-endpoint
( // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-endpoint
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-endpoint
@ -6599,6 +6721,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-key
( // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-key
@ -6634,6 +6757,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-key
( // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-key
@ -6677,6 +6801,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-key-secret
( // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-key-secret
@ -6712,6 +6837,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-key-secret
( // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key-secret
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-key-secret
@ -6753,6 +6879,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-key-type
( // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-key-type
@ -6788,6 +6915,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-key-type
( // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-key-type
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-key-type
@ -6842,6 +6970,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-kms-key-id
( // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-kms-key-id
@ -6877,6 +7006,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-kms-key-id
( // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-kms-key-id
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-kms-key-id
@ -6919,6 +7049,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-region
( // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-region
@ -6954,6 +7085,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-region
( // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-region
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-region
@ -6995,6 +7127,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-role
( // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-role
@ -7030,6 +7163,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-role
( // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-role
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-role
@ -7072,6 +7206,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-token
( // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-token
@ -7107,6 +7242,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-token
( // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-token
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-token
@ -7148,6 +7284,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-s3-uri-style
( // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-s3-uri-style
@ -7183,6 +7320,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-s3-uri-style
( // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-s3-uri-style
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-s3-uri-style
@ -7236,6 +7374,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-ca-file
( // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-ca-file
@ -7271,6 +7410,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-ca-file
( // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-ca-file
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-ca-file
@ -7314,6 +7454,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-ca-path
( // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-ca-path
@ -7349,6 +7490,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-ca-path
( // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-ca-path
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-ca-path
@ -7392,6 +7534,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-host
( // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-host
@ -7427,6 +7570,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-host
( // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-host
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-host
@ -7469,6 +7613,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-port
( // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-port
@ -7504,6 +7649,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-port
( // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-port
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-port
@ -7558,6 +7704,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-upload-chunk-size
( // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-upload-chunk-size
@ -7593,6 +7740,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-upload-chunk-size
( // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-upload-chunk-size
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-upload-chunk-size
@ -7643,6 +7791,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-storage-verify-tls
( // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-storage-verify-tls
@ -7678,6 +7827,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-storage-verify-tls
( // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-storage-verify-tls
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-storage-verify-tls
@ -7727,6 +7877,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-type
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/repo-type
( // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/repo-type
@ -7762,6 +7913,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/repo-type
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/repo-type
( // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/repo-type
PARSE_RULE_OPTION_COMMAND(cfgCmdCheck) // opt/repo-type
@ -7837,6 +7989,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/sck-block
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/sck-block
( // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/sck-block
@ -7874,6 +8027,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/sck-block
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/sck-block
( // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/sck-block
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/sck-block
@ -7914,6 +8068,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/sck-keep-alive
( // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/sck-keep-alive
@ -7951,6 +8106,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/sck-keep-alive
( // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/sck-keep-alive
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/sck-keep-alive
@ -7989,6 +8145,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/set
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/set
( // opt/set
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/set
PARSE_RULE_OPTION_COMMAND(cfgCmdExpire) // opt/set
PARSE_RULE_OPTION_COMMAND(cfgCmdInfo) // opt/set
PARSE_RULE_OPTION_COMMAND(cfgCmdRestore) // opt/set
@ -7998,6 +8155,16 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
PARSE_RULE_OPTIONAL // opt/set
( // opt/set
PARSE_RULE_OPTIONAL_GROUP // opt/set
( // opt/set
PARSE_RULE_FILTER_CMD // opt/set
( // opt/set
PARSE_RULE_VAL_CMD(cfgCmdAnnotate), // opt/set
), // opt/set
// opt/set
PARSE_RULE_OPTIONAL_REQUIRED(), // opt/set
), // opt/set
// opt/set
PARSE_RULE_OPTIONAL_GROUP // opt/set
( // opt/set
PARSE_RULE_FILTER_CMD // opt/set
( // opt/set
@ -8128,6 +8295,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/stanza
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/stanza
( // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/stanza
@ -8165,6 +8333,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/stanza
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/stanza
( // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/stanza
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/stanza
@ -8426,6 +8595,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/tcp-keep-alive-count
( // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-count
@ -8463,6 +8633,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/tcp-keep-alive-count
( // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-count
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-count
@ -8509,6 +8680,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/tcp-keep-alive-idle
( // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-idle
@ -8546,6 +8718,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/tcp-keep-alive-idle
( // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-idle
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-idle
@ -8592,6 +8765,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND_ROLE_MAIN_VALID_LIST // opt/tcp-keep-alive-interval
( // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-interval
@ -8629,6 +8803,7 @@ static const ParseRuleOption parseRuleOption[CFG_OPTION_TOTAL] =
// opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND_ROLE_REMOTE_VALID_LIST // opt/tcp-keep-alive-interval
( // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdAnnotate) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdArchiveGet) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdArchivePush) // opt/tcp-keep-alive-interval
PARSE_RULE_OPTION_COMMAND(cfgCmdBackup) // opt/tcp-keep-alive-interval
@ -9149,6 +9324,7 @@ Order for option parse resolution
static const uint8_t optionResolveOrder[] =
{
cfgOptStanza, // opt-resolve-order
cfgOptAnnotation, // opt-resolve-order
cfgOptArchiveAsync, // opt-resolve-order
cfgOptArchiveGetQueueMax, // opt-resolve-order
cfgOptArchiveHeaderCheck, // opt-resolve-order

View File

@ -95,6 +95,7 @@ Create new object and load contents from a file
#define INFO_BACKUP_SECTION "backup"
#define INFO_BACKUP_SECTION_BACKUP_CURRENT INFO_BACKUP_SECTION ":current"
#define INFO_BACKUP_KEY_BACKUP_ANNOTATION "backup-annotation"
#define INFO_BACKUP_KEY_BACKUP_ARCHIVE_START "backup-archive-start"
#define INFO_BACKUP_KEY_BACKUP_ARCHIVE_STOP "backup-archive-stop"
#define INFO_BACKUP_KEY_BACKUP_INFO_REPO_SIZE "backup-info-repo-size"
@ -152,6 +153,10 @@ infoBackupLoadCallback(void *data, const String *section, const String *key, con
info.backrestFormat = jsonReadUInt(jsonReadKeyRequireZ(json, INFO_KEY_FORMAT));
info.backrestVersion = jsonReadStr(jsonReadKeyRequireZ(json, INFO_KEY_VERSION));
// Annotation
if (jsonReadKeyExpectZ(json, INFO_BACKUP_KEY_BACKUP_ANNOTATION))
info.backupAnnotation = jsonReadVar(json);
// Archive start/stop
if (jsonReadKeyExpectZ(json, INFO_BACKUP_KEY_BACKUP_ARCHIVE_START))
info.backupArchiveStart = jsonReadStr(json);
@ -263,6 +268,9 @@ infoBackupSaveCallback(void *const data, const String *const sectionNext, InfoSa
jsonWriteUInt(jsonWriteKeyZ(json, INFO_KEY_FORMAT), backupData.backrestFormat);
jsonWriteStr(jsonWriteKeyZ(json, INFO_KEY_VERSION), backupData.backrestVersion);
if (backupData.backupAnnotation != NULL)
jsonWriteVar(jsonWriteKeyZ(json, INFO_BACKUP_KEY_BACKUP_ANNOTATION), backupData.backupAnnotation);
jsonWriteStr(jsonWriteKeyZ(json, INFO_BACKUP_KEY_BACKUP_ARCHIVE_START), backupData.backupArchiveStart);
jsonWriteStr(jsonWriteKeyZ(json, INFO_BACKUP_KEY_BACKUP_ARCHIVE_STOP), backupData.backupArchiveStop);
@ -424,6 +432,7 @@ infoBackupDataAdd(const InfoBackup *this, const Manifest *manifest)
.backupType = manData->backupType,
.backupError = varNewBool(backupError),
.backupAnnotation = varDup(manData->annotation),
.backupArchiveStart = strDup(manData->archiveStart),
.backupArchiveStop = strDup(manData->archiveStop),
.backupLsnStart = strDup(manData->lsnStart),
@ -459,6 +468,57 @@ infoBackupDataAdd(const InfoBackup *this, const Manifest *manifest)
FUNCTION_LOG_RETURN_VOID();
}
/**********************************************************************************************************************************/
void
infoBackupDataAnnotationSet(const InfoBackup *const this, const String *const backupLabel, const KeyValue *const newAnnotationKv)
{
FUNCTION_TEST_BEGIN();
FUNCTION_TEST_PARAM(INFO_BACKUP, this);
FUNCTION_TEST_PARAM(STRING, backupLabel);
FUNCTION_TEST_PARAM(KEY_VALUE, newAnnotationKv);
FUNCTION_TEST_END();
ASSERT(this != NULL);
ASSERT(infoBackupLabelExists(this, backupLabel));
ASSERT(newAnnotationKv != NULL);
MEM_CONTEXT_BEGIN(lstMemContext(this->pub.backup))
{
// Get data for specified backup
InfoBackupData *const infoBackupData = lstFind(this->pub.backup, &backupLabel);
// Create annotation if it does not exist
if (infoBackupData->backupAnnotation == NULL)
infoBackupData->backupAnnotation = varNewKv(kvNew());
// Update annotations
KeyValue *const annotationKv = varKv(infoBackupData->backupAnnotation);
const VariantList *const newAnnotationKeyList = kvKeyList(newAnnotationKv);
for (unsigned int keyIdx = 0; keyIdx < varLstSize(newAnnotationKeyList); keyIdx++)
{
const Variant *const newKey = varLstGet(newAnnotationKeyList, keyIdx);
const Variant *const newValue = kvGet(newAnnotationKv, newKey);
// If value is empty remove the key
if (strEmpty(varStr(newValue)))
{
kvRemove(annotationKv, newKey);
}
// Else put new key/value (this will overwrite an existing value)
else
kvPut(annotationKv, newKey, newValue);
}
// Clean field if there are no annotations left
if (varLstSize(kvKeyList(annotationKv)) == 0)
infoBackupData->backupAnnotation = NULL;
}
MEM_CONTEXT_END();
FUNCTION_TEST_RETURN_VOID();
}
/**********************************************************************************************************************************/
void
infoBackupDataDelete(const InfoBackup *this, const String *backupDeleteLabel)

View File

@ -46,6 +46,7 @@ typedef struct InfoBackupData
const String *backupLabel; // backupLabel must be first to allow for built-in list sorting
unsigned int backrestFormat;
const String *backrestVersion;
Variant *backupAnnotation; // Backup annotations, if present
const String *backupArchiveStart;
const String *backupArchiveStop;
uint64_t backupInfoRepoSize;
@ -136,6 +137,9 @@ Functions
// Add backup to the current list
void infoBackupDataAdd(const InfoBackup *this, const Manifest *manifest);
// Set Annotation in the backup data for a specific backup label
void infoBackupDataAnnotationSet(const InfoBackup *this, const String *const backupLabel, const KeyValue *annotationKv);
// Delete backup from the current backup list
void infoBackupDataDelete(const InfoBackup *this, const String *backupDeleteLabel);

View File

@ -1507,7 +1507,7 @@ manifestBuildComplete(
const time_t timestampStop, const String *const lsnStop, const String *const archiveStop, const unsigned int pgId,
const uint64_t pgSystemId, const Pack *const dbList, const bool optionArchiveCheck, const bool optionArchiveCopy,
const size_t optionBufferSize, const unsigned int optionCompressLevel, const unsigned int optionCompressLevelNetwork,
const bool optionHardLink, const unsigned int optionProcessMax, const bool optionStandby)
const bool optionHardLink, const unsigned int optionProcessMax, const bool optionStandby, const KeyValue *const annotation)
{
FUNCTION_LOG_BEGIN(logLevelDebug);
FUNCTION_LOG_PARAM(MANIFEST, this);
@ -1528,6 +1528,7 @@ manifestBuildComplete(
FUNCTION_LOG_PARAM(BOOL, optionHardLink);
FUNCTION_LOG_PARAM(UINT, optionProcessMax);
FUNCTION_LOG_PARAM(BOOL, optionStandby);
FUNCTION_LOG_PARAM(KEY_VALUE, annotation);
FUNCTION_LOG_END();
MEM_CONTEXT_BEGIN(this->pub.memContext)
@ -1564,6 +1565,29 @@ manifestBuildComplete(
lstSort(this->pub.dbList, sortOrderAsc);
}
// Save annotations
if (annotation != NULL)
{
this->pub.data.annotation = varNewKv(kvNew());
KeyValue *const manifestAnnotationKv = varKv(this->pub.data.annotation);
const VariantList *const annotationKeyList = kvKeyList(annotation);
for (unsigned int keyIdx = 0; keyIdx < varLstSize(annotationKeyList); keyIdx++)
{
const Variant *const key = varLstGet(annotationKeyList, keyIdx);
const Variant *const value = kvGet(annotation, key);
// Skip empty values
if (!strEmpty(varStr(value)))
kvPut(manifestAnnotationKv, key, value);
}
// Clean field if there are no annotations to save
if (varLstSize(kvKeyList(manifestAnnotationKv)) == 0)
this->pub.data.annotation = NULL;
}
// Save options
this->pub.data.backupOptionArchiveCheck = optionArchiveCheck;
this->pub.data.backupOptionArchiveCopy = optionArchiveCopy;
@ -1589,6 +1613,7 @@ manifestBuildComplete(
#define MANIFEST_SECTION_BACKUP_TARGET "backup:target"
#define MANIFEST_SECTION_DB "db"
#define MANIFEST_SECTION_METADATA "metadata"
#define MANIFEST_SECTION_TARGET_FILE "target:file"
#define MANIFEST_SECTION_TARGET_FILE_DEFAULT "target:file:default"
@ -1597,6 +1622,7 @@ manifestBuildComplete(
#define MANIFEST_SECTION_TARGET_PATH "target:path"
#define MANIFEST_SECTION_TARGET_PATH_DEFAULT "target:path:default"
#define MANIFEST_KEY_ANNOTATION "annotation"
#define MANIFEST_KEY_BACKUP_ARCHIVE_START "backup-archive-start"
#define MANIFEST_KEY_BACKUP_ARCHIVE_STOP "backup-archive-stop"
#define MANIFEST_KEY_BACKUP_BUNDLE "backup-bundle"
@ -1968,6 +1994,17 @@ manifestLoadCallback(void *callbackData, const String *const section, const Stri
manifestDbAdd(manifest, &db);
}
// -----------------------------------------------------------------------------------------------------------------------------
else if (strEqZ(section, MANIFEST_SECTION_METADATA))
{
MEM_CONTEXT_BEGIN(manifest->pub.memContext)
{
if (strEqZ(key, MANIFEST_KEY_ANNOTATION))
manifest->pub.data.annotation = jsonToVar(value);
}
MEM_CONTEXT_END();
}
// -----------------------------------------------------------------------------------------------------------------------------
else if (strEqZ(section, MANIFEST_SECTION_BACKUP))
{
@ -2398,6 +2435,17 @@ manifestSaveCallback(void *const callbackData, const String *const sectionNext,
MEM_CONTEXT_TEMP_END();
}
// -----------------------------------------------------------------------------------------------------------------------------
if (infoSaveSection(infoSaveData, MANIFEST_SECTION_METADATA, sectionNext))
{
if (manifest->pub.data.annotation != NULL)
{
infoSaveValue(
infoSaveData, MANIFEST_SECTION_METADATA, MANIFEST_KEY_ANNOTATION,
jsonFromVar(manifest->pub.data.annotation));
}
}
// -----------------------------------------------------------------------------------------------------------------------------
if (infoSaveSection(infoSaveData, MANIFEST_SECTION_TARGET_FILE, sectionNext))
{

View File

@ -67,6 +67,8 @@ typedef struct ManifestData
uint64_t pgSystemId; // PostgreSQL system identifier
unsigned int pgCatalogVersion; // PostgreSQL catalog version
const Variant *annotation; // Backup annotation(s) metadata
bool backupOptionArchiveCheck; // Will WAL segments be checked at the end of the backup?
bool backupOptionArchiveCopy; // Will WAL segments be copied to the backup?
const Variant *backupOptionStandby; // Will the backup be performed from a standby?
@ -216,7 +218,8 @@ void manifestBuildComplete(
Manifest *this, time_t timestampStart, const String *lsnStart, const String *archiveStart, time_t timestampStop,
const String *lsnStop, const String *archiveStop, unsigned int pgId, uint64_t pgSystemId, const Pack *dbList,
bool optionArchiveCheck, bool optionArchiveCopy, size_t optionBufferSize, unsigned int optionCompressLevel,
unsigned int optionCompressLevelNetwork, bool optionHardLink, unsigned int optionProcessMax, bool optionStandby);
unsigned int optionCompressLevelNetwork, bool optionHardLink, unsigned int optionProcessMax, bool optionStandby,
const KeyValue *annotation);
/***********************************************************************************************************************************
Functions

View File

@ -7,6 +7,7 @@ Main
#include <stdlib.h>
#include <unistd.h>
#include "command/annotate/annotate.h"
#include "command/archive/get/get.h"
#include "command/archive/push/push.h"
#include "command/backup/backup.h"
@ -133,6 +134,12 @@ main(int argListSize, const char *argList[])
{
switch (cfgCommand())
{
// Annotate command
// -----------------------------------------------------------------------------------------------------------------
case cfgCmdAnnotate:
cmdAnnotate();
break;
// Archive get command
// -----------------------------------------------------------------------------------------------------------------
case cfgCmdArchiveGet:

View File

@ -91,6 +91,7 @@ subdir('postgres')
# pgBackRest target
####################################################################################################################################
src_pgbackrest = [
'command/annotate/annotate.c',
'command/archive/common.c',
'command/archive/get/file.c',
'command/archive/get/get.c',

View File

@ -695,6 +695,13 @@ unit:
- command/control/start
- command/control/stop
# ----------------------------------------------------------------------------------------------------------------------------
- name: annotate
total: 1
coverage:
- command/annotate/annotate
# ----------------------------------------------------------------------------------------------------------------------------
- name: archive-common
total: 9

View File

@ -0,0 +1,215 @@
/***********************************************************************************************************************************
Test Annotate Command
***********************************************************************************************************************************/
#include "common/io/bufferRead.h"
#include "common/io/bufferWrite.h"
#include "storage/posix/storage.h"
#include "common/harnessConfig.h"
#include "common/harnessInfo.h"
/***********************************************************************************************************************************
Test Run
***********************************************************************************************************************************/
static void
testRun(void)
{
FUNCTION_HARNESS_VOID();
// *****************************************************************************************************************************
if (testBegin("cmdAnnotate()"))
{
StringList *argList = strLstNew();
hrnCfgArgRawZ(argList, cfgOptRepoPath, TEST_PATH "/repo");
hrnCfgArgRawZ(argList, cfgOptStanza, "stanza1");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("backup.info file missing");
StringList *argListAnnotation = strLstDup(argList);
hrnCfgArgRawZ(argListAnnotation, cfgOptAnnotation, "key1=value1");
hrnCfgArgRawZ(argListAnnotation, cfgOptRepo, "1");
hrnCfgArgRawZ(argListAnnotation, cfgOptSet, "20201116-200000F");
HRN_CFG_LOAD(cfgCmdAnnotate, argListAnnotation);
TEST_ERROR(
cmdAnnotate(), CommandError, CFGCMD_ANNOTATE " command encountered 1 error(s), check the log file for details");
TEST_RESULT_LOG(
"P00 ERROR: [055]: repo1: unable to load info file '" TEST_PATH "/repo/backup/stanza1/backup.info' or"
" '" TEST_PATH "/repo/backup/stanza1/backup.info.copy':\n"
" FileMissingError: unable to open missing file '" TEST_PATH "/repo/backup/stanza1/backup.info' for read\n"
" FileMissingError: unable to open missing file '" TEST_PATH
"/repo/backup/stanza1/backup.info.copy' for read\n"
" HINT: backup.info cannot be opened and is required to perform a backup.\n"
" HINT: has a stanza-create been performed?");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("annotate backup success");
// Add backup info
HRN_INFO_PUT(
storageRepoWrite(), STORAGE_REPO_BACKUP "/" INFO_BACKUP_FILE,
"[db]\n"
"db-catalog-version=201510051\n"
"db-control-version=942\n"
"db-id=1\n"
"db-system-id=6626363367545678089\n"
"db-version=\"9.5\"\n"
"\n"
"[backup:current]\n"
"20201116-200000F={\"backrest-format\":5,\"backrest-version\":\"2.30\","
"\"backup-archive-start\":\"000000010000000000000004\",\"backup-archive-stop\":\"000000010000000000000004\","
"\"backup-error\":true,"
"\"backup-info-repo-size\":3159000,\"backup-info-repo-size-delta\":3100,\"backup-info-size\":26897000,"
"\"backup-info-size-delta\":26897020,\"backup-timestamp-start\":1605556800,\"backup-timestamp-stop\":1605556802,"
"\"backup-type\":\"full\",\"db-id\":1,\"option-archive-check\":true,\"option-archive-copy\":false,"
"\"option-backup-standby\":false,\"option-checksum-page\":false,\"option-compress\":false,\"option-hardlink\":true,"
"\"option-online\":true}\n"
"\n"
"[db:history]\n"
"1={\"db-catalog-version\":201510051,\"db-control-version\":942,\"db-system-id\":6626363367545678089,"
"\"db-version\":\"9.5\"}\n",
.comment = "write backup info - stanza1, repo1");
// Add backup manifest
#define TEST_MANIFEST_HEADER \
"[backup]\n" \
"backup-archive-start=\"000000010000000000000004\"\n" \
"backup-archive-stop=\"000000010000000000000004\"\n" \
"backup-label=\"20201116-200000F\"\n" \
"backup-timestamp-copy-start=1605556800\n" \
"backup-timestamp-start=1605556800\n" \
"backup-timestamp-stop=1605556802\n" \
"backup-type=\"full\"\n" \
"\n" \
"[backup:db]\n" \
"db-catalog-version=201510051\n" \
"db-control-version=942\n" \
"db-id=1\n" \
"db-system-id=6626363367545678089\n" \
"db-version=\"9.5\"\n" \
"\n" \
"[backup:option]\n" \
"option-archive-check=true\n" \
"option-archive-copy=false\n" \
"option-backup-standby=false\n" \
"option-buffer-size=16384\n" \
"option-checksum-page=false\n" \
"option-compress=false\n" \
"option-compress-level=3\n" \
"option-compress-level-network=3\n" \
"option-delta=false\n" \
"option-hardlink=true\n" \
"option-online=true\n" \
"option-process-max=32\n" \
#define TEST_MANIFEST_TARGET \
"\n" \
"[backup:target]\n" \
"pg_data={\"path\":\"/pg/base\",\"type\":\"path\"}\n" \
"pg_data/pg_hba.conf={\"file\":\"pg_hba.conf\",\"path\":\"../pg_config\",\"type\":\"link\"}\n" \
"pg_data/pg_stat={\"path\":\"../pg_stat\",\"type\":\"link\"}\n" \
"pg_tblspc/1={\"path\":\"/tblspc/ts1\",\"tablespace-id\":\"1\",\"tablespace-name\":\"ts1\",\"type\":\"link\"}\n" \
"pg_tblspc/12={\"path\":\"/tblspc/ts12\",\"tablespace-id\":\"12\",\"tablespace-name\":\"ts12\",\"type\":\"link\"}\n" \
#define TEST_MANIFEST_DB \
"\n" \
"[db]\n" \
"mail={\"db-id\":16456,\"db-last-system-id\":12168}\n" \
"postgres={\"db-id\":12173,\"db-last-system-id\":12168}\n" \
"template0={\"db-id\":12168,\"db-last-system-id\":12168}\n" \
"template1={\"db-id\":1,\"db-last-system-id\":12168}\n" \
#define TEST_MANIFEST_FILE \
"\n" \
"[target:file]\n" \
"pg_data/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\"" \
",\"reference\":\"20190818-084502F_20190819-084506D\",\"size\":4,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/17000={\"checksum\":\"e0101dd8ffb910c9c202ca35b5f828bcb9697bed\",\"checksum-page\":false" \
",\"checksum-page-error\":[1],\"repo-size\":4096,\"size\":8192,\"timestamp\":1565282114}\n" \
"pg_data/base/16384/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"group\":false,\"size\":4" \
",\"timestamp\":1565282115}\n" \
"pg_data/base/32768/33000={\"checksum\":\"7a16d165e4775f7c92e8cdf60c0af57313f0bf90\",\"checksum-page\":true" \
",\"reference\":\"20190818-084502F\",\"size\":1073741824,\"timestamp\":1565282116}\n" \
"pg_data/base/32768/33000.32767={\"checksum\":\"6e99b589e550e68e934fd235ccba59fe5b592a9e\",\"checksum-page\":true" \
",\"reference\":\"20190818-084502F\",\"size\":32768,\"timestamp\":1565282114}\n" \
"pg_data/postgresql.conf={\"checksum\":\"6721d92c9fcdf4248acff1f9a1377127d9064807\",\"size\":4457" \
",\"timestamp\":1565282114}\n" \
"pg_data/special={\"mode\":\"0640\",\"size\":0,\"timestamp\":1565282120,\"user\":false}\n" \
#define TEST_MANIFEST_FILE_DEFAULT \
"\n" \
"[target:file:default]\n" \
"group=\"group1\"\n" \
"mode=\"0600\"\n" \
"user=\"user1\"\n" \
#define TEST_MANIFEST_LINK \
"\n" \
"[target:link]\n" \
"pg_data/pg_stat={\"destination\":\"../pg_stat\"}\n" \
"pg_data/postgresql.conf={\"destination\":\"../pg_config/postgresql.conf\",\"group\":false,\"user\":\"user1\"}\n" \
#define TEST_MANIFEST_LINK_DEFAULT \
"\n" \
"[target:link:default]\n" \
"group=\"group1\"\n" \
"user=false\n" \
#define TEST_MANIFEST_PATH \
"\n" \
"[target:path]\n" \
"pg_data={\"user\":\"user2\"}\n" \
"pg_data/base={\"group\":\"group2\"}\n" \
"pg_data/base/16384={\"mode\":\"0750\"}\n" \
"pg_data/base/32768={}\n" \
"pg_data/base/65536={\"user\":false}\n" \
#define TEST_MANIFEST_PATH_DEFAULT \
"\n" \
"[target:path:default]\n" \
"group=false\n" \
"mode=\"0700\"\n" \
"user=\"user1\"\n" \
// Create manifest file
HRN_INFO_PUT(
storageRepoWrite(), STORAGE_REPO_BACKUP "/20201116-200000F/" BACKUP_MANIFEST_FILE,
TEST_MANIFEST_HEADER
TEST_MANIFEST_TARGET
TEST_MANIFEST_DB
TEST_MANIFEST_FILE
TEST_MANIFEST_FILE_DEFAULT
TEST_MANIFEST_LINK
TEST_MANIFEST_LINK_DEFAULT
TEST_MANIFEST_PATH
TEST_MANIFEST_PATH_DEFAULT,
.comment = "write backup manifest - stanza1, repo1");
TEST_RESULT_VOID(cmdAnnotate(), "annotate 20201116-200000F backup set");
TEST_RESULT_LOG("P00 INFO: backup set '20201116-200000F' to annotate found in repo1");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("wrong backup label format");
argListAnnotation = strLstDup(argList);
hrnCfgArgRawZ(argListAnnotation, cfgOptAnnotation, "key1=value1");
hrnCfgArgRawZ(argListAnnotation, cfgOptSet, "backuplabel");
HRN_CFG_LOAD(cfgCmdAnnotate, argListAnnotation);
TEST_ERROR(cmdAnnotate(), OptionInvalidValueError, "'backuplabel' is not a valid backup label format");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("backup set not found");
argListAnnotation = strLstDup(argList);
hrnCfgArgRawZ(argListAnnotation, cfgOptAnnotation, "key1=value1");
hrnCfgArgRawZ(argListAnnotation, cfgOptSet, "20201116-200001F");
HRN_CFG_LOAD(cfgCmdAnnotate, argListAnnotation);
TEST_ERROR(cmdAnnotate(), BackupSetInvalidError, "no backup set to annotate found");
}
FUNCTION_HARNESS_RETURN_VOID();
}

View File

@ -3133,7 +3133,7 @@ testRun(void)
}
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("online 11 full backup with tablespaces and bundles");
TEST_TITLE("online 11 full backup with tablespaces, bundles and annotations");
backupTimeStart = BACKUP_EPOCH + 2400000;
@ -3150,6 +3150,8 @@ testRun(void)
hrnCfgArgRawZ(argList, cfgOptBufferSize, "16K");
hrnCfgArgRawBool(argList, cfgOptRepoBundle, true);
hrnCfgArgRawBool(argList, cfgOptResume, false);
hrnCfgArgRawZ(argList, cfgOptAnnotation, "extra key=this is an annotation");
hrnCfgArgRawZ(argList, cfgOptAnnotation, "source=this is another annotation");
HRN_CFG_LOAD(cfgCmdBackup, argList);
// Set to a smaller values than the defaults allow
@ -3227,6 +3229,9 @@ testRun(void)
"pg_tblspc/32768={\"path\":\"../../pg1-tblspc/32768\",\"tablespace-id\":\"32768\""
",\"tablespace-name\":\"tblspc32768\",\"type\":\"link\"}\n"
"\n"
"[metadata]\n"
"annotation={\"extra key\":\"this is an annotation\",\"source\":\"this is another annotation\"}\n"
"\n"
"[target:file]\n"
"pg_data/PG_VERSION={\"checksum\":\"17ba0791499db908433b80f37c5fbc89b870084b\",\"size\":2"
",\"timestamp\":1572200000}\n"

View File

@ -52,6 +52,7 @@ testRun(void)
" pgbackrest [options] [command]\n"
"\n"
"Commands:\n"
" annotate Add or modify backup annotation.\n"
" archive-get Get a WAL segment from the archive.\n"
" archive-push Push a WAL segment to the archive.\n"
" backup Backup a database cluster.\n"

View File

@ -652,7 +652,8 @@ testRun(void)
"\"db-id\":1,\"option-archive-check\":true,\"option-archive-copy\":false,\"option-backup-standby\":false,"
"\"option-checksum-page\":true,\"option-compress\":true,\"option-hardlink\":false,\"option-online\":true}\n"
"20181119-152138F_20181119-152155I={"
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\",\"backup-archive-start\":\"000000010000000000000003\","
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\","
"\"backup-archive-start\":\"000000010000000000000003\","
"\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
"\"backup-lsn-start\":\"285/89000028\",\"backup-lsn-stop\":\"285/89001F88\","
@ -671,6 +672,7 @@ testRun(void)
"\"option-online\":true}\n"
"20201116-155000F_20201119-152100I={"
"\"backrest-format\":5,\"backrest-version\":\"2.30\","
"\"backup-annotation\":{\"extra key\":\"this is an annotation\",\"source\":\"this is another annotation\"},"
"\"backup-archive-start\":\"000000010000000000000005\",\"backup-archive-stop\":\"000000010000000000000005\","
"\"backup-error\":false,\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
@ -1228,6 +1230,10 @@ testRun(void)
"\"type\":\"full\""
"},"
"{"
"\"annotation\":{"
"\"extra key\":\"this is an annotation\","
"\"source\":\"this is another annotation\""
"},"
"\"archive\":{"
"\"start\":\"000000010000000000000005\","
"\"stop\":\"000000010000000000000005\""
@ -1856,7 +1862,10 @@ testRun(void)
" database size: 19.2MB, database backup size: 8.2KB\n"
" repo1: backup set size: 2.3MB, backup size: 346B\n"
" backup reference list: 20201116-155000F\n"
" database list: none\n",
" database list: none\n"
" annotation(s)\n"
" extra key: this is an annotation\n"
" source: this is another annotation\n",
"text - backup set requested, no lsn start/stop location");
//--------------------------------------------------------------------------------------------------------------------------
@ -2071,6 +2080,63 @@ testRun(void)
" backup reference list: 20201116-155000F\n",
"text - multi-repo, prior backup: no archives but backups (code coverage)");
//--------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("Annotation assert not null value");
argList2 = strLstDup(argListMultiRepo);
hrnCfgArgRawZ(argList2, cfgOptStanza, "stanza1");
hrnCfgArgRawZ(argList2, cfgOptSet, "20181119-152138F_20181119-152155I");
hrnCfgArgRawZ(argList2, cfgOptRepo, "1");
HRN_CFG_LOAD(cfgCmdInfo, argList2);
HRN_INFO_PUT(
storageTest, TEST_PATH "/repo/" STORAGE_PATH_BACKUP "/stanza1/" INFO_BACKUP_FILE,
"[backup:current]\n"
"20181119-152138F={"
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\","
"\"backup-archive-start\":\"000000010000000000000002\",\"backup-archive-stop\":\"000000010000000000000002\","
"\"backup-info-repo-size\":2369186,\"backup-info-repo-size-delta\":2369186,"
"\"backup-info-size\":20162900,\"backup-info-size-delta\":20162900,"
"\"backup-timestamp-start\":1542640898,\"backup-timestamp-stop\":1542640899,\"backup-type\":\"full\","
"\"db-id\":1,\"option-archive-check\":true,\"option-archive-copy\":false,\"option-backup-standby\":false,"
"\"option-checksum-page\":true,\"option-compress\":true,\"option-hardlink\":false,\"option-online\":true}\n"
"20181119-152138F_20181119-152152D={"
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\",\"backup-archive-start\":\"000000010000000000000003\","
"\"backup-archive-stop\":\"000000020000000000000003\",\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
"\"backup-prior\":\"20181119-152138F\",\"backup-reference\":[\"20181119-152138F\"],"
"\"backup-timestamp-start\":1542640912,\"backup-timestamp-stop\":1542640915,\"backup-type\":\"diff\","
"\"db-id\":1,\"option-archive-check\":true,\"option-archive-copy\":false,\"option-backup-standby\":false,"
"\"option-checksum-page\":true,\"option-compress\":true,\"option-hardlink\":false,\"option-online\":true}\n"
"20181119-152138F_20181119-152155I={"
"\"backrest-format\":5,\"backrest-version\":\"2.08dev\","
"\"backup-annotation\":{\"key1\":null},"
"\"backup-archive-start\":\"000000010000000000000003\","
"\"backup-info-repo-size\":2369186,"
"\"backup-info-repo-size-delta\":346,\"backup-info-size\":20162900,\"backup-info-size-delta\":8428,"
"\"backup-lsn-start\":\"285/89000028\",\"backup-lsn-stop\":\"285/89001F88\","
"\"backup-prior\":\"20181119-152138F_20181119-152152D\","
"\"backup-reference\":[\"20181119-152138F\",\"20181119-152138F_20181119-152152D\"],"
"\"backup-timestamp-start\":1542640915,\"backup-timestamp-stop\":1542640917,\"backup-type\":\"incr\","
"\"db-id\":1,\"option-archive-check\":true,\"option-archive-copy\":false,\"option-backup-standby\":false,"
"\"option-checksum-page\":true,\"option-compress\":true,\"option-hardlink\":false,\"option-online\":true}\n"
"\n"
"[db]\n"
"db-catalog-version=201510051\n"
"db-control-version=942\n"
"db-id=2\n"
"db-system-id=6626363367545678089\n"
"db-version=\"9.5\"\n"
"\n"
"[db:history]\n"
"1={\"db-catalog-version\":201409291,\"db-control-version\":942,\"db-system-id\":6625592122879095702,"
"\"db-version\":\"9.4\"}\n"
"2={\"db-catalog-version\":201510051,\"db-control-version\":942,\"db-system-id\":6626363367545678089,"
"\"db-version\":\"9.5\"}\n",
.comment = "put backup info to file - stanza1, repo1");
TEST_ERROR(infoRender(), AssertError, "assertion 'value != NULL' failed");
//--------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("multi-repo, stanza requested does not exist, but other stanzas do");

View File

@ -23,7 +23,7 @@ testRun(void)
}
// -----------------------------------------------------------------------------------------------------------------------------
if (testBegin("kvPut(), kvAdd(), kvKeyExists(), kvKeyList(), kvGet(), kvGetDefault(), kvGetList(), and kvDup()"))
if (testBegin("kvPut(), kvAdd(), kvKeyExists(), kvKeyList(), kvGet(), kvGetDefault(), kvGetList(), kvDup(), and kvRemove()"))
{
KeyValue *store = NULL;
@ -105,6 +105,16 @@ testRun(void)
varStr(kvGet(varKv(kvGet(storeDup, VARSTRDEF("kv-key"))), VARSTRDEF("str-sub-key"))),
"str-sub-value", "get string/kv");
// Remove a kv
// -------------------------------------------------------------------------------------------------------------------------
const Variant *key = VARSTRDEF("str-key-to-remove");
kvPut(store, key, VARSTRDEF("str-value"));
TEST_RESULT_STR_Z(varStr(kvGet(store, key)), "str-value", "get string/kv");
TEST_RESULT_PTR(kvRemove(store, key), store, "remove string/kv");
TEST_RESULT_BOOL(kvKeyExists(store, key), false, "key does not exist");
TEST_RESULT_PTR(kvRemove(store, key), store, "don't fail to remove key that doesn't exist");
TEST_RESULT_VOID(kvFree(storeDup), "free dup store");
TEST_RESULT_VOID(kvFree(store), "free store");
}

View File

@ -456,6 +456,27 @@ testRun(void)
TEST_RESULT_UINT(backupData.backupInfoRepoSize, 1073783153, "repo size");
TEST_RESULT_UINT(backupData.backupInfoRepoSizeDelta, 8557, "repo backup size");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("infoBackupDataAnnotationSet()");
KeyValue *annotationKV = kvNew();
kvPut(annotationKV, VARSTRDEF("empty key"), VARSTRDEF(""));
kvPut(annotationKV, VARSTRDEF("key to remove"), VARSTRDEF("step 1"));
TEST_RESULT_VOID(
infoBackupDataAnnotationSet(
infoBackup, STRDEF("20190818-084502F_20190820-084502I"), annotationKV), "add annotation");
kvPut(annotationKV, VARSTRDEF("key to remove"), VARSTRDEF(""));
TEST_RESULT_VOID(
infoBackupDataAnnotationSet(
infoBackup, STRDEF("20190818-084502F_20190820-084502I"), annotationKV), "remove empty annotation");
kvPut(annotationKV, VARSTRDEF("extra key"), VARSTRDEF("this is an annotation"));
kvPut(annotationKV, VARSTRDEF("source"), VARSTRDEF("this is another annotation"));
TEST_RESULT_VOID(
infoBackupDataAnnotationSet(
infoBackup, STRDEF("20190818-084502F_20190820-084502I"), annotationKV), "add annotations");
// -------------------------------------------------------------------------------------------------------------------------
TEST_TITLE("infoBackupLoadFileReconstruct - skip/add backups");

View File

@ -1491,6 +1491,11 @@ testRun(void)
"template1={\"db-id\":1,\"db-last-system-id\":99999}\n" \
SHRUG_EMOJI "={\"db-id\":18000,\"db-last-system-id\":99999}\n"
#define TEST_MANIFEST_METADATA \
"\n" \
"[metadata]\n" \
"annotation={\"extra key\":\"this is an annotation\",\"source\":\"this is another annotation\"}\n"
#define TEST_MANIFEST_FILE \
"\n" \
"[target:file]\n" \
@ -1628,9 +1633,19 @@ testRun(void)
TEST_TITLE("manifest complete");
TEST_RESULT_VOID(
manifestBuildComplete(manifest, 0, NULL, NULL, 0, NULL, NULL, 0, 0, NULL, false, false, 0, 0, 0, false, 0, false),
manifestBuildComplete(manifest, 0, NULL, NULL, 0, NULL, NULL, 0, 0, NULL, false, false, 0, 0, 0, false, 0, false, NULL),
"manifest complete without db");
// Create empty annotations
KeyValue *annotationKV = kvNew();
kvPut(annotationKV, VARSTRDEF("empty key"), VARSTRDEF(""));
kvPut(annotationKV, VARSTRDEF("empty key2"), VARSTRDEF(""));
TEST_RESULT_VOID(
manifestBuildComplete(
manifest, 0, NULL, NULL, 0, NULL, NULL, 0, 0, NULL, false, false, 0, 0, 0, false, 0, false, annotationKV),
"manifest complete without db and empty annotations");
// Create db list
PackWrite *dbList = pckWriteNewP();
@ -1654,11 +1669,15 @@ testRun(void)
pckWriteEndP(dbList);
// Add annotations
kvPut(annotationKV, VARSTRDEF("extra key"), VARSTRDEF("this is an annotation"));
kvPut(annotationKV, VARSTRDEF("source"), VARSTRDEF("this is another annotation"));
TEST_RESULT_VOID(
manifestBuildComplete(
manifest, 1565282140, STRDEF("285/89000028"), STRDEF("000000030000028500000089"), 1565282142,
STRDEF("285/89001F88"), STRDEF("000000030000028500000089"), 1, 1000000000000000094, pckWriteResult(dbList),
true, true, 16384, 3, 6, true, 32, false),
true, true, 16384, 3, 6, true, 32, false, annotationKV),
"manifest complete with db");
TEST_RESULT_STR_Z(manifestPathPg(STRDEF("pg_data")), NULL, "check pg_data path");
@ -1841,6 +1860,7 @@ testRun(void)
"[cipher]\n"
"cipher-pass=\"supersecret\"\n"
TEST_MANIFEST_DB
TEST_MANIFEST_METADATA
TEST_MANIFEST_FILE
TEST_MANIFEST_FILE_DEFAULT
TEST_MANIFEST_LINK
@ -1921,6 +1941,10 @@ testRun(void)
"[ignore-section]\n" \
"ignore-key=\"ignore-value\"\n" \
"\n" \
"[metadata]\n" \
"annotation={\"key\":\"value\"}\n" \
"ignore-key=\"ignore-value\"\n" \
"\n" \
"[target:file]\n" \
"pg_data/PG_VERSION={\"checksum\":\"184473f470864e067ee3a22e64b47b0a1c356f29\",\"size\":4,\"timestamp\":1565282114}\n" \
"\n" \