[PATCH 4/4] Use site download directory without trailing "%2f" if it doesn't already exist

2010-11-26 Thread Jon TURNEY
Centralize where download directory is chosen
Use site download directory without trailing "%2f" if it doesn't already exist

2010-11-26  Jon TURNEY  

* package_source.h (site): Add get_local_path() method and storage
* package_source.cc (get_local_path): Implement get_local_path() method,
to determine local directory to use for downloads from site.
* ini.cc (do_remote_ini): Use get_local_path()
* download.cc (check_for_cached, download_one): Use get_local_path()

Signed-off-by: Jon TURNEY 
---
 download.cc   |7 ++-
 ini.cc|5 ++---
 package_source.cc |   36 +++-
 package_source.h  |7 ++-
 4 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/download.cc b/download.cc
index 3567715..e9b4048 100644
--- a/download.cc
+++ b/download.cc
@@ -108,8 +108,7 @@ check_for_cached (packagesource & pkgsource)
   for (packagesource::sitestype::const_iterator n = pkgsource.sites.begin();
n != pkgsource.sites.end(); ++n)
   {
-std::string fullname = prefix + rfc1738_escape_part (n->key) + "/" +
-  pkgsource.Canonical ();
+std::string fullname = "file://" + n->get_local_path() + "/" + 
pkgsource.Canonical ();
 if (io_stream::exists(fullname) == IO_STREAM_EXISTS_FILE)
 {
   if (validateCachedPackage (fullname, pkgsource))
@@ -150,9 +149,7 @@ download_one (packagesource & pkgsource, HWND owner)
   for (packagesource::sitestype::const_iterator n = pkgsource.sites.begin();
n != pkgsource.sites.end() && !success; ++n)
 {
-  const std::string local = local_dir + "/" +
- rfc1738_escape_part (n->key) + "/" +
- pkgsource.Canonical ();
+  const std::string local = n->get_local_path() + "/" + 
pkgsource.Canonical ();
   io_stream::mkpath_p (PATH_TO_FILE, "file://" + local, 0);
 
   if (get_url_to_file(n->key +  "/" + pkgsource.Canonical (),
diff --git a/ini.cc b/ini.cc
index b983438..b9e256d 100644
--- a/ini.cc
+++ b/ini.cc
@@ -262,9 +262,8 @@ do_remote_ini (HWND owner)
   else
{
  /* save known-good setup.ini locally */
- const std::string fp = "file://" + local_dir + "/" +
-  rfc1738_escape_part (n->url) +
-  "/" + SETUP_INI_FILENAME;
+ site parse_site(n->url);
+ const std::string fp =  "file://" + parse_site.get_local_path() + "/" 
+ SETUP_INI_FILENAME;
  io_stream::mkpath_p (PATH_TO_FILE, fp, 0);
  if (io_stream *out = io_stream::open (fp, "wb", 0))
{
diff --git a/package_source.cc b/package_source.cc
index 8accb1f..5248cb8 100644
--- a/package_source.cc
+++ b/package_source.cc
@@ -25,11 +25,45 @@ static const char *cvsid =
 #include 
 #include 
 #include "package_source.h"
+#include "LogSingleton.h"
+#include "state.h"
+#include "io_stream.h"
+#include "csu_util/rfc1738.h"
 
 site::site (const std::string& newkey) : key(newkey)
 {
 };
-  
+
+const std::string &
+site::get_local_path(void) const
+{
+  /* if we haven't already determined the local_path for this site... */
+  if (local_path.empty())
+{
+  /* check for preexisting directory, if so use that... */
+  local_path = local_dir + "/" + rfc1738_escape_part(key);
+
+  if (!io_stream::exists("file://" + local_path))
+{
+  std::string temp = key;
+
+  /* ... otherwise, strip any terminal '/' (which should always be 
present in canonical URL) */
+  if (temp.at(temp.length()-1) == '/')
+temp.erase(temp.length()-1);
+
+  local_path = local_dir + "/" + rfc1738_escape_part(temp);
+
+  log (LOG_BABBLE) << "Will use " << local_path <<  " for storing 
downloads" << endLog;
+}
+  else
+{
+  log (LOG_BABBLE) << "Found " << local_path << ", will use for 
storing downloads" << endLog;
+}
+}
+
+  return local_path;
+}
+
 void
 packagesource::set_canonical (char const *fn)
 {
diff --git a/package_source.h b/package_source.h
index 9dea667..45a4a3c 100644
--- a/package_source.h
+++ b/package_source.h
@@ -47,11 +47,16 @@ class site
 public:
   site (const std::string& newkey);
   ~site () {}
-  std::string key;
+
   bool operator == (site const &rhs)
 {
   return casecompare(key, rhs.key) == 0;
 }
+
+  const std::string & get_local_path() const;
+
+  std::string key;
+  mutable std::string local_path;
 };
 
 class packagesource
-- 
1.7.2.3



Re: [PATCH 4/4] Use site download directory without trailing "%2f" if it doesn't already exist

2010-11-29 Thread Corinna Vinschen
On Nov 26 13:48, Jon TURNEY wrote:
> Centralize where download directory is chosen
> Use site download directory without trailing "%2f" if it doesn't already exist
> 
> 2010-11-26  Jon TURNEY  
> 
>   * package_source.h (site): Add get_local_path() method and storage
>   * package_source.cc (get_local_path): Implement get_local_path() method,
>   to determine local directory to use for downloads from site.
>   * ini.cc (do_remote_ini): Use get_local_path()
>   * download.cc (check_for_cached, download_one): Use get_local_path()

That one looks good, too.


Corinna

-- 
Corinna Vinschen  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader  cygwin AT cygwin DOT com
Red Hat