| Index: dart/tools/publish_pkg.py
 | 
| ===================================================================
 | 
| --- dart/tools/publish_pkg.py	(revision 29987)
 | 
| +++ dart/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)
 | 
|  
 | 
| 
 |