summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/contrib/hashes.cc25
-rw-r--r--apt-pkg/contrib/hashes.h9
-rw-r--r--cmdline/apt.cc20
3 files changed, 43 insertions, 11 deletions
diff --git a/apt-pkg/contrib/hashes.cc b/apt-pkg/contrib/hashes.cc
index e1a431823..b4c768db9 100644
--- a/apt-pkg/contrib/hashes.cc
+++ b/apt-pkg/contrib/hashes.cc
@@ -55,6 +55,26 @@ HashString::HashString(std::string StringedHash) /*{{{*/
/*}}}*/
bool HashString::VerifyFile(std::string filename) const /*{{{*/
{
+ std::string fileHash = GetHashForFile(filename);
+
+ if(_config->FindB("Debug::Hashes",false) == true)
+ std::clog << "HashString::VerifyFile: got: " << fileHash << " expected: " << toStr() << std::endl;
+
+ return (fileHash == Hash);
+}
+ /*}}}*/
+bool HashString::FromFile(std::string filename) /*{{{*/
+{
+ // pick the strongest hash
+ if (Type == "")
+ Type = _SupportedHashes[0];
+
+ Hash = GetHashForFile(filename);
+ return true;
+}
+ /*}}}*/
+std::string HashString::GetHashForFile(std::string filename) const /*{{{*/
+{
std::string fileHash;
FileFd Fd(filename, FileFd::ReadOnly);
@@ -84,10 +104,7 @@ bool HashString::VerifyFile(std::string filename) const /*{{{*/
}
Fd.Close();
- if(_config->FindB("Debug::Hashes",false) == true)
- std::clog << "HashString::VerifyFile: got: " << fileHash << " expected: " << toStr() << std::endl;
-
- return (fileHash == Hash);
+ return fileHash;
}
/*}}}*/
const char** HashString::SupportedHashes()
diff --git a/apt-pkg/contrib/hashes.h b/apt-pkg/contrib/hashes.h
index 0c0b6c6a7..0a8bcd259 100644
--- a/apt-pkg/contrib/hashes.h
+++ b/apt-pkg/contrib/hashes.h
@@ -36,7 +36,10 @@ class HashString
protected:
std::string Type;
std::string Hash;
- static const char * _SupportedHashes[10];
+ static const char* _SupportedHashes[10];
+
+ // internal helper
+ std::string GetHashForFile(std::string filename) const;
public:
HashString(std::string Type, std::string Hash);
@@ -49,6 +52,10 @@ class HashString
// verify the given filename against the currently loaded hash
bool VerifyFile(std::string filename) const;
+ // generate a hash string from the given filename
+ bool FromFile(std::string filename);
+
+
// helper
std::string toStr() const; // convert to str as "type:hash"
bool empty() const;
diff --git a/cmdline/apt.cc b/cmdline/apt.cc
index 38610e731..47187fac2 100644
--- a/cmdline/apt.cc
+++ b/cmdline/apt.cc
@@ -41,6 +41,7 @@
#include <apt-pkg/pkgsystem.h>
#include <apt-pkg/indexfile.h>
#include <apt-pkg/metaindex.h>
+#include <apt-pkg/hashes.h>
#include <apti18n.h>
@@ -61,21 +62,21 @@
// ---------------------------------------------------------------------
bool EditSources(CommandLine &CmdL)
{
- // FIXME: suport CmdL.FileList to specify sources.list.d files
+ bool res;
+ pkgSourceList sl;
+ std::string outs;
+ // FIXME: suport CmdL.FileList to specify sources.list.d files
std::string sourceslist = _config->FindFile("Dir::Etc::sourcelist");
- // FIXME: take hash before,
- // when changed display message to apt update
- bool res;
- pkgSourceList sl;
+ HashString before;
+ before.FromFile(sourceslist);
do {
EditFileInSensibleEditor(sourceslist);
_error->PushToStack();
res = sl.Read(sourceslist);
if (!res) {
- std::string outs;
strprintf(outs, _("Failed to parse %s. Edit again? "),
sourceslist.c_str());
std::cout << outs;
@@ -84,6 +85,13 @@ bool EditSources(CommandLine &CmdL)
_error->RevertToStack();
} while (res == false);
+ if (!before.VerifyFile(sourceslist)) {
+ strprintf(
+ outs, _("Your '%s' file changed, please run 'apt-get update'."),
+ sourceslist.c_str());
+ std::cout << outs << std::endl;
+ }
+
return true;
}
/*}}}*/