This commit is contained in:
Denis Silakov 2016-01-23 21:54:20 +03:00
commit c0bd31231f
8 changed files with 1053 additions and 780 deletions

View file

@ -1 +0,0 @@
2.2.2

401
abf.py
View file

@ -32,6 +32,16 @@ from abf.model import *
abf_url = cfg['main']['abf_url'] abf_url = cfg['main']['abf_url']
file_store_url = cfg['main']['file_store_url'] file_store_url = cfg['main']['file_store_url']
if cfg['main']['default_publish_status'] != '':
if cfg['main']['default_publish_status'] in BuildList.auto_publish_statuses:
default_publish_status = cfg['main']['default_publish_status']
else:
default_publish_status = BuildList.auto_publish_statuses[0]
print(_("Incorrect value of 'default_publish_status' in config file, ignoring. Possible valus are: ") + "'" + str.join("', '", BuildList.auto_publish_statuses) + "'")
else:
default_publish_status = BuildList.auto_publish_statuses[0]
cfg['main']['default_publish_status'] = BuildList.auto_publish_statuses[0]
login = cfg['user']['login'] login = cfg['user']['login']
password = cfg['user']['password'] password = cfg['user']['password']
default_group = cfg['user']['default_group'] default_group = cfg['user']['default_group']
@ -114,91 +124,92 @@ def parse_command_line():
subparsers = parser.add_subparsers(title='command') subparsers = parser.add_subparsers(title='command')
# help # help
parser_help = subparsers.add_parser('help', help=_('show a help for command')) subparser = subparsers.add_parser('help', help=_('show a help for command'))
parser_help.add_argument('command', action='store', nargs='?', help=_('a command to show help for')) subparser.add_argument('command', action='store', nargs='?', help=_('a command to show help for'))
parser_help.set_defaults(func=help) subparser.set_defaults(func=help)
# alias # alias
parser_alias = subparsers.add_parser('alias', help=_('Manage aliases')) subparser = subparsers.add_parser('alias', help=_('Manage aliases'))
alias_commands = ['list', 'add', 'remove'] alias_commands = ['list', 'add', 'remove']
parser_alias.add_argument('command', action='store', choices=alias_commands) subparser.add_argument('command', action='store', choices=alias_commands)
parser_alias.add_argument('options', action='store', nargs='*', help=_('name and alias (not quoted, e. g. "abf alias add sg search groups") for adding, only name for removing.')) subparser.add_argument('options', action='store', nargs='*', help=_('name and alias (not quoted, e. g. "abf alias add sg search groups") for adding, only name for removing.'))
parser_alias.set_defaults(func=alias) subparser.set_defaults(func=alias)
# get # get
parser_get = subparsers.add_parser('get', help=_('clone a project from ABF')) subparser = subparsers.add_parser('get', help=_('clone a project from ABF'))
parser_get.add_argument('project', action='store', help=_('project name. ([group/]project). If no group specified, ' subparser.add_argument('project', action='store', help=_('project name. ([group/]project). If no group specified, '
'it\'s assumed to be your default group.')) 'it\'s assumed to be your default group.'))
parser_get.add_argument('-b', '--branch', action='store', help=_('branch to checkout')) subparser.add_argument('-b', '--branch', action='store', help=_('branch to checkout'))
parser_get.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.')) subparser.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.'))
parser_get.set_defaults(func=get) subparser.set_defaults(func=get)
# put # put
parser_put = subparsers.add_parser('put', help=_('Upload large binary files to File-Store and update (or create) .abf.yml file. Can also commit and push changes.')) subparser = subparsers.add_parser('put', help=_('Upload large binary files to File-Store and update (or create) .abf.yml file. Can also commit and push changes.'))
parser_put.add_argument('-m', '--message', action='store', help=_('With this option specified, "git add --all", "git commit -m MSG" and "git push" will be executed.')) subparser.add_argument('-m', '--message', action='store', help=_('With this option specified, "git add" for every file, "git commit -m MSG" and "git push" will be executed.'))
parser_put.add_argument('-s', '--minimal-file-size', default='0', action='store', help=_('The minimal file size to upload to File-Store. ' subparser.add_argument('-f', '--add-folders', action='store_true', help=_('By default, the client does not add new folders to Git. This option will force it to add all new directories.'))
subparser.add_argument('-b', '--add-binaries', action='store_true', help=_('By default, the client does not add new binary files to Git. This option will force it to add all new binaries (unless they are uploaded to file store - see below).'))
subparser.add_argument('-s', '--minimal-file-size', default='0', action='store', help=_('The minimal file size to upload to File-Store. '
'Default is 0B.')) 'Default is 0B.'))
parser_put.add_argument('-n', '--do-not-remove-files', action='store_true', help=_('By default files are being removed on uploading. Override this behavior.')) subparser.add_argument('-n', '--do-not-remove-files', action='store_true', help=_('By default files are being removed on uploading. Override this behavior.'))
parser_put.add_argument('-a', '--upload-all', action='store_true', help=_('By default, console client analyzes spec file and tries to detect which files located in the ' subparser.add_argument('-a', '--upload-all', action='store_true', help=_('By default, console client analyzes spec file and tries to detect which files located in the '
'current folder are really used by the project and uploads only these files to file store. ' 'current folder are really used by the project and uploads only these files to file store. '
'With this option, console client will upload all binary files located in the current folder.')) 'With this option, console client will upload all binary files located in the current folder.'))
parser_put.set_defaults(func=put) subparser.set_defaults(func=put)
# store # store
parser_store = subparsers.add_parser('store', help=_('Upload a given file to File-Store. Prints a sha1 hash or error message (with non-zero return code).')) subparser = subparsers.add_parser('store', help=_('Upload a given file to File-Store. Prints a sha1 hash or error message (with non-zero return code).'))
parser_store.add_argument('path', action='store', help=_('Path to file')) subparser.add_argument('path', action='store', help=_('Path to file'))
parser_store.set_defaults(func=store) subparser.set_defaults(func=store)
# update # update
parser_update = subparsers.add_parser('update', help=_('Update project settings.')) subparser = subparsers.add_parser('update', help=_('Update project settings.'))
parser_update.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: ' subparser.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: '
'"[group/]name". If no group specified, default group will be used.')) '"[group/]name". If no group specified, default group will be used.'))
parser_update.add_argument('--name', nargs='?', action='store', help=_('New project name.')) subparser.add_argument('--name', nargs='?', action='store', help=_('New project name.'))
parser_update.add_argument('--desc', nargs='?', action='store', help=_('Project description.')) subparser.add_argument('--desc', nargs='?', action='store', help=_('Project description.'))
parser_update.add_argument('--visibility', nargs='?', action='store', help=_('Project visibility. Please specify "open" or "hidden".')) subparser.add_argument('--visibility', nargs='?', action='store', help=_('Project visibility. Please specify "open" or "hidden".'))
parser_update.add_argument('--is_pkg', nargs='?', action='store', help=_('Is project a package. Please specify "true" or "false".')) subparser.add_argument('--is_pkg', nargs='?', action='store', help=_('Is project a package. Please specify "true" or "false".'))
parser_update.add_argument('--maintainer', nargs='?', action='store', help=_('Project maintainer. You can specify either maintainer id or login.')) subparser.add_argument('--maintainer', nargs='?', action='store', help=_('Project maintainer. You can specify either maintainer id or login.'))
parser_update.add_argument('--branch', nargs='?', action='store', help=_('Default branch for the project Git repository.')) subparser.add_argument('--branch', nargs='?', action='store', help=_('Default branch for the project Git repository.'))
parser_update.add_argument('--issues', nargs='?', action='store', help=_('Should project issue tracker be enabled. Please specify "true" or "false".')) subparser.add_argument('--issues', nargs='?', action='store', help=_('Should project issue tracker be enabled. Please specify "true" or "false".'))
parser_update.add_argument('--wiki', nargs='?', action='store', help=_('Should project wiki be enabled. Please specify "true" or "false".')) subparser.add_argument('--wiki', nargs='?', action='store', help=_('Should project wiki be enabled. Please specify "true" or "false".'))
# parser_update.add_argument('maintainer', type=int, nargs='?', action='store', help=_('Identifier of project maintainer.')) subparser.add_argument('--biarch', nargs='?', action='store', help=_('Enable/disable publishing 32bit packages into 64bit repository. Please specify "true" or "false".'))
parser_update.add_argument('--biarch', nargs='?', action='store', help=_('Enable/disable publishing 32bit packages into 64bit repository. Please specify "true" or "false".')) subparser.set_defaults(func=update)
parser_update.set_defaults(func=update)
# fetch # fetch
parser_fetch = subparsers.add_parser('fetch', help=_('Download all the files listed in .abf.yml or file with given hash from File-Store to local directory.')) subparser = subparsers.add_parser('fetch', help=_('Download all the files listed in .abf.yml or file with given hash from File-Store to local directory.'))
parser_fetch.add_argument('filehash', nargs='*', action='store', help=_('Download file with given hash')) subparser.add_argument('filehash', nargs='*', action='store', help=_('Download file with given hash'))
parser_fetch.add_argument('-o', '--only', action='append', help=_('Limit the list of downloaded files to this file name(s). This option can be specified more than once.')) subparser.add_argument('-o', '--only', action='append', help=_('Limit the list of downloaded files to this file name(s). This option can be specified more than once.'))
parser_fetch.set_defaults(func=fetch) subparser.set_defaults(func=fetch)
# remote # remote
parser_remote = subparsers.add_parser('remote', help=_('Add remote Git repository and fetch it.')) subparser = subparsers.add_parser('remote', help=_('Add remote Git repository and fetch it.'))
parser_remote.add_argument('remote_group', action='store', help=_('ABF group to fetch from. This value will be also used as the name of remote repository.')) subparser.add_argument('remote_group', action='store', help=_('ABF group to fetch from. This value will be also used as the name of remote repository.'))
parser_remote.add_argument('remote_name', nargs='?', action='store', help=_('Project to fetch (by default the same project name is used as the current one).')) subparser.add_argument('remote_name', nargs='?', action='store', help=_('Project to fetch (by default the same project name is used as the current one).'))
parser_remote.set_defaults(func=remote) subparser.set_defaults(func=remote)
# show # show
parser_show = subparsers.add_parser('show', help=_('show some general information. Bash autocomplete uses it.')) subparser = subparsers.add_parser('show', help=_('show some general information. Bash autocomplete uses it.'))
show_choices = ['buildlists', 'build-repos', 'build-platforms', 'save-to-repos', 'save-to-platforms'] show_choices = ['buildlists', 'build-repos', 'build-platforms', 'save-to-repos', 'save-to-platforms']
parser_show.add_argument('type', action='store', nargs='?', choices=show_choices,help=_('The type of information to show')) subparser.add_argument('type', action='store', nargs='?', choices=show_choices,help=_('The type of information to show'))
parser_show.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: ' subparser.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: '
'"[group/]name". If no group specified, default group will be used.')) '"[group/]name". If no group specified, default group will be used.'))
parser_show.set_defaults(func=show) subparser.set_defaults(func=show)
# locate # locate
parser_locate = subparsers.add_parser('locate', help=_('tool can remember the project location and use it for some reasons (abfcd, etc.).'), subparser = subparsers.add_parser('locate', help=_('tool can remember the project location and use it for some reasons (abfcd, etc.).'),
epilog=_('Every interaction with git repository (build, get, put, etc.) updates the cached location of the project (overriding ' epilog=_('Every interaction with git repository (build, get, put, etc.) updates the cached location of the project (overriding '
'an existing one if needed). For any cached project you can execute "abfcd <project>" and you will cd to the project directory.')) 'an existing one if needed). For any cached project you can execute "abfcd <project>" and you will cd to the project directory.'))
locate_choices = ['update', 'update-recursive'] locate_choices = ['update', 'update-recursive']
parser_locate.add_argument('action', action='store', choices=locate_choices, nargs='?', help=_('The type of information to show')) subparser.add_argument('action', action='store', choices=locate_choices, nargs='?', help=_('The type of information to show'))
parser_locate.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: ' subparser.add_argument('-p', '--project', action='store', help=_('Project to show information for (if needed). Format: '
'"[group/]name". If no group specified, default group will be used.')) '"[group/]name". If no group specified, default group will be used.'))
parser_locate.add_argument('-d', '--directory', action='store', help=_('Directory to update locations for. It should be a ' subparser.add_argument('-d', '--directory', action='store', help=_('Directory to update locations for. It should be a '
'git repository for "update" and any directory for "update-recursive". If not specified - the current directory will be used')) 'git repository for "update" and any directory for "update-recursive". If not specified - the current directory will be used'))
parser_locate.set_defaults(func=locate) subparser.set_defaults(func=locate)
# build # build
parser_build = subparsers.add_parser('build', help=_('Initiate a build task on ABF.'), formatter_class=RawDescriptionHelpFormatter, subparser = subparsers.add_parser('build', help=_('Initiate a build task on ABF.'), formatter_class=RawDescriptionHelpFormatter,
epilog=_('NOTES:\n' epilog=_('NOTES:\n'
'API takes git commit hash to build. So client have to resolve it.\n' 'API takes git commit hash to build. So client have to resolve it.\n'
'1) If you\'ve specified commit hash - it will be used "as is".\n' '1) If you\'ve specified commit hash - it will be used "as is".\n'
@ -209,39 +220,41 @@ def parse_command_line():
'4) If you\'ve specified no git commit related options and you\'ve\n' '4) If you\'ve specified no git commit related options and you\'ve\n'
'not specified a project name (you have to be in a git repository) -\n' 'not specified a project name (you have to be in a git repository) -\n'
'the top remote commit of your current branch will be used.\n')) 'the top remote commit of your current branch will be used.\n'))
parser_build.add_argument('-p', '--project', action='store', help=_('project name ([group/]project). If no group ' subparser.add_argument('-p', '--project', action='store', help=_('project name ([group/]project). If no group '
'specified, it is assumed to be your default group. If the option is not specified and you are in a git ' 'specified, it is assumed to be your default group. If the option is not specified and you are in a git '
'repository directory - resolve a project name from it.')) 'repository directory - resolve a project name from it.'))
parser_build.add_argument('-b', '--branch', action='store', help=_('branch to build.')) subparser.add_argument('-b', '--branch', action='store', help=_('branch to build.'))
parser_build.add_argument('-t', '--tag', action='store', help=_('tag to build.')) subparser.add_argument('-t', '--tag', action='store', help=_('tag to build.'))
parser_build.add_argument('-c', '--commit', action='store', help=_('commit sha hash to build.')) subparser.add_argument('-c', '--commit', action='store', help=_('commit sha hash to build.'))
parser_build.add_argument('-s', '--save-to-repository', action='store', help=_('repository to save results to ' subparser.add_argument('-s', '--save-to-repository', action='store', help=_('repository to save results to '
'([platform/]repository). If no platform part specified, it is assumed to be "<default_group>_personal". ' '([platform/]repository). If no platform part specified, it is assumed to be "<default_group>_personal". '
'If this option is not specified at all, "<default_group>_personal/main" will be used.')) 'If this option is not specified at all, "<default_group>_personal/main" will be used.'))
parser_build.add_argument('-a', '--arch', action='append', help=_('architectures to build, ' subparser.add_argument('-a', '--arch', action='append', help=_('architectures to build, '
'can be set more than once. If not set - use all the available architectures.')) 'can be set more than once. If not set - use all the available architectures.'))
parser_build.add_argument('-r', '--repository', action='append', help=_('repositories to build with ([platform/]repository). ' subparser.add_argument('-r', '--repository', action='append', help=_('repositories to build with ([platform/]repository). '
'Can be set more than once. If no platform part specified, it is assumed to be your "<default_build_platform>".' 'Can be set more than once. If no platform part specified, it is assumed to be your "<default_build_platform>".'
' If no repositories were specified at all, use the "main" repository from save-to platform.')) ' If no repositories were specified at all, use the "main" repository from save-to platform.'))
parser_build.add_argument('-l', '--build-list', action='append', help=_('build list whose container should be used during the build. Can be specified more than once.')) subparser.add_argument('-l', '--build-list', action='append', help=_('build list whose container should be used during the build. Can be specified more than once.'))
parser_build.add_argument('--auto-publish', action='store_true', help=_('deprecated synonym for --auto-publish-status=default.')) subparser.add_argument('--auto-publish', action='store_true', help=_('deprecated synonym for --auto-publish-status=default.'))
parser_build.add_argument('--auto-publish-status', action='store', choices=BuildList.auto_publish_statuses, help=_('enable automatic publishing. Default is "%s".') % subparser.add_argument('--auto-publish-status', action='store', choices=BuildList.auto_publish_statuses, help=_('enable automatic publishing. Default is "%s".') %
(BuildList.auto_publish_statuses[0])) (BuildList.auto_publish_statuses[0]))
parser_build.add_argument('--skip-personal', action='store_true', help=_('do not use personal repository to resolve dependencies.')) subparser.add_argument('--skip-personal', action='store_true', help=_('do not use personal repository to resolve dependencies.'))
parser_build.add_argument('--testing', action='store_true', help=_('Include "testing" subrepository.')) subparser.add_argument('--testing', action='store_true', help=_('Include "testing" subrepository.'))
parser_build.add_argument('--no-extra-tests', action='store_true', help=_('Do not launch comprehensive tests.')) subparser.add_argument('--no-extra-tests', action='store_true', help=_('Do not launch comprehensive tests.'))
parser_build.add_argument('--auto-create-container', action='store_true', help=_('enable automatic creation of container')) subparser.add_argument('--auto-create-container', action='store_true', help=_('enable automatic creation of container'))
parser_build.add_argument('--cached-chroot', action='store_true', help=_('use cached chroot for the build')) subparser.add_argument('--cached-chroot', action='store_true', help=_('use cached chroot for the build'))
parser_build.add_argument('--save-chroot', action='store_true', help=_('save build chroot in case of failure')) subparser.add_argument('--save-chroot', action='store_true', help=_('save build chroot in case of failure'))
parser_build.add_argument('--update-type', action='store', choices=BuildList.update_types, help=_('Update type. Default is "%s".') % subparser.add_argument('--update-type', action='store', choices=BuildList.update_types, help=_('Update type. Default is "%s".') %
(BuildList.update_types[0]) ) (BuildList.update_types[0]) )
parser_build.add_argument('--skip-spec-check', action='store_true', help=_('Do not check spec file.')) subparser.add_argument('--external-nodes', action='store', choices=BuildList.external_nodes_vals, help=_('Use any external ABF node or own external ABF node. Default is "%s".') %
parser_build.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.')) (BuildList.external_nodes_vals[0]) )
parser_build.set_defaults(func=build) subparser.add_argument('--skip-spec-check', action='store_true', help=_('Do not check spec file.'))
subparser.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.'))
subparser.set_defaults(func=build)
# chain-build # chain-build
parser_chain_build = subparsers.add_parser('chain_build', help=_('Initiate a chain of build tasks on ABF.'), formatter_class=RawDescriptionHelpFormatter) subparser = subparsers.add_parser('chain_build', help=_('Initiate a chain of build tasks on ABF.'), formatter_class=RawDescriptionHelpFormatter)
parser_chain_build.add_argument('project', nargs='*', action='store', help=_('Project name ([group/]project). If no group ' subparser.add_argument('project', nargs='*', action='store', help=_('Project name ([group/]project). If no group '
'specified, it is assumed to be your default group. You can specify several projects to be built one after another. ' 'specified, it is assumed to be your default group. You can specify several projects to be built one after another. '
'You can also group projects with ":" to indicate that they can be built in parallel. For example, ' 'You can also group projects with ":" to indicate that they can be built in parallel. For example, '
'"abf chain_build a b:c d" will build project "a", then (after "a" is built) will launch builds of "b" and "c" ' '"abf chain_build a b:c d" will build project "a", then (after "a" is built) will launch builds of "b" and "c" '
@ -249,141 +262,157 @@ def parse_command_line():
'If automated publishing is set, then console client waits for every build to be published before starting the next build in the chain. ' 'If automated publishing is set, then console client waits for every build to be published before starting the next build in the chain. '
'If automated container creation is set, then console client waits for container to be ready and when the next build is started, containers ' 'If automated container creation is set, then console client waits for container to be ready and when the next build is started, containers '
'from all previous builds are used as extra repositories.' )) 'from all previous builds are used as extra repositories.' ))
parser_chain_build.add_argument('-i', '--infile', action='store', help=_('File with project names. You can omit project names in command line ' subparser.add_argument('-i', '--infile', action='store', help=_('File with project names. You can omit project names in command line '
'and provide a file with project names instead. The file will be read line by line. All projects specified at the same line ' 'and provide a file with project names instead. The file will be read line by line. All projects specified at the same line '
'will be built in parallel; the next line will be processed only after all the build from the previous line are completed successfully. ' 'will be built in parallel; the next line will be processed only after all the build from the previous line are completed successfully. '
'Project name in a line can be separated by colon (":") or by space symbols.')) 'Project name in a line can be separated by colon (":") or by space symbols.'))
parser_chain_build.add_argument('-b', '--branch', action='store', help=_('branch to build.')) subparser.add_argument('-b', '--branch', action='store', help=_('branch to build.'))
parser_chain_build.add_argument('-t', '--tag', action='store', help=_('tag to build.')) subparser.add_argument('-t', '--tag', action='store', help=_('tag to build.'))
parser_chain_build.add_argument('-c', '--commit', action='store', help=_('commit sha hash to build.')) subparser.add_argument('-c', '--commit', action='store', help=_('commit sha hash to build.'))
parser_chain_build.add_argument('-u', '--timeout', action='store', help=_('number of seconds to sleep between successive checks of build status.')) subparser.add_argument('-u', '--timeout', action='store', help=_('number of seconds to sleep between successive checks of build status.'))
parser_chain_build.add_argument('-s', '--save-to-repository', action='store', help=_('repository to save results to ' subparser.add_argument('-s', '--save-to-repository', action='store', help=_('repository to save results to '
'([platform/]repository). If no platform part specified, it is assumed to be "<default_group>_personal". ' '([platform/]repository). If no platform part specified, it is assumed to be "<default_group>_personal". '
'If this option is not specified at all, "<default_group>_personal/main" will be used.')) 'If this option is not specified at all, "<default_group>_personal/main" will be used.'))
parser_chain_build.add_argument('-a', '--arch', action='append', help=_('architectures to build, ' subparser.add_argument('-a', '--arch', action='append', help=_('architectures to build, '
'can be set more than once. If not set - use all the available architectures.')) 'can be set more than once. If not set - use all the available architectures.'))
parser_chain_build.add_argument('-r', '--repository', action='append', help=_('repositories to build with ([platform/]repository). ' subparser.add_argument('-r', '--repository', action='append', help=_('repositories to build with ([platform/]repository). '
'Can be set more than once. If no platform part specified, it is assumed to be your "<default_build_platform>".' 'Can be set more than once. If no platform part specified, it is assumed to be your "<default_build_platform>".'
' If no repositories were specified at all, use the "main" repository from save-to platform.')) ' If no repositories were specified at all, use the "main" repository from save-to platform.'))
parser_chain_build.add_argument('-l', '--build-list', action='append', help=_('build list whose container should be used during the build. Can be specified more than once.')) subparser.add_argument('-l', '--build-list', action='append', help=_('build list whose container should be used during the build. Can be specified more than once.'))
parser_chain_build.add_argument('--auto-publish', action='store_true', help=_('deprecated synonym for --auto-publish-status=default.')) subparser.add_argument('--auto-publish', action='store_true', help=_('deprecated synonym for --auto-publish-status=default.'))
parser_chain_build.add_argument('--auto-publish-status', action='store', choices=BuildList.auto_publish_statuses, help=_('enable automatic publishing. Default is "%s".') % subparser.add_argument('--auto-publish-status', action='store', choices=BuildList.auto_publish_statuses, help=_('enable automatic publishing. Default is "%s".') %
(BuildList.auto_publish_statuses[0])) (BuildList.auto_publish_statuses[0]))
parser_chain_build.add_argument('--skip-personal', action='store_true', help=_('do not use personal repository to resolve dependencies.')) subparser.add_argument('--skip-personal', action='store_true', help=_('do not use personal repository to resolve dependencies.'))
parser_chain_build.add_argument('--testing', action='store_true', help=_('Include "testing" subrepository.')) subparser.add_argument('--testing', action='store_true', help=_('Include "testing" subrepository.'))
parser_chain_build.add_argument('--no-extra-tests', action='store_true', help=_('Do not launch comprehensive tests.')) subparser.add_argument('--no-extra-tests', action='store_true', help=_('Do not launch comprehensive tests.'))
parser_chain_build.add_argument('--auto-create-container', action='store_true', help=_('enable automatic creation of container')) subparser.add_argument('--auto-create-container', action='store_true', help=_('enable automatic creation of container'))
parser_chain_build.add_argument('--cached-chroot', action='store_true', help=_('use cached chroot for the build')) subparser.add_argument('--cached-chroot', action='store_true', help=_('use cached chroot for the build'))
parser_chain_build.add_argument('--save-chroot', action='store_true', help=_('save build chroot in case of failure')) subparser.add_argument('--save-chroot', action='store_true', help=_('save build chroot in case of failure'))
parser_chain_build.add_argument('--update-type', action='store', choices=BuildList.update_types, help=_('Update type. Default is "%s".') % subparser.add_argument('--update-type', action='store', choices=BuildList.update_types, help=_('Update type. Default is "%s".') %
(BuildList.update_types[0]) ) (BuildList.update_types[0]) )
parser_chain_build.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.')) subparser.add_argument('--external-nodes', action='store', choices=BuildList.external_nodes_vals, help=_('Use any external ABF node or own external ABF node. Default is "%s".') %
parser_chain_build.set_defaults(func=chain_build) (BuildList.external_nodes_vals[0]) )
subparser.add_argument('--skip-proj-cfg-update', action='store_true', help=_('Do not update cache with information about project builds.'))
subparser.set_defaults(func=chain_build)
# mock-urpm # mock-urpm
parser_mock_urpm = subparsers.add_parser('mock-urpm', help=_('Build a project locally using mock-urpm.'), epilog=_('No checkouts will be made,' subparser = subparsers.add_parser('mock-urpm', help=_('Build a project locally using mock-urpm.'), epilog=_('No checkouts will be made,'
'the current git repository state will be used')) 'the current git repository state will be used'))
parser_mock_urpm.add_argument('-c', '--config', action='store', help=_('A config template to use. Specify one of the config names ' subparser.add_argument('-c', '--config', action='store', help=_('A config template to use. Specify one of the config names '
'from %s. Directory path should be omitted. If no config specified, "default.cfg" will be used') % configs_dir) 'from %s. Directory path should be omitted. If no config specified, "default.cfg" will be used') % configs_dir)
parser_mock_urpm.set_defaults(func=localbuild_mock_urpm) subparser.set_defaults(func=localbuild_mock_urpm)
# rpmbuild # rpmbuild
parser_rpmbuild = subparsers.add_parser('rpmbuild', help=_('Build a project locally using rpmbuild.'), epilog=_('No checkouts will be made,' subparser = subparsers.add_parser('rpmbuild', help=_('Build a project locally using rpmbuild.'), epilog=_('No checkouts will be made,'
'the current git repository state will be used')) 'the current git repository state will be used'))
parser_rpmbuild.add_argument('-b', '--build', action='store', choices=['b', 's', 'a'], default='a', help=_('Build src.rpm (s), rpm (b) or both (a)')) subparser.add_argument('-b', '--build', action='store', choices=['b', 's', 'a'], default='a', help=_('Build src.rpm (s), rpm (b) or both (a)'))
parser_rpmbuild.set_defaults(func=localbuild_rpmbuild) subparser.set_defaults(func=localbuild_rpmbuild)
# publish # publish
parser_publish = subparsers.add_parser('publish', help=_('Publish the task that have already been built.')) subparser = subparsers.add_parser('publish', help=_('Publish the task that have already been built.'))
parser_publish.add_argument('task_ids', action='store', nargs="+", help=_('The IDs of tasks to publish.')) subparser.add_argument('task_ids', action='store', nargs="+", help=_('The IDs of tasks to publish.'))
parser_publish.set_defaults(func=publish) subparser.set_defaults(func=publish)
# copy # copy
parser_copy = subparsers.add_parser('copy', help=_('Copy all the files from SRC_BRANCH to DST_BRANCH')) subparser = subparsers.add_parser('copy', help=_('Copy all the files from SRC_BRANCH to DST_BRANCH'))
parser_copy.add_argument('src_branch', action='store', help=_('source branch')) subparser.add_argument('src_branch', action='store', help=_('source branch'))
parser_copy.add_argument('dst_branch', action='store', nargs='?', help=_('destination branch. If not specified, it\'s assumed to be the current branch')) subparser.add_argument('dst_branch', action='store', nargs='?', help=_('destination branch. If not specified, it\'s assumed to be the current branch'))
parser_copy.add_argument('-p', '--pack', action='store_true', help=_('Create a tar.gz from the src_branch and put this archive and spec file to dst_branch')) subparser.add_argument('-p', '--pack', action='store_true', help=_('Create a tar.gz from the src_branch and put this archive and spec file to dst_branch'))
parser_copy.set_defaults(func=copy) subparser.set_defaults(func=copy)
# pull request # pull request
parser_pull = subparsers.add_parser('pullrequest', help=_('Send a pull request from SRC_BRANCH to DST_BRANCH')) subparser = subparsers.add_parser('pullrequest', help=_('Send a pull request from SRC_BRANCH to DST_BRANCH'))
parser_pull.add_argument('from_ref', action='store', help=_('source ref or branch')) subparser.add_argument('from_ref', action='store', help=_('source ref or branch'))
parser_pull.add_argument('to_ref', action='store', help=_('destination ref or branch')) subparser.add_argument('to_ref', action='store', help=_('destination ref or branch'))
parser_pull.add_argument('title', action='store', help=_('Request title')) subparser.add_argument('title', action='store', help=_('Request title'))
parser_pull.add_argument('body', action='store', help=_('Request body')) subparser.add_argument('body', action='store', help=_('Request body'))
parser_pull.add_argument('-p', '--project', action='store', help=_('Source project name (group/project).')) subparser.add_argument('-p', '--project', action='store', help=_('Source project name (group/project).'))
parser_pull.add_argument('-d', '--dest', action='store', help=_('Destination project name (group/project). If not specified, the source project is used (this can be used to send requests from one project branch to another).')) subparser.add_argument('-d', '--dest', action='store', help=_('Destination project name (group/project). If not specified, the source project is used (this can be used to send requests from one project branch to another).'))
parser_pull.set_defaults(func=pull_request) subparser.set_defaults(func=pull_request)
# fork project # fork project
parser_pull = subparsers.add_parser('fork', help=_('Fork existing project')) subparser = subparsers.add_parser('fork', help=_('Fork existing project'))
parser_pull.add_argument('source_project', action='store', help=_('project to fork (group/project)')) subparser.add_argument('source_project', action='store', help=_('project to fork (group/project)'))
parser_pull.add_argument('target_project', action='store', nargs='?', help=_('target project group and name (group/project)')) subparser.add_argument('target_project', action='store', nargs='?', help=_('target project group and name (group/project)'))
parser_pull.set_defaults(func=fork_project) subparser.set_defaults(func=fork_project)
# alias project # alias project
parser_pull = subparsers.add_parser('alias', help=_('Create alias of existing project')) subparser = subparsers.add_parser('proj_alias', help=_('Create alias of existing project'))
parser_pull.add_argument('source_project', action='store', help=_('project to fork (group/project)')) subparser.add_argument('source_project', action='store', help=_('project to fork (group/project)'))
parser_pull.add_argument('target_project', action='store', nargs='?', help=_('target project group and name (group/project)')) subparser.add_argument('target_project', action='store', help=_('target project group and name (group/project)'))
parser_pull.set_defaults(func=alias_project) subparser.set_defaults(func=alias_project)
# create empty project
subparser = subparsers.add_parser('create_empty', help=_('Create empty project'))
subparser.add_argument('name', action='store', help=_('project name'))
subparser.add_argument('owner', action='store', nargs='?', help=_('who will own the project; default_owner is used by default'))
subparser.add_argument('--description', action='store', help=_('project description'))
subparser.add_argument('--visibility', action='store', choices=['public', 'private'], default='public', help=_('project visibility'))
subparser.set_defaults(func=create_empty)
# create project from SRPM # create project from SRPM
parser_pull = subparsers.add_parser('create', help=_('Create project from SRPM')) subparser = subparsers.add_parser('create', help=_('Create project from SRPM'))
parser_pull.add_argument('srpm', action='store', help=_('srpm file')) subparser.add_argument('srpm', action='store', help=_('srpm file'))
parser_pull.add_argument('owner', action='store', nargs='?', help=_('who will own the project; default_owner is used by default')) subparser.add_argument('owner', action='store', nargs='?', help=_('who will own the project; default_owner is used by default'))
parser_pull.add_argument('-b', '--branch', action='append', help=_('create additional branch; can be set more than once.')) subparser.add_argument('-b', '--branch', action='append', help=_('create additional branch; can be set more than once.'))
parser_pull.add_argument('--no-def-branch', action='store_true', help=_('Do not automatically create branch set as default in user config (if it is set to smth different from "master").')) subparser.add_argument('--no-def-branch', action='store_true', help=_('Do not automatically create branch set as default in user config (if it is set to smth different from "master").'))
parser_pull.set_defaults(func=create) subparser.set_defaults(func=create)
# destroy project
subparser = subparsers.add_parser('destroy', help=_('Destroy project'))
subparser.add_argument('project', action='store', help=_('project name. ([group/]project). If no group specified, '
'it\'s assumed to be your default group.'))
subparser.set_defaults(func=destroy)
# add project to repository # add project to repository
parser_pull = subparsers.add_parser('add', help=_('Add project to specified repository')) subparser = subparsers.add_parser('add', help=_('Add project to specified repository'))
parser_pull.add_argument('repository', action='store', help=_('target repository ([platform/]repository)')) subparser.add_argument('repository', action='store', help=_('target repository ([platform/]repository)'))
parser_pull.add_argument('-p', '--project', action='store', help=_('project name (group/project).')) subparser.add_argument('-p', '--project', action='store', help=_('project name (group/project).'))
parser_pull.set_defaults(func=add_project_to_repository) subparser.set_defaults(func=add_project_to_repository)
# remove project from repository # remove project from repository
parser_pull = subparsers.add_parser('remove', help=_('Remove project from specified repository')) subparser = subparsers.add_parser('remove', help=_('Remove project from specified repository'))
parser_pull.add_argument('repository', action='store', help=_('target repository ([platform/]repository)')) subparser.add_argument('repository', action='store', help=_('target repository ([platform/]repository)'))
parser_pull.add_argument('-p', '--project', action='store', help=_('project name (group/project).')) subparser.add_argument('-p', '--project', action='store', help=_('project name (group/project).'))
parser_pull.set_defaults(func=remove_project_from_repository) subparser.set_defaults(func=remove_project_from_repository)
# status # status
parser_status = subparsers.add_parser('status', help=_('get a build-task status'), epilog=_('If a project specified ' subparser = subparsers.add_parser('status', help=_('get a build-task status'), epilog=_('If a project specified '
' or you are in a git repository - try to get the IDs from the last build task sent for this project. If you are not' ' or you are in a git repository - try to get the IDs from the last build task sent for this project. If you are not'
' in a git repository directory and project is not specified - try to get build IDs from the last build you\'ve done ' ' in a git repository directory and project is not specified - try to get build IDs from the last build you\'ve done '
'with console client.')) 'with console client.'))
parser_status.add_argument('ID', action='store', nargs='*', help=_('build list ID')) subparser.add_argument('ID', action='store', nargs='*', help=_('build list ID'))
parser_status.add_argument('-p', '--project', action='store', help=_('Project. If last IDs for this project can be found - use them')) subparser.add_argument('-p', '--project', action='store', help=_('Project. If last IDs for this project can be found - use them'))
parser_status.add_argument('-s', '--short', action='store_true', help=_('Show one-line information including id, project, ' subparser.add_argument('-s', '--short', action='store_true', help=_('Show one-line information including id, project, '
'arch and status')) 'arch and status'))
parser_status.set_defaults(func=status) subparser.set_defaults(func=status)
# clean # clean
parser_clean = subparsers.add_parser('clean', help=_('Analyze spec file and show missing and unnecessary files from ' subparser = subparsers.add_parser('clean', help=_('Analyze spec file and show missing and unnecessary files from '
'the current git repository directory.')) 'the current git repository directory.'))
parser_clean.add_argument('--auto-remove', action='store_true', help=_('automatically remove all the unnecessary files')) subparser.add_argument('--auto-remove', action='store_true', help=_('automatically remove all the unnecessary files'))
parser_clean.set_defaults(func=clean) subparser.set_defaults(func=clean)
# search # search
parser_search = subparsers.add_parser('search', help=_('Search for something on ABF.'), epilog=_('NOTE: only first 100 results of any request will be shown')) subparser = subparsers.add_parser('search', help=_('Search for something on ABF.'), epilog=_('NOTE: only first 100 results of any request will be shown'))
search_choices = ['users', 'groups', 'platforms', 'projects'] search_choices = ['users', 'groups', 'platforms', 'projects']
parser_search.add_argument('type', action='store', choices=search_choices, help=_('what to search for')) subparser.add_argument('type', action='store', choices=search_choices, help=_('what to search for'))
parser_search.add_argument('query', action='store', help=_('a string to search for')) subparser.add_argument('query', action='store', help=_('a string to search for'))
parser_search.set_defaults(func=search) subparser.set_defaults(func=search)
#list #list
# info # info
parser_info = subparsers.add_parser('info', help=_('get information about single instance')) subparser = subparsers.add_parser('info', help=_('get information about single instance'))
info_choices = ['platforms', 'repositories', 'projects'] info_choices = ['platforms', 'repositories', 'projects']
parser_info.add_argument('type', action='store', choices=info_choices, help=_('type of the instance')) subparser.add_argument('type', action='store', choices=info_choices, help=_('type of the instance'))
parser_info.add_argument('-f', '--filter', action='store', help=_('The filter may be specified by defining multiple pairs <type>.<attribute>=<value> or <attribute>=<value>, where <type> is one of the following positional arguments: %s, <attribute> is the one of the instance fields or special attribute (page - using for pagination) and <value> - string, that can take asterisk (*) or anything else... Example: abf info projects -f platforms.name=rosa2012lts page=*') % info_choices, nargs='*') subparser.add_argument('-f', '--filter', action='store', help=_('The filter may be specified by defining multiple pairs <type>.<attribute>=<value> or <attribute>=<value>, where <type> is one of the following positional arguments: %s, <attribute> is the one of the instance fields or special attribute (page - using for pagination) and <value> - string, that can take asterisk (*) or anything else... Example: abf info projects -f platforms.name=rosa2012lts page=*') % info_choices, nargs='*')
parser_info.add_argument('-o', '--output', action='store', help=_('output format '), nargs='*') subparser.add_argument('-o', '--output', action='store', help=_('output format '), nargs='*')
parser_info.set_defaults(func=info_single) subparser.set_defaults(func=info_single)
# test # test
parser_test = subparsers.add_parser('test', help=_('Execute a set of internal datamodel tests')) subparser = subparsers.add_parser('test', help=_('Execute a set of internal datamodel tests'))
parser_test.set_defaults(func=test) subparser.set_defaults(func=test)
for s in subparsers._name_parser_map: for s in subparsers._name_parser_map:
subparsers._name_parser_map[s].add_argument('-v', '--verbose', action='store_true', help=_('be verbose, display even debug messages')) subparsers._name_parser_map[s].add_argument('-v', '--verbose', action='store_true', help=_('be verbose, display even debug messages'))
@ -581,10 +610,13 @@ def localbuild_rpmbuild():
if os.path.exists(src_dir): if os.path.exists(src_dir):
shutil.rmtree(src_dir) shutil.rmtree(src_dir)
src = get_root_git_dir() src = get_root_git_dir()
if os.path.isfile(".abf.yml"):
cmd = ['abf', 'fetch'] cmd = ['abf', 'fetch']
if command_line.verbose: if command_line.verbose:
cmd.append('-v') cmd.append('-v')
execute_command(cmd, print_to_stdout=True, exit_on_error=True) execute_command(cmd, print_to_stdout=True, exit_on_error=True)
shutil.copytree(src, src_dir, symlinks=True) shutil.copytree(src, src_dir, symlinks=True)
spec_path = find_spec(src_dir) spec_path = find_spec(src_dir)
@ -747,6 +779,13 @@ def get():
if 'projects_cfg' in globals(): if 'projects_cfg' in globals():
projects_cfg[proj]['location'] = os.path.join(os.getcwd(), project_name) projects_cfg[proj]['location'] = os.path.join(os.getcwd(), project_name)
def destroy():
log.debug(_('DESTROY started'))
proj = get_project(models, must_exist=True, name=command_line.project)
ProjectCreator.destroy_project(models, proj.id)
def put(): def put():
log.debug(_('PUT started')) log.debug(_('PUT started'))
@ -771,6 +810,14 @@ def put():
if not command_line.message: if not command_line.message:
return return
if not command_line.add_folders:
files = [f for f in os.listdir('.') if os.path.isfile(f)]
for f in files:
if not is_text_file(f) and not command_line.add_binaries:
continue
cmd = ['git', 'add', f]
execute_command(cmd, print_to_stdout=True, exit_on_error=True)
else:
cmd = ['git', 'add', '--all'] cmd = ['git', 'add', '--all']
execute_command(cmd, print_to_stdout=True, exit_on_error=True) execute_command(cmd, print_to_stdout=True, exit_on_error=True)
@ -965,6 +1012,32 @@ def alias_project():
ProjectCreator.alias_project(models, source_proj.id, owner_id, target_name) ProjectCreator.alias_project(models, source_proj.id, owner_id, target_name)
def create_empty():
log.debug(_('CREATE EMPTY PROJECT started'))
if not command_line.owner:
command_line.owner = default_group
owner_group = Group.search(models, command_line.owner)
owner_user = User.search(models, command_line.owner)
if owner_group:
owner_id = owner_group[0].id
owner_type = "Group"
elif owner_user:
owner_id = owner_user[0].id
owner_type = "User"
else:
print(_("Incorrect owner data"))
return 1
description = ""
if command_line.description:
description = command_line.description
ProjectCreator.new_project(models, command_line.name, description, owner_id, owner_type, command_line.visibility)
def create(): def create():
log.debug(_('CREATE PROJECT started')) log.debug(_('CREATE PROJECT started'))
@ -1010,6 +1083,11 @@ def create():
os.system("git checkout -b " + default_branch); os.system("git checkout -b " + default_branch);
os.system("git push origin " + default_branch); os.system("git push origin " + default_branch);
# Supress output and errors for now, since only admins can set maintainers
set_maintainer = Popen(['abf', 'update', '--maintainer', login], stdout=PIPE, stderr=PIPE)
out, err = set_maintainer.communicate()
# os.system("abf update --maintainer " + login)
# Go back to initial dir and delete temp folder # Go back to initial dir and delete temp folder
os.chdir(curdir) os.chdir(curdir)
shutil.rmtree(tempdir) shutil.rmtree(tempdir)
@ -1168,7 +1246,7 @@ def build(return_ids=False):
return (None, None, None) return (None, None, None)
for repo in proj.repositories: for repo in proj.repositories:
if repo.platform.name == as_branch or (as_branch == 'master' and repo.platform.name == 'cooker'): if repo.platform.name == as_branch or (as_branch == 'master' and repo.platform.name == 'cooker') or (as_branch == 'rosa2014.1' and repo.platform.name == 'current'):
as_saveto = repo as_saveto = repo
if not as_saveto: if not as_saveto:
log.info(_('Could not resolve a platform to save to from the branch name "%s".') % as_branch) log.info(_('Could not resolve a platform to save to from the branch name "%s".') % as_branch)
@ -1347,6 +1425,9 @@ def build(return_ids=False):
else: else:
use_extra_tests = False use_extra_tests = False
if not command_line.auto_publish and not command_line.auto_publish_status:
command_line.auto_publish_status = default_publish_status
if command_line.auto_publish and not command_line.auto_publish_status: if command_line.auto_publish and not command_line.auto_publish_status:
command_line.auto_publish_status = 'default' command_line.auto_publish_status = 'default'
@ -1371,7 +1452,9 @@ def build(return_ids=False):
auto_create_container, auto_create_container,
command_line.testing, command_line.testing,
use_extra_tests, use_extra_tests,
extra_build_lists extra_build_lists,
# TODO: Read external_nodes config value from user's profile
command_line.external_nodes or BuildList.external_nodes_vals[0]
) )
ids = ','.join([str(i) for i in build_ids]) ids = ','.join([str(i) for i in build_ids])
if 'projects_cfg' in globals(): if 'projects_cfg' in globals():

