From ef4f5472872ff036c6e3b7b2425232b8b7e9fc80 Mon Sep 17 00:00:00 2001
From: Priyesh Padmavilasom
Date: Fri, 3 Jun 2016 07:36:56 +0000
Subject: [PATCH] implement enablerepo disablerepo options, fix repolist status
Change-Id: I1a402e790c4d946107a6feb76f22f1c0d64ce5ac
---
client/api.c | 63 ++++++++++++--
client/includes.h | 1 +
client/init.c | 56 +++++++++++++
client/prototypes.h | 24 ++++++
client/repolist.c | 182 +++++++++++++++++++++++++++++++++++++----
include/tdnftypes.h | 14 +++-
tools/cli/defines.h | 2 +
tools/cli/parseargs.c | 10 +++
tools/cli/prototypes.h | 8 ++
tools/cli/setopt.c | 57 +++++++++++++
10 files changed, 394 insertions(+), 23 deletions(-)
diff --git a/client/api.c b/client/api.c
index 7781e824..370f8970 100644
--- a/client/api.c
+++ b/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 @@ TDNFRepoList(
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);
}
}
diff --git a/client/includes.h b/client/includes.h
index e3a2128d..0cddad47 100644
--- a/client/includes.h
+++ b/client/includes.h
@@ -28,6 +28,7 @@
#include
#include
#include
+#include
//
#include
//glib
diff --git a/client/init.c b/client/init.c
index 8259871d..73de4a83 100644
--- a/client/init.c
+++ b/client/init.c
@@ -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 @@ TDNFCloneCmdArgs(
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,
diff --git a/client/prototypes.h b/client/prototypes.h
index 9b642482..774e768b 100644
--- a/client/prototypes.h
+++ b/client/prototypes.h
@@ -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(
diff --git a/client/repolist.c b/client/repolist.c
index 43bd26fb..55087e16 100644
--- a/client/repolist.c
+++ b/client/repolist.c
@@ -238,6 +238,73 @@ TDNFLoadReposFromFile(
&pRepo->pszPass);
BAIL_ON_TDNF_ERROR(dwError);
+ pRepo->pNext = pRepos;
+ pRepos = pRepo;
+ pRepo = NULL;
+ i++;
+ }
+
+ *ppRepos = pRepos;
+cleanup:
+ if(pKeyFile)
+ {
+ g_key_file_free(pKeyFile);
+ }
+ g_free(pszValue);
+ g_strfreev(ppszRepos);
+ return dwError;
+
+error:
+ if(ppRepos)
+ {
+ *ppRepos = NULL;
+ }
+ TDNF_SAFE_FREE_MEMORY(pRepo);
+ if(pRepos)
+ {
+ TDNFFreeRepos(pRepos);
+ }
+ 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)
@@ -252,32 +319,119 @@ TDNFLoadReposFromFile(
BAIL_ON_TDNF_ERROR(dwError);
}
}
+ pRepo = pRepo->pNext;
+ }
- pRepo->pNext = pRepos;
- pRepos = pRepo;
- pRepo = NULL;
- i++;
+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);
}
- *ppRepos = pRepos;
+ 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:
- if(pKeyFile)
+ 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)
{
- g_key_file_free(pKeyFile);
+ dwError = ERROR_TDNF_INVALID_PARAMETER;
+ BAIL_ON_TDNF_ERROR(dwError);
}
- g_free(pszValue);
- g_strfreev(ppszRepos);
+
+ 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(ppRepos)
+ if(ppRepo)
{
- *ppRepos = NULL;
+ *ppRepo = NULL;
}
- TDNF_SAFE_FREE_MEMORY(pRepo);
- if(pRepos)
+ if(pRepo)
{
- TDNFFreeRepos(pRepos);
+ TDNFFreeRepos(pRepo);
}
goto cleanup;
}
diff --git a/include/tdnftypes.h b/include/tdnftypes.h
index 320d2db4..94c7b5a4 100644
--- a/include/tdnftypes.h
+++ b/include/tdnftypes.h
@@ -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;
diff --git a/tools/cli/defines.h b/tools/cli/defines.h
index 13ecc227..9a0c2e27 100644
--- a/tools/cli/defines.h
+++ b/tools/cli/defines.h
@@ -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))
diff --git a/tools/cli/parseargs.c b/tools/cli/parseargs.c
index f0140e34..f3820b9a 100644
--- a/tools/cli/parseargs.c
+++ b/tools/cli/parseargs.c
@@ -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"))
{
diff --git a/tools/cli/prototypes.h b/tools/cli/prototypes.h
index e1b9f91d..9912a29e 100644
--- a/tools/cli/prototypes.h
+++ b/tools/cli/prototypes.h
@@ -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,
diff --git a/tools/cli/setopt.c b/tools/cli/setopt.c
index 7fd05bc1..7a472bc0 100644
--- a/tools/cli/setopt.c
+++ b/tools/cli/setopt.c
@@ -59,6 +59,62 @@ AddSetOpt(
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);