Imported Upstream version 17.23.5
[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       if ( true )
62       {
63         std::set<IdString> sorted( data_r.begin(), data_r.end() );
64         dumpRange( outs, sorted.begin(), sorted.end(), "#", "\n", "\n", "\n", "#\n" );
65       }
66       else
67       {
68         dumpRange( outs, data_r.begin(), data_r.end(), "#", "\n", "\n", "\n", "#\n" );
69       }
70       outs.close();
71
72       if ( outs.good() )
73       {
74         filesystem::rename( tmp.path(), file_r );
75         MIL << "Wrote " << PathInfo(file_r) << endl;
76       }
77       else
78       {
79         ERR << "Can't write " << PathInfo(tmp.path()) << endl;
80       }
81     }
82
83     /******************************************************************
84     **
85     **  FUNCTION NAME : operator<<
86     **  FUNCTION TYPE : std::ostream &
87     */
88     std::ostream & operator<<( std::ostream & str, const SolvIdentFile & obj )
89     {
90       str << obj.file() << ' ';
91       if ( obj._dataPtr )
92         str << obj.data();
93       else
94         str << "(unloaded)";
95       return str;
96     }
97
98     /////////////////////////////////////////////////////////////////
99   } // namespace target
100   ///////////////////////////////////////////////////////////////////
101   /////////////////////////////////////////////////////////////////
102 } // namespace zypp
103 ///////////////////////////////////////////////////////////////////