Compare commits

...

19 Commits
0.1.2 ... 0.1.3

Author SHA1 Message Date
fengmk2
41b9b31a01 Release 0.1.3 2013-12-20 17:14:59 +08:00
dead_horse
9a781166b0 Merge pull request #118 from fengmk2/toLowerCase
make sure all packages name are lower case
2013-12-20 01:02:03 -08:00
fengmk2
c03235ff83 Merge pull request #119 from alsotang/fix-auth-bug
Fix auth middleware bug
2013-12-20 00:57:47 -08:00
fengmk2
be7c07a078 add favicon 2013-12-20 16:53:58 +08:00
Alsotang
ee69ff9261 Fix auth middleware bug 2013-12-20 16:46:37 +08:00
fengmk2
bcf903cd3f make sure all packages name are lower case 2013-12-20 16:37:30 +08:00
fengmk2
460e7f42d3 Merge pull request #117 from fengmk2/list-since
select ids from tag
2013-12-20 00:08:43 -08:00
dead_horse
67d3adbdb0 select ids from tag
select all the name and package infos will cost about 20s.
2013-12-20 15:57:29 +08:00
fengmk2
d88ecbaa58 Merge pull request #115 from fengmk2/fix-nodectl
fix nodejsctl
2013-12-19 05:59:11 -08:00
dead_horse
1a64ae4bd4 fix nodejsctl
require('./config') maybe wont exist when add nfs
2013-12-19 21:40:12 +08:00
dead_horse
bfed6e3a87 Merge pull request #114 from fengmk2/empty-package
fix #112 missing versions and time no sync
2013-12-19 03:59:09 -08:00
fengmk2
b1d5e9e22d fix #112 missing versions and time no sync 2013-12-19 18:13:01 +08:00
fengmk2
d35a7518fa Merge pull request #113 from fengmk2/fix-sync-missing
fix sync missing packages error
2013-12-18 21:34:01 -08:00
fengmk2
d802ee80ee remove restart command 2013-12-19 12:11:30 +08:00
dead_horse
c74e0423f3 fix sync missing packages error 2013-12-19 12:10:26 +08:00
fengmk2
03e96d4af2 Merge pull request #111 from fengmk2/fix-web/readme
fix web/readme.md, add install
2013-12-18 19:46:38 -08:00
dead_horse
aac010c4a9 fix web/readme.md, add install 2013-12-19 11:32:51 +08:00
dead_horse
753dc6cc0c Merge pull request #110 from fengmk2/no-time-no-versions
fix #109 pkg no times and no versions bug.
2013-12-18 19:16:16 -08:00
fengmk2
ab327b452d fix #109 pkg no times and no versions bug. 2013-12-19 11:14:03 +08:00
13 changed files with 133 additions and 66 deletions

1
.gitignore vendored
View File

