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