mirror of https://github.com/vitalif/grive2
fixed the log messages and some state update
parent
377d8186b1
commit
7830136518
|
@ -97,7 +97,7 @@ Drive::Drive( OAuth2& auth ) :
|
|||
|
||||
else if ( parent != 0 && !parent->IsFolder() )
|
||||
Log( "warning: entry %1% has parent %2% which is not a folder, ignored",
|
||||
entry.Title(), parent->Name(), log::warning ) ;
|
||||
entry.Title(), parent->Name(), log::verbose ) ;
|
||||
|
||||
else
|
||||
m_state.FromRemote( entry ) ;
|
||||
|
@ -122,6 +122,8 @@ void Drive::SaveState()
|
|||
|
||||
void Drive::SyncFolders( http::Agent *http )
|
||||
{
|
||||
Log( "Synchronizing folders", log::info ) ;
|
||||
|
||||
http::XmlResponse xml ;
|
||||
http->Get( feed_base + "/-/folder?max-results=50&showroot=true", &xml, m_http_hdr ) ;
|
||||
|
||||
|
@ -138,7 +140,7 @@ void Drive::SyncFolders( http::Agent *http )
|
|||
if ( e.Kind() == "folder" )
|
||||
{
|
||||
if ( e.ParentHrefs().size() != 1 )
|
||||
Log( "folder \"%1%\" has multiple parents, ignored", e.Title(), log::warning ) ;
|
||||
Log( "folder \"%1%\" has multiple parents, ignored", e.Title(), log::verbose ) ;
|
||||
|
||||
else if ( e.Title().find('/') != std::string::npos )
|
||||
Log( "folder \"%1%\" contains a slash in its name, ignored", e.Title(), log::verbose ) ;
|
||||
|
@ -161,6 +163,8 @@ void Drive::SyncFolders( http::Agent *http )
|
|||
|
||||
void Drive::Update()
|
||||
{
|
||||
Log( "Synchronizing files", log::info ) ;
|
||||
|
||||
http::Agent http ;
|
||||
m_state.Sync( &http, m_http_hdr ) ;
|
||||
}
|
||||
|
|
|
@ -48,12 +48,17 @@ Entry::Entry( const xml::Node& n )
|
|||
}
|
||||
|
||||
/// construct an entry from a file or folder in local directory
|
||||
Entry::Entry( const fs::path& path ) :
|
||||
Entry::Entry( const fs::path& path, const std::string& kind ) :
|
||||
m_title ( path.filename().string() ),
|
||||
m_filename ( path.filename().string() ),
|
||||
m_kind ( fs::is_directory(path) ? "folder" : "file" ),
|
||||
m_kind
|
||||
(
|
||||
fs::exists(path)
|
||||
? (fs::is_directory(path) ? "folder" : "file" )
|
||||
: kind
|
||||
),
|
||||
m_md5 ( fs::is_directory(path) ? "" : crypt::MD5( path ) ),
|
||||
m_mtime ( os::FileMTime( path ) )
|
||||
m_mtime ( fs::exists(path) ? os::FileMTime( path ) : DateTime() )
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -109,6 +114,7 @@ const std::vector<std::string>& Entry::ParentHrefs() const
|
|||
void Entry::AssignID( const Entry& entry )
|
||||
{
|
||||
m_self_href = entry.m_self_href ;
|
||||
m_content_src = entry.m_content_src ;
|
||||
m_resource_id = entry.m_resource_id ;
|
||||
m_parent_hrefs = entry.m_parent_hrefs ;
|
||||
m_edit_link = entry.m_edit_link ;
|
||||
|
|
|
@ -43,7 +43,7 @@ class Entry
|
|||
{
|
||||
public :
|
||||
Entry( ) ;
|
||||
explicit Entry( const fs::path& path ) ;
|
||||
explicit Entry( const fs::path& path, const std::string& kind = "" ) ;
|
||||
explicit Entry( const xml::Node& n ) ;
|
||||
explicit Entry(
|
||||
const std::string& name,
|
||||
|
|
|
@ -56,28 +56,7 @@ Resource::Resource() :
|
|||
m_state ( sync )
|
||||
{
|
||||
}
|
||||
/*
|
||||
/// Construct from previously serialized JSON object. The state of the
|
||||
/// resource is treated as local_deleted by default. It is because the
|
||||
/// state will be updated by scanning the local directory. If the state
|
||||
/// is not updated during scanning, that means the resource is deleted.
|
||||
Resource::Resource( const Json& json, Resource *parent ) :
|
||||
m_entry (
|
||||
json["name"].Str(),
|
||||
json["id"].Str(),
|
||||
json["href"].Str(),
|
||||
json["md5"].Str(),
|
||||
json["kind"].Str(),
|
||||
DateTime( json["mtime"]["sec"].Int(), json["mtime"]["nsec"].Int() ),
|
||||
parent != 0 ? parent->SelfHref() : "" ),
|
||||
m_parent( parent ),
|
||||
m_state( local_deleted )
|
||||
{
|
||||
// if the file exists in local directory, FromLocal() will mark the
|
||||
// state as local_changed
|
||||
FromLocal() ;
|
||||
}
|
||||
*/
|
||||
|
||||
Resource::Resource( const xml::Node& entry ) :
|
||||
m_entry ( entry ),
|
||||
m_parent( 0 ),
|
||||
|
@ -92,8 +71,8 @@ Resource::Resource( const Entry& entry, Resource *parent ) :
|
|||
{
|
||||
}
|
||||
|
||||
Resource::Resource( const fs::path& path ) :
|
||||
m_entry ( path ),
|
||||
Resource::Resource( const fs::path& path, const std::string& kind ) :
|
||||
m_entry ( path, kind ),
|
||||
m_parent( 0 ),
|
||||
m_state ( local_new )
|
||||
{
|
||||
|
@ -119,39 +98,57 @@ void Resource::FromRemote( const Entry& remote, const DateTime& last_sync )
|
|||
// remote file created after last sync, so remote is newer
|
||||
else if ( remote.MTime() > last_sync )
|
||||
{
|
||||
Log( "creating %1% directory", path, log::info ) ;
|
||||
fs::create_directories( path ) ;
|
||||
m_state = sync ;
|
||||
if ( fs::exists( path ) )
|
||||
{
|
||||
// TODO: handle type change
|
||||
Log( "%1% changed from folder to file", path, log::verbose ) ;
|
||||
m_state = sync ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log( "folder %1% is created in local", path, log::verbose ) ;
|
||||
fs::create_directories( path ) ;
|
||||
m_state = sync ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Trace( "should I delete the local directory %1%?", path ) ;
|
||||
m_state = local_deleted ;
|
||||
if ( fs::exists( path ) )
|
||||
{
|
||||
// TODO: handle type chage
|
||||
Log( "%1% changed from file to folder", path, log::verbose ) ;
|
||||
m_state = sync ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log( "folder %1% is deleted in local", path, log::verbose ) ;
|
||||
m_state = local_deleted ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if checksum is equal, no need to compare the mtime
|
||||
else if ( remote.MD5() == m_entry.MD5() )
|
||||
{
|
||||
Log( "MD5 matches: %1% is already in sync", Path(), log::verbose ) ;
|
||||
m_state = sync ;
|
||||
}
|
||||
|
||||
// local not exists
|
||||
else if ( !fs::exists( path ) )
|
||||
{
|
||||
if ( remote.MTime() > last_sync )
|
||||
{
|
||||
Trace( "new file found in remote", path ) ;
|
||||
Log( "file %1% is created in remote", path, log::verbose ) ;
|
||||
m_state = remote_new ;
|
||||
}
|
||||
else
|
||||
{
|
||||
Trace( "should I delete the local file %1%?", path ) ;
|
||||
Log( "file %1% should be erased in remote", path, log::verbose ) ;
|
||||
m_state = local_deleted ;
|
||||
}
|
||||
}
|
||||
|
||||
// if checksum is equal, no need to compare the mtime
|
||||
else if ( remote.MD5() == m_entry.MD5() )
|
||||
{
|
||||
Log( "file %1% is already in sync", Path(), log::verbose ) ;
|
||||
m_state = sync ;
|
||||
}
|
||||
|
||||
// use mtime to check which one is more recent
|
||||
else
|
||||
{
|
||||
|
@ -159,13 +156,19 @@ void Resource::FromRemote( const Entry& remote, const DateTime& last_sync )
|
|||
|
||||
// if remote is modified
|
||||
if ( remote.MTime() > m_entry.MTime() )
|
||||
{
|
||||
Log( "file %1% is changed in remote", path, log::verbose ) ;
|
||||
m_state = remote_changed ;
|
||||
}
|
||||
|
||||
// remote also has the file, so it's not new in local
|
||||
else if ( m_state == local_new || m_state == remote_deleted )
|
||||
{
|
||||
Log( "file %1% is changed in local", path, log::verbose ) ;
|
||||
m_state = local_changed ;
|
||||
}
|
||||
|
||||
Log( "%1% state is %2%", Name(), m_state, log::verbose ) ;
|
||||
Trace( "%1% state is %2%", Name(), m_state ) ;
|
||||
}
|
||||
|
||||
m_entry.AssignID( remote ) ;
|
||||
|
@ -190,7 +193,7 @@ void Resource::FromLocal( const DateTime& last_sync )
|
|||
DateTime mtime = os::FileMTime( path ) ;
|
||||
m_state = ( mtime > last_sync ? local_new : remote_deleted ) ;
|
||||
|
||||
Log( "%1% found on disk: %2%", Name(), m_state ) ;
|
||||
Trace( "%1% found on disk: %2%", Name(), m_state ) ;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -287,8 +290,7 @@ void Resource::Sync( http::Agent *http, const http::Headers& auth )
|
|||
switch ( m_state )
|
||||
{
|
||||
case local_new :
|
||||
Log( "sync %1% doesn't exist in server. upload \"%2%\"?",
|
||||
Path(), m_parent->m_entry.CreateLink(), log::verbose ) ;
|
||||
Log( "sync %1% doesn't exist in server, uploading", Path(), log::verbose ) ;
|
||||
|
||||
if ( Create( http, auth ) )
|
||||
m_state = sync ;
|
||||
|
@ -299,14 +301,14 @@ void Resource::Sync( http::Agent *http, const http::Headers& auth )
|
|||
break ;
|
||||
|
||||
case local_changed :
|
||||
Log( "sync %1% changed in local", Path(), log::verbose ) ;
|
||||
Log( "sync %1% changed in local. uploading", Path(), log::verbose ) ;
|
||||
if ( EditContent( http, auth ) )
|
||||
m_state = sync ;
|
||||
break ;
|
||||
|
||||
case remote_new :
|
||||
case remote_changed :
|
||||
Log( "sync %1% changed in remote. download?", Path(), log::verbose ) ;
|
||||
Log( "sync %1% changed in remote. downloading", Path(), log::verbose ) ;
|
||||
Download( http, Path(), auth ) ;
|
||||
m_state = sync ;
|
||||
break ;
|
||||
|
@ -336,7 +338,6 @@ void Resource::Delete( http::Agent *http, const http::Headers& auth )
|
|||
|
||||
void Resource::Download( http::Agent* http, const fs::path& file, const http::Headers& auth ) const
|
||||
{
|
||||
Log( "Downloading %1%", file ) ;
|
||||
http::Download dl( file.string(), http::Download::NoChecksum() ) ;
|
||||
long r = http->Get( m_entry.ContentSrc(), &dl, auth ) ;
|
||||
if ( r <= 400 )
|
||||
|
@ -401,8 +402,6 @@ bool Resource::Create( http::Agent* http, const http::Headers& auth )
|
|||
|
||||
bool Resource::Upload( http::Agent* http, const std::string& link, const http::Headers& auth, bool post )
|
||||
{
|
||||
Log( "Uploading %1%", m_entry.Title() ) ;
|
||||
|
||||
StdioFile file( Path() ) ;
|
||||
|
||||
// TODO: upload in chunks
|
||||
|
|
|
@ -49,7 +49,7 @@ public :
|
|||
Resource() ;
|
||||
explicit Resource( const xml::Node& entry ) ;
|
||||
explicit Resource( const Entry& entry, Resource *parent = 0 ) ;
|
||||
explicit Resource( const fs::path& path ) ;
|
||||
explicit Resource( const fs::path& path, const std::string& kind = "" ) ;
|
||||
// explicit Resource( const Json& json, Resource *parent = 0 ) ;
|
||||
void Swap( Resource& coll ) ;
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ void State::FromLocal( const fs::path& p, gr::Resource* folder )
|
|||
std::string fname = i->path().filename().string() ;
|
||||
|
||||
if ( fname[0] == '.' )
|
||||
Log( "file %1% is ignored by grive", fname, log::info ) ;
|
||||
Log( "file %1% is ignored by grive", fname, log::verbose ) ;
|
||||
|
||||
else
|
||||
{
|
||||
|
@ -148,9 +148,12 @@ bool State::Update( const Entry& e )
|
|||
// the directory
|
||||
else if ( e.Kind() == "folder" || !e.Filename().empty() )
|
||||
{
|
||||
child = new Resource( e ) ;
|
||||
// first create a dummy resource and update it later
|
||||
child = new Resource( parent->Path() / e.Filename(), e.Kind() ) ;
|
||||
parent->AddChild( child ) ;
|
||||
m_res.Insert( child ) ;
|
||||
|
||||
// update the state of the resource
|
||||
m_res.Update( child, e, m_last_sync ) ;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -25,7 +25,29 @@ namespace gr {
|
|||
|
||||
namespace log
|
||||
{
|
||||
enum Serverity { debug, verbose, info, warning, error, critical } ;
|
||||
/// defines the types of the log message
|
||||
enum Serverity
|
||||
{
|
||||
/// user unfriendly messages. only meant for developers.
|
||||
debug,
|
||||
|
||||
/// enabled only if -V is specified. grive tries to tell you every
|
||||
/// single thing it tries to do.
|
||||
verbose,
|
||||
|
||||
/// notification messages indicates nothing is going wrong
|
||||
info,
|
||||
|
||||
/// potential error messages
|
||||
warning,
|
||||
|
||||
/// an error has occurs but grive doesn't need to quit
|
||||
error,
|
||||
|
||||
/// grive cannot proceed
|
||||
critical
|
||||
} ;
|
||||
|
||||
typedef boost::format Fmt ;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue