summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/contrib/fileutl.cc11
-rw-r--r--apt-pkg/contrib/fileutl.h3
-rw-r--r--apt-pkg/depcache.cc11
-rw-r--r--apt-pkg/indexcopy.cc6
-rw-r--r--apt-pkg/pkgcachegen.cc4
-rw-r--r--debian/changelog18
-rw-r--r--debian/control2
-rw-r--r--methods/bzip2.cc2
-rw-r--r--methods/copy.cc2
-rw-r--r--methods/gzip.cc2
-rw-r--r--methods/rred.cc4
11 files changed, 48 insertions, 17 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 2a3b8a87d..91aecee65 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -669,7 +669,7 @@ bool FileFd::Open(string FileName,OpenMode Mode, unsigned long Perms)
}
break;
- case WriteEmpty:
+ case WriteAtomic:
{
Flags |= Replace;
char *name = strdup((FileName + ".XXXXXX").c_str());
@@ -678,6 +678,15 @@ bool FileFd::Open(string FileName,OpenMode Mode, unsigned long Perms)
free(name);
break;
}
+
+ case WriteEmpty:
+ {
+ struct stat Buf;
+ if (lstat(FileName.c_str(),&Buf) == 0 && S_ISLNK(Buf.st_mode))
+ unlink(FileName.c_str());
+ iFd = open(FileName.c_str(),O_RDWR | O_CREAT | O_TRUNC,Perms);
+ break;
+ }
case WriteExists:
iFd = open(FileName.c_str(),O_RDWR);
diff --git a/apt-pkg/contrib/fileutl.h b/apt-pkg/contrib/fileutl.h
index 62705478d..cb4655798 100644
--- a/apt-pkg/contrib/fileutl.h
+++ b/apt-pkg/contrib/fileutl.h
@@ -46,7 +46,8 @@ class FileFd
gzFile gz;
public:
- enum OpenMode {ReadOnly,WriteEmpty,WriteExists,WriteAny,WriteTemp,ReadOnlyGzip};
+ enum OpenMode {ReadOnly,WriteEmpty,WriteExists,WriteAny,WriteTemp,ReadOnlyGzip,
+ WriteAtomic};
inline bool Read(void *To,unsigned long Size,bool AllowEof)
{
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index bc663a8e9..00bf68af1 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -227,7 +227,7 @@ bool pkgDepCache::writeStateFile(OpProgress *prog, bool InstalledOnly) /*{{{*/
// if it does not exist, create a empty one
if(!FileExists(state))
{
- StateFile.Open(state, FileFd::WriteEmpty);
+ StateFile.Open(state, FileFd::WriteAtomic);
StateFile.Close();
}
@@ -1425,10 +1425,13 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
VerIterator Ver(*this,*I);
PkgIterator Pkg = Ver.ParentPkg();
- if (Start->Type != Dep::DpkgBreaks)
- MarkDelete(Pkg,false,Depth + 1, false);
- else if (PkgState[Pkg->ID].CandidateVer != *I)
+
+
+ if (PkgState[Pkg->ID].CandidateVer != *I &&
+ Start->Type == Dep::DpkgBreaks)
MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
+ else
+ MarkDelete(Pkg,false,Depth + 1, false);
}
continue;
}
diff --git a/apt-pkg/indexcopy.cc b/apt-pkg/indexcopy.cc
index 621c18716..b4e587d7b 100644
--- a/apt-pkg/indexcopy.cc
+++ b/apt-pkg/indexcopy.cc
@@ -134,7 +134,7 @@ bool IndexCopy::CopyPackages(string CDROM,string Name,vector<string> &List,
TargetF += URItoFileName(S);
if (_config->FindB("APT::CDROM::NoAct",false) == true)
TargetF = "/dev/null";
- FileFd Target(TargetF,FileFd::WriteEmpty);
+ FileFd Target(TargetF,FileFd::WriteAtomic);
FILE *TargetFl = fdopen(dup(Target.Fd()),"w");
if (_error->PendingError() == true)
return false;
@@ -565,7 +565,7 @@ bool SigVerify::CopyMetaIndex(string CDROM, string CDName, /*{{{*/
FileFd Target;
FileFd Rel;
- Target.Open(TargetF,FileFd::WriteEmpty);
+ Target.Open(TargetF,FileFd::WriteAtomic);
Rel.Open(prefix + file,FileFd::ReadOnly);
if (_error->PendingError() == true)
return false;
@@ -840,7 +840,7 @@ bool TranslationsCopy::CopyTranslations(string CDROM,string Name, /*{{{*/
TargetF += URItoFileName(S);
if (_config->FindB("APT::CDROM::NoAct",false) == true)
TargetF = "/dev/null";
- FileFd Target(TargetF,FileFd::WriteEmpty);
+ FileFd Target(TargetF,FileFd::WriteAtomic);
FILE *TargetFl = fdopen(dup(Target.Fd()),"w");
if (_error->PendingError() == true)
return false;
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index c9a9a753c..ed35174bb 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -1192,7 +1192,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
if (Writeable == true && CacheFile.empty() == false)
{
unlink(CacheFile.c_str());
- CacheF = new FileFd(CacheFile,FileFd::WriteEmpty);
+ CacheF = new FileFd(CacheFile,FileFd::WriteAtomic);
fchmod(CacheF->Fd(),0644);
Map = CreateDynamicMMap(CacheF, MMap::Public);
if (_error->PendingError() == true)
@@ -1254,7 +1254,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
// Write it back
if (Writeable == true && SrcCacheFile.empty() == false)
{
- FileFd SCacheF(SrcCacheFile,FileFd::WriteEmpty);
+ FileFd SCacheF(SrcCacheFile,FileFd::WriteAtomic);
if (_error->PendingError() == true)
return false;
diff --git a/debian/changelog b/debian/changelog
index e90aebef6..0ca0f285a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,21 @@
+apt (0.7.26~exp13) UNRELEASEDexperimental; urgency=low
+
+ [ Julian Andres Klode ]
+ * apt-pkg/contrib/fileutl.cc:
+ - Add WriteAtomic mode.
+ - Revert WriteEmpty to old behavior (LP: #613211)
+ * apt-pkg, methods:
+ - Convert users of WriteEmpty to WriteAtomic.
+ * apt-pkg/depcache.cc:
+ - Only try upgrade for Breaks if there is a newer version, otherwise
+ handle it as Conflicts (by removing it) (helps for #591882).
+
+ [ Michael Vogt ]
+ * debian/control:
+ - Add recommends on gnupg to apt, apt-key uses it.
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Fri, 30 Jul 2010 17:37:14 +0200
+
apt (0.7.26~exp12ubuntu3) maverick; urgency=low
[ Colin Watson ]
diff --git a/debian/control b/debian/control
index 534473a29..c1283f7d2 100644
--- a/debian/control
+++ b/debian/control
@@ -16,7 +16,7 @@ Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Replaces: manpages-pl (<< 20060617-3~)
Provides: ${libapt-pkg:provides}
-Recommends: ubuntu-keyring
+Recommends: ubuntu-keyring, gpg
Conflicts: python-apt (<< 0.7.93.2~)
Suggests: aptitude | synaptic | wajig, dpkg-dev, apt-doc, bzip2, lzma, python-apt
Description: Advanced front-end for dpkg
diff --git a/methods/bzip2.cc b/methods/bzip2.cc
index 5da214bfc..19e49828e 100644
--- a/methods/bzip2.cc
+++ b/methods/bzip2.cc
@@ -91,7 +91,7 @@ bool Bzip2Method::Fetch(FetchItem *Itm)
close(GzOut[1]);
FileFd FromGz(GzOut[0]); // For autoclose
- FileFd To(Itm->DestFile,FileFd::WriteEmpty);
+ FileFd To(Itm->DestFile,FileFd::WriteAtomic);
To.EraseOnFailure();
if (_error->PendingError() == true)
return false;
diff --git a/methods/copy.cc b/methods/copy.cc
index 027b59f46..a6bb372a3 100644
--- a/methods/copy.cc
+++ b/methods/copy.cc
@@ -52,7 +52,7 @@ bool CopyMethod::Fetch(FetchItem *Itm)
// See if the file exists
FileFd From(File,FileFd::ReadOnly);
- FileFd To(Itm->DestFile,FileFd::WriteEmpty);
+ FileFd To(Itm->DestFile,FileFd::WriteAtomic);
To.EraseOnFailure();
if (_error->PendingError() == true)
{
diff --git a/methods/gzip.cc b/methods/gzip.cc
index 72e3ac909..5b9b66b50 100644
--- a/methods/gzip.cc
+++ b/methods/gzip.cc
@@ -55,7 +55,7 @@ bool GzipMethod::Fetch(FetchItem *Itm)
return true;
}
- FileFd To(Itm->DestFile,FileFd::WriteEmpty);
+ FileFd To(Itm->DestFile,FileFd::WriteAtomic);
To.EraseOnFailure();
if (_error->PendingError() == true)
return false;
diff --git a/methods/rred.cc b/methods/rred.cc
index f42c7a072..d51c45c85 100644
--- a/methods/rred.cc
+++ b/methods/rred.cc
@@ -446,7 +446,7 @@ bool RredMethod::Fetch(FetchItem *Itm) /*{{{*/
// the cleanup/closing of the fds)
FileFd From(Path,FileFd::ReadOnly);
FileFd Patch(Path+".ed",FileFd::ReadOnly);
- FileFd To(Itm->DestFile,FileFd::WriteEmpty);
+ FileFd To(Itm->DestFile,FileFd::WriteAtomic);
To.EraseOnFailure();
if (_error->PendingError() == true)
return false;
@@ -458,7 +458,7 @@ bool RredMethod::Fetch(FetchItem *Itm) /*{{{*/
// retry with patchFile
lseek(Patch.Fd(), 0, SEEK_SET);
lseek(From.Fd(), 0, SEEK_SET);
- To.Open(Itm->DestFile,FileFd::WriteEmpty);
+ To.Open(Itm->DestFile,FileFd::WriteAtomic);
if (_error->PendingError() == true)
return false;
if (patchFile(Patch, From, To, &Hash) != ED_OK) {