Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
J
jquery
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
夏彬
jquery
Commits
f3062f96
Commit
f3062f96
authored
Dec 20, 2013
by
Timmy Willison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Release script: jquery-release integration
parent
bae11744
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
143 additions
and
380 deletions
+143
-380
release.js
build/release.js
+142
-380
package.json
package.json
+1
-0
No files found.
build/release.js
View file @
f3062f96
#!/usr/bin/env node
module
.
exports
=
function
(
Release
)
{
/*
* jQuery Core Release Management
*/
// Debugging variables
var
var
debug
=
false
,
fs
=
require
(
"fs"
)
,
skipRemote
=
false
;
shell
=
require
(
"shelljs"
),
var
fs
=
require
(
"fs"
),
// Windows needs the .cmd version but will find the non-.cmd
child
=
require
(
"child_process"
),
// On Windows, ensure the HOME environment variable is set
path
=
require
(
"path"
),
gruntCmd
=
process
.
platform
===
"win32"
?
"grunt.cmd"
:
"grunt"
,
archiver
=
require
(
"archiver"
);
var
releaseVersion
,
devFile
=
"dist/jquery.js"
,
nextVersion
,
minFile
=
"dist/jquery.min.js"
,
isBeta
,
mapFile
=
"dist/jquery.min.map"
,
pkg
,
branch
,
scpURL
=
"jqadmin@code.origin.jquery.com:/var/www/html/code.jquery.com/"
,
cdnFolder
=
"dist/cdn"
,
cdnURL
=
"http://code.origin.jquery.com/"
,
repoURL
=
"git@github.com:jquery/jquery.git"
,
// Windows needs the .cmd version but will find the non-.cmd
releaseFiles
=
{
// On Windows, ensure the HOME environment variable is set
"jquery-VER.js"
:
devFile
,
gruntCmd
=
process
.
platform
===
"win32"
?
"grunt.cmd"
:
"grunt"
,
"jquery-VER.min.js"
:
minFile
,
"jquery-VER.min.map"
:
mapFile
//,
devFile
=
"dist/jquery.js"
,
minFile
=
"dist/jquery.min.js"
,
mapFile
=
"dist/jquery.min.map"
,
releaseFiles
=
{
"jquery-VER.js"
:
devFile
,
"jquery-VER.min.js"
:
minFile
,
"jquery-VER.min.map"
:
mapFile
//,
// Disable these until 2.0 defeats 1.9 as the ONE TRUE JQUERY
// Disable these until 2.0 defeats 1.9 as the ONE TRUE JQUERY
// "jquery.js": devFile,
// "jquery.js": devFile,
// "jquery.min.js": minFile,
// "jquery.min.js": minFile,
// "jquery.min.map": mapFile,
// "jquery.min.map": mapFile,
// "jquery-latest.js": devFile,
// "jquery-latest.js": devFile,
// "jquery-latest.min.js": minFile,
// "jquery-latest.min.js": minFile,
// "jquery-latest.min.map": mapFile
// "jquery-latest.min.map": mapFile
},
},
jQueryFilesCDN
=
[],
googleFilesCDN
=
[
"jquery.js"
,
"jquery.min.js"
,
"jquery.min.map"
googleFilesCDN
=
[
],
"jquery.js"
,
"jquery.min.js"
,
"jquery.min.map"
],
msFilesCDN
=
[
"jquery-VER.js"
,
"jquery-VER.min.js"
,
"jquery-VER.min.map"
msFilesCDN
=
[
],
"jquery-VER.js"
,
"jquery-VER.min.js"
,
"jquery-VER.min.map"
];
_complete
=
Release
.
complete
;
/**
steps
(
* Generates copies for the CDNs
initialize
,
*/
checkGitStatus
,
function
makeReleaseCopies
()
{
setReleaseVersion
,
shell
.
mkdir
(
"-p"
,
cdnFolder
);
gruntBuild
,
makeReleaseCopies
,
Object
.
keys
(
releaseFiles
).
forEach
(
function
(
key
)
{
copyTojQueryCDN
,
var
text
,
buildGoogleCDN
,
builtFile
=
releaseFiles
[
key
],
buildMicrosoftCDN
,
unpathedFile
=
key
.
replace
(
/VER/g
,
Release
.
newVersion
),
createTag
,
releaseFile
=
cdnFolder
+
"/"
+
unpathedFile
;
setNextVersion
,
pushToGithub
,
// Beta releases don't update the jquery-latest etc. copies
// publishToNpm,
if
(
!
Release
.
preRelease
||
key
.
indexOf
(
"VER"
)
>=
0
)
{
exit
);
if
(
/
\.
map$/
.
test
(
releaseFile
)
)
{
// Map files need to reference the new uncompressed name;
function
initialize
(
next
)
{
// assume that all files reside in the same directory.
// "file":"jquery.min.js","sources":["jquery.js"]
if
(
process
.
argv
[
2
]
===
"-d"
)
{
text
=
fs
.
readFileSync
(
builtFile
,
"utf8"
)
process
.
argv
.
shift
();
.
replace
(
/"file":"
([^
"
]
+
)
","sources":
\[
"
([^
"
]
+
)
"
\]
/
,
debug
=
true
;
"
\"
file
\"
:
\"
"
+
unpathedFile
.
replace
(
/
\.
min
\.
map/
,
".min.js"
)
+
console
.
warn
(
"=== DEBUG MODE ==="
);
"
\"
,
\"
sources
\"
:[
\"
"
+
unpathedFile
.
replace
(
/
\.
min
\.
map/
,
".js"
)
+
"
\"
]"
);
fs
.
writeFileSync
(
releaseFile
,
text
);
}
else
if
(
/
\.
min
\.
js$/
.
test
(
releaseFile
)
)
{
// Remove the source map comment; it causes way too many problems.
// Keep the map file in case DevTools allow manual association.
text
=
fs
.
readFileSync
(
builtFile
,
"utf8"
)
.
replace
(
/
\/\/
# sourceMappingURL=
\S
+/
,
""
);
fs
.
writeFileSync
(
releaseFile
,
text
);
}
else
if
(
builtFile
!==
releaseFile
)
{
shell
.
cp
(
"-f"
,
builtFile
,
releaseFile
);
}
}
});
}
}
// First arg should be the version number being released
function
buildGoogleCDN
(
next
)
{
var
newver
,
oldver
,
makeArchive
(
"googlecdn"
,
googleFilesCDN
,
next
);
exists
=
fs
.
existsSync
||
path
.
existsSync
,
rsemver
=
/^
(\d
+
)\.(\d
+
)\.(\d
+
)(?:
-
([\d
A-Za-z
\-]
+
(?:\.[\d
A-Za-z
\-]
+
)
*
))?
$/
,
version
=
(
process
.
argv
[
3
]
||
""
).
toLowerCase
().
match
(
rsemver
)
||
{},
major
=
version
[
1
],
minor
=
version
[
2
],
patch
=
version
[
3
],
xbeta
=
version
[
4
];
branch
=
process
.
argv
[
2
];
releaseVersion
=
process
.
argv
[
3
];
isBeta
=
!!
xbeta
;
if
(
!
branch
||
!
major
||
!
minor
||
!
patch
)
{
die
(
"Usage: "
+
process
.
argv
[
1
]
+
" branch releaseVersion"
);
}
if
(
xbeta
===
"pre"
)
{
die
(
"Cannot release a 'pre' version!"
);
}
}
if
(
!
exists
(
"package.json"
)
)
{
die
(
"No package.json in this directory"
);
}
pkg
=
readJSON
(
"package.json"
);
console
.
log
(
"Current version is "
+
pkg
.
version
+
"; generating release "
+
releaseVersion
);
function
buildMicrosoftCDN
(
next
)
{
version
=
pkg
.
version
.
match
(
rsemver
);
makeArchive
(
"mscdn"
,
msFilesCDN
,
next
);
oldver
=
(
+
version
[
1
]
)
*
10000
+
(
+
version
[
2
]
*
100
)
+
(
+
version
[
3
]
);
newver
=
(
+
major
)
*
10000
+
(
+
minor
*
100
)
+
(
+
patch
);
if
(
newver
<
oldver
)
{
die
(
"Next version is older than current version!"
);
}
}
nextVersion
=
major
+
"."
+
minor
+
"."
+
(
isBeta
?
patch
:
+
patch
+
1
)
+
"-pre"
;
function
makeArchive
(
cdn
,
files
,
next
)
{
next
();
if
(
Release
.
preRelease
)
{
}
console
.
log
(
"Skipping archive creation for "
+
cdn
+
"; this is a beta release."
);
return
;
function
checkGitStatus
(
next
)
{
git
(
[
"status"
],
function
(
error
,
stdout
)
{
var
onBranch
=
((
stdout
||
""
).
match
(
/On branch
(\S
+
)
/
)
||
[])[
1
];
if
(
onBranch
!==
branch
)
{
dieIfReal
(
"Branches don't match: Wanted "
+
branch
+
", got "
+
onBranch
);
}
}
if
(
/Changes to be committed/i
.
test
(
stdout
)
)
{
dieIfReal
(
"Please commit changed files before attempting to push a release."
);
}
if
(
/Changes not staged for commit/i
.
test
(
stdout
)
)
{
dieIfReal
(
"Please stash files before attempting to push a release."
);
}
next
();
});
}
function
setReleaseVersion
(
next
)
{
console
.
log
(
"Creating production archive for "
+
cdn
);
updateVersion
(
releaseVersion
);
git
(
[
"commit"
,
"-a"
,
"-m"
,
"Updating version to "
+
releaseVersion
+
"."
],
next
,
debug
);
}
function
gruntBuild
(
next
)
{
// First clean the dist directory of anything we're not about to rebuild
git
(
[
"clean"
,
"-dfx"
,
"dist/"
],
function
()
{
exec
(
gruntCmd
,
[],
function
(
error
,
stdout
,
stderr
)
{
if
(
error
)
{
die
(
error
+
stderr
);
}
console
.
log
(
stdout
);
next
();
},
false
);
},
debug
);
}
function
makeReleaseCopies
(
next
)
{
var
archiver
=
require
(
"archiver"
),
Object
.
keys
(
releaseFiles
).
forEach
(
function
(
key
)
{
md5file
=
cdnFolder
+
"/"
+
cdn
+
"-md5.txt"
,
var
text
,
output
=
fs
.
createWriteStream
(
cdnFolder
+
"/"
+
cdn
+
"-jquery-"
+
Release
.
newVersion
+
".zip"
);
builtFile
=
releaseFiles
[
key
],
unpathedFile
=
key
.
replace
(
/VER/g
,
releaseVersion
),
releaseFile
=
"dist/"
+
unpathedFile
;
// Beta releases don't update the jquery-latest etc. copies
output
.
on
(
"error"
,
function
(
err
)
{
if
(
!
isBeta
||
key
.
indexOf
(
"VER"
)
>=
0
)
{
throw
err
;
if
(
/
\.
map$/
.
test
(
releaseFile
)
)
{
// Map files need to reference the new uncompressed name;
// assume that all files reside in the same directory.
// "file":"jquery.min.js","sources":["jquery.js"]
text
=
fs
.
readFileSync
(
builtFile
,
"utf8"
)
.
replace
(
/"file":"
([^
"
]
+
)
","sources":
\[
"
([^
"
]
+
)
"
\]
/
,
"
\"
file
\"
:
\"
"
+
unpathedFile
.
replace
(
/
\.
min
\.
map/
,
".min.js"
)
+
"
\"
,
\"
sources
\"
:[
\"
"
+
unpathedFile
.
replace
(
/
\.
min
\.
map/
,
".js"
)
+
"
\"
]"
);
fs
.
writeFileSync
(
releaseFile
,
text
);
}
else
if
(
/
\.
min
\.
js$/
.
test
(
releaseFile
)
)
{
// Remove the source map comment; it causes way too many problems.
// Keep the map file in case DevTools allow manual association.
text
=
fs
.
readFileSync
(
builtFile
,
"utf8"
)
.
replace
(
/
\/\/
# sourceMappingURL=
\S
+/
,
""
);
fs
.
writeFileSync
(
releaseFile
,
text
);
}
else
if
(
builtFile
!==
releaseFile
)
{
copy
(
builtFile
,
releaseFile
);
}
jQueryFilesCDN
.
push
(
releaseFile
);
}
});
next
();
}
function
copyTojQueryCDN
(
next
)
{
var
cmds
=
[];
jQueryFilesCDN
.
forEach
(
function
(
name
)
{
cmds
.
push
(
function
(
nxt
){
exec
(
"scp"
,
[
name
,
scpURL
],
nxt
,
debug
||
skipRemote
);
});
cmds
.
push
(
function
(
nxt
){
exec
(
"curl"
,
[
cdnURL
+
name
+
"?reload"
],
nxt
,
debug
||
skipRemote
);
});
});
});
cmds
.
push
(
next
);
steps
.
apply
(
this
,
cmds
);
}
function
buildGoogleCDN
(
next
)
{
makeArchive
(
"googlecdn"
,
googleFilesCDN
,
next
);
}
function
buildMicrosoftCDN
(
next
)
{
makeArchive
(
"mscdn"
,
msFilesCDN
,
next
);
}
function
createTag
(
next
)
{
output
.
on
(
"close"
,
next
);
steps
(
archiver
.
pipe
(
output
);
checkoutCommit
,
commitDistFiles
,
tagRelease
,
checkoutBranch
,
next
);
}
function
setNextVersion
(
next
)
{
files
=
files
.
map
(
function
(
item
)
{
updateVersion
(
nextVersion
);
return
cdnFolder
+
"/"
+
item
.
replace
(
/VER/g
,
Release
.
newVersion
);
git
(
[
"commit"
,
"-a"
,
"-m"
,
"Updating the source version to "
+
nextVersion
+
"✓™"
],
next
,
debug
);
}
function
pushToGithub
(
next
)
{
git
(
[
"push"
,
"--tags"
,
repoURL
,
branch
],
next
,
debug
||
skipRemote
);
}
/* Utilities
---------------------------------------------------------------------- */
function
steps
()
{
var
cur
=
0
,
st
=
arguments
;
(
function
next
(){
process
.
nextTick
(
function
(){
st
[
cur
++
](
next
);
});
});
})();
}
function
readJSON
(
filename
)
{
shell
.
exec
(
"md5sum"
,
files
,
function
(
code
,
stdout
)
{
return
JSON
.
parse
(
fs
.
readFileSync
(
filename
)
);
fs
.
writeFileSync
(
md5file
,
stdout
);
}
files
.
push
(
md5file
);
function
replaceVersionJSON
(
file
,
version
)
{
files
.
forEach
(
function
(
file
)
{
var
text
=
fs
.
readFileSync
(
file
,
"utf8"
);
archiver
.
append
(
fs
.
createReadStream
(
file
),
{
name
:
file
}
);
text
=
text
.
replace
(
/
(
"version":
\s
*"
)[^
"
]
+/
,
"$1"
+
version
);
});
fs
.
writeFileSync
(
file
,
text
);
}
function
updateVersion
(
ver
)
{
archiver
.
finalize
();
console
.
log
(
"Updating version to "
+
ver
);
pkg
.
version
=
ver
;
if
(
!
debug
)
{
[
"package.json"
,
"bower.json"
].
forEach
(
function
(
filename
)
{
replaceVersionJSON
(
filename
,
ver
);
});
});
}
}
}
function
copy
(
oldFile
,
newFile
,
skip
)
{
Release
.
define
({
console
.
log
(
"Copying "
+
oldFile
+
" to "
+
newFile
);
issueTracker
:
"trac"
,
if
(
!
skip
)
{
contributorReportId
:
508
,
fs
.
writeFileSync
(
newFile
,
fs
.
readFileSync
(
oldFile
,
"utf8"
)
);
/**
}
* Generates any release artifacts that should be included in the release.
}
* The callback must be invoked with an array of files that should be
* committed before creating the tag.
function
exec
(
cmd
,
args
,
fn
,
skip
)
{
* @param {Function} callback
if
(
skip
)
{
*/
console
.
log
(
"# "
+
cmd
+
" "
+
args
.
join
(
" "
)
);
generateArtifacts
:
function
(
callback
)
{
fn
(
""
,
""
,
""
);
if
(
Release
.
exec
(
gruntCmd
).
code
!==
0
)
{
}
else
{
Release
.
abort
(
"Grunt command failed"
);
console
.
log
(
cmd
+
" "
+
args
.
join
(
" "
)
);
child
.
execFile
(
cmd
,
args
,
{
env
:
process
.
env
},
function
(
err
,
stdout
,
stderr
)
{
if
(
err
)
{
die
(
stderr
||
stdout
||
err
);
}
fn
.
apply
(
this
,
arguments
);
}
}
);
makeReleaseCopies
();
}
callback
([
"dist/jquery.js"
,
"dist/jquery.min.js"
,
"dist/jquery.min.map"
]);
}
},
/**
function
git
(
args
,
fn
,
skip
)
{
* Release completion
exec
(
"git"
,
args
,
fn
,
skip
);
*/
}
complete
:
function
()
{
// Build CDN archives
Release
.
_walk
(
buildGoogleCDN
,
buildMicrosoftCDN
,
_complete
);
/* Tag creation
},
---------------------------------------------------------------------- */
/**
function
checkoutCommit
(
next
)
{
* Our trac milestones are different than the new version
git
(
[
"checkout"
,
"HEAD^0"
],
next
,
debug
);
* @example
}
*
* // For Release.newVersion equal to 2.1.0 or 1.11.0
function
commitDistFiles
(
next
)
{
* Release._tracMilestone();
// Remove scripts property from package.json
* // => 1.11/2.1
// Building and bower are irrelevant as those files will be committed
*
// Makes for a clean npm install
* // For Release.newVersion equal to 2.1.1 or 1.11.1
var
pkgClone
=
readJSON
(
"package.json"
);
* Release._tracMilestone();
delete
pkgClone
.
scripts
;
* // => 1.11.1/2.1.1
fs
.
writeFileSync
(
"package.json"
,
JSON
.
stringify
(
pkgClone
,
null
,
"
\
t"
)
);
*/
// Add files to be committed
_tracMilestone
:
function
()
{
git
(
[
"add"
,
"package.json"
],
function
()
{
var
otherVersion
,
git
(
[
"commit"
,
"-m"
,
"Remove scripts property from package.json"
],
function
()
{
m
=
Release
.
newVersion
.
split
(
"."
),
// Add jquery files for distribution in a final commit
major
=
m
[
0
]
|
0
,
git
(
[
"add"
,
"-f"
,
devFile
,
minFile
,
mapFile
],
function
()
{
minor
=
m
[
1
]
|
0
,
git
(
[
"commit"
,
"-m"
,
releaseVersion
],
next
,
debug
);
patch
=
m
[
2
]
|
0
?
"."
+
m
[
2
]
:
""
,
},
debug
);
version
=
major
+
"."
+
minor
+
patch
;
},
debug
);
if
(
major
===
1
)
{
},
debug
);
otherVersion
=
"2."
+
(
minor
-
10
)
+
patch
;
}
return
version
+
"/"
+
otherVersion
;
function
tagRelease
(
next
)
{
git
(
[
"tag"
,
releaseVersion
],
next
,
debug
);
}
function
checkoutBranch
(
next
)
{
// Reset files to previous state before leaving the commit
git
(
[
"reset"
,
"--hard"
,
"HEAD"
],
function
()
{
git
(
[
"checkout"
,
branch
],
next
,
debug
);
},
debug
);
}
/* Archive creation
---------------------------------------------------------------------- */
function
makeArchive
(
cdn
,
files
,
fn
)
{
if
(
isBeta
)
{
console
.
log
(
"Skipping archive creation for "
+
cdn
+
"; "
+
releaseVersion
+
" is beta"
);
process
.
nextTick
(
fn
);
return
;
}
console
.
log
(
"Creating production archive for "
+
cdn
);
var
archive
=
archiver
(
"zip"
),
md5file
=
"dist/"
+
cdn
+
"-md5.txt"
,
output
=
fs
.
createWriteStream
(
"dist/"
+
cdn
+
"-jquery-"
+
releaseVersion
+
".zip"
);
archive
.
on
(
"error"
,
function
(
err
)
{
throw
err
;
});
output
.
on
(
"close"
,
fn
);
archive
.
pipe
(
output
);
files
=
files
.
map
(
function
(
item
)
{
return
"dist/"
+
item
.
replace
(
/VER/g
,
releaseVersion
);
});
exec
(
"md5sum"
,
files
,
function
(
err
,
stdout
)
{
fs
.
writeFileSync
(
md5file
,
stdout
);
files
.
push
(
md5file
);
files
.
forEach
(
function
(
file
)
{
archive
.
append
(
fs
.
createReadStream
(
file
),
{
name
:
file
}
);
});
archive
.
finalize
();
},
false
);
}
/* NPM
---------------------------------------------------------------------- */
/*
function publishToNpm( next ) {
// Only publish the master branch to NPM
// You must be the jquery npm user for this not to fail
// To check, run `npm whoami`
// Log in to the jquery user with `npm adduser`
if ( branch !== "master" ) {
next();
return;
}
git( [ "checkout", releaseVersion ], function() {
// Only publish committed files
git( [ "clean", "-dfx" ], function() {
var args = [ "publish" ];
// Tag the version as beta if necessary
if ( isBeta ) {
args.push( "--tag", "beta" );
}
}
exec( "npm", args, function() {
otherVersion
=
"1."
+
(
minor
+
10
)
+
patch
;
git( [ "checkout", branch ], next, debug );
return
otherVersion
+
"/"
+
version
;
}, debug || skipRemote );
}
}, debug );
});
}, debug);
};
}*/
/* Death
---------------------------------------------------------------------- */
function
die
(
msg
)
{
console
.
error
(
"ERROR: "
+
msg
);
process
.
exit
(
1
);
}
function
dieIfReal
(
msg
)
{
if
(
debug
)
{
console
.
log
(
"DIE: "
+
msg
);
}
else
{
die
(
msg
);
}
}
function
exit
()
{
process
.
exit
(
0
);
}
package.json
View file @
f3062f96
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
"
testswarm
"
:
"
1.1.0
"
,
"
testswarm
"
:
"
1.1.0
"
,
"
load-grunt-tasks
"
:
"
0.2.0
"
,
"
load-grunt-tasks
"
:
"
0.2.0
"
,
"
requirejs
"
:
"
2.1.9
"
,
"
requirejs
"
:
"
2.1.9
"
,
"
shelljs
"
:
"
0.2.6
"
,
"
grunt
"
:
"
0.4.2
"
,
"
grunt
"
:
"
0.4.2
"
,
"
grunt-cli
"
:
"
0.1.11
"
,
"
grunt-cli
"
:
"
0.1.11
"
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment