[go: nahoru, domu]

Skip to content

Commit

Permalink
New release process (flutter#14061)
Browse files Browse the repository at this point in the history
Generate the "version" file from git tags.
Remove the old VERSION file and mentions of versions in pubspec.yaml files.
Replace the old update_versions.dart script with a new roll_dev.dart script.
Update "flutter channel".
Update "flutter upgrade", including making it transition from alpha to dev.
Update "flutter --version" and "flutter doctor".
  • Loading branch information
Hixie committed Jan 18, 2018
1 parent 4353297 commit 9e42e4b
Show file tree
Hide file tree
Showing 20 changed files with 340 additions and 279 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
/dev/docs/lib/
/dev/docs/pubspec.yaml
/packages/flutter/coverage/
version

# Flutter/Dart/Pub related
**/doc/api/
Expand Down
34 changes: 21 additions & 13 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
# ENVIRONMENTS
os:
- linux
- osx
env:
- SHARD=analyze
- SHARD=tests
- SHARD=docs
matrix:
exclude:
- os: osx
env: SHARD=analyze
- os: osx
env: SHARD=docs
sudo: false
filter_secrets: false

# INSTALLATION
addons:
apt:
# sky_shell binary depends on /usr/lib/x86_64-linux-gnu/libstdc++.so.6 version GLIBCXX_3.4.18
Expand All @@ -14,23 +27,18 @@ addons:
language: node_js
node_js:
- "6"
git:
# We rely on git tags for determining the version.
depth: false
cache:
directories:
- $HOME/.pub-cache
install:
- ./dev/bots/travis_install.sh
env:
- SHARD=analyze
- SHARD=tests
- SHARD=docs

# TESTING
before_script:
- ./dev/bots/travis_setup.sh
script:
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
- (./bin/cache/dart-sdk/bin/dart ./dev/bots/test.dart && ./dev/bots/travis_upload.sh)
cache:
directories:
- $HOME/.pub-cache
matrix:
exclude:
- os: osx
env: SHARD=analyze
- os: osx
env: SHARD=docs
9 changes: 0 additions & 9 deletions VERSION

This file was deleted.

1 change: 1 addition & 0 deletions bin/flutter
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ function upgrade_flutter () {

local revision=`(cd "$FLUTTER_ROOT"; git rev-parse HEAD)`
if [ ! -f "$SNAPSHOT_PATH" ] || [ ! -s "$STAMP_PATH" ] || [ `cat "$STAMP_PATH"` != "$revision" ] || [ "$FLUTTER_TOOLS_DIR/pubspec.yaml" -nt "$FLUTTER_TOOLS_DIR/pubspec.lock" ]; then
rm -f "$FLUTTER_ROOT/version"
mkdir -p "$FLUTTER_ROOT/bin/cache"
touch "$FLUTTER_ROOT/bin/cache/.dartignore"
"$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh"
Expand Down
1 change: 1 addition & 0 deletions bin/flutter.bat
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ GOTO :after_subroutine
)

:do_snapshot
IF EXIST "%FLUTTER_ROOT%\version" DEL "%FLUTTER_ROOT%\version"
ECHO: > "%cache_dir%\.dartignore"
ECHO Updating flutter tool...
PUSHD "%flutter_tools_dir%"
Expand Down
1 change: 0 additions & 1 deletion dev/devicelab/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
name: flutter_devicelab
version: 0.0.1
author: Flutter Authors <flutter-dev@googlegroups.com>
description: Flutter continuous integration performance and correctness tests.
homepage: https://github.com/flutter/flutter
Expand Down
25 changes: 15 additions & 10 deletions dev/tools/dartdoc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'dart:io';

import 'package:intl/intl.dart';
import 'package:path/path.dart' as path;
import 'update_versions.dart';

/// Whether to report all error messages (true) or attempt to filter out some
/// known false positives (false).
Expand Down Expand Up @@ -36,15 +35,18 @@ Future<Null> main(List<String> args) async {
if (path.basename(Directory.current.path) == 'tools')
Directory.current = Directory.current.parent.parent;

final RawVersion version = new RawVersion('VERSION');
final ProcessResult flutter = Process.runSync('flutter', <String>[]);
final File versionFile = new File('version');
if (flutter.exitCode != 0 || !versionFile.existsSync())
throw new Exception('Failed to determine Flutter version.');
final String version = versionFile.readAsStringSync();

// Create the pubspec.yaml file.
final StringBuffer buf = new StringBuffer('''
name: Flutter
homepage: https://flutter.io
version: $version
dependencies:
''');
final StringBuffer buf = new StringBuffer();
buf.writeln('name: Flutter');
buf.writeln('homepage: https://flutter.io');
buf.writeln('version: $version');
buf.writeln('dependencies:');
for (String package in findPackageNames()) {
buf.writeln(' $package:');
buf.writeln(' sdk: flutter');
Expand Down Expand Up @@ -100,7 +102,7 @@ dependencies:
workingDirectory: 'dev/docs',
environment: pubEnvironment,
);
print('\n${result.stdout}');
print('\n${result.stdout}flutter version: $version\n');

// Generate the documentation.
final List<String> args = <String>[
Expand Down Expand Up @@ -159,7 +161,10 @@ void createFooter(String footerPath) {
const int kGitRevisionLength = 10;

final ProcessResult gitResult = Process.runSync('git', <String>['rev-parse', 'HEAD']);
String gitRevision = (gitResult.exitCode == 0) ? gitResult.stdout.trim() : 'unknown';
if (gitResult.exitCode != 0)
throw 'git exit with non-zero exit code: ${gitResult.exitCode}';
String gitRevision = gitResult.stdout.trim();

gitRevision = gitRevision.length > kGitRevisionLength ? gitRevision.substring(0, kGitRevisionLength) : gitRevision;

final String timestamp = new DateFormat('yyyy-MM-dd HH:mm').format(new DateTime.now());
Expand Down
158 changes: 158 additions & 0 deletions dev/tools/lib/roll_dev.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Rolls the dev channel.
// Only tested on Linux.
//
// See: https://github.com/flutter/flutter/wiki/Release-process

import 'dart:io';

import 'package:args/args.dart';
import 'package:path/path.dart' as path;

const String kIncrement = 'increment';
const String kX = 'x';
const String kY = 'y';
const String kZ = 'z';
const String kHelp = 'help';

void main(List<String> args) {
// If we're run from the `tools` dir, set the cwd to the repo root.
if (path.basename(Directory.current.path) == 'tools')
Directory.current = Directory.current.parent.parent;

final ArgParser argParser = new ArgParser(allowTrailingOptions: false);
argParser.addOption(
kIncrement,
help: 'Specifies which part of the x.y.z version number to increment. Required.',
valueHelp: 'level',
allowed: <String>[kX, kY, kZ],
allowedHelp: <String, String>{
kX: 'Indicates a major development, e.g. typically changed after a big press event.',
kY: 'Indicates a minor development, e.g. typically changed after a beta release.',
kZ: 'Indicates the least notable level of change. You normally want this.',
},
);
argParser.addFlag(kHelp, negatable: false, help: 'Show this help message.', hide: true);
ArgResults argResults;
try {
argResults = argParser.parse(args);
} on ArgParserException catch (error) {
print(error.message);
print(argParser.usage);
exit(1);
}

final String level = argResults[kIncrement];
final bool help = argResults[kHelp];

if (help || level == null) {
print('roll_dev.dart --increment=x • update the version tags and roll a new dev build.\n');
print(argParser.usage);
exit(0);
}

runGit('checkout master', 'switch to master branch');

if (getGitOutput('status --porcelain', 'check status of your local checkout') != '') {
print('Your git repository is not clean. Try running "git clean -fd". Warning, this ');
print('will delete files! Run with -n to find out which ones.');
exit(1);
}

String version = getFullTag();
final Match match = parseFullTag(version);
if (match == null) {
print('Could not determine the version for this build.');
if (version.isNotEmpty)
print('Git reported the latest version as "$version", which does not fit the expected pattern.');
exit(1);
}

final List<int> parts = match.groups(<int>[1, 2, 3]).map(int.parse).toList();

if (match.group(4) == '0') {
print('This commit has already been released, as version ${parts.join(".")}.');
exit(0);
}

switch (level) {
case kX:
parts[0] += 1;
parts[1] = 0;
parts[2] = 0;
break;
case kY:
parts[1] += 1;
parts[2] = 0;
break;
case kZ:
parts[2] += 1;
break;
default:
print('Unknown increment level. The valid values are "$kX", "$kY", and "$kZ".');
exit(1);
}
version = parts.join('.');

runGit('fetch upstream', 'fetch upstream');
runGit('reset upstream/master --hard', 'check out master branch');
runGit('tag $version', 'tag the commit with the version label');

print('Your tree is ready to publish Flutter $version to the "dev" channel.');
stdout.write('Are you? [yes/no] ');
if (stdin.readLineSync() != 'yes') {
runGit('tag -d $version', 'remove the tag you did not want to publish');
print('The dev roll has been aborted.');
exit(0);
}

runGit('push upstream $version', 'publish the version');
runGit('push upstream HEAD:dev', 'land the new version on the "dev" branch');
print('Flutter version $version has been rolled to the "dev" channel!');
}

String getFullTag() {
return getGitOutput(
'describe --match v*.*.* --exclude *-* --first-parent --long --tags',
'obtain last released version number',
);
}

Match parseFullTag(String version) {
final RegExp versionPattern = new RegExp('^v([0-9]+)\.([0-9]+)\.([0-9]+)-([0-9]+)-g([a-f0-9]+)\$');
return versionPattern.matchAsPrefix(version);
}

String getGitOutput(String command, String explanation) {
final ProcessResult result = _runGit(command);
if (result.stderr.isEmpty && result.exitCode == 0)
return result.stdout.trim();
_reportGitFailureAndExit(result, explanation);
return null; // for the analyzer's sake
}

void runGit(String command, String explanation) {
final ProcessResult result = _runGit(command);
if (result.exitCode != 0)
_reportGitFailureAndExit(result, explanation);
}

ProcessResult _runGit(String command) {
return Process.runSync('git', command.split(' '));
}

void _reportGitFailureAndExit(ProcessResult result, String explanation) {
if (result.exitCode != 0) {
print('Failed to $explanation. Git exitted with error code ${result.exitCode}.');
} else {
print('Failed to $explanation.');
}
if (result.stdout.isNotEmpty)
print('stdout from git:\n${result.stdout}\n');
if (result.stderr.isNotEmpty)
print('stderr from git:\n${result.stderr}\n');
exit(1);
}
Loading

0 comments on commit 9e42e4b

Please sign in to comment.