implement enablerepo disablerepo options, fix repolist status

Change-Id: I1a402e790c4d946107a6feb76f22f1c0d64ce5ac
This commit is contained in:
Priyesh Padmavilasom 2016-06-03 07:36:56 +00:00 committed by Priyesh Padmavilasom
parent 76d9fb1d03
commit 5280cbe42e
10 changed files with 395 additions and 24 deletions

View File

@ -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);
}
}

View File

@ -28,6 +28,7 @@
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <fnmatch.h>
//
#include <sys/utsname.h>
//glib

View File

@ -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,

View File

@ -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(

View File

@ -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(

View File

@ -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;

View File

@ -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))

View File

@ -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"))
{

View File

@ -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,

View File

@ -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);