aboutsummaryrefslogtreecommitdiff
path: root/bdep/sync.cxx
blob: e84fa0f9866cabb05aa2b12c028ce63e87781d08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// file      : bdep/sync.cxx -*- C++ -*-
// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#include <bdep/sync.hxx>

#include <bdep/database.hxx>
#include <bdep/diagnostics.hxx>

using namespace std;

namespace bdep
{
  void
  cmd_sync (const common_options& co,
            const dir_path& prj,
            const shared_ptr<configuration>& c)
  {
    assert (!c->packages.empty ());

    // Prepare the pkg-spec.
    //
    string spec;
    for (const package_state& p: c->packages)
    {
      if (!spec.empty ())
        spec += ',';

      spec += p.name;
    }

    spec += '@';
    spec += prj.string ();

    run_bpkg (co,
              "build",
              "-d", c->path,
              //"--fetch-shallow",
              "--configure-only",
              //"--keep-out",
              spec);
  }

  int
  cmd_sync (const cmd_sync_options& o, cli::scanner&)
  {
    tracer trace ("sync");

    // We could be running from a package directory (or the user specified one
    // with -d) that has not been init'ed in this configuration. We want to
    // diagnose that since such a package will not be present in the bpkg
    // configuration. But if we are running from the project, then we don't
    // want to treat all the available packages as specified by the user (thus
    // load_packages=false).
    //
    project_packages pp (
      find_project_packages (o,
                             false /* ignore_packages */,
                             false /* load_packages */));

    const dir_path& prj (pp.project);

    database db (open (prj, trace));

    transaction t (db.begin ());
    configurations cfgs (find_configurations (prj, t, o));
    t.commit ();

    // If specified, verify packages are present in each configuration.
    //
    for (const shared_ptr<configuration>& c: cfgs)
    {
      for (const package_location& p: pp.packages)
      {
        if (find_if (c->packages.begin (),
                     c->packages.end (),
                     [&p] (const package_state& s)
                     {
                       return p.name == s.name;
                     }) == c->packages.end ())
        {
          fail << "package " << p.name << " is not initialized "
               << "in configuration " << *c;
        }
      }
    }

    // Synchronize each configuration skipping empty ones.
    //
    for (const shared_ptr<configuration>& c: cfgs)
    {
      if (c->packages.empty ())
      {
        if (verb)
          info << "skipping empty configuration " << *c;

        continue;
      }

      cmd_sync (o, prj, c);
    }

    return 0;
  }
}