@@ -18,3 +18,4 @@ public/dist/
config/config.js
backup/*.json
backup/*.gz
docs/web/history.md

View File

@@ -1,5 +1,19 @@
0.1.2 / 2013-12-19
0.1.3 / 2013-12-20
==================
* add favicon
* Fix auth middleware bug (@alsotang)
* make sure all packages name are lower case
* select ids from tag
* fix nodejsctl
* fix #112 missing versions and time no sync
* remove restart command
* fix sync missing packages error
* fix web/readme.md, add install
* fix #109 pkg no times and no versions bug.
0.1.2 / 2013-12-19
==================
* fix times not exists canot sync bug. fixed #101

View File

@@ -34,12 +34,13 @@ $ git summary
project : cnpmjs.org
repo age : 2 weeks
active : 73 days
commits : 186
active : 81 days
commits : 205
files : 83
authors :
109 fengmk2 58.6%
77 dead_horse 41.4%
120 fengmk2 58.5%
84 dead_horse 41.0%
1 Alsotang 0.5%
```
## License

View File

@@ -10,7 +10,8 @@ cd `dirname $0`/..
NODEJS=node
BASE_HOME=`pwd`
PROJECT_NAME=`basename ${BASE_HOME}`
STDOUT_LOG=`$NODEJS -e "console.log(require('path').join(require('$BASE_HOME/config').logdir, 'nodejs_stdout.log'))"`
STDOUT_LOG=`$NODEJS -e "console.log(require('path').join(require('$BASE_HOME/config').logdir, 'nodejs_stdout.log'));\
process.exit(0);"`
NODE_DISPATH_PATH=${BASE_HOME}/dispatch.js
PROG_NAME=$0
ACTION=$1
@@ -47,9 +48,9 @@ stop()
{
get_pid
if [ ! -z "$PID" ]; then
echo "Waiting $PROJECT_NAME stop for 5s ..."
echo "Waiting $PROJECT_NAME stop for 2s ..."
kill -15 $PID
sleep 5
sleep 2
node_num=`ps -ef |grep node|grep ${PROJECT_NAME}|grep -v grep|wc -l`
if [ $node_num != 0 ]; then

View File

@@ -68,7 +68,7 @@ var config = {
user: 'address@gmail.com',
pass: 'your password',
ssl: true,
debug: true
debug: false
},
sourceNpmRegistry: 'http://registry.npmjs.org',

View File

@@ -1,6 +1,6 @@
# cnpmjs.org: Private npm registry and web for Enterprise
[![Build Status](https://secure.travis-ci.org/fengmk2/cnpmjs.org.png)](http://travis-ci.org/fengmk2/cnpmjs.org) [![Coverage Status](https://coveralls.io/repos/fengmk2/cnpmjs.org/badge.png)](https://coveralls.io/r/fengmk2/cnpmjs.org)[![Dependency Status](https://gemnasium.com/fengmk2/cnpmjs.org.png)](https://gemnasium.com/fengmk2/cnpmjs.org)
[![Build Status](https://secure.travis-ci.org/fengmk2/cnpmjs.org.png)](http://travis-ci.org/fengmk2/cnpmjs.org) [![Coverage Status](https://coveralls.io/repos/fengmk2/cnpmjs.org/badge.png)](https://coveralls.io/r/fengmk2/cnpmjs.org) [![Dependency Status](https://gemnasium.com/fengmk2/cnpmjs.org.png)](https://gemnasium.com/fengmk2/cnpmjs.org)
[![NPM](https://nodei.co/npm/cnpmjs.org.png?downloads=true&stars=true)](https://nodei.co/npm/cnpmjs.org/)
@@ -135,9 +135,17 @@ Or you can just use our `cnpm` cli:
$ npm install cnpm -g
```
### install
Install package from [registry.cnpmjs.org](http://registry.cnpmjs.org). When isntall a package or version not exist, it will try to install from official registry([registry.npmjs.org](http://registry.npmjs.org)), and sync this package to cnpm in the backend.
```
$ cnpm install [name]
```
### sync
Only `cnpm` cli has this command:
Only `cnpm` cli has this command. Meaning sync package from source npm.
```bash
$ cnpm sync connect
@@ -149,33 +157,38 @@ sync package on web: [cnpmjs.org/sync/connect](http://cnpmjs.org/sync/connect)
$ open http://cnpmjs.org/sync/connect
```
### publish
### publish / unpublish
Meaning sync package from source npm.
Only `admin` user can publish package to private registry.
Only `admin` user can publish / unpublish package to private registry.
```bash
$ cnpm publish [name]
$ cnpm unpublish [name]
```
### Orther command
Support all the other npm command.
## TODO list
@see Github [Issues](https://github.com/fengmk2/cnpmjs.org/issues)
## Authors
Release [History](/history).
```bash
$ git summary
project : cnpmjs.org
repo age : 2 weeks
active : 73 days
commits : 186
active : 81 days
commits : 205
files : 83
authors :
109 fengmk2 58.6%
77 dead_horse 41.4%
120 fengmk2 58.5%
84 dead_horse 41.0%
1 Alsotang 0.5%
```
## npm and cnpm relation

View File

@@ -52,7 +52,7 @@ module.exports = function (options) {
}
req.session.name = row.name;
if (config.admins[req.session.name]) {
if (config.admins.hasOwnProperty(req.session.name)) {
req.session.isAdmin = true;
}
debug('auth pass user: %j, onlySync: %s, isAdmin: %s, headers: %j',

View File

@@ -1,14 +1,13 @@
{
"name": "cnpmjs.org",
"version": "0.1.2",
"version": "0.1.3",
"description": "Private npm registry and web",
"main": "dispatch.js",
"scripts": {
"test": "make test-all",
"start": "./bin/nodejsctl start && npm run status",
"start": "./bin/nodejsctl start && cp History.md docs/web/history.md",
"status": "./bin/nodejsctl status",
"stop": "./bin/nodejsctl stop && npm run status",
"restart": "./bin/nodejsctl restart && npm run status",
"stop": "./bin/nodejsctl stop",
"blanket": {
"pattern": "//^((?!(node_modules|test|common)).)*$/",
"data-cover-flags": {
@@ -20,23 +19,24 @@
}
},
"dependencies": {
"humanize-number": "0.0.2",
"forward": ">=0.0.4",
"humanize-number": ">=0.0.2",
"gravatar": "1.0.6",
"urllib": "0.5.5",
"urllib": ">=0.5.5",
"connect-markdown": "0.0.3",
"qn": "0.2.0",
"qn": ">=0.2.0",
"microtime": "0.5.1",
"debug": "0.7.4",
"utility": "0.1.9",
"debug": ">=0.7.4",
"utility": ">=0.1.9",
"ready": "0.1.1",
"connect": "2.12.0",
"connect-rt": "0.0.2",
"connect-redis": "1.4.6",
"connect-render": "0.3.2",
"urlrouter": "0.5.4",
"graceful": "0.0.5",
"urlrouter": ">=0.5.4",
"graceful": ">=0.0.5",
"moment": "2.4.0",
"logfilestream": "0.1.0",
"logfilestream": ">=0.1.0",
"ms": "0.6.2",
"mkdirp": "0.3.5",
"mysql": "2.0.0-rc2",
@@ -46,7 +46,7 @@
"semver": "2.2.1",
"marked": "0.2.10",
"nodemailer": "0.5.15",
"eventproxy": "0.2.6"
"eventproxy": ">=0.2.6"
},
"devDependencies": {
"supertest": "*",

View File

@@ -21,9 +21,6 @@ var mysql = require('../common/mysql');
var MODULE_COLUMNS = 'id, publish_time, gmt_create, gmt_modified, author, name, version, description, package, dist_tarball, dist_shasum, dist_size';
// var INSERT_MODULE_SQL = 'INSERT INTO module(gmt_create, gmt_modified, author, name, version, package, dist_tarball, dist_shasum, dist_size) \
// VALUES(now(), now(), ?, ?, ?, ?, ?, ?, ?);';
var INSERT_MODULE_SQL = 'INSERT INTO module(gmt_create, gmt_modified, \
publish_time, author, name, version, package, dist_tarball, dist_shasum, dist_size, description) \
VALUES(now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?) \
@@ -227,35 +224,23 @@ exports.listByName = function (name, callback) {
};
var LIST_SINCE_SQLS = [
'SELECT distinct(name) AS name FROM module WHERE publish_time > ?;',
'SELECT module_id FROM tag WHERE tag="latest" AND name IN (?);',
'SELECT module_id FROM tag WHERE tag="latest" AND gmt_modified>?',
'SELECT name, package FROM module WHERE id IN (?);'
];
exports.listSince = function (start, callback) {
var ep = eventproxy.create();
ep.fail(callback);
mysql.query(LIST_SINCE_SQLS[0], [start], ep.done(function (rows) {
mysql.query(LIST_SINCE_SQLS[0], [new Date(start)], ep.done(function (rows) {
if (!rows || rows.length === 0) {
return callback(null, []);
}
ep.emit('names', rows.map(function (r) {
return r.name;
ep.emit('ids', rows.map(function (r) {
return r.module_id;
}));
}));
ep.once('names', function (names) {
mysql.query(LIST_SINCE_SQLS[1], [names], ep.done(function (rows) {
if (!rows || rows.length === 0) {
return callback(null, []);
}
ep.emit('ids', rows.map(function (r) {
return r.module_id;
}));
}));
});
ep.once('ids', function (ids) {
mysql.query(LIST_SINCE_SQLS[2], [ids], callback);
mysql.query(LIST_SINCE_SQLS[1], [ids], callback);
});
};
@@ -264,6 +249,11 @@ exports.listShort = function (callback) {
mysql.query(LIST_SHORT_SQL, callback);
};
var LIST_ALL_MODULE_NAMES_SQL = 'SELECT distinct(name) FROM module ORDER BY name';
exports.listAllModuleNames = function (callback) {
mysql.query(LIST_ALL_MODULE_NAMES_SQL, callback);
};
var DELETE_MODULE_BY_NAME_SQL = 'DELETE FROM module WHERE name=?;';
exports.removeByName = function (name, callback) {
mysql.query(DELETE_MODULE_BY_NAME_SQL, [name], callback);
@@ -294,7 +284,7 @@ exports.listByAuthor = function (author, callback) {
mysql.query(LIST_BY_AUTH_SQLS[1], [names], ep.done(function (rows) {
if (!rows || rows.length === 0) {
return callback(null, []);
}
}
ep.emit('ids', rows.map(function (r) {
return r.module_id;
}));

View File

@@ -40,6 +40,11 @@ function SyncModuleWorker(options) {
}
this.names = options.name;
for (var i = 0; i < this.names.length; i++) {
// ensure package name is lower case
this.names[i] = this.names[i].toLowerCase();
}
this.username = options.username;
this.concurrency = options.concurrency || 1;
this.syncingNames = {};
@@ -136,7 +141,9 @@ SyncModuleWorker.prototype._sync = function (pkg, callback) {
var ep = eventproxy.create();
ep.fail(callback);
var hasModules = false;
Module.listByName(name, ep.done(function (rows) {
hasModules = rows.length > 0;
var map = {};
for (var i = 0; i < rows.length; i++) {
var r = rows[i];
@@ -182,10 +189,41 @@ SyncModuleWorker.prototype._sync = function (pkg, callback) {
var missingDescriptions = [];
ep.all('existsMap', 'existsTags', function (map, tags) {
var times = pkg.time || {};
pkg.versions = pkg.versions || {};
var versionNames = Object.keys(times);
if (versionNames.length === 0) {
versionNames = Object.keys(pkg.versions);
}
if (versionNames.length === 0) {
that.log(' [%s] no times and no versions, hasModules: %s', pkg.name, hasModules);
if (!hasModules) {
// save a next module
var maintainer = pkg.maintainers && pkg.maintainers[0];
if (maintainer && maintainer.name) {
maintainer = maintainer.name;
}
if (!maintainer) {
maintainer = '-';
}
var nextMod = {
name: pkg.name,
version: 'next',
author: maintainer,
package: {
name: pkg.name,
version: 'next',
description: pkg.description || '',
readme: pkg.readme || '',
maintainers: pkg.maintainers || {
name: maintainer
},
},
};
Module.add(nextMod, function (err, result) {
that.log(' [%s] save next module, %j, error: %s', pkg.name, result, err);
});
}
}
var versions = [];
for (var i = 0; i < versionNames.length; i++) {
var v = versionNames[i];

View File

@@ -21,12 +21,15 @@ var connect = require('connect');
var rt = require('connect-rt');
var responseCookie = require('response-cookie');
var urlrouter = require('urlrouter');
var forward = require('forward');
var path = require('path');
var routes = require('../routes/registry');
var logger = require('../common/logger');
var config = require('../config');
var session = require('../common/session');
var auth = require('../middleware/auth');
var rootdir = path.dirname(__dirname);
var app = connect();
app.use(rt({headerName: 'X-ReadTime'}));
@@ -35,6 +38,8 @@ app.use(function (req, res, next) {
next();
});
app.use('/favicon.ico', forward(path.join(rootdir, 'public', 'favicon.png')));
app.use('/dist', connect.static(config.uploadDir));
app.use(responseCookie());

View File

@@ -14,16 +14,16 @@
* Module dependencies.
*/
var debug = require('debug')('cnpmjs.org:sync:sync_all');
var eventproxy = require('eventproxy');
var ms = require('ms');
var utility = require('utility');
var config = require('../config');
var Status = require('./status');
var Npm = require('../proxy/npm');
var Total = require('../proxy/total');
var eventproxy = require('eventproxy');
var SyncModuleWorker = require('../proxy/sync_module_worker');
var debug = require('debug')('cnpmjs.org:sync:sync_all');
var utility = require('utility');
var Status = require('./status');
var Module = require('../proxy/module');
var ms = require('ms');
function subtract(subtracter, minuend) {
subtracter = subtracter || [];
@@ -31,10 +31,14 @@ function subtract(subtracter, minuend) {
var map = {};
var results = [];
minuend.forEach(function (name) {
map[name] = true;
map[name.toLowerCase()] = true;
});
subtracter.forEach(function (name) {
!map[name] && results.push(name);
var lowerName = name.toLowerCase();
if (!map[lowerName] && !/[A-Z]/.test(name)) {
// ensure package name is lower case
results.push(lowerName);
}
});
return results;
}
@@ -52,7 +56,7 @@ function union(arrOne, arrTwo) {
/**
* when sync from official at the first time
* get all packages by short and restart from last synced module
* @param {String} lastSyncModule
* @param {String} lastSyncModule
* @param {Function} callback
*/
function getFirstSyncPackages(lastSyncModule, callback) {
@@ -71,8 +75,8 @@ function getFirstSyncPackages(lastSyncModule, callback) {
/**
* get all the packages that update time > lastSyncTime
* @param {Number} lastSyncTime
* @param {Function} callback
* @param {Number} lastSyncTime
* @param {Function} callback
*/
function getCommonSyncPackages(lastSyncTime, callback) {
Npm.getAllSince(lastSyncTime, function (err, data) {
@@ -92,7 +96,7 @@ function getMissPackages(callback) {
var ep = eventproxy.create();
ep.fail(callback);
Npm.getShort(ep.doneLater('allPackages'));
Module.listShort(ep.doneLater(function (rows) {
Module.listAllModuleNames(ep.doneLater(function (rows) {
var existPackages = rows.map(function (row) {
return row.name;
});

View File

@@ -47,7 +47,7 @@ describe('sync/sync_all.js', function () {
});
mm.data(Npm, 'getShort', ['cnpmjs.org', 'cutter', 'cnpm']);
mm.data(Total, 'getTotalInfo', {last_sync_time: Date.now()});
mm.data(Module, 'listShort', [{name: 'cnpmjs.org'}, {name: 'cutter'}]);
mm.data(Module, 'listAllModuleNames', [{name: 'cnpmjs.org'}, {name: 'cutter'}]);
sync(function (err, data) {
should.not.exist(err);
data.successes.should.eql(['cnpm', 'cnpmjs.org', 'cutter']);