Index: tools/publish_pkg.py |
=================================================================== |
--- tools/publish_pkg.py (revision 29983) |
+++ tools/publish_pkg.py (working copy) |
@@ -19,122 +19,52 @@ |
import subprocess |
import tempfile |
-def ReplaceInFiles(paths, subs): |
- '''Reads a series of files, applies a series of substitutions to each, and |
- saves them back out. subs should be a list of (pattern, replace) tuples.''' |
- for path in paths: |
- contents = open(path).read() |
- for pattern, replace in subs: |
- contents = re.sub(pattern, replace, contents) |
- |
- dest = open(path, 'w') |
- dest.write(contents) |
- dest.close() |
- |
-def ReadVersion(file, field): |
- for line in open(file).read().split('\n'): |
- [k, v] = re.split('\s+', line) |
- if field == k: |
- return int(v) |
- |
def Main(argv): |
HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) |
- versionFile = os.path.join(HOME, 'tools', 'VERSION') |
- major = ReadVersion(versionFile, 'MAJOR') |
- minor = ReadVersion(versionFile, 'MINOR') |
- build = ReadVersion(versionFile, 'BUILD') |
- patch = ReadVersion(versionFile, 'PATCH') |
+ pkgName = os.path.basename(os.path.normpath(argv[1])) |
- # bleeding_edge has a fixed version number of 0.1.x.y . Don't allow users |
- # to publish packages from bleeding_edge. |
- if major == 0 and minor <= 1: |
- print 'Error: Do not run this script from a bleeding_edge checkout.' |
+ pubspec = os.path.join(HOME, argv[1], 'pubspec.yaml') |
+ if not os.path.exists(pubspec): |
+ print 'Error: did not find pubspec.yaml at ' + pubspec |
return -1 |
- if patch != 0: |
- version = '%d.%d.%d+%d' % (major, minor, build, patch) |
- else: |
- version = '%d.%d.%d' % (major, minor, build) |
+ with open(pubspec) as pubspecFile: |
+ lines = pubspecFile.readlines() |
- tmpDir = tempfile.mkdtemp() |
- pkgName = os.path.basename(os.path.normpath(argv[1])) |
- |
- pubspec = os.path.join(tmpDir, pkgName, 'pubspec.yaml') |
- |
- replaceInDart = [] |
- replaceInPubspec = [] |
- |
- if os.path.exists(os.path.join(HOME, argv[1], 'pubspec.yaml')): |
- # |
- # If pubspec.yaml exists, add the SDK's version number if |
- # no version number is present. |
- # |
- shutil.copytree(os.path.join(HOME, argv[1]), |
- os.path.join(tmpDir, pkgName)) |
- with open(pubspec) as pubspecFile: |
- lines = pubspecFile.readlines() |
- with open(pubspec, 'w') as pubspecFile: |
- foundVersion = False |
+ version = None |
+ foundSdkContraint = False |
+ inDependencies = False |
+ for line in lines: |
+ if line.startswith('dependencies:'): |
+ inDependencies = True |
+ elif line.startswith('environment:'): |
+ foundSdkContraint = True |
+ elif line[0].isalpha(): |
inDependencies = False |
- for line in lines: |
- if line.startswith('dependencies:'): |
- inDependencies = True |
- elif line[0].isalpha(): |
- inDependencies = False |
- if line.startswith('version:'): |
- foundVersion = True |
- if inDependencies: |
- # |
- # Within dependencies, don't print line that start with " sdk:" |
- # and strip out "{ sdk: package_name }". |
- # |
- if not line.startswith(' sdk:'): |
- line = re.sub(r'{(\s*)sdk:(\s+)([a-z0-9_]+)(\s*)}', '', line) |
- pubspecFile.write(line) |
- else: |
- pubspecFile.write(line) |
- if not foundVersion: |
- pubspecFile.write('\nversion: ' + version + '\n') |
- pubspecFile.write('environment:\n') |
- pubspecFile.write(' sdk: ">=' + version + '"\n') |
+ if line.startswith('version:'): |
+ version = line[len('version:'):].strip() |
+ if inDependencies: |
+ if line.endswith(': any'): |
+ print 'Error in %s: should not use "any" version constraint: %s' % ( |
+ pubspec, line) |
+ return -1 |
- else: |
- # |
- # If there's a lib/ directory in the package, copy the package. |
- # Otherwise, move the package's contents to lib/. |
- # |
- if os.path.exists(os.path.join(HOME, argv[1], 'lib')): |
- shutil.copytree(os.path.join(HOME, argv[1]), |
- os.path.join(tmpDir, pkgName)) |
- else: |
- os.makedirs(os.path.join(tmpDir, pkgName)) |
- shutil.copytree(os.path.join(HOME, argv[1]), |
- os.path.join(tmpDir, pkgName, 'lib')) |
+ if not version: |
+ print 'Error in %s: did not find package version.' % pubspec |
+ return -1 |
- # Create pubspec.yaml . |
- with open(pubspec, 'w') as pubspecFile: |
- pubspecFile.write('name: ' + pkgName + '_unsupported\n') |
- pubspecFile.write('author: None\n') |
- pubspecFile.write('homepage: http://None\n') |
- pubspecFile.write('version: ' + version + '\n') |
- pubspecFile.write("description: >\n") |
- pubspecFile.write(' A completely unsupported clone of Dart SDK library\n') |
- pubspecFile.write(' ' + argv[1] + ' . This package will change in\n') |
- pubspecFile.write(' unpredictable/incompatible ways without warning.\n') |
- pubspecFile.write('dependencies:\n') |
- pubspecFile.write('environment:\n') |
- pubspecFile.write(' sdk: ">=' + version + '"\n') |
+ if not foundSdkContraint: |
+ print 'Error in %s: did not find SDK version constraint.' % pubspec |
+ return -1 |
- libpath = os.path.join(HOME, argv[1], '../libraries.dart') |
- if os.path.exists(libpath): |
- # Copy libraries.dart into the package source code |
- shutil.copy(libpath, os.path.join(tmpDir, pkgName, 'lib/libraries.dart')) |
+ tmpDir = tempfile.mkdtemp() |
- # Replace '../../libraries.dart' with '../libraries.dart' |
- replaceInDart.append( |
- (r'(import|part)(\s+)(\'|")\.\./(\.\./)*libraries.dart', |
- r'\1\2\3\4libraries.dart')) |
+ # |
+ # If pubspec.yaml exists, check that the SDK's version constraint is valid |
+ # |
+ shutil.copytree(os.path.join(HOME, argv[1]), |
+ os.path.join(tmpDir, pkgName)) |
if not os.path.exists(os.path.join(tmpDir, pkgName, 'LICENSE')): |
with open(os.path.join(tmpDir, pkgName, 'LICENSE'), 'w') as licenseFile: |
@@ -167,21 +97,16 @@ |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
'''); |
- replaceInDart.append( |
- (r'(import|part)(\s+)(\'|")(\.\./)+pkg/([^/]+/)lib/', r'\1\2\3package:\5')) |
+ print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n' |
- # Replace '../*/pkg' imports and parts. |
- for root, dirs, files in os.walk(os.path.join(tmpDir, pkgName)): |
- # TODO(dgrove): Remove this when dartbug.com/7487 is fixed. |
- if '.svn' in dirs: |
- shutil.rmtree(os.path.join(root, '.svn')) |
- for name in files: |
- if name.endswith('.dart'): |
- ReplaceInFiles([os.path.join(root, name)], replaceInDart) |
- elif name == 'pubspec.yaml': |
- ReplaceInFiles([os.path.join(root, name)], replaceInPubspec) |
+ # TODO(jmesserly): this code puts things in the pub cache. Useful for testing |
+ # without actually uploading. |
+ #cacheDir = os.path.join( |
+ # os.path.expanduser('~/.pub-cache/hosted/pub.dartlang.org'), |
+ # pkgName + '-' + version) |
+ #print 'Moving to ' + cacheDir |
+ #shutil.move(os.path.join(tmpDir, pkgName), cacheDir) |
- print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n' |
subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName)) |
shutil.rmtree(tmpDir) |