proj_projects.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: proj_projects.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:31:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: proj_projects.cpp,v 1000.1 2004/06/01 18:31:25 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Viatcheslav Gorelenkov
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <app/project_tree_builder/proj_projects.hpp>
  39. #include <app/project_tree_builder/proj_builder_app.hpp>
  40. #include <app/project_tree_builder/proj_tree.hpp>
  41. #include <corelib/ncbienv.hpp>
  42. BEGIN_NCBI_SCOPE
  43. //-----------------------------------------------------------------------------
  44. CProjectOneNodeFilter::CProjectOneNodeFilter(const string& root_src_dir,
  45.                                              const string& subtree_dir)
  46.     :m_RootSrcDir(root_src_dir),
  47.      m_SubtreeDir(subtree_dir)
  48. {
  49.     CProjectTreeFolders::CreatePath(m_RootSrcDir, 
  50.                                     m_SubtreeDir, 
  51.                                     &m_SubtreePath);
  52.     m_PassAll = NStr::CompareNocase(m_RootSrcDir, m_SubtreeDir) == 0;
  53. }
  54. bool CProjectOneNodeFilter::CheckProject(const string& project_base_dir) const
  55. {
  56.     TPath project_path;
  57.     CProjectTreeFolders::CreatePath(m_RootSrcDir, 
  58.                                     project_base_dir, 
  59.                                     &project_path);
  60.     if (project_path.size() < m_SubtreePath.size())
  61.         return false;
  62.     TPath::const_iterator i = project_path.begin();
  63.     ITERATE(TPath, p, m_SubtreePath) {
  64.         const string& subtree_i  = *p;
  65.         const string& project_i = *i;
  66.         if (NStr::CompareNocase(subtree_i, project_i) != 0)
  67.             return false;
  68.         ++i;
  69.     }
  70.     return true;
  71. }
  72. //-----------------------------------------------------------------------------
  73. CProjectsLstFileFilter::CProjectsLstFileFilter(const string& root_src_dir,
  74.                                                const string& file_full_path)
  75. {
  76.     m_RootSrcDir = root_src_dir;
  77.     CNcbiIfstream ifs(file_full_path.c_str(), IOS_BASE::in | IOS_BASE::binary);
  78.     if ( !ifs )
  79.         NCBI_THROW(CProjBulderAppException, eFileOpen, file_full_path);
  80.     string strline;
  81.     while ( NcbiGetlineEOL(ifs, strline) ) {
  82.         
  83.         // skip "update" statements
  84.         if (strline.find(" update-only") != NPOS)
  85.             continue;
  86.         TPath project_path;
  87.         NStr::Split(strline, " rnt$/", project_path);
  88.         if ( !project_path.empty() ) {
  89.             if ( NStr::StartsWith(project_path.front(), "-") ) {
  90.                 
  91.                 // exclusion statement
  92.                 SLstElement elt;
  93.                 // erase '-'
  94.                 project_path.front().erase(0, 1);
  95.                 elt.m_Path      = project_path;
  96.                 elt.m_Recursive = true;
  97.                 m_LstFileContentsExclude.push_back(elt);
  98.             } else {
  99.                 // inclusion statement
  100.                 SLstElement elt;
  101.                 elt.m_Path      = project_path;
  102.                 elt.m_Recursive = strline.find("$") == NPOS;
  103.                 m_LstFileContentsInclude.push_back(elt);
  104.             }
  105.         }
  106.     }
  107. }
  108. bool CProjectsLstFileFilter::CmpLstElementWithPath(const SLstElement& elt, 
  109.                                                    const TPath&       path)
  110. {
  111.     if (path.size() < elt.m_Path.size())
  112.         return false;
  113.     if ( !elt.m_Recursive  && path.size() != elt.m_Path.size())
  114.         return false;
  115.     TPath::const_iterator i = path.begin();
  116.     ITERATE(TPath, p, elt.m_Path) {
  117.         const string& elt_i  = *p;
  118.         const string& path_i = *i;
  119.         if (NStr::CompareNocase(elt_i, path_i) != 0)
  120.             return false;
  121.         ++i;
  122.     }
  123.     return true;
  124. }
  125. bool CProjectsLstFileFilter::CheckProject(const string& project_base_dir) const
  126. {
  127.     TPath project_path;
  128.     CProjectTreeFolders::CreatePath(m_RootSrcDir, 
  129.                                     project_base_dir, 
  130.                                     &project_path);
  131.     bool include_ok = false;
  132.     ITERATE(TLstFileContents, p, m_LstFileContentsInclude) {
  133.         const SLstElement& elt = *p;
  134.         if ( CmpLstElementWithPath(elt, project_path) ) {
  135.             include_ok =  true;
  136.             break;
  137.         }
  138.     }
  139.     if ( !include_ok )
  140.         return false;
  141.     ITERATE(TLstFileContents, p, m_LstFileContentsExclude) {
  142.         const SLstElement& elt = *p;
  143.         if ( CmpLstElementWithPath(elt, project_path) ) {
  144.             return false;
  145.         }
  146.     }
  147.     return true;
  148. }
  149. END_NCBI_SCOPE
  150. /*
  151.  * ===========================================================================
  152.  * $Log: proj_projects.cpp,v $
  153.  * Revision 1000.1  2004/06/01 18:31:25  gouriano
  154.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  155.  *
  156.  * Revision 1.7  2004/05/21 21:41:41  gorelenk
  157.  * Added PCH ncbi_pch.hpp
  158.  *
  159.  * Revision 1.6  2004/03/18 19:13:08  gorelenk
  160.  * Changed imlementations of class CProjectsLstFileFilter constructor and
  161.  * CProjectsLstFileFilter::CheckProject .
  162.  *
  163.  * Revision 1.5  2004/03/02 16:27:10  gorelenk
  164.  * Added include for proj_tree.hpp.
  165.  *
  166.  * Revision 1.4  2004/02/27 18:09:14  gorelenk
  167.  * Changed implementation of CProjectsLstFileFilter::CmpLstElementWithPath.
  168.  *
  169.  * Revision 1.3  2004/02/26 21:27:43  gorelenk
  170.  * Removed all older class implementations. Added implementations of classes:
  171.  * CProjectDummyFilter, CProjectOneNodeFilter and CProjectsLstFileFilter.
  172.  *
  173.  * Revision 1.2  2004/02/18 23:38:06  gorelenk
  174.  * Added definitions of class CProjProjectsSets member-functions.
  175.  *
  176.  * ===========================================================================
  177.  */