libzypp  17.14.0
SolvIdentFile.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
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 
24 
25 using std::endl;
26 
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  {
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 
99  } // namespace target
102 } // namespace zypp