mirror of https://github.com/vmware/tdnf.git
implement enablerepo disablerepo options, fix repolist status
Change-Id: I1a402e790c4d946107a6feb76f22f1c0d64ce5ac
This commit is contained in:
parent
76d9fb1d03
commit
5280cbe42e
63
client/api.c
63
client/api.c
|
@ -515,10 +515,13 @@ TDNFOpenHandle(
|
|||
|
||||
dwError = TDNFLoadRepoData(
|
||||
pTdnf,
|
||||
REPOLISTFILTER_ENABLED,
|
||||
REPOLISTFILTER_ALL,
|
||||
&pTdnf->pRepos);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFRepoListFinalize(pTdnf);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFRefreshSack(pTdnf, pTdnf->pArgs->nRefresh);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
|
@ -624,15 +627,54 @@ TDNFRepoList(
|
|||
{
|
||||
uint32_t dwError = 0;
|
||||
PTDNF_REPO_DATA pReposAll = NULL;
|
||||
PTDNF_REPO_DATA pRepoTemp = NULL;
|
||||
PTDNF_REPO_DATA pRepoCurrent = NULL;
|
||||
PTDNF_REPO_DATA pRepos = NULL;
|
||||
int nAdd = 0;
|
||||
|
||||
if(!pTdnf || !pTdnf->pConf || !ppReposAll)
|
||||
if(!pTdnf || !pTdnf->pRepos || !ppReposAll)
|
||||
{
|
||||
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
dwError = TDNFLoadRepoData(pTdnf, nFilter, &pReposAll);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
pRepos = pTdnf->pRepos;
|
||||
|
||||
while(pRepos)
|
||||
{
|
||||
nAdd = 0;
|
||||
if(nFilter == REPOLISTFILTER_ALL)
|
||||
{
|
||||
nAdd = 1;
|
||||
}
|
||||
else if(nFilter == REPOLISTFILTER_ENABLED && pRepos->nEnabled)
|
||||
{
|
||||
nAdd = 1;
|
||||
}
|
||||
else if(nFilter == REPOLISTFILTER_DISABLED && !pRepos->nEnabled)
|
||||
{
|
||||
nAdd = 1;
|
||||
}
|
||||
if(nAdd)
|
||||
{
|
||||
dwError = TDNFCloneRepo(pRepos, &pRepoTemp);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
if(!pReposAll)
|
||||
{
|
||||
pReposAll = pRepoTemp;
|
||||
pRepoCurrent = pReposAll;
|
||||
}
|
||||
else
|
||||
{
|
||||
pRepoCurrent->pNext = pRepoTemp;
|
||||
pRepoCurrent = pRepoCurrent->pNext;
|
||||
}
|
||||
pRepoTemp = NULL;
|
||||
}
|
||||
|
||||
pRepos = pRepos->pNext;
|
||||
}
|
||||
|
||||
*ppReposAll = pReposAll;
|
||||
|
||||
|
@ -640,6 +682,14 @@ cleanup:
|
|||
return dwError;
|
||||
|
||||
error:
|
||||
if(ppReposAll)
|
||||
{
|
||||
*ppReposAll = NULL;
|
||||
}
|
||||
if(pReposAll)
|
||||
{
|
||||
TDNFFreeRepos(pReposAll);
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
@ -1064,7 +1114,10 @@ TDNFFreeCmdArgs(
|
|||
TDNF_SAFE_FREE_MEMORY(pCmdArgs->pszConfFile);
|
||||
TDNF_SAFE_FREE_MEMORY(pCmdArgs->pszReleaseVer);
|
||||
|
||||
TDNF_SAFE_FREE_MEMORY(pCmdArgs->pSetOpt);
|
||||
if(pCmdArgs->pSetOpt)
|
||||
{
|
||||
TDNFFreeCmdOpt(pCmdArgs->pSetOpt);
|
||||
}
|
||||
TDNF_SAFE_FREE_MEMORY(pCmdArgs);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <fnmatch.h>
|
||||
//
|
||||
#include <sys/utsname.h>
|
||||
//glib
|
||||
|
|
|
@ -171,6 +171,13 @@ TDNFCloneCmdArgs(
|
|||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
if(pCmdArgsIn->pSetOpt)
|
||||
{
|
||||
dwError = TDNFCloneSetOpts(pCmdArgsIn->pSetOpt,
|
||||
&pCmdArgs->pSetOpt);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
*ppCmdArgs = pCmdArgs;
|
||||
|
||||
cleanup:
|
||||
|
@ -185,6 +192,55 @@ error:
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TDNFCloneSetOpts(
|
||||
PTDNF_CMD_OPT pCmdOptIn,
|
||||
PTDNF_CMD_OPT* ppCmdOpt
|
||||
)
|
||||
{
|
||||
uint32_t dwError = 0;
|
||||
PTDNF_CMD_OPT pCmdOpt = NULL;
|
||||
PTDNF_CMD_OPT pCmdOptCurrent = NULL;
|
||||
PTDNF_CMD_OPT* ppCmdOptCurrent = NULL;
|
||||
|
||||
if(!pCmdOptIn || !ppCmdOpt)
|
||||
{
|
||||
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
ppCmdOptCurrent = &pCmdOpt;
|
||||
while(pCmdOptIn)
|
||||
{
|
||||
dwError = TDNFAllocateMemory(1,
|
||||
sizeof(TDNF_CMD_OPT),
|
||||
(void**)ppCmdOptCurrent);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
pCmdOptCurrent = *ppCmdOptCurrent;
|
||||
|
||||
pCmdOptCurrent->nType = pCmdOptIn->nType;
|
||||
|
||||
dwError = TDNFAllocateString(pCmdOptIn->pszOptName,
|
||||
&pCmdOptCurrent->pszOptName);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFAllocateString(pCmdOptIn->pszOptValue,
|
||||
&pCmdOptCurrent->pszOptValue);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
ppCmdOptCurrent = &(pCmdOptCurrent->pNext);
|
||||
pCmdOptIn = pCmdOptIn->pNext;
|
||||
}
|
||||
|
||||
*ppCmdOpt = pCmdOpt;
|
||||
cleanup:
|
||||
return dwError;
|
||||
|
||||
error:
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TDNFRefreshSack(
|
||||
PTDNF pTdnf,
|
||||
|
|
|
@ -80,6 +80,12 @@ TDNFCloneCmdArgs(
|
|||
PTDNF_CMD_ARGS* ppCmdArgs
|
||||
);
|
||||
|
||||
uint32_t
|
||||
TDNFCloneSetOpts(
|
||||
PTDNF_CMD_OPT pCmdOptIn,
|
||||
PTDNF_CMD_OPT* ppCmdOpt
|
||||
);
|
||||
|
||||
uint32_t
|
||||
TDNFInitSack(
|
||||
PTDNF pTdnf,
|
||||
|
@ -433,6 +439,24 @@ TDNFLoadRepoData(
|
|||
PTDNF_REPO_DATA* ppReposAll
|
||||
);
|
||||
|
||||
uint32_t
|
||||
TDNFRepoListFinalize(
|
||||
PTDNF pTdnf
|
||||
);
|
||||
|
||||
uint32_t
|
||||
TDNFAlterRepoState(
|
||||
PTDNF_REPO_DATA pRepos,
|
||||
int nEnable,
|
||||
const char* pszId
|
||||
);
|
||||
|
||||
uint32_t
|
||||
TDNFCloneRepo(
|
||||
PTDNF_REPO_DATA pRepoIn,
|
||||
PTDNF_REPO_DATA* ppRepo
|
||||
);
|
||||
|
||||
//resolve.c
|
||||
HySubject
|
||||
hy_subject_create(
|
||||
|
|
|
@ -238,21 +238,6 @@ TDNFLoadReposFromFile(
|
|||
&pRepo->pszPass);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
if(pRepo->nEnabled)
|
||||
{
|
||||
if(pRepo->pszBaseUrl)
|
||||
{
|
||||
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszBaseUrl);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
if(pRepo->pszMetaLink)
|
||||
{
|
||||
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszMetaLink);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
}
|
||||
|
||||
pRepo->pNext = pRepos;
|
||||
pRepos = pRepo;
|
||||
pRepo = NULL;
|
||||
|
@ -282,6 +267,175 @@ error:
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TDNFRepoListFinalize(
|
||||
PTDNF pTdnf
|
||||
)
|
||||
{
|
||||
uint32_t dwError = 0;
|
||||
PTDNF_CMD_OPT pSetOpt = NULL;
|
||||
PTDNF_REPO_DATA pRepo = NULL;
|
||||
|
||||
if(!pTdnf || !pTdnf->pArgs || !pTdnf->pRepos)
|
||||
{
|
||||
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
//There could be overrides to enable/disable
|
||||
//repo such as cmdline args, api overrides
|
||||
pSetOpt = pTdnf->pArgs->pSetOpt;
|
||||
|
||||
while(pSetOpt)
|
||||
{
|
||||
if(pSetOpt->nType == CMDOPT_ENABLEREPO ||
|
||||
pSetOpt->nType == CMDOPT_DISABLEREPO)
|
||||
{
|
||||
dwError = TDNFAlterRepoState(
|
||||
pTdnf->pRepos,
|
||||
pSetOpt->nType == CMDOPT_ENABLEREPO,
|
||||
pSetOpt->pszOptValue);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
pSetOpt = pSetOpt->pNext;
|
||||
}
|
||||
|
||||
//Now that the overrides are applied, replace config vars
|
||||
//for the repos that are enabled.
|
||||
pRepo = pTdnf->pRepos;
|
||||
while(pRepo)
|
||||
{
|
||||
if(pRepo->nEnabled)
|
||||
{
|
||||
if(pRepo->pszBaseUrl)
|
||||
{
|
||||
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszBaseUrl);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
if(pRepo->pszMetaLink)
|
||||
{
|
||||
dwError = TDNFConfigReplaceVars(pTdnf, &pRepo->pszMetaLink);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
}
|
||||
pRepo = pRepo->pNext;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
return dwError;
|
||||
|
||||
error:
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TDNFAlterRepoState(
|
||||
PTDNF_REPO_DATA pRepos,
|
||||
int nEnable,
|
||||
const char* pszId
|
||||
)
|
||||
{
|
||||
uint32_t dwError = 0;
|
||||
int nMatch = 0;
|
||||
int nIsGlob = 0;
|
||||
if(!pRepos && IsNullOrEmptyString(pszId))
|
||||
{
|
||||
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
nIsGlob = TDNFIsGlob(pszId);
|
||||
|
||||
while(pRepos)
|
||||
{
|
||||
nMatch = 0;
|
||||
if(nIsGlob)
|
||||
{
|
||||
if(!fnmatch(pszId, pRepos->pszId, 0))
|
||||
{
|
||||
nMatch = 1;
|
||||
}
|
||||
}
|
||||
else if(!strcmp(pRepos->pszId, pszId))
|
||||
{
|
||||
nMatch = 1;
|
||||
}
|
||||
if(nMatch)
|
||||
{
|
||||
pRepos->nEnabled = nEnable;
|
||||
if(!nIsGlob)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
pRepos = pRepos->pNext;
|
||||
}
|
||||
cleanup:
|
||||
return dwError;
|
||||
|
||||
error:
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
TDNFCloneRepo(
|
||||
PTDNF_REPO_DATA pRepoIn,
|
||||
PTDNF_REPO_DATA* ppRepo
|
||||
)
|
||||
{
|
||||
uint32_t dwError = 0;
|
||||
PTDNF_REPO_DATA pRepo = NULL;
|
||||
|
||||
if(!pRepoIn || !ppRepo)
|
||||
{
|
||||
dwError = ERROR_TDNF_INVALID_PARAMETER;
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
}
|
||||
|
||||
dwError = TDNFAllocateMemory(1, sizeof(TDNF_REPO_DATA), (void**)&pRepo);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
pRepo->nEnabled = pRepoIn->nEnabled;
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszId, &pRepo->pszId);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszName, &pRepo->pszName);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszBaseUrl, &pRepo->pszBaseUrl);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszMetaLink, &pRepo->pszMetaLink);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszUrlGPGKey, &pRepo->pszUrlGPGKey);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszUser, &pRepo->pszUser);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
dwError = TDNFSafeAllocateString(pRepoIn->pszPass, &pRepo->pszPass);
|
||||
BAIL_ON_TDNF_ERROR(dwError);
|
||||
|
||||
*ppRepo = pRepo;
|
||||
|
||||
cleanup:
|
||||
return dwError;
|
||||
|
||||
error:
|
||||
if(ppRepo)
|
||||
{
|
||||
*ppRepo = NULL;
|
||||
}
|
||||
if(pRepo)
|
||||
{
|
||||
TDNFFreeRepos(pRepo);
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
TDNFFreeRepos(
|
||||
|
|
|
@ -133,6 +133,15 @@ typedef enum
|
|||
REPOLISTFILTER_DISABLED
|
||||
}TDNF_REPOLISTFILTER;
|
||||
|
||||
//CmdOpt Types
|
||||
typedef enum
|
||||
{
|
||||
CMDOPT_NONE = -1,
|
||||
CMDOPT_KEYVALUE,
|
||||
CMDOPT_ENABLEREPO,
|
||||
CMDOPT_DISABLEREPO
|
||||
}TDNF_CMDOPT_TYPE;
|
||||
|
||||
typedef struct _TDNF_ *PTDNF;
|
||||
typedef struct _HyRepo * HyRepo;
|
||||
|
||||
|
@ -172,6 +181,7 @@ typedef struct _TDNF_SOLVED_PKG_INFO
|
|||
|
||||
typedef struct _TDNF_CMD_OPT
|
||||
{
|
||||
int nType;
|
||||
char* pszOptName;
|
||||
char* pszOptValue;
|
||||
struct _TDNF_CMD_OPT* pNext;
|
||||
|
@ -204,10 +214,6 @@ typedef struct _TDNF_CMD_ARGS
|
|||
//Commands and args that do not fall in options
|
||||
char** ppszCmds;
|
||||
int nCmdCount;
|
||||
//Enabled repositories
|
||||
char** ppszEnabledRepos;
|
||||
//Disabled repositories
|
||||
char** ppszDisabledRepos;
|
||||
PTDNF_CMD_OPT pSetOpt;
|
||||
}TDNF_CMD_ARGS, *PTDNF_CMD_ARGS;
|
||||
|
||||
|
|
|
@ -34,6 +34,8 @@
|
|||
#define ERROR_TDNF_CLI_OPTION_ARG_UNEXPECTED (ERROR_TDNF_CLI_BASE + 10)
|
||||
#define ERROR_TDNF_CLI_SETOPT_NO_EQUALS (ERROR_TDNF_CLI_BASE + 11)
|
||||
|
||||
#define ENABLEREPO "enablerepo"
|
||||
#define DISABLEREPO "disablerepo"
|
||||
|
||||
#define IsNullOrEmptyString(str) (!(str) || !(*str))
|
||||
|
||||
|
|
|
@ -325,9 +325,19 @@ ParseOption(
|
|||
}
|
||||
else if(!strcasecmp(pszName, "enablerepo"))
|
||||
{
|
||||
dwError = AddSetOptWithValues(pCmdArgs,
|
||||
CMDOPT_ENABLEREPO,
|
||||
ENABLEREPO,
|
||||
optarg);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
}
|
||||
else if(!strcasecmp(pszName, "disablerepo"))
|
||||
{
|
||||
dwError = AddSetOptWithValues(pCmdArgs,
|
||||
CMDOPT_DISABLEREPO,
|
||||
DISABLEREPO,
|
||||
optarg);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
}
|
||||
else if(!strcasecmp(pszName, "installroot"))
|
||||
{
|
||||
|
|
|
@ -395,6 +395,14 @@ AddSetOpt(
|
|||
const char* pszOptArg
|
||||
);
|
||||
|
||||
uint32_t
|
||||
AddSetOptWithValues(
|
||||
PTDNF_CMD_ARGS pCmdArgs,
|
||||
int nType,
|
||||
const char* pszOptArg,
|
||||
const char* pszOptValue
|
||||
);
|
||||
|
||||
uint32_t
|
||||
GetOptionAndValue(
|
||||
const char* pszOptArg,
|
||||
|
|
|
@ -59,6 +59,62 @@ error:
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
AddSetOptWithValues(
|
||||
PTDNF_CMD_ARGS pCmdArgs,
|
||||
int nType,
|
||||
const char* pszOptArg,
|
||||
const char* pszOptValue
|
||||
)
|
||||
{
|
||||
uint32_t dwError = 0;
|
||||
PTDNF_CMD_OPT pCmdOpt = NULL;
|
||||
PTDNF_CMD_OPT pSetOptTemp = NULL;
|
||||
|
||||
if(!pCmdArgs ||
|
||||
IsNullOrEmptyString(pszOptArg) ||
|
||||
IsNullOrEmptyString(pszOptValue))
|
||||
{
|
||||
dwError = ERROR_TDNF_CLI_INVALID_ARGUMENT;
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
}
|
||||
|
||||
dwError = TDNFAllocateMemory(1, sizeof(TDNF_CMD_OPT), (void**)&pCmdOpt);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
|
||||
pCmdOpt->nType = nType;
|
||||
|
||||
dwError = TDNFAllocateString(pszOptArg, &pCmdOpt->pszOptName);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
|
||||
dwError = TDNFAllocateString(pszOptValue, &pCmdOpt->pszOptValue);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
|
||||
pSetOptTemp = pCmdArgs->pSetOpt;
|
||||
if(!pSetOptTemp)
|
||||
{
|
||||
pCmdArgs->pSetOpt = pCmdOpt;
|
||||
}
|
||||
else
|
||||
{
|
||||
while(pSetOptTemp->pNext)
|
||||
{
|
||||
pSetOptTemp = pSetOptTemp->pNext;
|
||||
}
|
||||
pSetOptTemp->pNext = pCmdOpt;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
return dwError;
|
||||
|
||||
error:
|
||||
if(pCmdOpt)
|
||||
{
|
||||
TDNFFreeCmdOpt(pCmdOpt);
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
GetOptionAndValue(
|
||||
const char* pszOptArg,
|
||||
|
@ -87,6 +143,7 @@ GetOptionAndValue(
|
|||
dwError = TDNFAllocateMemory(1, sizeof(TDNF_CMD_OPT), (void**)&pCmdOpt);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
|
||||
pCmdOpt->nType = CMDOPT_KEYVALUE;
|
||||
dwError = TDNFAllocateString(pszOptArg, &pCmdOpt->pszOptName);
|
||||
BAIL_ON_CLI_ERROR(dwError);
|
||||
|
||||
|
|
Loading…
Reference in New Issue