View file

@ -385,6 +385,10 @@ class AbfJson(object):
URL = "/api/v1/projects/%d/alias.json" % proj_id URL = "/api/v1/projects/%d/alias.json" % proj_id
return self.get_url_contents(URL, GET=None, POST=data) return self.get_url_contents(URL, GET=None, POST=data)
def destroy_project(self, data, proj_id):
URL = "/api/v1/projects/%d.json" % proj_id
return self.get_url_contents(URL, GET=None, POST=None, DELETE=data)
def add_project_to_repo(self, data, repo_id): def add_project_to_repo(self, data, repo_id):
URL = "/api/v1/repositories/%d/add_project.json" % repo_id URL = "/api/v1/repositories/%d/add_project.json" % repo_id
return self.get_url_contents(URL, GET=None, POST=None, PUT=data) return self.get_url_contents(URL, GET=None, POST=None, PUT=data)

View file

@ -77,7 +77,7 @@ class Section(dict):
try: try:
res = self.config.get(self.section, key) res = self.config.get(self.section, key)
except ConfigParser.NoOptionError, ex: except ConfigParser.NoOptionError, ex:
if key == 'default_branch': if key in ['default_branch', 'default_publish_status']:
print(_('non-critical error in config "%(path)s": %(exception)s') % {'path': self.conf_path, 'exception': str(ex)}) print(_('non-critical error in config "%(path)s": %(exception)s') % {'path': self.conf_path, 'exception': str(ex)})
return '' return ''
else: else:
@ -198,6 +198,11 @@ class Config(dict):
filestore_domain = self.ask_user_url('File-store URL [%s]: ' % Config.default_filestore_url, Config.default_filestore_url) filestore_domain = self.ask_user_url('File-store URL [%s]: ' % Config.default_filestore_url, Config.default_filestore_url)
self['main']['file_store_url'] = filestore_domain self['main']['file_store_url'] = filestore_domain
if 'default_publish_status' not in self['main']:
def_status = 'default'
res = ask_user('Default publishing status for new builds [%s]: ' % def_status, can_be_empty=True)
self['main']['default_publish_status'] = res or def_status
#configure logging #configure logging
self['formatters']['keys'] = 'verbose,simple' self['formatters']['keys'] = 'verbose,simple'
self['formatter_verbose']['format'] = '%(asctime)s %(levelname)-7s in %(filename)s:%(funcName)s:%(lineno)d: %(message)s' self['formatter_verbose']['format'] = '%(asctime)s %(levelname)-7s in %(filename)s:%(funcName)s:%(lineno)d: %(message)s'

