########
Packages
########

Packages allow you to utilize GitLab as a private repository for a variety
of common package managers, as well as GitLab's generic package registry.

Project Packages
=====================

Reference
---------

* v4 API:

  + :class:`gitlab.v4.objects.ProjectPackage`
  + :class:`gitlab.v4.objects.ProjectPackageManager`
  + :attr:`gitlab.v4.objects.Project.packages`

* GitLab API: https://docs.gitlab.com/api/packages#within-a-project

Examples
--------

List the packages in a project::

    packages = project.packages.list(get_all=True)

Filter the results by ``package_type`` or ``package_name`` ::

    packages = project.packages.list(package_type='pypi', get_all=True)

Get a specific package of a project by id::

    package = project.packages.get(1)

Delete a package from a project::

    package.delete()
    # or
    project.packages.delete(package.id)


Group Packages
===================

Reference
---------

* v4 API:

  + :class:`gitlab.v4.objects.GroupPackage`
  + :class:`gitlab.v4.objects.GroupPackageManager`
  + :attr:`gitlab.v4.objects.Group.packages`

* GitLab API: https://docs.gitlab.com/api/packages#within-a-group

Examples
--------

List the packages in a group::

    packages = group.packages.list(get_all=True)

Filter the results by ``package_type`` or ``package_name`` ::

    packages = group.packages.list(package_type='pypi', get_all=True)


Project Package Files
=====================

Reference
---------

* v4 API:

  + :class:`gitlab.v4.objects.ProjectPackageFile`
  + :class:`gitlab.v4.objects.ProjectPackageFileManager`
  + :attr:`gitlab.v4.objects.ProjectPackage.package_files`

* GitLab API: https://docs.gitlab.com/api/packages#list-package-files

Examples
--------

List package files for package in project::

    package = project.packages.get(1)
    package_files = package.package_files.list(get_all=True)

Delete a package file in a project::

    package = project.packages.get(1)
    file = package.package_files.list(get_all=False)[0]
    file.delete()

Project Package Pipelines
=========================

Reference
---------

* v4 API:

  + :class:`gitlab.v4.objects.ProjectPackagePipeline`
  + :class:`gitlab.v4.objects.ProjectPackagePipelineManager`
  + :attr:`gitlab.v4.objects.ProjectPackage.pipelines`

* GitLab API: https://docs.gitlab.com/api/packages#list-package-pipelines

Examples
--------

List package pipelines for package in project::

    package = project.packages.get(1)
    package_pipelines = package.pipelines.list(get_all=True)

Generic Packages
================

You can use python-gitlab to upload and download generic packages.

Reference
---------

* v4 API:

  + :class:`gitlab.v4.objects.GenericPackage`
  + :class:`gitlab.v4.objects.GenericPackageManager`
  + :attr:`gitlab.v4.objects.Project.generic_packages`

* GitLab API: https://docs.gitlab.com/user/packages/generic_packages

Examples
--------

Upload a generic package to a project::

    project = gl.projects.get(1, lazy=True)
    package = project.generic_packages.upload(
        package_name="hello-world",
        package_version="v1.0.0",
        file_name="hello.tar.gz",
        path="/path/to/local/hello.tar.gz"
    )

Download a project's generic package::

    project = gl.projects.get(1, lazy=True)
    package = project.generic_packages.download(
        package_name="hello-world",
        package_version="v1.0.0",
        file_name="hello.tar.gz",
    )

.. hint:: You can use the Packages API described above to find packages and
    retrieve the metadata you need download them.
