If you are a package maintainer you will need to request sftp upload privileges to the Cygwin distro. This page documents how to request the privileges and upload packages to cygwin.com.

Requesting upload privileges

Send your public ssh key to the cygwin-apps using this format:
    Subject: SSH key for upload access

    Name: Your Name
    Package: The name of one (and only one) of the packages that you are responsible for
    ---- BEGIN SSH2 PUBLIC KEY ----
       encoded public ssh key here
    ---- END SSH2 PUBLIC KEY ----
When specifying your name, use your exact name as shown at http://cygwin.com/cygwin-pkg-maint.
Specifying one package provides you with the ability to upload any of your packages from http://cygwin.com/cygwin-pkg-maint.

The SSH key above should be generated from one of your public keys, e.g.:

    ssh-keygen -e -f ~/.ssh/id_rsa.pub

The format of this email is not optional. It is read by a program so please do not deviate from the above. In particular, don't indent, don't add multiple packages, and do use your name as recorded in http://cygwin.com/cygwin-pkg-maint.

Note: Send email in this format if you need to update your ssh key.

Requests are handled manually and are acknowledged publicly in response to email to the cygwin-apps mailing list.

Uploading Files to cygwin.com

Once the ssh key has been installed you'll have limited sftp access to cygwin.com where you will be able to upload packages. An upload directory on cygwin.com will look like this:
    Your Name                   # Directory is currently your full name (you won't actually see this)
        !packages               # read-only file containing valid packages
        x86        x86_64       # arch-specific dir
        release    release      # release dir
          pkg                   # package directory
           pkg-debuginfo        # package subdirectories

When connecting, make sure that you use the user cygwin with no password and that you are using the same ssh key as the one that you specified previously.

Example using lftp to upload packages:

    % lftp sftp://cygwin@cygwin.com
    cd ok, cwd=/                                    

    lftp cygwin.com:/> ls
    -rw-rw-r--   1 root     cygstage      179 Sep  1 05:12 !packages
    drwxrwsr-x   4 root     cygstage     4096 Sep  1 05:16 .
    drwxrwxr-x  61 cygwin   root         4096 Sep  1 05:12 ..
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 19:35 x86
    drwxrwsr-x   3 cygwin   cygstage     4096 Aug 10 19:04 x86_64

    lftp cygwin.com:/> cd x86/release
    cd ok, cwd=/x86/release                     

    lftp cygwin.com:/x86/release> ls
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 18:28 .
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 19:35 ..
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 19:36 grep

    lftp cygwin.com:/x86/release> mirror -eR grep
    Total: 2 directories, 3 files, 0 symlinks                                                  
    New: 3 files, 0 symlinks
    2311396 bytes transferred in 14 seconds (166.2K/s)

    lftp cygwin.com:/x86/release> ls grep
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 19:47 .
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 18:28 ..
    -rw-r--r--   1 cygwin   cygstage  1204708 Oct 12 19:46 grep-2.14-3-src.tar.xz
    -rw-r--r--   1 cygwin   cygstage   229284 Oct 12 19:47 grep-2.14-3.tar.xz
    drwxrwsr-x   2 cygwin   cygstage     4096 Oct 12 19:47 grep-debuginfo

    lftp cygwin.com:/x86/release> ls grep/grep-debuginfo
    drwxrwsr-x   2 cygwin   cygstage     4096 Oct 12 19:47 . 
    drwxrwsr-x   3 cygwin   cygstage     4096 Oct 12 19:47 ..
    -rw-r--r--   1 cygwin   cygstage   877404 Oct 12 19:47 grep-debuginfo-2.14-3.tar.xz

    lftp cygwin.com:/x86/release> put /dev/null -o !ready

The package directories should exactly mirror what is currently in the release directory. So, it should be a hierarchy containing .tar.xz files and (potentially) setup.hint files.

The !ready file is used to tell upset (the script which creates setup.ini) that any files older than this file in or under the given directory should be processed. The intent is that you create !ready when you have finished uploading everything that you plan on uploading.

Note: !ready files need to be created at least once for each architecture that is uploaded, i.e., in each of the x86 and x86_64 directories or in the package directories themselves.

upset will periodically scan the upload directories for packages that are ready, and, if there are no errors, move the packages into the real release area. New directories in the release area will be created as needed. If there are errors then setup.ini will not be updated and the release area will remain pristine.

Note: The upload area is only for new files intended for the Cygwin release. There is no reason to put older files (such as unchanged setup.hints) in the upload directories since they already exist in the main release.

Although not shown above, you can also create a !mail (or !email) file which contains a list of email address (one per line) where any upset errors should be sent. If that isn't specified then you won't get email when upset finds issues with what was uploaded. Currently, this is not a "per-directory" thing since upset parsing doesn't work that way so, if you add a !email file you will get all errors from upset - not just ones associated to your uploaded packages. It doesn't matter where you create this file but it makes sense to put it at the root of your upload directory.

Example lftp upload command line

    From: Christopher Faylor
    To: cygwin-apps
    Subject: Re: The upload system is live (Re: Major changes coming to
            procedure for uploading to sourceware)
    Date: Thu, 17 Oct 2013 00:30:00 -0400
    
    I just used this command line to upload the time packages:
    
    cd wherever
    lftp -c 'connect sftp://cygwin@cygwin.com/; cd x86/release; mirror -eR time; put /dev/null -o !ready'
    
    FYI.
    
    cgf

Removing files from the Cygwin distribution

To cause files to be removed from the distribution, upload an empty file with the name of the file that you want deleted, prefixed with a "-".

For example, if you want to delete the file foo-1.2-1.tar.xz then upload an empty file named:

 -foo-1.2-1.tar.xz

Wildcards: "*" and "?" are supported. So,

 -foo-1.2-1*
will cause both the binary and src package files to be removed.

Note that files are not actually deleted; they are moved to a vault where they will be removed after some indeterminate amount of time.

This technique should work with directories but some confusion may arise if you delete a directory, recreate it, and attempt to remove it again. This scenario has not been tested.

Frequently Asked Questions

Q) Why aren't my files being transferred to the release area? I've waited several days and don't see any movement.

A) The package updater runs every hour at 10 minutes past the hour so, if you don't see any movement at, e.g., 20 minutes past the next hour, then your package is not going to be updated.

The main reason that this could happen is if you uploaded a package that you are not actually responsible for. The updater only knows what you are responsible for based on http://cygwin.com/cygwin-pkg-maint so if you aren't listed as an owner there your packages won't be updated.

Q) Why can't I login via sftp?

A) There are two likely reasons for login failures:

  1. You're not using the ssh key provided when you set up your account.
  2. You are not logging in as the cygwin user. You need to login as user cygwin with no password.