View file

@ -558,6 +558,7 @@ class BuildList(Model):
self.arch.name, self.status_string) self.arch.name, self.status_string)
update_types = ['security', 'bugfix', 'enhancement', 'recommended', 'newpackage'] update_types = ['security', 'bugfix', 'enhancement', 'recommended', 'newpackage']
external_nodes_vals = ['none', 'everything', 'owned']
auto_publish_statuses = ['default', 'none', 'testing'] auto_publish_statuses = ['default', 'none', 'testing']
@staticmethod @staticmethod
def new_build_task(models, def new_build_task(models,
@ -574,7 +575,9 @@ class BuildList(Model):
auto_create_container, auto_create_container,
include_testing_subrepo, include_testing_subrepo,
use_extra_tests, use_extra_tests,
extra_build_lists): extra_build_lists,
external_nodes):
if external_nodes == 'none':
DATA = { DATA = {
'project_id': project.id, 'project_id': project.id,
'commit_hash': commit_hash, 'commit_hash': commit_hash,
@ -593,6 +596,27 @@ class BuildList(Model):
'include_testing_subrepository': include_testing_subrepo, 'include_testing_subrepository': include_testing_subrepo,
'use_extra_tests': use_extra_tests 'use_extra_tests': use_extra_tests
} }
else:
DATA = {
'project_id': project.id,
'commit_hash': commit_hash,
'update_type': update_type,
'save_to_repository_id': save_to_repository.id,
'build_for_platform_id': None,
'auto_publish_status': auto_publish_status,
'project_version': project_version,
'auto_create_container': auto_create_container,
'use_cached_chroot': cached_chroot,
'save_buildroot': save_chroot,
'arch_id': None,
'include_repos': [],
'extra_repositories': [],
'extra_build_lists': extra_build_lists,
'include_testing_subrepository': include_testing_subrepo,
'use_extra_tests': use_extra_tests,
'external_nodes': external_nodes
}
build_platforms = {} build_platforms = {}
if not skip_personal and string.find(save_to_repository.platform.name,"_personal") > 0: if not skip_personal and string.find(save_to_repository.platform.name,"_personal") > 0:
@ -681,12 +705,17 @@ class ProjectCreator(Model):
return '%s (%s)' % (self.name, self.owner) return '%s (%s)' % (self.name, self.owner)
@staticmethod @staticmethod
def new_project(models, name, description, owner_id, owner_type): def new_project(models, name, description, owner_id, owner_type, visibility='public'):
# WebUI and API use different terms for visibility: Public/Private vs Open/Hidden
if visibility == "public":
vis = "open"
else:
vis = "hidden"
DATA = { DATA = {
'name': name, 'name': name,
'owner_id': owner_id, 'owner_id': owner_id,
'owner_type': owner_type, 'owner_type': owner_type,
'visibility': 'open', 'visibility': vis,
'description': description, 'description': description,
'is_package': 'true', 'is_package': 'true',
'default_branch': 'master', 'default_branch': 'master',
@ -772,13 +801,28 @@ class ProjectCreator(Model):
log.debug(_('Creating alias for a project: ') + str(DATA)) log.debug(_('Creating alias for a project: ') + str(DATA))
try: try:
result = models.jsn.fork_project(DATA, proj_id) result = models.jsn.alias_project(DATA, proj_id)
except BadRequestError, ex: except BadRequestError, ex:
log.error(_('Sorry, but something went wrong and request I\'ve sent to ABF is bad. Please, ' log.error(_('Sorry, but something went wrong and request I\'ve sent to ABF is bad. Please, '
'notify the console-client developers. Send them a set of command-line arguments and the request data:\n%s') % DATA ) 'notify the console-client developers. Send them a set of command-line arguments and the request data:\n%s') % DATA )
exit(1) exit(1)
log.info(_("The project alias has been created.")) log.info(_("The project alias has been created."))
@staticmethod
def destroy_project(models, proj_id):
DATA = {
'id': proj_id,
}
log.debug(_('Destroying project: ') + str(proj_id))
try:
result = models.jsn.destroy_project(DATA, proj_id)
except BadRequestError, ex:
log.error(_('Sorry, but something went wrong and request I\'ve sent to ABF is bad. Please, '
'notify the console-client developers. Send them a set of command-line arguments and the request data:\n%s') % DATA )
exit(1)
log.info(_("The project has been destroyed."))
class Models(object): class Models(object):
_instance = {} _instance = {}
def __new__(cls, abf_url, file_store_url, login, password, *args, **kwargs): def __new__(cls, abf_url, file_store_url, login, password, *args, **kwargs):

View file

@ -69,8 +69,9 @@ __abf_rpmbuild()
__abf_build() __abf_build()
{ {
__abf_opts "--branch --build-list --tag --commit --target-platform --arch --repository --save-to-repository --auto-publish-status --auto-publish --update-type --skip-spec-check --auto-create-container --no-extra-tests --cached-chroot --save-chroot --testing" __abf_opts "--branch --build-list --tag --commit --target-platform --arch --repository --save-to-repository --auto-publish-status --auto-publish --update-type --skip-spec-check --auto-create-container --no-extra-tests --cached-chroot --save-chroot --testing --external-nodes"
update_types="security bugfix enhancement recommended newpackage" update_types="security bugfix enhancement recommended newpackage"
external_nodes_vals="owned everything"
auto_publish_status="none default testing" auto_publish_status="none default testing"
if [ ${prev} == -r ] || [ ${prev} == --repository ] ; then if [ ${prev} == -r ] || [ ${prev} == --repository ] ; then
COMPREPLY=( $(compgen -W "`abf show build-repos`" -- "${cur}") ) COMPREPLY=( $(compgen -W "`abf show build-repos`" -- "${cur}") )
@ -101,6 +102,11 @@ __abf_build()
return 0 return 0
fi fi
if [ ${prev} == --external-nodes ] ; then
COMPREPLY=( $(compgen -W "${external_nodes_vals}" -- "${cur}") )
return 0
fi
if [ ${prev} == --auto-publish-status ] ; then if [ ${prev} == --auto-publish-status ] ; then
COMPREPLY=( $(compgen -W "${auto_publish_status}" -- "${cur}") ) COMPREPLY=( $(compgen -W "${auto_publish_status}" -- "${cur}") )
return 0 return 0
@ -199,7 +205,7 @@ __abf_alias()
__abf() __abf()
{ {
local opts modes local opts modes
modes="help get put show build chain_build publish status locate search test fetch mock-urpm rpmbuild clean copy create store alias add remove fork" modes="help get put show build chain_build publish status locate search test fetch mock-urpm rpmbuild clean copy create store alias add remove fork destroy pullrequest info"
COMPREPLY=() COMPREPLY=()
mode="${COMP_WORDS[1]}" mode="${COMP_WORDS[1]}"
prev="${COMP_WORDS[COMP_CWORD-1]}" prev="${COMP_WORDS[COMP_CWORD-1]}"

File diff suppressed because it is too large Load diff

649
po/ru.po

File diff suppressed because it is too large Load diff