2009-12-28 3 views
6

Я уже давно искал Google, но я был удивлен тем, что не смог найти ответ на этот, довольно простой вопрос.Меркуриальные символические ссылки на Windows

С mercurial 1.4, когда я клонирую репозиторий на клиенте Windows, символические ссылки отображаются в виде файла, содержащего путь к исходному файлу.

Я не использую символические ссылки широко, но я использую их для совместной работы с lib (libpng.so -> libpng.so.2-> libpng.so.2.43.0, например).

Окно окна здесь только для тестирования, что означает, что я был бы очень невзрачным, если бы символические ссылки на реальные копии исходного файла, это позволило бы мне скомпилировать.

Я видел http://markmail.org/message/7d353ucvivhphvvk который в основном тот же вопрос, но без реального ответа.

ответ

4

Ну, обычный ответ - это не стоит боль, по крайней мере, на уровне VCS. Конечно, решение, которое вы предлагаете, будет работать для вас, но как насчет редактирования символических копий файлов: должны ли они быть обновлены? Что происходит, когда вы редактируете исходный код и копируете файл по-другому? И так далее.

Тем не менее, никто не мешает вам реализовать расширение или простой (обновить) крючок, просматривающий манифест и переписывающий ссылки с исходным файлом. Это заставит символические ссылки выглядеть как измененные, но вы, вероятно, не заботитесь о своей тестовой настройке.

Вот код крюк (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(), '') 

Тогда в репо hgrc поставить что-то вроде:

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

И тест с бегом:

$ hg up -C somerev 

Вы действительно хотите - очистить при обновлении, так как крючок будет отмечать символические ссылки как измененные, и вы не хотите запускать слияние.

Возможно, fsrc необходимо немного почистить, но вы получите эту идею.

+0

Ну, для этого хранилища, все файлы, которые слинкованы можно прочитать только на коробках окна. У вас есть указатель на то, что вы говорите? – 2009-12-28 21:19:48

+0

Образец крюка добавлен – pmezard

+0

Большое спасибо, я все выясню. – 2009-12-29 01:25:08

3

Используя пример @ pmezard в качестве базы, вот мой брошено-вместе крюк:

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) 
Смежные вопросы