{
    "mode": "man",
    "parameter": "salsa",
    "section": "1",
    "url": "https://www.chedong.com/phpMan.php/man/salsa/1/json",
    "generated": "2026-06-10T16:16:06Z",
    "synopsis": "# salsa <command> <args>\nsalsa whoami\nsalsa searchproject devscripts\nsalsa searchproject qa/qa\nsalsa searchgroup js-team\nsalsa searchgroup perl-team/modules\nsalsa searchuser yadd\nsalsa pushrepo . --group js-team --kgb --irc devscripts --tagpending\nsalsa updaterepo node-mongodb --group js-team --disable-kgb --desc \\\n--desc-pattern \"Package %p\"\nsalsa updaterepo js-team/node-mongodb --kgb --irc debian-js\nsalsa updatesafe --all --desc --desc-pattern \"Debian package %p\" \\\n--group js-team\nsalsa checkout node-mongodb --group js-team\nsalsa checkout js-team/node-mongodb\nsalsa adduser developer foobar --group-id 2665\nsalsa updateuser maintainer foobar --group js-team\nsalsa deluser foobar --group js-team\nsalsa lastcistatus js-team/nodejs",
    "sections": {
        "NAME": {
            "content": "salsa - tool to manipulate salsa repositories and group members\n",
            "subsections": []
        },
        "SYNOPSIS": {
            "content": "# salsa <command> <args>\nsalsa whoami\nsalsa searchproject devscripts\nsalsa searchproject qa/qa\nsalsa searchgroup js-team\nsalsa searchgroup perl-team/modules\nsalsa searchuser yadd\nsalsa pushrepo . --group js-team --kgb --irc devscripts --tagpending\nsalsa updaterepo node-mongodb --group js-team --disable-kgb --desc \\\n--desc-pattern \"Package %p\"\nsalsa updaterepo js-team/node-mongodb --kgb --irc debian-js\nsalsa updatesafe --all --desc --desc-pattern \"Debian package %p\" \\\n--group js-team\nsalsa checkout node-mongodb --group js-team\nsalsa checkout js-team/node-mongodb\nsalsa adduser developer foobar --group-id 2665\nsalsa updateuser maintainer foobar --group js-team\nsalsa deluser foobar --group js-team\nsalsa lastcistatus js-team/nodejs\n",
            "subsections": []
        },
        "DESCRIPTION": {
            "content": "salsa is a designed to create and configure repositories on <https://salsa.debian.org> and\nmanage users of groups.\n\nA Salsa token is required, except for search* commands, and must be set in command line (see\nbelow), or in your configuration file (~/.devscripts):\n\nSALSATOKEN=abcdefghi\n\nor\n\nSALSATOKEN=`cat ~/.token`\n\nor\n\nSALSATOKENFILE=~/.dpt.conf\n\nIf you choose to link another file using SALSATOKENFILE, it must contain a line with one of\n(no differences):\n\n<anything>SALSAPRIVATETOKEN=xxxx\n<anything>SALSATOKEN=xxxx\n\nThis allows for example to use dpt(1) configuration file (~/.dpt.conf) which contains:\n\nDPTSALSAPRIVATETOKEN=abcdefghi\n",
            "subsections": []
        },
        "COMMANDS": {
            "content": "",
            "subsections": [
                {
                    "name": "Managing users and groups",
                    "content": ""
                },
                {
                    "name": "join",
                    "content": "Request access to a group.\n\nsalsa join js-team\nsalsa join --group js-team\nsalsa join --group-id 1234\n\nadduser\nAdd a user to a group.\n\nsalsa --group js-group adduser guest foouser\nsalsa --group-id 1234 adduser guest foouser\nsalsa --group-id 1234 adduser maintainer 1245\n\nFirst argument is the GitLab's access levels: guest, reporter, developer, maintainer,\nowner.\n\ndeluser\nRemove a user from a group\n\nsalsa --group js-team deluser foouser\nsalsa --group-id=1234 deluser foouser\n\nlistgroups\nList sub groups of current one if group is set, groups of current user else.\n"
                },
                {
                    "name": "group",
                    "content": "Show group members.\n\nsalsa --group js-team group\nsalsa --group-id 1234 group\n\nsearchgroup\nSearch for a group using given string. Shows group id and other information.\n\nsalsa searchgroup perl-team\nsalsa searchgroup perl-team/modules\nsalsa searchgroup 2666\n\nsearchuser\nSearch for a user using given string. Shows user id and other information.\n\nsalsa searchuser yadd\n\nupdateuser\nUpdate user role in a group.\n\nsalsa --group-id 1234 updateuser guest foouser\nsalsa --group js-team updateuser maintainer 1245\n\nFirst argument is the GitLab's access levels: guest, reporter, developer, maintainer,\nowner.\n"
                },
                {
                    "name": "whoami",
                    "content": "Gives information on the token owner\n\nsalsa whoami\n"
                },
                {
                    "name": "Managing repositories",
                    "content": "One of \"--group\", \"--group-id\", \"--user\" or \"--user-id\" is required to manage repositories.\nIf both are set, salsa warns and only \"--user\"/\"--user-id\" is used. If none is given, salsa\nuses current user id (token owner).\n\ncheckrepo\nVerify that repo(s) are well configured. It works exactly like updaterepo except that it\ndoes not modify anything but just lists projects not well configured with found errors.\n\nsalsa --user yadd --tagpending --kgb --irc=devscripts checkrepo test\nsalsa --group js-team checkrepo --all\nsalsa --group js-team --rename-head checkrepo test1 test2 test3\n\ncheckout or co\nClone repo in current dir. If directory already exists, update local repo.\n\nsalsa --user yadd co devscripts\nsalsa --group js-team co node-mongodb\nsalsa co js-team/node-mongodb\n\nYou can clone more than one repository or all repositories of a group or a user:\n\nsalsa --user yadd co devscripts autodep8\nsalsa co yadd/devscripts js-team/npm\nsalsa --group js-team co --all           # All js-team repos\nsalsa co --all                           # All your repos\n\ncreaterepo\nCreate public empty project. If \"--group\"/\"--group-id\" is set, project is created in\ngroup directory, else in user directory.\n\nsalsa --user yadd createrepo test\nsalsa --group js-team --kgb --irc-channel=devscripts createrepo test\n\ndelrepo\nDelete a repository.\n"
                },
                {
                    "name": "fork",
                    "content": "Forks a project in group/user repository and set \"upstream\" to original project. Example:\n\n$ salsa fork js-team/node-mongodb --verbose\n...\nsalsa.pl info: node-mongodb ready in node-mongodb/\n$ cd node-mongodb\n$ git remote --verbose show\norigin          git@salsa.debian.org:me/node-mongodb (fetch)\norigin          git@salsa.debian.org:me/node-mongodb (push)\nupstream        git@salsa.debian.org:js-team/node-mongodb (fetch)\nupstream        git@salsa.debian.org:js-team/node-mongodb (push)\n\nFor a group:\n\nsalsa fork --group js-team user/node-foo\n"
                },
                {
                    "name": "forks",
                    "content": "List forks of project(s).\n\nsalsa forks qa/qa debian/devscripts\n\nProject can be set using full path or using --group/--group-id or --user/--user-id, else\nit is searched in current user namespace.\n"
                },
                {
                    "name": "push",
                    "content": "Push relevant packaging refs to origin Git remote. To be run from packaging working\ndirectory.\n\nsalsa push\n\nIt pushes the following refs to the configured remote for the debian-branch or, falling\nback, to the \"origin\" remote:\n\n\"master\" branch (or whatever is set to debian-branch in gbp.conf)\n\"upstream\" branch (or whatever is set to upstream-branch in gbp.conf)\n\"pristine-tar\" branch\ntags named \"debian/*\" (or whatever is set to debian-tag in gbp.conf)\ntags named \"upstream/*\" (or whatever is set to upstream-tag in gbp.conf)\nall tags, if the package's source format is \"3.0 (native)\"\nls or listrepos\nShows projects owned by user or group. If second argument exists, search only matching\nprojects\n\nsalsa --group js-team listrepos\nsalsa --user yadd listrepos foo*\n\nlastcistatus or ci\nDisplays last continuous integration result. Use --verbose to see URL of pipeline when\nresult isn't success. Unless --no-fail is set, salsa lastcistatus will stop on first\n\"failed\" status.\n\nsalsa --group js-team lastcistatus --all --no-fail\nsalsa --user yadd lastcistatus foo\nsalsa lastcistatus js-team/nodejs\n\nThis commands returns the number of \"failed\" status found. \"success\" entries are\ndisplayed using STDOUT while other are displayed (with details) using STDERR. Then you\ncan easily see only failures using:\n\nsalsa --group js-team lastcistatus --all --no-fail >/dev/null\n\nmergerequest, mr\nCreates a merge request.\n\nSuppose you created a fork using salsa fork, modify some things in a new branch using one\ncommit and want to propose it to original project (branch \"master\"). You just have to\nlaunch this in source directory:\n\nsalsa mr\n\nOther example:\n\nsalsa mr --mr-dst-project debian/foo --mr-dst-branch debian/master\n\nor simply\n\nsalsa mr debian/foo debian/master\n\nNote that unless destination project has been set using command line, salsa mergerequest\nwill search it in the following order:\n\nusing GitLab API: salsa will detect from where this project was forked\nusing \"upstream\" origin\nelse salsa will use source project as destination project\n\nTo force salsa to use source project as destination project, you can use \"same\":\n\nsalsa mr --mr-dst-project same\n# or\nsalsa mr same\n\nNew merge request will be created using last commit title and description.\n\nSee --mr-* options for more.\n\nmergerequests, mrs\nList opened merge requests for project(s)\n\nsalsa mrs qa/qa debian/devscripts\n\nProject can be set using full path or using --group/--group-id or --user/--user-id, else\nit is searched in current user namespace.\n\nprotectbranch\nProtect/unprotect a branch.\n\nSet protection\n#                                    project      branch merge push\nsalsa --group js-team protectbranch node-mongodb master m     d\n\n\"merge\" and \"push\" can be one of:\n\no, owner: owner only\nm, maintainer: o + maintainers allowed\nd, developer: m + developers allowed\nr, reporter: d + reporters allowed\ng, guest: r + guest allowed\nUnprotect\nsalsa --group js-team protectbranch node-mongodb master no\n\nprotectedbranches\nList protected branches\n\nsalsa --group js-team protectedbranches node-mongodb\n\npushrepo\nCreate a new project from a local Debian source directory configured with git.\n\npushrepo executes the following steps:\n\ngets project name using debian/changelog file;\nlaunches git remote add upstream ...;\nlaunches createrepo;\npushes local repo.\n\nExamples:\n\nsalsa --user yadd pushrepo ./test\nsalsa --group js-team --kgb --irc-channel=devscripts pushrepo .\n\nrenamebranch\nRename branch given in --source-branch with name given in --dest-branch.  You can use\n--no-fail and --all options here.\n\nsearch, searchproject, searchrepo\nSearch for a project using given string. Shows name, owner id and other information.\n\nsalsa search devscripts\nsalsa search debian/devscripts\nsalsa search 18475\n\nupdaterepo\nConfigure repo(s) using parameters given to command line.  A repo name has to be given\nunless --all is set. Prefer to use updatesafe.\n\nsalsa --user yadd --tagpending --kgb --irc=devscripts updaterepo test\nsalsa --group js-team updaterepo --all\nsalsa --group js-team --rename-head updaterepo test1 test2 test3\nsalsa updaterepo js-team/node-mongodb --kgb --irc debian-js\n\nBy default when using --all, salsa will fail on first error. If you want to continue, set\n--no-fail. In this case, salsa will display a warning for each project that has fail but\ncontinue with next project. Then to see full errors, set --verbose.\n\nupdatesafe\nLaunch checkrepo and ask before launching updaterepo (unless --yes).\n\nsalsa --user yadd --tagpending --kgb --irc=devscripts updatesafe test\nsalsa --group js-team updatesafe --all\nsalsa --group js-team --rename-head updatesafe test1 test2 test3\nsalsa updatesafe js-team/node-mongodb --kgb --irc debian-js\n"
                },
                {
                    "name": "Other",
                    "content": "purgecache\nEmpty local cache.\n"
                }
            ]
        },
        "OPTIONS": {
            "content": "",
            "subsections": [
                {
                    "name": "General options",
                    "content": ""
                },
                {
                    "name": "-C --chdir",
                    "content": "Change directory before launching command\n\nsalsa -C ~/debian co debian/libapache2-mod-fcgid\n",
                    "flag": "-C",
                    "long": "--chdir"
                },
                {
                    "name": "--cache-file",
                    "content": "File to store cached values. Default to ~/.cache/salsa.json. An empty value disables\ncache.\n\n\".devscripts\" value: SALSACACHEFILE\n",
                    "long": "--cache-file"
                },
                {
                    "name": "--no-cache",
                    "content": "Disable cache usage. Same as --cache-file ''\n\n--conffile, --conf-file\nAdd or replace default configuration files (\"/etc/devscripts.conf\" and \"~/.devscripts\").\nThis can only be used as the first option given on the command-line.\n\nreplace:\nsalsa --conf-file test.conf <command>...\nsalsa --conf-file test.conf --conf-file test2.conf  <command>...\n\nadd:\nsalsa --conf-file +test.conf <command>...\nsalsa --conf-file +test.conf --conf-file +test2.conf  <command>...\n\nIf one --conf-file has no \"+\", default configuration files are ignored.\n\n--no-conf, --noconf\nDon't read any configuration files. This can only be used as the first option given on\nthe command-line.\n",
                    "long": "--no-cache"
                },
                {
                    "name": "--debug",
                    "content": "Enable debugging output\n",
                    "long": "--debug"
                },
                {
                    "name": "--group",
                    "content": "Team to use. Use \"salsa searchgroup name\" to find it.\n\nIf you want to use a subgroup, you have to set its full path:\n\nsalsa --group perl-team/modules/packages checkrepo lemonldap-ng\n\n\".devscripts\" value: SALSAGROUP\n\nBe careful when you use SALSAGROUP in your \".devscripts\" file. Every salsa command will\nbe executed in group space, for example if you want to propose a little change in a\nproject using salsa fork + salsa mr, this \"fork\" will be done in group space unless you\nset a --user/--user-id.  Prefer to use an alias in your \".bashrc\" file. Example:\n\nalias jsteamadmin=\"salsa --group js-team\"\n\nor\n\nalias jsteamadmin=\"salsa --conf-file ~/.js.conf\n\nor to use both .devscripts and .js.conf:\n\nalias jsteamadmin=\"salsa --conf-file +~/.js.conf\n\nthen you can fix SALSAGROUP in \"~/.js.conf\"\n\nTo enable bash completion for your alias, add this in your .bashrc file:\n\ncompletionloader salsa\ncomplete -F salsacompletion jsteamadmin\n",
                    "long": "--group"
                },
                {
                    "name": "--group-id",
                    "content": "Group id to use. Use \"salsa searchgroup name\" to find it.\n\n\".devscripts\" value: SALSAGROUPID\n\nBe careful when you use SALSAGROUPID in your \".devscripts\" file. Every salsa command\nwill be executed in group space, for example if you want to propose a little change in a\nproject using salsa fork + salsa mr, this \"fork\" will be done in group space unless you\nset a --user/--user-id.  Prefer to use an alias in your \".bashrc\" file. Example:\n\nalias jsteamadmin=\"salsa --group-id 2666\"\n\nor\n\nalias jsteamadmin=\"salsa --conf-file ~/.js.conf\n\nthen you can fix SALSAGROUPID in \"~/.js.conf\"\n\n--help: displays this manpage",
                    "long": "--group-id"
                },
                {
                    "name": "-i --info",
                    "content": "Prompt before sensible changes.\n\n\".devscripts\" value: SALSAINFO (yes/no)\n",
                    "flag": "-i",
                    "long": "--info"
                },
                {
                    "name": "--path",
                    "content": "Repo path. Default to group or user path.\n\n\".devscripts\" value: SALSAREPOPATH\n",
                    "long": "--path"
                },
                {
                    "name": "--token",
                    "content": "Token value (see above).\n",
                    "long": "--token"
                },
                {
                    "name": "--token-file",
                    "content": "File to find token (see above).\n",
                    "long": "--token-file"
                },
                {
                    "name": "--user",
                    "content": "Username to use. If neither --group, --group-id, --user or --user-id is set, salsa uses\ncurrent user id (corresponding to salsa private token).\n",
                    "long": "--user"
                },
                {
                    "name": "--user-id",
                    "content": "User id to use. Use \"salsa searchuser name\" to find one. If neither --group, --group-id,\n--user or --user-id is set, salsa uses current user id (corresponding to salsa private\ntoken).\n\n\".devscripts\" value: SALSAUSERID\n",
                    "long": "--user-id"
                },
                {
                    "name": "--verbose",
                    "content": "Enable verbose output.\n",
                    "long": "--verbose"
                },
                {
                    "name": "--yes",
                    "content": "Never ask for consent.\n\n\".devscripts\" value: SALSAYES (yes/no)\n",
                    "long": "--yes"
                },
                {
                    "name": "List/search repo options",
                    "content": ""
                },
                {
                    "name": "--archived --no-archived",
                    "content": "Instead of looking to active projects, list or search in archived projects.  Note that\nyou can't have both archived and unarchived projects in the same request. Default: no (ie\n--no-archived).\n\n\".devscripts\" value: SALSAARCHIVED (yes/no)\n",
                    "long": "--no-archived"
                },
                {
                    "name": "Update/create repo options",
                    "content": ""
                },
                {
                    "name": "--all",
                    "content": "When set, all project of group/user are affected by command.\n\n--skip: ignore project with --all. Example:\nsalsa updaterepo --tagpending --all --skip qa --skip devscripts\n\n\".devscripts\" value: SALSASKIP. To set multiples values, use spaces.  Example\n\nSALSASKIP=qa devscripts\n\n--skip-file: ignore projects in this file (1 project per line)\nsalsa updaterepo --tagpending --all --skip-file ~/.skip\n\n\".devscripts\" value: SALSASKIPFILE\n",
                    "long": "--all"
                },
                {
                    "name": "--ci-config-path",
                    "content": "Configure configuration file path of GitLab CI. Default: empty. Example:\n\nsalsa updatesafe --ci-config-path debian/.gitlab-ci.yml debian/devscripts\n\n\".devscripts\" value: SALSACICONFIGPATH\n",
                    "long": "--ci-config-path"
                },
                {
                    "name": "--desc --no-desc",
                    "content": "Configure repo description using pattern given in desc-pattern\n\n\".devscripts\" value: SALSADESC (yes/no)\n",
                    "long": "--no-desc"
                },
                {
                    "name": "--desc-pattern",
                    "content": "Repo description pattern. Default to \"Debian package %p\". \"%p\" is replaced by repo name,\nwhile \"%P\" is replaced by repo name given in command (may contains full path).\n\n\".devscripts\" value: SALSADESCPATTERN\n\n--email, --no-email, --disable-email\nEnable, ignore or disable email-on-push.\n\n\".devscripts\" value: SALSAEMAIL (yes/ignore/no, default: ignore)\n",
                    "long": "--desc-pattern"
                },
                {
                    "name": "--email-recipient",
                    "content": "Email-on-push recipient. Can be multi valued:\n\n$ salsa updatesafe myrepo \\\n--email-recipient foo@foobar.org \\\n--email-recipient bar@foobar.org\n\nIf recipient value contains \"%p\", it is replaced by project name.\n\n\".devscripts\" value: SALSAEMAILRECIPIENTS (use spaces to separate multiples recipients)\n\n--enable-issues, --no-enable-issues, --disable-issues, --no-disable-issues\nEnable, ignore or disable issues.\n\n\".devscripts\" values: SALSAENABLEISSUES (yes/ignore/no, default: ignore)\n\n--enable-mr, --no-enable-mr, --disable-mr, --no-disable-mr\nEnable, ignore or disable merge requests.\n\n\".devscripts\" values: SALSAENABLEMR (yes/ignore/no, default: ignore)\n",
                    "long": "--email-recipient"
                },
                {
                    "name": "--irc-channel",
                    "content": "IRC channel for KGB or Irker. Can be used more than one time only with --irker.\n\nImportant: channel must not include the first \"#\". If salsa finds a channel starting with\n\"#\", it will consider that the channel starts with 2 \"#\"!\n\n\".devscript\" value: SALSAIRCCHANNEL.\n\nMultiple values must be space separated.\n\nSince configuration files are read using sh, be careful when using \"#\": you must enclose\nthe channel with quotes, else sh will consider it as a comment and will ignore this\nvalue.\n\n--irker, --no-irker, --disable-irker\nEnable, ignore or disable Irker service\n\n\".devscripts\" values: SALSAIRKER (yes/ignore/no, default: ignore)\n",
                    "long": "--irc-channel"
                },
                {
                    "name": "--irker-host",
                    "content": "Irker host. Default: ruprecht.snow-crash.org\n\n\".devscripts\" value: SALSAIRKERHOST\n",
                    "long": "--irker-host"
                },
                {
                    "name": "--irker-port",
                    "content": "Irker port. Default: empty (default value)\n\n\".devscripts\" value: SALSAIRKERPORT\n\n--kgb, --no-kgb, --disable-kgb\nEnable, ignore or disable KGB webhook.\n\n\".devscripts\" value: SALSAKGB (yes/ignore/no, default: ignore)\n",
                    "long": "--irker-port"
                },
                {
                    "name": "--kgb-options",
                    "content": "List of KGB enabled options (comma separated). Default: issuesevents,\nmergerequestsevents, noteevents, pipelineevents, pushevents, tagpushevents,\nwikipageevents, enablesslverification\n\n$ salsa updatesafe debian/devscripts --kgb --irc-channel devscripts \\\n--kgb-options 'mergerequestsevents,issuesevents,enablesslverification'\n\nList of available options: confidentialcommentsevents, confidentialissuesevents,\nconfidentialnoteevents, enablesslverification, issuesevents, jobevents,\nmergerequestsevents, noteevents, pipelineevents, tagpushevents, wikipageevents\n\n\".devscripts\" value: SALSAKGBOPTIONS\n",
                    "long": "--kgb-options"
                },
                {
                    "name": "--no-fail",
                    "content": "Don't stop on error when using updaterepo with --all.\n\n\".devscripts\" value: SALSANOFAIL (yes/no)\n\n--rename-head, --no-rename-head\nRename HEAD branch given by --source-branch into --dest-branch and change \"default\nbranch\" of project. Works only with updaterepo.\n\n\".devscripts\" value: SALSARENAMEHEAD (yes/no)\n\n--source-branch: default \"master\"\n\".devscripts\" value: SALSASOURCEBRANCH\n\n--dest-branch: default \"debian/master\"\n\".devscripts\" value: SALSADESTBRANCH\n\n--tagpending, --no-tagpending, --disable-tagpending\nEnable, ignore or disable \"tagpending\" webhook.\n\n\".devscripts\" value: SALSATAGPENDING (yes/ignore/no, default: ignore)\n",
                    "long": "--no-fail"
                },
                {
                    "name": "Merge requests options",
                    "content": ""
                },
                {
                    "name": "--mr-title",
                    "content": "Title for merge request. Default: last commit title.\n",
                    "long": "--mr-title"
                },
                {
                    "name": "--mr-desc",
                    "content": "Description of new MR. Default:\n\nempty if --mr-title is set\nlast commit description if any\n--mr-dst-branch (or second command line argument)\nDestination branch. Default to \"master\".\n\n--mr-dst-project (or first command line argument)\nDestination project. Default: project from which the current project was forked; or, if\nnot found, \"upstream\" value found using git remote --verbose show; or using source\nproject.\n\nIf --mr-dst-project is set to same, salsa will use source project as destination.\n",
                    "long": "--mr-desc"
                },
                {
                    "name": "--mr-src-branch",
                    "content": "Source branch. Default: current branch.\n",
                    "long": "--mr-src-branch"
                },
                {
                    "name": "--mr-src-project",
                    "content": "Source project. Default: current project found using git remote --verbose show.\n\n--mr-allow-squash, --no-mr-allow-squash\nAllow upstream project to squash your commits, this is the default.\n\n\".devscripts\" value: SALSAMRALLOWSQUASH (yes/no)\n\n--mr-remove-source-branch, --no-mr-remove-source-branch\nRemove source branch if merge request is accepted. Default: no.\n\n\".devscripts\" value: SALSAMRREMOVESOURCEBRANCH (yes/no)\n",
                    "long": "--mr-src-project"
                },
                {
                    "name": "Options to manage other Gitlab instances",
                    "content": ""
                },
                {
                    "name": "--api-url",
                    "content": "GitLab API. Default: <https://salsa.debian.org/api/v4>.\n\n\".devscripts\" value: SALSAAPIURL\n",
                    "long": "--api-url"
                },
                {
                    "name": "--git-server-url",
                    "content": "Default to \"git@salsa.debian.org:\"\n\n\".devscripts\" value: SALSAGITSERVERURL\n",
                    "long": "--git-server-url"
                },
                {
                    "name": "--irker-server-url",
                    "content": "Default to \"ircs://irc.oftc.net:6697/\"\n\n\".devscripts\" value: SALSAIRKERSERVERURL\n",
                    "long": "--irker-server-url"
                },
                {
                    "name": "--kgb-server-url",
                    "content": "Default to <http://kgb.debian.net:9418/webhook/?channel=>\n\n\".devscripts\" value: SALSAKGBSERVERURL\n",
                    "long": "--kgb-server-url"
                },
                {
                    "name": "--tagpending-server-url",
                    "content": "Default to <https://webhook.salsa.debian.org/tagpending/>\n\n\".devscripts\" value: SALSATAGPENDINGSERVERURL\n\nConfiguration file example\n\nExample to use salsa with <https://gitlab.ow2.org> (group \"lemonldap-ng\"):\n\nSALSATOKEN=`cat ~/.ow2-gitlab-token`\nSALSAAPIURL=https://gitlab.ow2.org/api/v4\nSALSAGITSERVERURL=git@gitlab.ow2.org:\nSALSAGROUPID=34\n\nThen to use it, add something like this in your \".bashrc\" file:\n\nalias llngadmin='salsa --conffile ~/.salsa-ow2.conf'\n",
                    "long": "--tagpending-server-url"
                }
            ]
        },
        "SEE ALSO": {
            "content": "",
            "subsections": [
                {
                    "name": "dpt-salsa",
                    "content": ""
                }
            ]
        },
        "AUTHOR": {
            "content": "Xavier Guimard <yadd@debian.org>\n",
            "subsections": []
        },
        "COPYRIGHT AND LICENSE": {
            "content": "Copyright (C) 2018, Xavier Guimard <yadd@debian.org>\n\nIt contains code formerly found in dpt-salsa (pkg-perl-tools) copyright 2018, gregor herrmann\n<gregoa@debian.org>.\n\nThis library is free software; you can redistribute it and/or modify it under the terms of\nthe GNU General Public License as published by the Free Software Foundation; either version\n2, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\nwithout even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program.\nIf not, see <http://www.gnu.org/licenses/>.\n\n\n\nDebian Utilities                             2026-03-04                                     SALSA(1)",
            "subsections": []
        }
    },
    "summary": "salsa - tool to manipulate salsa repositories and group members",
    "flags": [
        {
            "flag": "-C",
            "long": "--chdir",
            "arg": null,
            "description": "Change directory before launching command salsa -C ~/debian co debian/libapache2-mod-fcgid"
        },
        {
            "flag": "",
            "long": "--cache-file",
            "arg": null,
            "description": "File to store cached values. Default to ~/.cache/salsa.json. An empty value disables cache. \".devscripts\" value: SALSACACHEFILE"
        },
        {
            "flag": "",
            "long": "--no-cache",
            "arg": null,
            "description": "Disable cache usage. Same as --cache-file '' --conffile, --conf-file Add or replace default configuration files (\"/etc/devscripts.conf\" and \"~/.devscripts\"). This can only be used as the first option given on the command-line. replace: salsa --conf-file test.conf <command>... salsa --conf-file test.conf --conf-file test2.conf <command>... add: salsa --conf-file +test.conf <command>... salsa --conf-file +test.conf --conf-file +test2.conf <command>... If one --conf-file has no \"+\", default configuration files are ignored. --no-conf, --noconf Don't read any configuration files. This can only be used as the first option given on the command-line."
        },
        {
            "flag": "",
            "long": "--debug",
            "arg": null,
            "description": "Enable debugging output"
        },
        {
            "flag": "",
            "long": "--group",
            "arg": null,
            "description": "Team to use. Use \"salsa searchgroup name\" to find it. If you want to use a subgroup, you have to set its full path: salsa --group perl-team/modules/packages checkrepo lemonldap-ng \".devscripts\" value: SALSAGROUP Be careful when you use SALSAGROUP in your \".devscripts\" file. Every salsa command will be executed in group space, for example if you want to propose a little change in a project using salsa fork + salsa mr, this \"fork\" will be done in group space unless you set a --user/--user-id. Prefer to use an alias in your \".bashrc\" file. Example: alias jsteamadmin=\"salsa --group js-team\" or alias jsteamadmin=\"salsa --conf-file ~/.js.conf or to use both .devscripts and .js.conf: alias jsteamadmin=\"salsa --conf-file +~/.js.conf then you can fix SALSAGROUP in \"~/.js.conf\" To enable bash completion for your alias, add this in your .bashrc file: completionloader salsa complete -F salsacompletion jsteamadmin"
        },
        {
            "flag": "",
            "long": "--group-id",
            "arg": null,
            "description": "Group id to use. Use \"salsa searchgroup name\" to find it. \".devscripts\" value: SALSAGROUPID Be careful when you use SALSAGROUPID in your \".devscripts\" file. Every salsa command will be executed in group space, for example if you want to propose a little change in a project using salsa fork + salsa mr, this \"fork\" will be done in group space unless you set a --user/--user-id. Prefer to use an alias in your \".bashrc\" file. Example: alias jsteamadmin=\"salsa --group-id 2666\" or alias jsteamadmin=\"salsa --conf-file ~/.js.conf then you can fix SALSAGROUPID in \"~/.js.conf\" --help: displays this manpage"
        },
        {
            "flag": "-i",
            "long": "--info",
            "arg": null,
            "description": "Prompt before sensible changes. \".devscripts\" value: SALSAINFO (yes/no)"
        },
        {
            "flag": "",
            "long": "--path",
            "arg": null,
            "description": "Repo path. Default to group or user path. \".devscripts\" value: SALSAREPOPATH"
        },
        {
            "flag": "",
            "long": "--token",
            "arg": null,
            "description": "Token value (see above)."
        },
        {
            "flag": "",
            "long": "--token-file",
            "arg": null,
            "description": "File to find token (see above)."
        },
        {
            "flag": "",
            "long": "--user",
            "arg": null,
            "description": "Username to use. If neither --group, --group-id, --user or --user-id is set, salsa uses current user id (corresponding to salsa private token)."
        },
        {
            "flag": "",
            "long": "--user-id",
            "arg": null,
            "description": "User id to use. Use \"salsa searchuser name\" to find one. If neither --group, --group-id, --user or --user-id is set, salsa uses current user id (corresponding to salsa private token). \".devscripts\" value: SALSAUSERID"
        },
        {
            "flag": "",
            "long": "--verbose",
            "arg": null,
            "description": "Enable verbose output."
        },
        {
            "flag": "",
            "long": "--yes",
            "arg": null,
            "description": "Never ask for consent. \".devscripts\" value: SALSAYES (yes/no)"
        },
        {
            "flag": "",
            "long": "--no-archived",
            "arg": null,
            "description": "Instead of looking to active projects, list or search in archived projects. Note that you can't have both archived and unarchived projects in the same request. Default: no (ie --no-archived). \".devscripts\" value: SALSAARCHIVED (yes/no)"
        },
        {
            "flag": "",
            "long": "--all",
            "arg": null,
            "description": "When set, all project of group/user are affected by command. --skip: ignore project with --all. Example: salsa updaterepo --tagpending --all --skip qa --skip devscripts \".devscripts\" value: SALSASKIP. To set multiples values, use spaces. Example SALSASKIP=qa devscripts --skip-file: ignore projects in this file (1 project per line) salsa updaterepo --tagpending --all --skip-file ~/.skip \".devscripts\" value: SALSASKIPFILE"
        },
        {
            "flag": "",
            "long": "--ci-config-path",
            "arg": null,
            "description": "Configure configuration file path of GitLab CI. Default: empty. Example: salsa updatesafe --ci-config-path debian/.gitlab-ci.yml debian/devscripts \".devscripts\" value: SALSACICONFIGPATH"
        },
        {
            "flag": "",
            "long": "--no-desc",
            "arg": null,
            "description": "Configure repo description using pattern given in desc-pattern \".devscripts\" value: SALSADESC (yes/no)"
        },
        {
            "flag": "",
            "long": "--desc-pattern",
            "arg": null,
            "description": "Repo description pattern. Default to \"Debian package %p\". \"%p\" is replaced by repo name, while \"%P\" is replaced by repo name given in command (may contains full path). \".devscripts\" value: SALSADESCPATTERN --email, --no-email, --disable-email Enable, ignore or disable email-on-push. \".devscripts\" value: SALSAEMAIL (yes/ignore/no, default: ignore)"
        },
        {
            "flag": "",
            "long": "--email-recipient",
            "arg": null,
            "description": "Email-on-push recipient. Can be multi valued: $ salsa updatesafe myrepo \\ --email-recipient foo@foobar.org \\ --email-recipient bar@foobar.org If recipient value contains \"%p\", it is replaced by project name. \".devscripts\" value: SALSAEMAILRECIPIENTS (use spaces to separate multiples recipients) --enable-issues, --no-enable-issues, --disable-issues, --no-disable-issues Enable, ignore or disable issues. \".devscripts\" values: SALSAENABLEISSUES (yes/ignore/no, default: ignore) --enable-mr, --no-enable-mr, --disable-mr, --no-disable-mr Enable, ignore or disable merge requests. \".devscripts\" values: SALSAENABLEMR (yes/ignore/no, default: ignore)"
        },
        {
            "flag": "",
            "long": "--irc-channel",
            "arg": null,
            "description": "IRC channel for KGB or Irker. Can be used more than one time only with --irker. Important: channel must not include the first \"#\". If salsa finds a channel starting with \"#\", it will consider that the channel starts with 2 \"#\"! \".devscript\" value: SALSAIRCCHANNEL. Multiple values must be space separated. Since configuration files are read using sh, be careful when using \"#\": you must enclose the channel with quotes, else sh will consider it as a comment and will ignore this value. --irker, --no-irker, --disable-irker Enable, ignore or disable Irker service \".devscripts\" values: SALSAIRKER (yes/ignore/no, default: ignore)"
        },
        {
            "flag": "",
            "long": "--irker-host",
            "arg": null,
            "description": "Irker host. Default: ruprecht.snow-crash.org \".devscripts\" value: SALSAIRKERHOST"
        },
        {
            "flag": "",
            "long": "--irker-port",
            "arg": null,
            "description": "Irker port. Default: empty (default value) \".devscripts\" value: SALSAIRKERPORT --kgb, --no-kgb, --disable-kgb Enable, ignore or disable KGB webhook. \".devscripts\" value: SALSAKGB (yes/ignore/no, default: ignore)"
        },
        {
            "flag": "",
            "long": "--kgb-options",
            "arg": null,
            "description": "List of KGB enabled options (comma separated). Default: issuesevents, mergerequestsevents, noteevents, pipelineevents, pushevents, tagpushevents, wikipageevents, enablesslverification $ salsa updatesafe debian/devscripts --kgb --irc-channel devscripts \\ --kgb-options 'mergerequestsevents,issuesevents,enablesslverification' List of available options: confidentialcommentsevents, confidentialissuesevents, confidentialnoteevents, enablesslverification, issuesevents, jobevents, mergerequestsevents, noteevents, pipelineevents, tagpushevents, wikipageevents \".devscripts\" value: SALSAKGBOPTIONS"
        },
        {
            "flag": "",
            "long": "--no-fail",
            "arg": null,
            "description": "Don't stop on error when using updaterepo with --all. \".devscripts\" value: SALSANOFAIL (yes/no) --rename-head, --no-rename-head Rename HEAD branch given by --source-branch into --dest-branch and change \"default branch\" of project. Works only with updaterepo. \".devscripts\" value: SALSARENAMEHEAD (yes/no) --source-branch: default \"master\" \".devscripts\" value: SALSASOURCEBRANCH --dest-branch: default \"debian/master\" \".devscripts\" value: SALSADESTBRANCH --tagpending, --no-tagpending, --disable-tagpending Enable, ignore or disable \"tagpending\" webhook. \".devscripts\" value: SALSATAGPENDING (yes/ignore/no, default: ignore)"
        },
        {
            "flag": "",
            "long": "--mr-title",
            "arg": null,
            "description": "Title for merge request. Default: last commit title."
        },
        {
            "flag": "",
            "long": "--mr-desc",
            "arg": null,
            "description": "Description of new MR. Default: empty if --mr-title is set last commit description if any --mr-dst-branch (or second command line argument) Destination branch. Default to \"master\". --mr-dst-project (or first command line argument) Destination project. Default: project from which the current project was forked; or, if not found, \"upstream\" value found using git remote --verbose show; or using source project. If --mr-dst-project is set to same, salsa will use source project as destination."
        },
        {
            "flag": "",
            "long": "--mr-src-branch",
            "arg": null,
            "description": "Source branch. Default: current branch."
        },
        {
            "flag": "",
            "long": "--mr-src-project",
            "arg": null,
            "description": "Source project. Default: current project found using git remote --verbose show. --mr-allow-squash, --no-mr-allow-squash Allow upstream project to squash your commits, this is the default. \".devscripts\" value: SALSAMRALLOWSQUASH (yes/no) --mr-remove-source-branch, --no-mr-remove-source-branch Remove source branch if merge request is accepted. Default: no. \".devscripts\" value: SALSAMRREMOVESOURCEBRANCH (yes/no)"
        },
        {
            "flag": "",
            "long": "--api-url",
            "arg": null,
            "description": "GitLab API. Default: <https://salsa.debian.org/api/v4>. \".devscripts\" value: SALSAAPIURL"
        },
        {
            "flag": "",
            "long": "--git-server-url",
            "arg": null,
            "description": "Default to \"git@salsa.debian.org:\" \".devscripts\" value: SALSAGITSERVERURL"
        },
        {
            "flag": "",
            "long": "--irker-server-url",
            "arg": null,
            "description": "Default to \"ircs://irc.oftc.net:6697/\" \".devscripts\" value: SALSAIRKERSERVERURL"
        },
        {
            "flag": "",
            "long": "--kgb-server-url",
            "arg": null,
            "description": "Default to <http://kgb.debian.net:9418/webhook/?channel=> \".devscripts\" value: SALSAKGBSERVERURL"
        },
        {
            "flag": "",
            "long": "--tagpending-server-url",
            "arg": null,
            "description": "Default to <https://webhook.salsa.debian.org/tagpending/> \".devscripts\" value: SALSATAGPENDINGSERVERURL Configuration file example Example to use salsa with <https://gitlab.ow2.org> (group \"lemonldap-ng\"): SALSATOKEN=`cat ~/.ow2-gitlab-token` SALSAAPIURL=https://gitlab.ow2.org/api/v4 SALSAGITSERVERURL=git@gitlab.ow2.org: SALSAGROUPID=34 Then to use it, add something like this in your \".bashrc\" file: alias llngadmin='salsa --conffile ~/.salsa-ow2.conf'"
        }
    ],
    "examples": [],
    "see_also": []
}