This is an automated email from the git hooks/post-receive script.

guillem pushed a commit to branch master
in repository dpkg.

commit ce4f0311e6e7a7b5125c4e881a0f2d3a8e1eea45
Author: Guillem Jover <guil...@debian.org>
Date:   Sun Apr 6 06:03:24 2014 +0200

    dpkg-split: Parse deb control file directly from stdin
    
    This reduces the dpkg-deb calls to just one instead of one per field. In
    addition we also reduce the parsing and dumping to a single instance.
---
 dpkg-split/split.c | 54 ++++++++++++++++++++++--------------------------------
 1 file changed, 22 insertions(+), 32 deletions(-)

diff --git a/dpkg-split/split.c b/dpkg-split/split.c
index 47b9c3e..28ad646 100644
--- a/dpkg-split/split.c
+++ b/dpkg-split/split.c
@@ -40,6 +40,7 @@
 #include <dpkg/c-ctype.h>
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
+#include <dpkg/parsedump.h>
 #include <dpkg/path.h>
 #include <dpkg/string.h>
 #include <dpkg/subproc.h>
@@ -49,14 +50,16 @@
 
 #include "dpkg-split.h"
 
-static char *
-deb_field(const char *filename, const char *field)
+/**
+ * Parse the control file from a .deb package into a struct pkginfo.
+ */
+static struct pkginfo *
+deb_parse_control(const char *filename)
 {
-       struct dpkg_error err;
+       struct parsedb_state *ps;
+       struct pkginfo *pkg;
        pid_t pid;
        int p[2];
-       struct varbuf buf = VARBUF_INIT;
-       char *end;
 
        m_pipe(p);
 
@@ -67,31 +70,23 @@ deb_field(const char *filename, const char *field)
                close(p[0]);
                close(p[1]);
 
-               execlp(BACKEND, BACKEND, "--field", filename, field, NULL);
+               execlp(BACKEND, BACKEND, "--info", filename, "control", NULL);
                ohshite(_("unable to execute %s (%s)"),
                        _("package field value extraction"), BACKEND);
        }
        close(p[1]);
 
-       /* Parant reads from pipe. */
-       varbuf_reset(&buf);
-       if (fd_vbuf_copy(p[0], &buf, -1, &err) < 0)
-               ohshit(_("cannot extract package field value from '%s': %s"),
-                      filename, err.str);
-       varbuf_end_str(&buf);
+       /* Parent reads from pipe. */
+       ps = parsedb_new(_("<dpkg-deb --info pipe>"), p[0], pdb_parse_binary);
+       parsedb_load(ps);
+       parsedb_parse(ps, &pkg);
+       parsedb_close(ps);
 
        close(p[0]);
 
        subproc_reap(pid, _("package field value extraction"), SUBPROC_NOPIPE);
 
-       /* Trim down trailing junk. */
-       for (end = buf.buf + strlen(buf.buf) - 1; end - buf.buf >= 1; end--)
-               if (c_isspace(*end))
-                       *end = '\0';
-               else
-                       break;
-
-       return varbuf_detach(&buf);
+       return pkg;
 }
 
 /* Cleanup filename for use in crippled msdos systems. */
@@ -118,11 +113,12 @@ static int
 mksplit(const char *file_src, const char *prefix, off_t maxpartsize,
         bool msdos)
 {
+       struct pkginfo *pkg;
        struct dpkg_error err;
        int fd_src;
        struct stat st;
+       const char *version;
        char hash[MD5HASHLEN + 1];
-       char *package, *version, *arch;
        int nparts, curpart;
        off_t partsize;
        off_t cur_partsize, last_partsize;
@@ -144,10 +140,8 @@ mksplit(const char *file_src, const char *prefix, off_t 
maxpartsize,
                       file_src, err.str);
        lseek(fd_src, 0, SEEK_SET);
 
-       /* FIXME: Use libdpkg-deb. */
-       package = deb_field(file_src, "Package");
-       version = deb_field(file_src, "Version");
-       arch = deb_field(file_src, "Architecture");
+       pkg  = deb_parse_control(file_src);
+       version = versiondescribe(&pkg->available.version, vdew_always);
 
        partsize = maxpartsize - HEADERALLOWANCE;
        last_partsize = st.st_size % partsize;
@@ -157,7 +151,7 @@ mksplit(const char *file_src, const char *prefix, off_t 
maxpartsize,
 
        printf(P_("Splitting package %s into %d part: ",
                  "Splitting package %s into %d parts: ", nparts),
-              package, nparts);
+              pkg->set->name, nparts);
 
        if (msdos) {
                char *t;
@@ -212,9 +206,9 @@ mksplit(const char *file_src, const char *prefix, off_t 
maxpartsize,
                /* Write the debian-split part. */
                varbuf_printf(&partmagic,
                              "%s\n%s\n%s\n%s\n%jd\n%jd\n%d/%d\n%s\n",
-                             SPLITVERSION, package, version, hash,
+                             SPLITVERSION, pkg->set->name, version, hash,
                              (intmax_t)st.st_size, (intmax_t)partsize,
-                             curpart, nparts, arch);
+                             curpart, nparts, pkg->available.arch->name);
                dpkg_ar_member_put_mem(file_dst.buf, fd_dst, PARTMAGIC,
                                       partmagic.buf, partmagic.used);
                varbuf_reset(&partmagic);
@@ -234,10 +228,6 @@ mksplit(const char *file_src, const char *prefix, off_t 
maxpartsize,
        varbuf_destroy(&partname);
        varbuf_destroy(&partmagic);
 
-       free(package);
-       free(version);
-       free(arch);
-
        free(prefixdir);
        free(msdos_prefix);
 

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/dpkg/dpkg.git


-- 
To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to