register.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. var mout = require('mout');
  2. var Q = require('q');
  3. var chalk = require('chalk');
  4. var PackageRepository = require('../core/PackageRepository');
  5. var Config = require('bower-config');
  6. var Tracker = require('../util/analytics').Tracker;
  7. var cli = require('../util/cli');
  8. var createError = require('../util/createError');
  9. var defaultConfig = require('../config');
  10. var GitHubResolver = require('../core/resolvers/GitHubResolver');
  11. function register(logger, name, url, config) {
  12. var repository;
  13. var registryClient;
  14. var tracker;
  15. var force;
  16. config = defaultConfig(config);
  17. force = config.force;
  18. tracker = new Tracker(config);
  19. // Bypass any cache
  20. config.offline = false;
  21. config.force = true;
  22. // Trim name
  23. name = name.trim();
  24. return Q.try(function () {
  25. // Verify name
  26. // TODO: Verify with the new spec regexp?
  27. if (!name) {
  28. throw createError('Please type a name', 'EINVNAME');
  29. }
  30. // The public registry only allows git:// endpoints
  31. // As such, we attempt to convert URLs as necessary
  32. if (config.registry.register === Config.DEFAULT_REGISTRY) {
  33. url = convertUrl(url, logger);
  34. if (!mout.string.startsWith(url, 'git://')) {
  35. throw createError('The registry only accepts URLs starting with git://', 'EINVFORMAT');
  36. }
  37. }
  38. tracker.track('register');
  39. // Attempt to resolve the package referenced by the URL to ensure
  40. // everything is ok before registering
  41. repository = new PackageRepository(config, logger);
  42. return repository.fetch({ name: name, source: url, target: '*' });
  43. })
  44. .spread(function (canonicalDir, pkgMeta) {
  45. if (pkgMeta.private) {
  46. throw createError('The package you are trying to register is marked as private', 'EPRIV');
  47. }
  48. // If non interactive or user forced, bypass confirmation
  49. if (!config.interactive || force) {
  50. return true;
  51. }
  52. // Confirm if the user really wants to register
  53. return Q.nfcall(logger.prompt.bind(logger), {
  54. type: 'confirm',
  55. message: 'Registering a package will make it installable via the registry (' +
  56. chalk.cyan.underline(config.registry.register) + '), continue?',
  57. default: true
  58. });
  59. })
  60. .then(function (result) {
  61. // If user response was negative, abort
  62. if (!result) {
  63. return;
  64. }
  65. // Register
  66. registryClient = repository.getRegistryClient();
  67. logger.action('register', url, {
  68. name: name,
  69. url: url
  70. });
  71. return Q.nfcall(registryClient.register.bind(registryClient), name, url);
  72. });
  73. }
  74. function convertUrl(url, logger) {
  75. var pair;
  76. var newUrl;
  77. if (!mout.string.startsWith(url, 'git://')) {
  78. // Convert GitHub ssh & https to git://
  79. pair = GitHubResolver.getOrgRepoPair(url);
  80. if (pair) {
  81. newUrl = 'git://github.com/' + pair.org + '/' + pair.repo + '.git';
  82. logger.warn('convert', 'Converted ' + url + ' to ' + newUrl);
  83. }
  84. }
  85. return newUrl || url;
  86. }
  87. // -------------------
  88. register.line = function (logger, argv) {
  89. var options = cli.readOptions(argv);
  90. var name = options.argv.remain[1];
  91. var url = options.argv.remain[2];
  92. if (!name || !url) {
  93. return new Q();
  94. } else {
  95. return register(logger, name, url);
  96. }
  97. };
  98. register.completion = function () {
  99. // TODO:
  100. };
  101. module.exports = register;