Commits

Anonymous committed a41d1c0

Added ``--local-snapshots-ok`` flag, to allow building eggs from
projects installed using ``setup.py develop``. (backport from trunk)

  • Participants
  • Parent commits 94e2ab7
  • Branches setuptools-0.6

Comments (0)

Files changed (5)

File EasyInstall.txt

 even if they're installed elsewhere on the machine, and ``-d`` indicates the
 directory to place the eggs in.)
 
+You can also build the eggs from local development packages that were installed
+with the ``setup.py develop`` command, by including the ``-l`` option, e.g.::
+
+    easy_install -zmaxld somedir SomePackage
+
+This will use locally-available source distributions to build the eggs.
+
 
 Packaging Others' Projects As Eggs
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     script directories, and does not override the ones set on the command line
     or in a configuration file.
 
+``--local-snapshots-ok, -l`` (New in 0.6c6)
+    Normally, EasyInstall prefers to only install *released* versions of
+    projects, not in-development ones, because such projects may not
+    have a currently-valid version number.  So, it usually only installs them
+    when their ``setup.py`` directory is explicitly passed on the command line.
+    
+    However, if this option is used, then any in-development projects that were
+    installed using the ``setup.py develop`` command, will be used to build
+    eggs, effectively upgrading the "in-development" project to a snapshot
+    release.  Normally, this option is used only in conjunction with the
+    ``--always-copy`` option to create a distributable snapshot of every egg
+    needed to run an application.
+
+    Note that if you use this option, you must make sure that there is a valid
+    version number (such as an SVN revision number tag) for any in-development
+    projects that may be used, as otherwise EasyInstall may not be able to tell
+    what version of the project is "newer" when future installations or
+    upgrades are attempted.
+
 
 .. _non-root installation:
 
 
  * Fixed distutils-style scripts originally built on Windows having their line
    endings doubled when installed on any platform.
+
+ * Added ``--local-snapshots-ok`` flag, to allow building eggs from projects
+   installed using ``setup.py develop``.
   
 0.6c5
  * Fixed ``.dll`` files on Cygwin not having executable permisions when an egg

File pkg_resources.py

                         if not line.strip(): continue
                         for item in find_distributions(os.path.join(path_item,line.rstrip())):
                             yield item
-
+                        break
 register_finder(ImpWrapper,find_on_path)
 
 _namespace_handlers = {}

File setuptools/command/develop.py

         self.uninstall = None
         self.egg_path = None
         easy_install.initialize_options(self)
-
+        self.setup_path = None
 
 
 
                 " directory to "+target
         )
 
+        
         # Make a distribution for the package's source
         self.dist = Distribution(
             target,
             project_name = ei.egg_name
         )
 
-
-
-
-
-
-
-
-
-
-
+        p = self.egg_base.replace(os.sep,'/')
+        if p!= os.curdir:
+            p = '../' * (p.count('/')+1)
+        self.setup_path = p
+        p = normalize_path(os.path.join(self.install_dir, self.egg_path, p))
+        if  p != normalize_path(os.curdir):
+            raise DistutilsOptionError(
+                "Can't get a consistent path to setup script from"
+                " installation directory", p, normalize_path(os.curdir))
 
 
     def install_for_development(self):
         log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
         if not self.dry_run:
             f = open(self.egg_link,"w")
-            f.write(self.egg_path)
+            f.write(self.egg_path + "\n" + self.setup_path)
             f.close()
         # postprocess the installed distro, fixing up .pth, installing scripts,
         # and handling requirements
         if os.path.exists(self.egg_link):
             log.info("Removing %s (link to %s)", self.egg_link, self.egg_base)
             contents = [line.rstrip() for line in file(self.egg_link)]
-            if contents != [self.egg_path]:
+            if contents not in ([self.egg_path], [self.egg_path, self.setup_path]):
                 log.warn("Link points to %s: uninstall aborted", contents)
                 return
             if not self.dry_run:

File setuptools/command/easy_install.py

         ('editable', 'e', "Install specified packages in editable form"),
         ('no-deps', 'N', "don't install dependencies"),
         ('allow-hosts=', 'H', "pattern(s) that hostnames must match"),
+        ('local-snapshots-ok', 'l', "allow building eggs from local checkouts"),
     ]
     boolean_options = [
         'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy',
         'delete-conflicting', 'ignore-conflicts-at-my-risk', 'editable',
-        'no-deps',
+        'no-deps', 'local-snapshots-ok',
     ]
     negative_opt = {'always-unzip': 'zip-ok'}
     create_index = PackageIndex
 
-
     def initialize_options(self):
-        self.zip_ok = None
+        self.zip_ok = self.local_snapshots_ok = None
         self.install_dir = self.script_dir = self.exclude_scripts = None
         self.index_url = None
         self.find_links = None
                 self.find_links = self.find_links.split()
         else:
             self.find_links = []
-
+        if self.local_snapshots_ok:
+            self.package_index.scan_egg_links(self.shadow_path+sys.path)
         self.package_index.add_find_links(self.find_links)
         self.set_undefined_options('install_lib', ('optimize','optimize'))
         if not isinstance(self.optimize,int):
 
         self.outputs = []
 
-
     def run(self):
         if self.verbose<>self.distribution.verbose:
             log.set_verbosity(self.verbose)

File setuptools/package_index.py

         else:
             self.warn(msg, url)
 
+    def scan_egg_links(self, search_path):
+        for item in search_path:
+            if os.path.isdir(item):
+                for entry in os.listdir(item):
+                    if entry.endswith('.egg-link'):
+                        self.scan_egg_link(item, entry)
 
-
-
-
-
-
-
-
-
-
-
-
-
-
+    def scan_egg_link(self, path, entry):
+        lines = filter(None, map(str.strip, file(os.path.join(path, entry))))
+        if len(lines)==2:
+            for dist in find_distributions(os.path.join(path, lines[0])):
+                dist.location = os.path.join(path, *lines)
+                dist.precedence = SOURCE_DIST
+                self.add(dist)
 
 
     def process_index(self,url,page):