2009-12-28 18 views
6

he estado buscando en Google desde hace un tiempo, pero me sorprendió no encontrar una respuesta a esta, bastante simple, pregunta.enlaces simbólicos Mercurial en Windows

Con mercurial 1.4, cuando clono un repositorio en un cliente de Windows, los enlaces simbólicos aparecen como un archivo que contiene la ruta al archivo original.

No consumo enlaces simbólicos ampliamente, pero sí los utilizan para el manejo compartido lib (libpng.so -> libpng.so.2-> libpng.so.2.43.0 por ejemplo).

El cuadro de ventanas está aquí solo para probarlo, lo que significa que estaría muy contento si los enlaces simbólicos fueran copias reales del archivo original, esto me permitiría compilar.

Vi http://markmail.org/message/7d353ucvivhphvvk que es básicamente la misma pregunta, pero sin una respuesta real.

Respuesta

4

Bueno, la respuesta habitual es que no vale la pena, al menos a nivel de VCS. Por supuesto, la solución que se propone funcionaría para usted, pero ¿qué pasa con la edición de copias de archivo del enlace simbólico: en caso de que se actualicen así? ¿Qué sucede cuando editas el archivo fuente y copia de una manera diferente? Etcétera.

Aún así, nadie le impide implementar una extensión, o un simple (actualización) enganche que escanea el manifiesto y sobreescribe enlaces con el archivo original. Hará que los enlaces simbólicos se vean como cambiados, pero probablemente no le importe la configuración de la prueba.

Aquí está el código de enlace (symcopy.py):

def symcopy(ui, repo, hooktype, parent1, **kwargs): 
    ctx = repo[parent1] 
    for f in ctx: 
     if 'l' in ctx.flags(f): 
      # overwrite symlink with original file content 
      print 'overwriting', f 
      fsrc = ctx[f].data() 
      repo.wwrite(f, ctx[fsrc].data(), '') 

Luego, en el repositorio hgrc poner algo como:

[hooks] 
update = python:c:/path/to/symcopy.py:symcopy 

Y prueba con el correr:

$ hg up -C somerev 

¿de verdad quieres --clean cuando se actualiza desde el gancho marcará como enlaces simbólicos modificado y que no quieren desencadenar una fusión.

Quizás fsrc se limpien un poco, pero ya se ha hecho una idea.

+0

Bueno, de ese repositorio, todos los archivos que se enlace simbólico sólo se pueden leer en las cajas de las ventanas. ¿Tienes algún indicio sobre lo que dices? –

+0

gancho Muestra añadió – pmezard

+0

Muchas gracias, me ocurrirá el resto fuera. –

3

Usando ejemplo de @ pmezard como base, aquí está mi-juntos tirado gancho:

import os 
import os.path 
import string 
import subprocess 

def symlinktojunction(ui, repo, hooktype, parent1, **kwargs): 
    ctx = repo[ parent1 ] 
    for f in ctx: 
     if 'l' in ctx.flags(f): 
      fsrc = ctx[ f ].data() 
      winf = string.replace(f, "/", "\\") 
      winfsrc = string.replace(fsrc, "/", "\\") 
      base = os.path.dirname(winf) 
      winfsrc = os.path.join(base, winfsrc) 
      print "'%s' is symlink to '%s'" % (f, fsrc) 
      os.remove(winf) 
      subprocess.call([ "mklink", "/j", winf, winfsrc ], shell = True) 
Cuestiones relacionadas