mirror of https://github.com/vitalif/grive2
Add --ignore (perl regexp) option
parent
5dc7028c8a
commit
7ac15187d3
|
@ -120,6 +120,7 @@ int Main( int argc, char **argv )
|
||||||
"instead of uploading it." )
|
"instead of uploading it." )
|
||||||
( "dry-run", "Only detect which files need to be uploaded/downloaded, "
|
( "dry-run", "Only detect which files need to be uploaded/downloaded, "
|
||||||
"without actually performing them." )
|
"without actually performing them." )
|
||||||
|
( "ignore", po::value<std::string>(), "Ignore files relative paths of which match this Perl RegExp." )
|
||||||
;
|
;
|
||||||
|
|
||||||
po::variables_map vm;
|
po::variables_map vm;
|
||||||
|
|
|
@ -5,7 +5,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
|
||||||
find_package(LibGcrypt REQUIRED)
|
find_package(LibGcrypt REQUIRED)
|
||||||
find_package(CURL REQUIRED)
|
find_package(CURL REQUIRED)
|
||||||
find_package(EXPAT REQUIRED)
|
find_package(EXPAT REQUIRED)
|
||||||
find_package(Boost 1.40.0 COMPONENTS program_options filesystem unit_test_framework system REQUIRED)
|
find_package(Boost 1.40.0 COMPONENTS program_options filesystem unit_test_framework regex system REQUIRED)
|
||||||
find_package(BFD)
|
find_package(BFD)
|
||||||
find_package(CppUnit)
|
find_package(CppUnit)
|
||||||
find_package(Iberty)
|
find_package(Iberty)
|
||||||
|
|
|
@ -337,6 +337,15 @@ fs::path Resource::Path() const
|
||||||
return m_parent != 0 ? (m_parent->Path() / m_name) : m_name ;
|
return m_parent != 0 ? (m_parent->Path() / m_name) : m_name ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Path relative to the root directory
|
||||||
|
fs::path Resource::RelPath() const
|
||||||
|
{
|
||||||
|
assert( m_parent != this ) ;
|
||||||
|
assert( m_parent == 0 || m_parent->IsFolder() ) ;
|
||||||
|
|
||||||
|
return m_parent != 0 && !m_parent->IsRoot() ? (m_parent->Path() / m_name) : m_name ;
|
||||||
|
}
|
||||||
|
|
||||||
bool Resource::IsInRootTree() const
|
bool Resource::IsInRootTree() const
|
||||||
{
|
{
|
||||||
assert( m_parent == 0 || m_parent->IsFolder() ) ;
|
assert( m_parent == 0 || m_parent->IsFolder() ) ;
|
||||||
|
|
|
@ -100,6 +100,7 @@ public :
|
||||||
Resource* FindChild( const std::string& title ) ;
|
Resource* FindChild( const std::string& title ) ;
|
||||||
|
|
||||||
fs::path Path() const ;
|
fs::path Path() const ;
|
||||||
|
fs::path RelPath() const ;
|
||||||
bool IsInRootTree() const ;
|
bool IsInRootTree() const ;
|
||||||
bool IsRoot() const ;
|
bool IsRoot() const ;
|
||||||
bool HasID() const ;
|
bool HasID() const ;
|
||||||
|
|
|
@ -36,11 +36,12 @@ namespace gr {
|
||||||
State::State( const fs::path& filename, const Val& options ) :
|
State::State( const fs::path& filename, const Val& options ) :
|
||||||
m_res ( options["path"].Str() ),
|
m_res ( options["path"].Str() ),
|
||||||
m_dir ( options["dir"].Str() ),
|
m_dir ( options["dir"].Str() ),
|
||||||
m_cstamp ( -1 )
|
m_cstamp ( -1 ),
|
||||||
|
m_ign ( !options["ignore"].Str().empty() ? options["ignore"].Str()+"|^\\.(grive|grive_state|trash)" : "^\\.(grive|grive_state|trash)" )
|
||||||
{
|
{
|
||||||
Read( filename ) ;
|
Read( filename ) ;
|
||||||
|
|
||||||
// the "-f" option will make grive always thinks remote is newer
|
// the "-f" option will make grive always think remote is newer
|
||||||
Val force ;
|
Val force ;
|
||||||
if ( options.Get("force", force) && force.Bool() )
|
if ( options.Get("force", force) && force.Bool() )
|
||||||
m_last_sync = DateTime() ;
|
m_last_sync = DateTime() ;
|
||||||
|
@ -61,7 +62,7 @@ void State::FromLocal( const fs::path& p )
|
||||||
|
|
||||||
bool State::IsIgnore( const std::string& filename )
|
bool State::IsIgnore( const std::string& filename )
|
||||||
{
|
{
|
||||||
return filename == ".grive" || filename == ".grive_state" || filename == ".trash";
|
return regex_match( filename.c_str(), m_ign );
|
||||||
}
|
}
|
||||||
|
|
||||||
void State::FromLocal( const fs::path& p, Resource* folder )
|
void State::FromLocal( const fs::path& p, Resource* folder )
|
||||||
|
@ -77,8 +78,9 @@ void State::FromLocal( const fs::path& p, Resource* folder )
|
||||||
std::string fname = i->path().filename().string() ;
|
std::string fname = i->path().filename().string() ;
|
||||||
fs::file_status st = fs::status(i->path());
|
fs::file_status st = fs::status(i->path());
|
||||||
|
|
||||||
if ( IsIgnore(fname) )
|
std::string path = folder->IsRoot() ? fname : ( folder->RelPath() / fname ).string();
|
||||||
Log( "file %1% is ignored by grive", fname, log::verbose ) ;
|
if ( IsIgnore( path ) )
|
||||||
|
Log( "file %1% is ignored by grive", path, log::verbose ) ;
|
||||||
|
|
||||||
// check if it is ignored
|
// check if it is ignored
|
||||||
else if ( folder == m_res.Root() && m_dir != "" && fname != m_dir )
|
else if ( folder == m_res.Root() && m_dir != "" && fname != m_dir )
|
||||||
|
@ -114,11 +116,7 @@ void State::FromRemote( const Entry& e )
|
||||||
std::string fn = e.Filename() ;
|
std::string fn = e.Filename() ;
|
||||||
std::string k = e.IsDir() ? "folder" : "file";
|
std::string k = e.IsDir() ? "folder" : "file";
|
||||||
|
|
||||||
if ( IsIgnore( e.Name() ) )
|
if ( e.ParentHref() == m_res.Root()->SelfHref() && m_dir != "" && e.Name() != m_dir )
|
||||||
Log( "%1% %2% is ignored by grive", k, e.Name(), log::verbose ) ;
|
|
||||||
|
|
||||||
// check if it is ignored
|
|
||||||
else if ( e.ParentHref() == m_res.Root()->SelfHref() && m_dir != "" && e.Name() != m_dir )
|
|
||||||
Log( "%1% %2% is ignored", k, e.Name(), log::verbose );
|
Log( "%1% %2% is ignored", k, e.Name(), log::verbose );
|
||||||
|
|
||||||
// common checkings
|
// common checkings
|
||||||
|
@ -170,7 +168,6 @@ std::size_t State::TryResolveEntry()
|
||||||
void State::FromChange( const Entry& e )
|
void State::FromChange( const Entry& e )
|
||||||
{
|
{
|
||||||
assert( e.IsChange() ) ;
|
assert( e.IsChange() ) ;
|
||||||
assert( !IsIgnore( e.Name() ) ) ;
|
|
||||||
|
|
||||||
// entries in the change feed is always treated as newer in remote,
|
// entries in the change feed is always treated as newer in remote,
|
||||||
// so we override the last sync time to 0
|
// so we override the last sync time to 0
|
||||||
|
@ -185,13 +182,25 @@ bool State::Update( const Entry& e )
|
||||||
|
|
||||||
if ( Resource *res = m_res.FindByHref( e.SelfHref() ) )
|
if ( Resource *res = m_res.FindByHref( e.SelfHref() ) )
|
||||||
{
|
{
|
||||||
|
std::string path = res->RelPath().string();
|
||||||
|
if ( IsIgnore( path ) )
|
||||||
|
{
|
||||||
|
Log( "%1% is ignored by grive", path, log::verbose ) ;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
m_res.Update( res, e, m_last_sync ) ;
|
m_res.Update( res, e, m_last_sync ) ;
|
||||||
return true ;
|
|
||||||
}
|
}
|
||||||
else if ( Resource *parent = m_res.FindByHref( e.ParentHref() ) )
|
else if ( Resource *parent = m_res.FindByHref( e.ParentHref() ) )
|
||||||
{
|
{
|
||||||
assert( parent->IsFolder() ) ;
|
assert( parent->IsFolder() ) ;
|
||||||
|
|
||||||
|
std::string path = parent->IsRoot() ? e.Name() : ( parent->RelPath() / e.Name() ).string();
|
||||||
|
if ( IsIgnore( path ) )
|
||||||
|
{
|
||||||
|
Log( "%1% is ignored by grive", path, log::verbose ) ;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// see if the entry already exist in local
|
// see if the entry already exist in local
|
||||||
std::string name = e.Name() ;
|
std::string name = e.Name() ;
|
||||||
Resource *child = parent->FindChild( name ) ;
|
Resource *child = parent->FindChild( name ) ;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "util/FileSystem.hh"
|
#include "util/FileSystem.hh"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <boost/regex.hpp>
|
||||||
|
|
||||||
namespace gr {
|
namespace gr {
|
||||||
|
|
||||||
|
@ -69,13 +70,14 @@ private :
|
||||||
bool Update( const Entry& e ) ;
|
bool Update( const Entry& e ) ;
|
||||||
std::size_t TryResolveEntry() ;
|
std::size_t TryResolveEntry() ;
|
||||||
|
|
||||||
static bool IsIgnore( const std::string& filename ) ;
|
bool IsIgnore( const std::string& filename ) ;
|
||||||
|
|
||||||
private :
|
private :
|
||||||
ResourceTree m_res ;
|
ResourceTree m_res ;
|
||||||
DateTime m_last_sync ;
|
DateTime m_last_sync ;
|
||||||
int m_cstamp ;
|
int m_cstamp ;
|
||||||
std::string m_dir ;
|
std::string m_dir ;
|
||||||
|
boost::regex m_ign ;
|
||||||
|
|
||||||
std::vector<Entry> m_unresolved ;
|
std::vector<Entry> m_unresolved ;
|
||||||
} ;
|
} ;
|
||||||
|
|
|
@ -47,6 +47,9 @@ Config::Config( const po::variables_map& vm )
|
||||||
m_cmd.Add( "dir", Val(vm.count("dir") > 0
|
m_cmd.Add( "dir", Val(vm.count("dir") > 0
|
||||||
? vm["dir"].as<std::string>()
|
? vm["dir"].as<std::string>()
|
||||||
: "" ) ) ;
|
: "" ) ) ;
|
||||||
|
m_cmd.Add( "ignore", Val(vm.count("ignore") > 0
|
||||||
|
? vm["ignore"].as<std::string>()
|
||||||
|
: "" ) ) ;
|
||||||
|
|
||||||
m_path = GetPath( fs::path(m_cmd["path"].Str()) ) ;
|
m_path = GetPath( fs::path(m_cmd["path"].Str()) ) ;
|
||||||
m_file = Read( ) ;
|
m_file = Read( ) ;
|
||||||
|
|
Loading…
Reference in New Issue