Browse code

update tdnf to 2.0.0 - use libsolv directly

Change-Id: Ie75759c317cd21289cb6de2dcceb482835913c3f
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/4798
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Xiaolin Li <xiaolinl@vmware.com>

Priyesh Padmavilasom authored on 2018/02/10 10:57:39
Showing 2 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,264 @@
0
+diff --git a/client/defines.h b/client/defines.h
1
+index c112074..637eb31 100644
2
+--- a/client/defines.h
3
+@@ -199,4 +199,5 @@ typedef enum
4
+     {ERROR_TDNF_RPM_CHECK,           "ERROR_TDNF_RPM_CHECK",           "rpm check reported errors"}, \
5
+     {ERROR_TDNF_METADATA_EXPIRE_PARSE, "ERROR_TDNF_METADATA_EXPIRE_PARSE", "metadata_expire value could not be parsed. Check your repo files."},\
6
+     {ERROR_TDNF_SELF_ERASE, "ERROR_TDNF_SELF_ERASE", "The operation would result in removing the protected package : tdnf"},\
7
++    {ERROR_TDNF_PERM, "ERROR_TDNF_PERM", "Operation not permitted. You have to be root."},\
8
+ };
9
+diff --git a/client/packageutils.c b/client/packageutils.c
10
+index 6b86d20..0ee3212 100644
11
+--- a/client/packageutils.c
12
+@@ -763,22 +763,14 @@ TDNFPopulatePkgInfos(
13
+                       (void**)&pPkgInfo);
14
+         BAIL_ON_TDNF_ERROR(dwError);
15
+ 
16
+-        dwError = SolvGetPkgNameFromId(pSack, dwPkgId, &pPkgInfo->pszName);
17
+-        BAIL_ON_TDNF_ERROR(dwError);
18
+-
19
+-        dwError = SolvGetPkgVersionFromId(
20
+-                      pSack,
21
+-                      dwPkgId,
22
+-                      &pPkgInfo->pszVersion);
23
+-        BAIL_ON_TDNF_ERROR(dwError);
24
+-
25
+-        dwError = SolvGetPkgReleaseFromId(
26
++        dwError = SolvGetNevraFromId(
27
+                       pSack,
28
+                       dwPkgId,
29
+-                      &pPkgInfo->pszRelease);
30
+-        BAIL_ON_TDNF_ERROR(dwError);
31
+-
32
+-        dwError = SolvGetPkgArchFromId(pSack, dwPkgId, &pPkgInfo->pszArch);
33
++                      &pPkgInfo->dwEpoch,
34
++                      &pPkgInfo->pszName,
35
++                      &pPkgInfo->pszVersion,
36
++                      &pPkgInfo->pszRelease,
37
++                      &pPkgInfo->pszArch);
38
+         BAIL_ON_TDNF_ERROR(dwError);
39
+ 
40
+         dwError = SolvGetPkgRepoNameFromId(
41
+diff --git a/client/rpmtrans.c b/client/rpmtrans.c
42
+index 212169d..92e88bf 100644
43
+--- a/client/rpmtrans.c
44
+@@ -29,14 +29,15 @@ TDNFRpmExecTransaction(
45
+ {
46
+     uint32_t dwError = 0;
47
+     int nKeepCachedRpms = 0;
48
+-    TDNFRPMTS ts = {pTdnf->pArgs->nQuiet};
49
++    TDNFRPMTS ts = {0};
50
+ 
51
+-    if(!pTdnf || !pTdnf->pConf || !pSolvedInfo)
52
++    if(!pTdnf || !pTdnf->pArgs || !pTdnf->pConf || !pSolvedInfo)
53
+     {
54
+         dwError = ERROR_TDNF_INVALID_PARAMETER;
55
+         BAIL_ON_TDNF_ERROR(dwError);
56
+     }
57
+ 
58
++    ts.nQuiet = pTdnf->pArgs->nQuiet;
59
+     nKeepCachedRpms = pTdnf->pConf->nKeepCache;
60
+ 
61
+     dwError = TDNFAllocateMemory(
62
+diff --git a/include/tdnferror.h b/include/tdnferror.h
63
+index 9033efc..1eeb714 100644
64
+--- a/include/tdnferror.h
65
+@@ -122,10 +122,11 @@ extern "C" {
66
+ #define ERROR_TDNF_TRANS_INCOMPLETE     1525
67
+ #define ERROR_TDNF_TRANS_PKG_NOT_FOUND  1526
68
+ 
69
+-//System errors 1600 and up
70
+-#define ERROR_TDNF_SYSTEM_BASE          1600
71
+ // No search results found
72
+-#define ERROR_TDNF_NO_SEARCH_RESULTS    1601
73
++#define ERROR_TDNF_NO_SEARCH_RESULTS    1599
74
++#define ERROR_TDNF_SYSTEM_BASE          1600
75
++//System errors 1600 and up
76
++#define ERROR_TDNF_PERM                 (ERROR_TDNF_SYSTEM_BASE + EPERM)
77
+ #define ERROR_TDNF_INVALID_PARAMETER    (ERROR_TDNF_SYSTEM_BASE + EINVAL)
78
+ #define ERROR_TDNF_OUT_OF_MEMORY        (ERROR_TDNF_SYSTEM_BASE + ENOMEM)
79
+ #define ERROR_TDNF_NO_DATA              (ERROR_TDNF_SYSTEM_BASE + ENODATA)
80
+diff --git a/include/tdnftypes.h b/include/tdnftypes.h
81
+index 6aabaf0..2ebc466 100644
82
+--- a/include/tdnftypes.h
83
+@@ -160,6 +160,7 @@ typedef struct _TDNF_SOLVED_PKG_INFO
84
+ {
85
+     int nNeedAction;
86
+     int nNeedDownload;
87
++    TDNF_ALTERTYPE nAlterType;
88
+     PTDNF_PKG_INFO pPkgsNotAvailable;
89
+     PTDNF_PKG_INFO pPkgsExisting;
90
+     PTDNF_PKG_INFO pPkgsToInstall;
91
+diff --git a/solv/prototypes.h b/solv/prototypes.h
92
+index 1865b99..0fd08a5 100644
93
+--- a/solv/prototypes.h
94
+@@ -246,6 +246,17 @@ SolvFindHighestOrLowestInstalled(
95
+     uint32_t dwFindHighest
96
+     );
97
+ 
98
++uint32_t
99
++SolvGetNevraFromId(
100
++    PSolvSack pSack,
101
++    uint32_t dwPkgId,
102
++    uint32_t *pdwEpoch,
103
++    char **ppszName,
104
++    char **ppszVersion,
105
++    char **ppszRelease,
106
++    char **ppszArch
107
++    );
108
++
109
+ // tdnfpool.c
110
+ uint32_t
111
+ SolvCreateSack(
112
+diff --git a/solv/tdnfpackage.c b/solv/tdnfpackage.c
113
+index d394f07..3a926a1 100644
114
+--- a/solv/tdnfpackage.c
115
+@@ -1558,4 +1558,119 @@ cleanup:
116
+ 
117
+ error:
118
+     goto cleanup;
119
+-}
120
+\ No newline at end of file
121
++}
122
++
123
++uint32_t
124
++SolvGetNevraFromId(
125
++    PSolvSack pSack,
126
++    uint32_t dwPkgId,
127
++    uint32_t *pdwEpoch,
128
++    char **ppszName,
129
++    char **ppszVersion,
130
++    char **ppszRelease,
131
++    char **ppszArch
132
++    )
133
++{
134
++    uint32_t dwError = 0;
135
++    const char* pszTmp = NULL;
136
++    Solvable *pSolv = NULL;
137
++    uint32_t dwEpoch = 0;
138
++    char *pszName = NULL;
139
++    char *pszEpoch = NULL;
140
++    char *pszVersion = NULL;
141
++    char *pszRelease = NULL;
142
++    char *pszArch = NULL;
143
++
144
++    if(!pSack ||
145
++       !ppszName ||
146
++       !ppszVersion ||
147
++       !ppszRelease ||
148
++       !ppszArch ||
149
++       !pdwEpoch)
150
++    {
151
++        dwError = ERROR_TDNF_INVALID_PARAMETER;
152
++        BAIL_ON_TDNF_LIBSOLV_ERROR(dwError);
153
++    }
154
++
155
++    pSolv = pool_id2solvable(pSack->pPool, dwPkgId);
156
++    if(!pSolv)
157
++    {
158
++        dwError = ERROR_TDNF_NO_DATA;
159
++        BAIL_ON_TDNF_ERROR(dwError);
160
++    }
161
++
162
++    pszTmp = solvable_lookup_str(pSolv, SOLVABLE_NAME);
163
++    if(!pszTmp)
164
++    {
165
++        dwError = ERROR_TDNF_NO_DATA;
166
++        BAIL_ON_TDNF_ERROR(dwError);
167
++    }
168
++
169
++    dwError = TDNFAllocateString(pszTmp, &pszName);
170
++    BAIL_ON_TDNF_ERROR(dwError);
171
++
172
++    pszTmp = solvable_lookup_str(pSolv, SOLVABLE_ARCH);
173
++    if(!pszTmp)
174
++    {
175
++        dwError = ERROR_TDNF_NO_DATA;
176
++        BAIL_ON_TDNF_ERROR(dwError);
177
++    }
178
++
179
++    dwError = TDNFAllocateString(pszTmp, &pszArch);
180
++    BAIL_ON_TDNF_ERROR(dwError);
181
++
182
++    pszTmp = solvable_lookup_str(pSolv, SOLVABLE_EVR);
183
++    if(!pszTmp)
184
++    {
185
++        dwError = ERROR_TDNF_NO_DATA;
186
++        BAIL_ON_TDNF_ERROR(dwError);
187
++    }
188
++
189
++    dwError = SolvSplitEvr(pSack,
190
++                           pszTmp,
191
++                           &pszEpoch,
192
++                           &pszVersion,
193
++                           &pszRelease);
194
++    BAIL_ON_TDNF_ERROR(dwError);
195
++
196
++    if(!IsNullOrEmptyString(pszEpoch))
197
++    {
198
++        dwEpoch = strtol(pszEpoch, NULL, 10);
199
++    }
200
++
201
++    *pdwEpoch = dwEpoch;
202
++    *ppszName = pszName;
203
++    *ppszVersion = pszVersion;
204
++    *ppszRelease = pszRelease;
205
++    *ppszArch = pszArch;
206
++cleanup:
207
++    TDNF_SAFE_FREE_MEMORY(pszEpoch);
208
++    return dwError;
209
++
210
++error:
211
++    if(pdwEpoch)
212
++    {
213
++        *pdwEpoch = 0;
214
++    }
215
++    if(ppszName)
216
++    {
217
++        *ppszName = NULL;
218
++    }
219
++    if(ppszVersion)
220
++    {
221
++        *ppszVersion = NULL;
222
++    }
223
++    if(ppszRelease)
224
++    {
225
++        *ppszRelease = NULL;
226
++    }
227
++    if(ppszArch)
228
++    {
229
++        *ppszArch = NULL;
230
++    }
231
++    TDNF_SAFE_FREE_MEMORY(pszName);
232
++    TDNF_SAFE_FREE_MEMORY(pszVersion);
233
++    TDNF_SAFE_FREE_MEMORY(pszRelease);
234
++    TDNF_SAFE_FREE_MEMORY(pszArch);
235
++    goto cleanup;
236
++}
237
+diff --git a/tools/cli/main.c b/tools/cli/main.c
238
+index c1df143..dc7a505 100644
239
+--- a/tools/cli/main.c
240
+@@ -63,6 +63,15 @@ int main(int argc, char* argv[])
241
+     PTDNF pTdnf = NULL;
242
+     int nFound = 0;
243
+ 
244
++    //granular permissions for non root users are pending.
245
++    //blocking all operations for non root and show the
246
++    //right error to avoid confusion.
247
++    if(geteuid() != 0)
248
++    {
249
++        dwError = ERROR_TDNF_PERM;
250
++        BAIL_ON_CLI_ERROR(dwError);
251
++    }
252
++
253
+     _context.pFnCheck = TDNFCliInvokeCheck;
254
+     _context.pFnCheckLocal = TDNFCliInvokeCheckLocal;
255
+     _context.pFnCheckUpdate = TDNFCliInvokeCheckUpdate;
... ...
@@ -3,42 +3,40 @@
3 3
 #
4 4
 Summary:        dnf/yum equivalent using C libs
5 5
 Name:           tdnf
6
-Version:        1.2.2
7
-Release:        3%{?dist}
6
+Version:        2.0.0
7
+Release:        1%{?dist}
8 8
 Vendor:         VMware, Inc.
9 9
 Distribution:   Photon
10 10
 License:        LGPLv2.1,GPLv2
11 11
 Url:            http://www.vmware.com
12 12
 Group:          Applications/RPM
13
-Requires:       hawkey >= 2017.1
14 13
 Requires:       rpm-libs
15 14
 Requires:       curl
15
+Requires:       tdnf-cli-libs = %{version}-%{release}
16
+Requires:       libsolv
16 17
 BuildRequires:  popt-devel
17 18
 BuildRequires:  rpm-devel
18
-BuildRequires:  hawkey-devel >= 2017.1
19 19
 BuildRequires:  openssl-devel
20 20
 BuildRequires:  libsolv-devel
21 21
 BuildRequires:  curl-devel
22 22
 Obsoletes:      yum
23 23
 Provides:       yum
24
-Source0:        %{name}-%{version}.tar.gz
25
-%define sha1    tdnf=51e084e294e1ae4eae800dbf6f4e435c3d18a8ff
24
+Source0:        %{name}-%{version}-alpha.1.tar.gz
25
+%define sha1    tdnf=625331f1b2e72fdacd64c137667553be1c4236cf
26 26
 Source1:        cache-updateinfo
27 27
 Source2:        cache-updateinfo.service
28 28
 Source3:        cache-updateinfo.timer
29 29
 Source4:        updateinfo.sh
30
-Patch0:         tdnf_fix_protected_pkgs_in_obsolete.patch
31
-Patch1:         tdnf-perm.patch
30
+Patch0:         tdnf-epoch-and-perm.patch
32 31
 
33 32
 %description
34
-tdnf is a yum/dnf equivalent
35
-which uses libsolv and libhawkey
33
+tdnf is a yum/dnf equivalent which uses libsolv and libcurl
36 34
 
37 35
 %package    devel
38 36
 Summary:    A Library providing C API for tdnf
39 37
 Group:      Development/Libraries
40 38
 Requires:   tdnf = %{version}-%{release}
41
-Requires:   hawkey-devel >= 2017.1
39
+Requires:   libsolv-devel
42 40
 
43 41
 %description devel
44 42
 Development files for tdnf
... ...
@@ -51,13 +49,10 @@ Group:		Development/Libraries
51 51
 Library providing cli libs for tdnf like clients.
52 52
 
53 53
 %prep
54
-%setup -q
54
+%setup -qn %{name}-%{version}-alpha.1
55 55
 %patch0 -p1
56
-%patch1 -p1
57
-
58 56
 
59 57
 %build
60
-sed -i 's/tdnf, 1.2.0/tdnf, 1.2.2/' configure.ac
61 58
 autoreconf -i
62 59
 ./configure \
63 60
     --prefix=%{_prefix} \
... ...
@@ -136,7 +131,7 @@ systemctl try-restart tdnf-cache-updateinfo.timer >/dev/null 2>&1 || :
136 136
     %{_bindir}/tyum
137 137
     %{_bindir}/yum
138 138
     %{_bindir}/tdnf-cache-updateinfo
139
-    %{_libdir}/*.so.*
139
+    %{_libdir}/libtdnf.so.*
140 140
     %config(noreplace) %{_sysconfdir}/tdnf/tdnf.conf
141 141
     %config %{_libdir}/systemd/system/tdnf-cache-updateinfo.service
142 142
     %config(noreplace) %{_libdir}/systemd/system/tdnf-cache-updateinfo.timer
... ...
@@ -146,7 +141,8 @@ systemctl try-restart tdnf-cache-updateinfo.timer >/dev/null 2>&1 || :
146 146
 %files devel
147 147
     %defattr(-,root,root)
148 148
     %{_includedir}/tdnf/*.h
149
-    %{_libdir}/*.so
149
+    %{_libdir}/libtdnf.so
150
+    %{_libdir}/libtdnfcli.so
150 151
     %exclude %{_libdir}/debug
151 152
     %{_libdir}/pkgconfig/tdnf.pc
152 153
     %{_libdir}/pkgconfig/tdnf-cli-libs.pc
... ...
@@ -156,6 +152,8 @@ systemctl try-restart tdnf-cache-updateinfo.timer >/dev/null 2>&1 || :
156 156
     %{_libdir}/libtdnfcli.so.*
157 157
 
158 158
 %changelog
159
+*   Fri Feb 09 2018 Priyesh Padmavilasom <ppadmavilasom@vmware.com> 2.0.0-1
160
+-   update to 2.0.0
159 161
 *   Tue Jan 30 2018 Priyesh Padmavilasom <ppadmavilasom@vmware.com> 1.2.2-3
160 162
 -   patch to error out early for permission issues.
161 163
 *   Tue Oct 10 2017 Priyesh Padmavilasom <ppadmavilasom@vmware.com> 1.2.2-2