f09074aec6c9189ac769fc908743dd06571ab902
[platform/upstream/libzypp.git] / zypp / target / SolvIdentFile.cc
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/target/SolvIdentFile.cc
10  *
11 */
12 #include <iostream>
13 #include <fstream>
14
15 #include "zypp/base/LogTools.h"
16 #include "zypp/base/IOStream.h"
17 #include "zypp/base/String.h"
18
19 #include "zypp/PathInfo.h"
20 #include "zypp/TmpPath.h"
21 #include "zypp/Date.h"
22
23 #include "zypp/target/SolvIdentFile.h"
24
25 using std::endl;
26
27 ///////////////////////////////////////////////////////////////////
28 namespace zypp
29 { /////////////////////////////////////////////////////////////////
30   ///////////////////////////////////////////////////////////////////
31   namespace target
32   { /////////////////////////////////////////////////////////////////
33
34     void SolvIdentFile::load( const Pathname & file_r, Data & data_r )
35     {
36       PathInfo pi( file_r );
37       if ( ! pi.isFile() )
38       {
39         WAR << "Can't read " << pi << endl;
40         return;
41       }
42       std::ifstream infile( file_r.c_str() );
43       for( iostr::EachLine in( infile ); in; in.next() )
44       {
45         std::string l( str::trim(*in) );
46         if ( ! l.empty() && l[0] != '#' )
47         {
48           data_r.insert( IdString(l) );
49         }
50       }
51       MIL << "Read " << pi << endl;
52     }
53
54     void SolvIdentFile::store( const Pathname & file_r, const Data & data_r )
55     {
56       filesystem::TmpFile tmp( filesystem::TmpFile::makeSibling( file_r ) );
57       filesystem::chmod( tmp.path(), 0644 );
58
59       std::ofstream outs( tmp.path().c_str() );
60       outs << "# " << file_r.basename() << " generated " << Date::now() << endl;
61       dumpRange( outs, data_r.begin(), data_r.end(), "#", "\n", "\n", "\n", "#\n" );
62       outs.close();
63
64       if ( outs.good() )
65       {
66         filesystem::rename( tmp.path(), file_r );
67         MIL << "Wrote " << PathInfo(file_r) << endl;
68       }
69       else
70       {
71         ERR << "Can't write " << PathInfo(tmp.path()) << endl;
72       }
73     }
74
75     /******************************************************************
76     **
77     **  FUNCTION NAME : operator<<
78     **  FUNCTION TYPE : std::ostream &
79     */
80     std::ostream & operator<<( std::ostream & str, const SolvIdentFile & obj )
81     {
82       str << obj.file() << ' ';
83       if ( obj._dataPtr )
84         str << obj.data();
85       else
86         str << "(unloaded)";
87       return str;
88     }
89
90     /////////////////////////////////////////////////////////////////
91   } // namespace target
92   ///////////////////////////////////////////////////////////////////
93   /////////////////////////////////////////////////////////////////
94 } // namespace zypp
95 ///////////////////////////////////////////////////////////////////