Commit c8dac3e0 authored by Bernhard Link's avatar Bernhard Link

When missing section or priority reprepro's includedsc and changestool's...

When missing section or priority reprepro's includedsc and changestool's add[dsc] look into the .diff file.
parent f84c86be
2008-03-08 Bernhard R. Link <brlink@debian.org>
* When missing section or priority reprepro's includedsc and
changestool's add[dsc] look into the .diff file.
2008-03-06 Bernhard R. Link <brlink@debian.org>
* fix/improve some messages, based uppon many suggestions
by Marc Haber.
......
......@@ -18,12 +18,12 @@ AM_CPPFLAGS = -std=gnu99 -Wall $(ARCHIVECPP) $(DBCPPFLAGS)
reprepro_LDADD = $(ARCHIVELIBS) $(DBLIBS)
changestool_LDADD = $(ARCHIVELIBS)
reprepro_SOURCES = checksums.c readtextfile.c filecntl.c sha1.c configparser.c database.c freespace.c log.c changes.c incoming.c uploaderslist.c guesscomponent.c files.c md5.c dirs.c chunks.c reference.c binaries.c sources.c checks.c names.c dpkgversions.c release.c mprintf.c updates.c strlist.c signature.c distribution.c checkindeb.c checkindsc.c checkin.c upgradelist.c target.c aptmethod.c downloadcache.c main.c override.c terms.c ignore.c filterlist.c exports.c tracking.c optionsfile.c readrelease.c donefile.c pull.c contents.c filelist.c $(ARCHIVE_USED) $(ARCHIVE_CONTENTS)
reprepro_SOURCES = readcompressed.c sourceextraction.c checksums.c readtextfile.c filecntl.c sha1.c configparser.c database.c freespace.c log.c changes.c incoming.c uploaderslist.c guesscomponent.c files.c md5.c dirs.c chunks.c reference.c binaries.c sources.c checks.c names.c dpkgversions.c release.c mprintf.c updates.c strlist.c signature.c distribution.c checkindeb.c checkindsc.c checkin.c upgradelist.c target.c aptmethod.c downloadcache.c main.c override.c terms.c ignore.c filterlist.c exports.c tracking.c optionsfile.c readrelease.c donefile.c pull.c contents.c filelist.c $(ARCHIVE_USED) $(ARCHIVE_CONTENTS)
EXTRA_reprepro_SOURCE = $(ARCHIVE_UNUSED)
changestool_SOURCES = readtextfile.c filecntl.c tool.c chunkedit.c strlist.c checksums.c sha1.c md5.c mprintf.c chunks.c signature.c dirs.c names.c $(ARCHIVE_USED)
changestool_SOURCES = readcompressed.c sourceextraction.c readtextfile.c filecntl.c tool.c chunkedit.c strlist.c checksums.c sha1.c md5.c mprintf.c chunks.c signature.c dirs.c names.c $(ARCHIVE_USED)
noinst_HEADERS = checksums.h readtextfile.h filecntl.h sha1.h configparser.h database_p.h database.h freespace.h log.h changes.h incoming.h guesscomponent.h md5.h dirs.h files.h chunks.h reference.h binaries.h sources.h checks.h names.h release.h error.h mprintf.h updates.h strlist.h signature.h distribution.h debfile.h checkindeb.h checkindsc.h upgradelist.h target.h aptmethod.h downloadcache.h override.h terms.h ignore.h filterlist.h dpkgversions.h checkin.h exports.h globals.h tracking.h trackingt.h optionsfile.h readrelease.h donefile.h pull.h ar.h filelist.h contents.h chunkedit.h uploaderslist.h
noinst_HEADERS = readcompressed.h sourceextraction.h checksums.h readtextfile.h filecntl.h sha1.h configparser.h database_p.h database.h freespace.h log.h changes.h incoming.h guesscomponent.h md5.h dirs.h files.h chunks.h reference.h binaries.h sources.h checks.h names.h release.h error.h mprintf.h updates.h strlist.h signature.h distribution.h debfile.h checkindeb.h checkindsc.h upgradelist.h target.h aptmethod.h downloadcache.h override.h terms.h ignore.h filterlist.h dpkgversions.h checkin.h exports.h globals.h tracking.h trackingt.h optionsfile.h readrelease.h donefile.h pull.h ar.h filelist.h contents.h chunkedit.h uploaderslist.h
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in $(srcdir)/configure $(srcdir)/install-sh $(srcdir)/stamp-h.in $(srcdir)/aclocal.m4 $(srcdir)/config.h.in $(srcdir)/mkinstalldirs $(srcdir)/config.guess $(srcdir)/config.sub $(srcdir)/missing
......
......@@ -44,6 +44,7 @@
#include "ignore.h"
#include "override.h"
#include "log.h"
#include "sourceextraction.h"
extern int verbose;
......@@ -223,13 +224,72 @@ retvalue dsc_add(struct database *database,const char *forcecomponent,const char
}
}
r = dirs_getdirectory(dscfilename, &origdirectory);
if( RET_WAS_ERROR(r) ) {
dsc_free(pkg, database);
return r;
}
if( pkg->dsc.section == NULL || pkg->dsc.priority == NULL ) {
struct sourceextraction *extraction;
extraction = sourceextraction_init(
(pkg->dsc.section == NULL)?&pkg->dsc.section:NULL,
(pkg->dsc.priority == NULL)?&pkg->dsc.priority:NULL);
if( FAILEDTOALLOC(extraction) ) {
free(origdirectory);
dsc_free(pkg, database);
return RET_ERROR_OOM;
}
for( i = 1 ; i < pkg->dsc.files.names.count ; i ++ )
sourceextraction_setpart(extraction, i,
pkg->dsc.files.names.values[i]);
while( sourceextraction_needs(extraction, &i) ) {
char *fullfilename = calc_dirconcat(origdirectory,
pkg->dsc.files.names.values[i]);
if( FAILEDTOALLOC(fullfilename) ) {
free(origdirectory);
dsc_free(pkg, database);
return RET_ERROR_OOM;
}
/* while it would nice to try at the pool if we
* do not have the file here, to know its location
* in the pool we need to know the component. And
* for the component we might need the section first */
// TODO: but if forcecomponent is set it might be possible.
r = sourceextraction_analyse(extraction, fullfilename);
free(fullfilename);
if( RET_WAS_ERROR(r) ) {
free(origdirectory);
dsc_free(pkg, database);
sourceextraction_abort(extraction);
return r;
}
}
r = sourceextraction_finish(extraction);
if( RET_WAS_ERROR(r) ) {
free(origdirectory);
dsc_free(pkg, database);
return r;
}
}
if( pkg->dsc.section == NULL && pkg->dsc.priority == NULL ) {
fprintf(stderr, "No section and no priority for '%s', skipping.\n",
pkg->dsc.name);
free(origdirectory);
dsc_free(pkg, database);
return RET_ERROR;
}
if( pkg->dsc.section == NULL ) {
fprintf(stderr, "No section for '%s', skipping.\n", pkg->dsc.name);
free(origdirectory);
dsc_free(pkg, database);
return RET_ERROR;
}
if( pkg->dsc.priority == NULL ) {
fprintf(stderr, "No priority for '%s', skipping.\n", pkg->dsc.name);
free(origdirectory);
dsc_free(pkg, database);
return RET_ERROR;
}
......@@ -240,6 +300,7 @@ retvalue dsc_add(struct database *database,const char *forcecomponent,const char
pkg->dsc.name, pkg->dsc.section, forcecomponent,
&pkg->component);
if( RET_WAS_ERROR(r) ) {
free(origdirectory);
dsc_free(pkg, database);
return r;
}
......@@ -247,12 +308,6 @@ retvalue dsc_add(struct database *database,const char *forcecomponent,const char
fprintf(stderr,"%s: component guessed as '%s'\n",dscfilename,pkg->component);
}
r = dirs_getdirectory(dscfilename, &origdirectory);
if( RET_WAS_ERROR(r) ) {
dsc_free(pkg, database);
return r;
}
pkg->deleteonfailure = calloc(pkg->dsc.files.names.count+1, sizeof(bool));
if( pkg->deleteonfailure == NULL ) {
dsc_free(pkg, database);
......
......@@ -387,9 +387,12 @@ like .orig.tar.gz, .tar.gz and/or .diff.gz) in the specified
distribution, applying override information and guessing all values
not given and guessable.
Note that as .dsc files do not contain section or priority, but the
Sources.gz file does, you have to either specify a DscOverride or
given them via
Note that .dsc files do not contain section or priority, but the
Sources.gz file needs them.
reprepro tries to parse .diff and .tar files for
it, but is only able to resolve easy cases.
If reprepro fails to extract those automatically,
you have to either specify a DscOverride or give them via
.B \-S
and
.B \-P
......
/* This file is part of "reprepro"
* Copyright (C) 2008 Bernhard R. Link
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include <config.h>
#include <errno.h>
#include <assert.h>
#include <limits.h>
#include <malloc.h>
#include <string.h>
#include <zlib.h>
#ifdef HAVE_LIBBZ2
#include <bzlib.h>
#endif
#include "error.h"
#include "readcompressed.h"
extern int verbose;
struct readcompressed {
// preliminary, as dead slow...
gzFile f;
char buffer[4097];
size_t lineno;
};
bool readcompressed_getline(struct readcompressed *r, /*@out@*/const char **line) {
char *c;
r->lineno++;
if( gzgets(r->f, r->buffer, 4096) == NULL )
return false;
r->buffer[4096] = '\0';
c = strchr(r->buffer, '\n');
if( c == NULL )
return false;
*c = '\0';
while( --c > r->buffer && *c == '\r' )
*c = '\0';
*line = r->buffer;
return true;
}
char readcompressed_overlinegetchar(struct readcompressed *r) {
char *c, ch;
r->lineno++;
if( gzgets(r->f, r->buffer, 4096) == NULL )
return false;
r->buffer[4096] = '\0';
ch = r->buffer[0];
if( ch == '\n' ) {
return '\0';
}
c = strchr(r->buffer, '\n');
while( c == NULL ) {
if( gzgets(r->f, r->buffer, 4096) == NULL )
return ch;
c = strchr(r->buffer, '\n');
}
return ch;
}
retvalue readcompressed_open(/*@out@*/struct readcompressed **r, const char *filename, enum compression c) {
struct readcompressed *n;
if( c != c_uncompressed && c != c_gzipped )
return RET_NOTHING;
n = calloc(1, sizeof(struct readcompressed));
if( n == NULL )
return RET_ERROR_OOM;
n->f = gzopen(filename, "r");
if( n->f == NULL ) {
free(n);
return RET_NOTHING;
}
*r = n;
return RET_OK;
}
retvalue readcompressed_close(struct readcompressed *r) {
if( r != NULL ) {
gzclose(r->f);
free(r);
}
// TODO: implement error handling...
return RET_OK;
}
void readcompressed_abort(struct readcompressed *r) {
if( r != NULL ) {
if( verbose > 20 ) {
fprintf(stderr, "Aborted reading compessed file at line %llu\n",
(long long unsigned int)r->lineno);
}
gzclose(r->f);
free(r);
}
}
#ifndef REPREPRO_READCOMPRESSED_H
#define REPREPRO_READCOMPRESSED_H
// TODO: this might be moved to some common code for also parsing index files
// later...
enum compression { c_uncompressed, c_gzipped, c_bzipped, c_lzmad };
#ifdef HAVE_LIBBZ2
#define unsupportedcompression(x) ( x > c_bzipped )
#else
#define unsupportedcompression(x) ( x >= c_bzipped )
#endif
struct readcompressed;
bool readcompressed_getline(struct readcompressed *, /*@out@*/const char **);
char readcompressed_overlinegetchar(struct readcompressed *);
retvalue readcompressed_open(/*@out@*/struct readcompressed **, const char *, enum compression);
retvalue readcompressed_close(/*@only@*/struct readcompressed *);
void readcompressed_abort(/*@only@*/struct readcompressed *);
#endif
/* This file is part of "reprepro"
* Copyright (C) 2008 Bernhard R. Link
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1301 USA
*/
#include <config.h>
#include <errno.h>
#include <assert.h>
#include <limits.h>
#include <malloc.h>
#include <string.h>
#include "error.h"
#include "readcompressed.h"
#include "sourceextraction.h"
struct sourceextraction {
bool failed, completed;
int difffile, tarfile;
enum compression diffcompression, tarcompression;
/*@null@*/ char **section_p, **priority_p;
};
struct sourceextraction *sourceextraction_init(char **section_p, char **priority_p) {
struct sourceextraction *n;
n = calloc(1, sizeof(struct sourceextraction));
if( FAILEDTOALLOC(n) )
return n;
n->difffile = -1;
n->tarfile = -1;
n->section_p = section_p;
n->priority_p = priority_p;
return n;
}
void sourceextraction_abort(struct sourceextraction *e) {
free(e);
}
/* with must be a string constant, no pointer! */
#define endswith(name, len, with) (len >= sizeof(with) && memcmp(name+(len+1-sizeof(with)), with, sizeof(with)-1) == 0 )
/* register a file part of this source */
void sourceextraction_setpart(struct sourceextraction *e, int i, const char *basename) {
size_t bl = strlen(basename);
enum compression c;
if( e->failed )
return;
if( endswith(basename, bl, ".gz" ) ) {
c = c_gzipped;
bl -= 3;
} else if( endswith(basename, bl, ".bz2" ) ) {
c = c_bzipped;
bl -= 4;
} else if( endswith(basename, bl, ".lzma" ) ) {
c = c_bzipped;
bl -= 5;
} else {
c = c_uncompressed;
}
if( endswith(basename, bl, ".dsc" ) )
return;
else if( endswith(basename, bl, ".diff" ) ) {
e->difffile = i;
e->diffcompression = c;
return;
} else if( endswith(basename, bl, ".tar" ) ) {
e->tarfile = i;
e->tarcompression = c;
return;
} else {
// TODO: errormessage
e->failed = true;
}
}
/* return the next needed file */
bool sourceextraction_needs(struct sourceextraction *e, int *ofs_p) {
if( e->failed || e->completed )
return false;
if( e->difffile >= 0 ) {
if( unsupportedcompression(e->diffcompression) )
// TODO: errormessage
return false;
*ofs_p = e->difffile;
return true;
} else if( e->tarfile >= 0 ) {
#ifdef HAVE_LIBARCHIVE
if( unsupportedcompression(e->tarcompression) )
// TODO: errormessage
return false;
*ofs_p = e->tarfile;
return true;
#else
return false;
#endif
} else
return false;
}
static retvalue parsediff(struct readcompressed *f, /*@null@*/char **section_p, /*@null@*/char **priority_p, bool *found_p) {
size_t destlength, lines_in, lines_out;
const char *p, *s;
/* we are assuming the exact format dpkg-source generates here... */
if( !readcompressed_getline(f, &p) ) {
/* empty file */
*found_p = false;
return RET_OK;
}
if( unlikely(memcmp(p, "--- ", 4) != 0) )
return RET_NOTHING;
if( !readcompressed_getline(f, &p) )
/* so short a file? */
return RET_NOTHING;
if( unlikely(memcmp(p, "+++ ", 4) != 0) )
return RET_NOTHING;
p += 4;
s = strchr(p, '/');
if( unlikely(s == NULL) )
return RET_NOTHING;
destlength = s - p;
/* ignore all files that are not x/debian/control */
while( strcmp(s, "debian/control") != 0 ) {
if( !readcompressed_getline(f, &p) )
return RET_NOTHING;
while( memcmp(p, "@@ -", 4) == 0) {
p += 4;
while( *p != ',' ) {
if( unlikely(*p == '\0') )
return RET_NOTHING;
p++;
}
p++;
lines_in = 0;
while( *p >= '0' && *p <= '9' ) {
lines_in = 10*lines_in + (*p-'0');
p++;
}
while( *p == ' ' )
p++;
if( unlikely(*(p++) != '+') )
return RET_NOTHING;
while( *p >= '0' && *p <= '9' )
p++;
if( *p == ',' ) {
p++;
lines_out = 0;
while( *p >= '0' && *p <= '9' ) {
lines_out = 10*lines_out + (*p-'0');
p++;
}
} else
lines_out = 1;
while( *p == ' ' )
p++;
if( unlikely(*p != '@') )
return RET_NOTHING;
while( lines_in > 0 || lines_out > 0 ) {
char ch;
ch = readcompressed_overlinegetchar(f);
switch( ch ) {
case '+':
if( unlikely(lines_out == 0) )
return RET_NOTHING;
lines_out--;
break;
case ' ':
if( unlikely(lines_out == 0) )
return RET_NOTHING;
lines_out--;
case '-':
if( unlikely(lines_in == 0) )
return RET_NOTHING;
lines_in--;
break;
default:
return RET_NOTHING;
}
}
if( !readcompressed_getline(f, &p) ) {
*found_p = false;
/* nothing found successfully */
return RET_OK;
}
}
if( unlikely(memcmp(p, "--- ", 4) != 0) )
return RET_NOTHING;
if( !readcompressed_getline(f, &p) )
return RET_NOTHING;
if( unlikely(memcmp(p, "+++ ", 4) != 0) )
return RET_NOTHING;
s = p + 4 + destlength;
if( unlikely(*s != '/') )
return RET_NOTHING;
s++;
}
/* found debian/control */
if( !readcompressed_getline(f, &p) )
return RET_NOTHING;
if( unlikely(memcmp(p, "@@ -", 4) != 0) )
return RET_NOTHING;
p += 4;
p++;
while( *p != ',' ) {
if( unlikely(*p == '\0') )
return RET_NOTHING;
p++;
}
p++;
while( *p >= '0' && *p <= '9' )
p++;
while( *p == ' ' )
p++;
if( unlikely(*(p++) != '+') )
return RET_NOTHING;
if( *(p++) != '1' || *(p++) != ',' ) {
/* a diff not starting at the first line is not yet supported */
return RET_NOTHING;
}
lines_out = 0;
while( *p >= '0' && *p <= '9' ) {
lines_out = 10*lines_out + (*p-'0');
p++;
}
while( *p == ' ' )
p++;
if( unlikely(*p != '@') )
return RET_NOTHING;
while( lines_out > 0 ) {
if( !readcompressed_getline(f, &p) )
return RET_NOTHING;
switch( *(p++) ) {
case '-':
break;
default:
return RET_NOTHING;
case ' ':
case '+':
if( unlikely(lines_out == 0) )
return RET_NOTHING;
lines_out--;
if( section_p != NULL &&
strncasecmp(p, "Section:", 8) == 0 ) {
p += 8;
while( *p == ' ' || *p == '\t' )
p++;
s = p;
while( *s != ' ' && *s != '\t' &&
*s != '\0' && *s != '\r' )
s++;
if( s == p )
return RET_NOTHING;
*section_p = strndup(p, s-p);
if( FAILEDTOALLOC(*section_p) )
return RET_ERROR_OOM;
while( *s == ' ' || *s == '\t' ||
*s == '\r' )
s++;
if( *s != '\0' )
return RET_NOTHING;
continue;
}
if( priority_p != NULL &&
strncasecmp(p, "Priority:", 9) == 0 ) {
p += 9;
while( *p == ' ' || *p == '\t' )
p++;
s = p;
while( *s != ' ' && *s != '\t' &&
*s != '\0' && *s != '\r' )
s++;
if( s == p )
return RET_NOTHING;
*priority_p = strndup(p, s-p);
if( FAILEDTOALLOC(*priority_p) )
return RET_ERROR_OOM;
while( *s == ' ' || *s == '\t' ||
*s == '\r' )
s++;
if( *s != '\0' )
return RET_NOTHING;
continue;
}
if( *p == '\0' ) {
/* end of control data, we are
* finished */
*found_p = true;
return RET_OK;
}
break;
}
}
/* cannot yet handle a .diff not containing the full control */
return RET_NOTHING;
}
/* full file name of requested files ready to analyse */
retvalue sourceextraction_analyse(struct sourceextraction *e, const char *fullfilename) {
retvalue r;
bool found IFSTUPIDCC(= false);
#ifndef HAVE_LIBARCHIVE
assert( e->difffile >= 0 );
#endif
if( e->difffile >= 0 ) {
struct readcompressed *f;
assert( !unsupportedcompression(e->diffcompression) );
e->difffile = -1;
r = readcompressed_open(&f, fullfilename, e->diffcompression);
if( !RET_IS_OK(r) ) {
e->failed = true;
return r;
}
r = parsediff(f, e->section_p, e->priority_p, &found);
if( RET_IS_OK(r) )
r = readcompressed_close(f);
else
readcompressed_abort(f);
if( !RET_IS_OK(r) )
e->failed = true;
else if( found )
/* do not look in the tar, we found debian/control */
e->completed = true;
return r;
}
/* if it's not the diff, look into the .tar file */
assert( e->tarfile >= 0 );
assert( !unsupportedcompression(e->tarcompression) );
e->tarfile = -1;
// TODO: implement this. This is a bit more complicated because those
// are native upstream tars and dpkg-source has even special code to
// handle all kind of broken tars.
return RET_NOTHING;
}
retvalue sourceextraction_finish(struct sourceextraction *e) {
if( e->completed ) {
free(e);
return RET_OK;
}
free(e);
return RET_NOTHING;
}
#ifndef REPREPRO_SOURCEEXTRACTION_H
#define REPREPRO_SOURCEEXTRACTION_H
struct sourceextraction;
/*@NULL@*/struct sourceextraction *sourceextraction_init(/*@null@*/char **section_p, /*@null@*/char **priority_p);
void sourceextraction_abort(/*@only@*/struct sourceextraction *);
/* register a file part of this source */
void sourceextraction_setpart(struct sourceextraction *, int , const char *);
/* return the next needed file */
bool sourceextraction_needs(struct sourceextraction *, /*@out@*/int *);
/* full file name of requested files ready to analyse */
retvalue sourceextraction_analyse(struct sourceextraction *, const char *);
retvalue sourceextraction_finish(/*@only@*/struct sourceextraction *);
#endif
......@@ -38,6 +38,7 @@
#include "chunkedit.h"
#include "signature.h"
#include "debfile.h"
#include "sourceextraction.h"
/* for compatibility with used code */
int verbose=0;
......@@ -1935,6 +1936,7 @@ static retvalue adddsc(struct changes *c, const char *dscfilename) {
return RET_ERROR_OOM;
dsc->files[i].file = file;
/* make them appear in the .changes file if not there: */
// TODO: add missing checksums here from file
if( file->checksumsfromchanges == NULL ) {
file->checksumsfromchanges = checksums_dup(checksums);
if( file->checksumsfromchanges == NULL )
......@@ -1965,6 +1967,44 @@ static retvalue adddsc(struct changes *c, const char *dscfilename) {
if( f->priority == NULL )
return RET_ERROR_OOM;
}
if( f->section == NULL || f->priority == NULL ) {
struct sourceextraction *extraction;
int j;
extraction = sourceextraction_init(
(f->section == NULL)?&f->section:NULL,
(f->priority == NULL)?&f->priority:NULL);
if( extraction == NULL )
return RET_ERROR_OOM;
for( j = 0 ; j < dsc->filecount ; j++ ) {
sourceextraction_setpart(extraction, j,
dsc->files[j].basename);
}
while( sourceextraction_needs(extraction, &j) ) {
if( dsc->files[j].file->fullfilename == NULL ) {
/* look for file */
// TODO: add path of dsc here...
r = findfile(dsc->files[j].basename, c, NULL,
&dsc->files[j].file->fullfilename);
if( RET_WAS_ERROR(r) ) {
sourceextraction_abort(extraction);
return r;
}
if( r == RET_NOTHING ||
dsc->files[j].file->fullfilename == NULL )
break;
}
r = sourceextraction_analyse(extraction,
dsc->files[j].file->fullfilename);
if( RET_WAS_ERROR(r) ) {
sourceextraction_abort(extraction);
return r;
}
}
r = sourceextraction_finish(extraction);
if( RET_WAS_ERROR(r) )
return r;
}
/* update information in the main .changes file if not there already */
if( c->maintainer == NULL && dsc->maintainer != NULL ) {
c->maintainer = strdup(dsc->maintainer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment