1# -*- coding=utf-8 -*-
2
3from __future__ import absolute_import, print_function, unicode_literals
4
5import itertools
6import sys
7
8
9def add_packages(packages=[], editables=[], project=None, dev=False, sync=False, clean=False):
10    from passa.models.lockers import PinReuseLocker
11    from passa.operations.lock import lock
12
13    lines = list(itertools.chain(
14        packages,
15        ("-e {}".format(e) for e in editables),
16    ))
17
18    project = project
19    for line in lines:
20        try:
21            project.add_line_to_pipfile(line, develop=dev)
22        except (TypeError, ValueError) as e:
23            print("Cannot add {line!r} to Pipfile: {error}".format(
24                line=line, error=str(e),
25            ), file=sys.stderr)
26            return 2
27
28    prev_lockfile = project.lockfile
29
30    locker = PinReuseLocker(project)
31    success = lock(locker)
32    if not success:
33        return 1
34
35    project._p.write()
36    project._l.write()
37    print("Written to project at", project.root)
38
39    if not sync:
40        return
41
42    from passa.models.synchronizers import Synchronizer
43    from passa.operations.sync import sync
44
45    lockfile_diff = project.difference_lockfile(prev_lockfile)
46    default = any(lockfile_diff.default)
47    develop = any(lockfile_diff.develop)
48
49    syncer = Synchronizer(
50        project, default=default, develop=develop,
51        clean_unneeded=clean,
52    )
53    success = sync(syncer)
54    if not success:
55        return 1
56
57    print("Synchronized project at", project.root)
58