14 #include <zypp/base/Regex.h> 15 #include <zypp/base/String.h> 16 #include <zypp/base/LogTools.h> 17 #include <zypp/base/IOStream.h> 18 #include <zypp/base/Iterator.h> 24 #include <zypp/PathInfo.h> 26 #undef ZYPP_BASE_LOGGER_LOGGROUP 27 #define ZYPP_BASE_LOGGER_LOGGROUP "locks" 38 static Locks _instance;
44 template <
typename TPredicate>
47 LockSet::iterator first = lockset_r.begin();
48 LockSet::iterator last = lockset_r.end();
49 while ( first != last )
51 LockSet::iterator next = first;
53 if ( pred_r( *first ) )
54 lockset_r.erase( first );
103 {
return _pimpl->APIlocks().begin(); }
106 {
return _pimpl->APIlocks().end(); }
109 {
return _pimpl->locks().size(); }
112 {
return _pimpl->locks().empty(); }
121 DBG <<
"lock "<< item.name();
130 template <
class OutputIterator>
149 MIL <<
"read and apply locks from "<<file << endl;
153 std::insert_iterator<LockSet> ii(
_pimpl->MANIPlocks(),
_pimpl->MANIPlocks().end() );
155 readPoolQueriesFromFile( file, boost::make_function_output_iterator(lout) );
158 MIL <<
"file does not exist(or cannot be stat), no lock added." << endl;
164 MIL <<
"read locks from "<<file << endl;
167 readPoolQueriesFromFile( file, std::insert_iterator<LockSet>(
_pimpl->MANIPlocks(),
_pimpl->MANIPlocks().end()) );
169 MIL <<
"file does not exist(or cannot be stat), no lock added." << endl;
175 DBG <<
"apply locks" << endl;
182 MIL <<
"add new lock" << endl;
188 if (
_pimpl->toRemove.erase( query ) )
190 DBG <<
"query removed from toRemove" << endl;
194 DBG <<
"query added as new" << endl;
195 _pimpl->toAdd.insert( query );
217 DBG <<
"add lock by identifier" << endl;
223 MIL <<
"remove lock" << endl;
230 if (
_pimpl->toAdd.erase( query ) )
232 DBG <<
"query removed from added" << endl;
236 DBG <<
"need to remove some old lock" << endl;
237 _pimpl->toRemove.insert( query );
259 DBG <<
"remove lock by Selectable" << endl;
301 switch (
report->execute(q))
312 INT <<
"Unexpected return value from callback. Need to adapt switch statement." << std::endl;
322 MIL <<
"clean of locks" << endl;
325 size_t sum =
_pimpl->locks().size();
332 MIL <<
"cleaning aborted" << endl;
341 if ( sum !=
_pimpl->locks().size() )
342 _pimpl->locksDirty =
true;
356 bool intersect =
false;
359 if ( s.find(*it)!=s.end() )
369 return intersect ? 1 : 0;
383 DBG <<
"identical queries" << endl;
401 MIL <<
"find conflict: " << cs << endl;
402 switch (
report->conflict(q,cs))
406 DBG <<
"abort merging" << endl;
409 DBG <<
"force delete" << endl;
412 DBG <<
"skip lock" << endl;
415 INT <<
"Unexpected return value from callback. Need to adapt switch statement." << std::endl;
424 MIL <<
"merge list old: " <<
locks().size()
425 <<
" to add: " <<
toAdd.size() <<
" to remove: " <<
toRemove.size() << endl;
428 std::set<sat::Solvable> s(it->begin(),it->end());
432 if (!report->progress())
435 for (
const auto & q :
toAdd ) {
437 if ( not
b && i->comment() != q.comment() )
438 i->setComment( q.comment() );
449 if( (
_pimpl->toAdd.size() |
_pimpl->toRemove.size())==0)
456 if (!
_pimpl->mergeList(report))
461 DBG <<
"locks merged" << endl;
463 _pimpl->locksDirty =
true;
468 if( ((
_pimpl->toAdd.size() |
_pimpl->toRemove.size())==0)
471 DBG <<
"nothing changed in locks - no write to file" << endl;
478 if ((
_pimpl->toAdd.size() |
_pimpl->toRemove.size())!=0)
480 if (!
_pimpl->mergeList(report))
487 DBG <<
"wrote "<<
_pimpl->locks().size() <<
"locks" << endl;
488 writePoolQueriesToFile( file,
_pimpl->locks().begin(),
_pimpl->locks().end() );
const LockList & APIlocks() const
LocksRemovePredicate(std::set< sat::Solvable > &s, const PoolQuery &q, callback::SendReport< SavingLocksReport > &r)
void addAttribute(const sat::SolvAttr &attr, const std::string &value="")
Filter by the value of the specified attr attribute.
void removeEmpty()
Call callback for each empty lock.
void operator()(const PoolQuery &query) const
LockingOutputIterator(OutputIterator &out_)
ResStatus & status() const
Returns the current status.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
bool existEmpty() const
Gets true if some lock doesn't lock any object in pool This can happen e.g.
LockList::size_type size() const
void setCaseSensitive(bool value=true)
Turn case sentitivity on or off (unsets or sets SEARCH_NOCASE flag).
Access to the sat-pools string space.
void addKind(const ResKind &kind)
Filter by selectable kind.
const_iterator begin() const
RW_pointer< Impl, rw_pointer::Scoped< Impl > > _pimpl
void addLock(const PoolQuery &query)
TODO add: toBeAdded{Begin,End,Size,Empty} toBeRemoved{Begin,End,Size,Empty}.
bool operator()(const PoolQuery &q)
void operator()(const PoolQuery &query) const
Singleton class which manipulate with locks file and apply locks on pool.
locks lock some file and unlocking lock unlock only part of iti, so removing old lock can unlock more...
std::list< PoolQuery > LockList
void removeDuplicates()
Delete all query duplicate in loaded locks.
const_iterator end() const
void apply() const
Applies locks in stable list (locks which is not changed during session).
bool isExist() const
Return whether valid stat info exists.
static Locks & instance()
Gets instance of this class.
Convenience char* constructible from std::string and char*, it maps (char*)0 to an empty string...
void merge()
Merges toAdd and ToRemove list to stable list.
const_iterator begin() const
Query result accessers.
std::set< PoolQuery > LockSet
locks lock same item in pool but its parameters are different
bool setLock(bool toLock_r, TransactByValue causer_r)
Apply a lock (prevent transaction).
static const SolvAttr name
LocksCleanPredicate(size_t count, callback::SendReport< CleanEmptyLocksReport > &_report)
bool mergeList(callback::SendReport< SavingLocksReport > &report)
void save(const Pathname &file=ZConfig::instance().locksFile())
Merges toAdd and ToRemove list to stable list and save that stable list to file.
const LockSet & locks() const
const_iterator end() const
An iterator pointing to the end of the query result.
void readAndApply(const Pathname &file=ZConfig::instance().locksFile())
Optimalized version of read and apply.
void remove_if(LockSet &lockset_r, TPredicate pred_r)
bool operator()(const PoolQuery &q)
void setMatchExact()
Set to match exact string instead of substring.
Helper that splits an identifier into kind and name or vice versa.
Wrapper class for ::stat/::lstat.
bool empty() const
Whether the result is empty.
Combining sat::Solvable and ResStatus.
std::string asString() const
Conversion to std::string
ConflictState
type of conflict of old and new lock
int contains(const PoolQuery &q, std::set< sat::Solvable > &s)
callback::SendReport< SavingLocksReport > & report
void read(const Pathname &file=ZConfig::instance().locksFile())
Read locks from file to list of stable locks (locks which is not changed during session) ...
void removeLock(const PoolQuery &query)
unlocks by result of query and add to toRemove.
callback::SendReport< CleanEmptyLocksReport > & report
Iterable< PoolItem_iterator > poolItem() const
LockList::const_iterator const_iterator
std::set< sat::Solvable > & solvs
Easy-to use interface to the ZYPP dependency resolver.
iterator that takes lock, lock all solvables from query and send query to output iterator ...