libzypp  17.38.7
plaindir.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
9 #include "plaindir.h"
10 
11 #include <zypp-core/ng/ui/ProgressObserver>
12 #include <zypp-media/ng/ProvideSpec>
13 #include <zypp/ng/Context>
14 
15 
18 
19 #undef ZYPP_BASE_LOGGER_LOGGROUP
20 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager"
21 
23 
24  namespace {
25  auto statusLogic( repo::DownloadContextRef &&ctx, ProvideMediaHandle mediaHandle ) {
26  // this can only happen if this function is called with a non mounting medium, but those do not support plaindir anyway
27  if ( !mediaHandle.localPath().has_value() ) {
28  return makeReadyTask<expected<zypp::RepoStatus>>( expected<zypp::RepoStatus>::error( ZYPP_EXCPT_PTR( zypp::Exception("Medium does not support plaindir") )) );
29  }
30 
31  // dir status
32  const auto &repoInfo = std::forward<repo::DownloadContextRef>(ctx)->repoInfo();
33  auto rStatus = zypp::RepoStatus( repoInfo ) && zypp::RepoStatus( mediaHandle.localPath().value() / repoInfo.path() );
34  return makeReadyTask<expected<zypp::RepoStatus>> ( expected<zypp::RepoStatus>::success(std::move(rStatus)) );
35  }
36  }
37 
38  MaybeAwaitable<expected<zypp::RepoStatus> > repoStatus(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle)
39  {
40  return statusLogic( std::move(dl), std::move(mediaHandle) );
41  }
42 
43  namespace {
44  auto dlLogic( repo::DownloadContextRef &&ctx, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver ) {
46 
47  try {
48  // this can only happen if this function is called with a non mounting medium, but those do not support plaindir anyway
49  if ( !mediaHandle.localPath().has_value() ) {
50  return makeReadyTask<Ret>( Ret::error( ZYPP_EXCPT_PTR( zypp::Exception("Medium does not support plaindir") )) );
51  }
52 
53  if ( progressObserver ) progressObserver->inc();
54 
55  // as substitute for real metadata remember the checksum of the directory we refreshed
56  const auto &repoInfo = std::forward<repo::DownloadContextRef>(ctx)->repoInfo();
57  auto newstatus = zypp::RepoStatus( mediaHandle.localPath().value() / repoInfo.path() ); // dir status
58 
59  zypp::Pathname productpath( std::forward<repo::DownloadContextRef>(ctx)->destDir() / repoInfo.path() );
60  zypp::filesystem::assert_dir( productpath );
61  newstatus.saveToCookieFile( productpath/"cookie" );
62 
63  if ( progressObserver ) progressObserver->setFinished();
64 
65  } catch ( const zypp::Exception &e ) {
66  ZYPP_CAUGHT(e);
67  return makeReadyTask<Ret>( Ret::error( ZYPP_FWD_CURRENT_EXCPT() ) );
68  } catch ( ... ) {
69  return makeReadyTask<Ret>( Ret::error( ZYPP_FWD_CURRENT_EXCPT() ) );
70  }
71  return makeReadyTask<Ret>( Ret::success( std::forward<repo::DownloadContextRef>(ctx) ) );
72  }
73  }
74 
75  MaybeAwaitable<expected<repo::DownloadContextRef> > download(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
76  {
77  return dlLogic( std::move(dl), std::move(mediaHandle), std::move(progressObserver) );
78  }
79 }
zypp::RepoStatus RepoStatus
Definition: repomanager.h:39
int assert_dir(const Pathname &path, unsigned mode)
Like &#39;mkdir -p&#39;.
Definition: PathInfo.cc:338
#define ZYPP_EXCPT_PTR(EXCPT)
Drops a logline and returns Exception as a std::exception_ptr.
Definition: Exception.h:463
const std::optional< zypp::Pathname > & localPath() const
Definition: provide.cc:134
MaybeAwaitable< expected< repo::DownloadContextRef > > download(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver)
Definition: plaindir.cc:75
static expected success(ConsParams &&...params)
Definition: expected.h:178
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
Definition: Exception.h:475
Base class for Exception.
Definition: Exception.h:152
#define ZYPP_FWD_CURRENT_EXCPT()
Drops a logline and returns the current Exception as a std::exception_ptr.
Definition: Exception.h:471
MaybeAwaitable< expected< zypp::RepoStatus > > repoStatus(repo::DownloadContextRef dl, ProvideMediaHandle mediaHandle)
Definition: plaindir.cc:38