Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dvc/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
VERSION = '0.8.7'
271 changes: 271 additions & 0 deletions dvc/cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
from __future__ import print_function

import os
import sys
import argparse
import configparser
from multiprocessing import cpu_count

from dvc.command.init import CmdInit
from dvc.command.remove import CmdRemove
from dvc.command.run import CmdRun
from dvc.command.repro import CmdRepro
from dvc.command.data_sync import CmdDataSync
from dvc.command.lock import CmdLock
from dvc.command.gc import CmdGC
from dvc.command.import_file import CmdImportFile
from dvc.command.target import CmdTarget
from dvc.command.test import CmdTest
from dvc.config import Config
from dvc import VERSION

def parse_args(argv=None):
# Common args
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument('-q',
'--quiet',
action='store_true',
default=False,
help='Be quiet.')
parent_parser.add_argument('-v',
'--verbose',
action='store_true',
default=False,
help='Be verbose.')
parent_parser.add_argument('-G',
'--no-git-actions',
action='store_true',
default=False,
help='Skip all git actions including reproducibility check and commits.')

desc = 'Data Version Control'
parser = argparse.ArgumentParser(description=desc, parents=[parent_parser],
formatter_class=argparse.RawTextHelpFormatter)

parser.add_argument('-V',
'--version',
action='version',
version='%(prog)s ' + VERSION)

# Sub commands
subparsers = parser.add_subparsers(
dest='cmd',
help='Use dvc CMD --help for command-specific help')

# Init
init_parser = subparsers.add_parser(
'init',
parents=[parent_parser],
help='Initialize dvc over a directory (should already be a git dir).')
init_parser.add_argument(
'--data-dir',
default='data',
help='Data directory.')
init_parser.add_argument(
'--cache-dir',
default='.cache',
help='Cache directory.')
init_parser.add_argument(
'--state-dir',
default='.state',
help='State directory.')
init_parser.add_argument(
'--target-file',
default=Config.TARGET_FILE_DEFAULT,
help='Target file.')
init_parser.set_defaults(func=CmdInit)

# Run
run_parser = subparsers.add_parser(
'run',
parents=[parent_parser],
help='Run command')
run_parser.add_argument(
'--stdout',
help='Output std output to a file.')
run_parser.add_argument(
'--stderr',
help='Output std error to a file.')
run_parser.add_argument('-i',
'--input',
action='append',
help='Declare input data items for reproducible cmd.')
run_parser.add_argument('-o',
'--output',
action='append',
help='Declare output data items for reproducible cmd.')
run_parser.add_argument('-c',
'--code',
action='append',
help='Code dependencies which produce the output.')
run_parser.add_argument(
'--shell',
action='store_true',
default=False,
help='Shell command')
run_parser.add_argument('-l',
'--lock',
action='store_true',
default=False,
help='Lock data item - disable reproduction.')
run_parser.add_argument(
'command',
nargs=argparse.REMAINDER,
help='Command to execute')
run_parser.set_defaults(func=CmdRun)

# Sync
sync_parser = subparsers.add_parser(
'sync',
parents=[parent_parser],
help='Synchronize data file with cloud (cloud settings already setup.')
sync_parser.add_argument(
'targets',
metavar='',
nargs='*',
help='File or directory to sync.')
sync_parser.add_argument('-j',
'--jobs',
type=int,
default=cpu_count(),
help='Number of jobs to run simultaneously.')
sync_parser.set_defaults(func=CmdDataSync)

# Repro
repro_parser = subparsers.add_parser(
'repro',
parents=[parent_parser],
help='Reproduce data')
repro_parser.add_argument(
'target',
metavar='',
nargs='*',
help='Data items to reproduce.')
repro_parser.add_argument('-f',
'--force',
action='store_true',
default=False,
help='Reproduce even if dependencies were not changed.')
repro_parser.add_argument('-s',
'--single-item',
action='store_true',
default=False,
help='Reproduce only single data item without recursive dependencies check.')
repro_parser.set_defaults(func=CmdRun)

# Remove
remove_parser = subparsers.add_parser(
'remove',
parents=[parent_parser],
help='Remove data item from data directory.')
remove_parser.add_argument('target',
metavar='',
nargs='*',
help='Target to remove - file or directory.')
remove_parser.add_argument('-l',
'--keep-in-cloud',
action='store_true',
default=False,
help='Do not remove data from cloud.')
remove_parser.add_argument('-r',
'--recursive',
action='store_true',
help='Remove directory recursively.')
remove_parser.add_argument('-c',
'--keep-in-cache',
action='store_true',
default=False,
help='Do not remove data from cache.')
remove_parser.set_defaults(func=CmdRemove)

# Import
import_parser = subparsers.add_parser(
'import',
parents=[parent_parser],
help='Import file to data directory.')
import_parser.add_argument(
'input',
nargs='+',
help='Input file/files.')
import_parser.add_argument(
'output',
help='Output file/directory.')
import_parser.add_argument('-l',
'--lock',
action='store_true',
default=False,
help='Lock data item - disable reproduction.')
import_parser.add_argument('-j',
'--jobs',
type=int,
default=cpu_count(),
help='Number of jobs to run simultaneously.')
import_parser.set_defaults(func=CmdImportFile)

