Символические ссылки Mercurial в Windows

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

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

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

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

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


person Community    schedule 28.12.2009    source источник


Ответы (2)


Что ж, обычный ответ: это не стоит мучений, по крайней мере, на уровне 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

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

Возможно, fsrc нужно немного почистить, но вы поняли.

person pmezard    schedule 28.12.2009
comment
Что ж, для этого репозитория все файлы, на которые есть символические ссылки, могут быть прочитаны только в окнах. Есть ли у вас какие-либо указания на то, что вы говорите? - person ; 29.12.2009
comment
Спасибо большое, с остальным разберусь. - person ; 29.12.2009
comment
@Nicolas: Не могли бы вы опубликовать здесь свое возможное решение (или ссылку на него), если вам пришлось внести существенные изменения? Спасибо! - person Ed Brannin; 15.11.2010

Используя пример @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 )
person TBBle    schedule 23.06.2012