# Lock
lock_parser = subparsers.add_parser(
'lock',
parents=[parent_parser],
help='Lock')
lock_parser.add_argument('-l',
'--lock',
action='store_true',
default=False,
help='Lock data item - disable reproduction.')
lock_parser.add_argument('-u',
'--unlock',
action='store_true',
default=False,
help='Unlock data item - enable reproduction.')
lock_parser.add_argument(
'files',
metavar='',
nargs='*',
help='Data items to lock or unlock.')
lock_parser.set_defaults(func=CmdLock)

# Garbage collector
gc_parser = subparsers.add_parser(
'gc',
parents=[parent_parser],
help='Collect garbage')
gc_parser.add_argument('target',
metavar='',
nargs='*',
help='Target to remove - file or directory.')
gc_parser.add_argument('-l',
'--keep-in-cloud',
action='store_true',
default=False,
help='Do not remove data from cloud.')
gc_parser.add_argument('-r',
'--recursive',
action='store_true',
help='Remove directory recursively.')
gc_parser.add_argument('-c',
'--keep-in-cache',
action='store_false',
default=False,
help='Do not remove data from cache.')
gc_parser.set_defaults(func=CmdGC)

# Target
target_parser = subparsers.add_parser(
'target',
parents=[parent_parser],
help='Set default target')
target_parser.add_argument('target_file',
metavar='',
nargs='?',
help='Target data item.')
target_parser.add_argument('-u',
'--unset',
action='store_true',
default=False,
help='Reset target.')
target_parser.set_defaults(func=CmdTarget)

if isinstance(argv, str):
argv = argv.split()

return parser.parse_args(argv)
66 changes: 7 additions & 59 deletions dvc/command/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,29 +40,24 @@ class CmdBase(object):
def __init__(self, settings):
self._settings = settings

parser = argparse.ArgumentParser()
self.define_common_args(parser)
self.define_args(parser)

self._parsed_args, self._command_args = parser.parse_known_args(args=self.args)

self.process_common_args()
if settings._parsed_args.quiet and not settings._parsed_args.verbose:
Logger.be_quiet()
elif not settings._parsed_args.quiet and settings._parsed_args.verbose:
Logger.be_verbose()

@property
def settings(self):
return self._settings

#NOTE: this name is really confusing. It should really be called "command" or smth,
# because it is only used for "command" argument from CmdRun.
@property
def args(self):
return self._settings.args

@property
def parsed_args(self):
return self._parsed_args

@property
def command_args(self):
return self._command_args
return self._settings._parsed_args

@property
def config(self):
Expand All @@ -76,34 +71,6 @@ def dvc_home(self):
def git(self):
return self._settings.git

def define_args(self, parser):
pass

def set_no_git_actions(self, parser):
parser.add_argument('--no-git-actions', '-G', action='store_true', default=False,
help='Skip all git actions including reproducibility check and commits.')

def set_lock_action(self, parser):
parser.add_argument('--lock', '-l', action='store_true', default=False,
help='Lock data item - disable reproduction. ' +
'It can be enabled by `dvc lock` command or by forcing reproduction.')

def define_common_args(self, parser):
parser.add_argument('--quiet', '-q', action='store_true', default=False, help='Be quiet.')
parser.add_argument('--verbose', '-v', action='store_true', default=False, help='Be verbose.')
parser.add_argument('--jobs', '-j', type=int, default=cpu_count(),
help='Number of jobs to run simultaneously.')

@staticmethod
def set_reset_flag(parser, short_name, long_name, message):
parser.add_argument(short_name, long_name, action='store_true', default=False, help=message)

def process_common_args(self):
if self._parsed_args.quiet and not self._parsed_args.verbose:
Logger.be_quiet()
elif not self._parsed_args.quiet and self._parsed_args.verbose:
Logger.be_verbose()

@property
def no_git_actions(self):
return self.parsed_args.no_git_actions
Expand Down Expand Up @@ -132,24 +99,5 @@ def commit_if_needed(self, message, error=False):
def not_committed_changes_warning():
Logger.warn('changes were not committed to git')

def add_string_arg(self, parser, name, message, default = None,
conf_section=None, conf_name=None):
if conf_section and conf_name:
section = self.config[conf_section]
if not section:
raise ConfigError("")
default_value = section.get(conf_section, default)
else:
default_value = default

parser.add_argument(name,
metavar='',
default=default_value,
help=message)

def run(self):
pass

@staticmethod
def warning_dvc_is_busy():
Logger.warn('Cannot perform the cmd since DVC is busy and locked. Please retry the cmd later.')
10 changes: 0 additions & 10 deletions dvc/command/data_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

from dvc.command.base import CmdBase, DvcLock
from dvc.exceptions import DvcException
from dvc.runtime import Runtime
from dvc.system import System
from dvc.data_cloud import DataCloud
from dvc.utils import map_progress
Expand All @@ -18,12 +17,6 @@ class CmdDataSync(CmdBase):
def __init__(self, settings):
super(CmdDataSync, self).__init__(settings)

def define_args(self, parser):
parser.add_argument('targets',
metavar='',
help='File or directory to sync.',
nargs='*')

def run(self):
with DvcLock(self.is_locker, self.git):
cloud = DataCloud(self.settings)
Expand All @@ -44,6 +37,3 @@ def run(self):

map_progress(cloud.sync, targets, self.parsed_args.jobs)
pass

if __name__ == '__main__':
Runtime.run(CmdDataSync)
Loading