2010-04-24 16 views
11

Trabajo en un repositorio de Mercurial que se comprueba en un sistema de archivos Unix como ext3 en algunas máquinas y FAT32 en otras.Configuración del bit de ejecución de Mercurial en Windows

En Subversion, puedo establecer la propiedad svn: executable para controlar si un archivo debe marcarse como ejecutable cuando se desprotege en una plataforma que admite dicho bit. Puedo hacer esto independientemente de la plataforma en la que estoy ejecutando SVN o del sistema de archivos que contiene mi copia de trabajo.

En Mercurial, puedo chmod + x para obtener el mismo efecto si el clon está en un sistema de archivos Unix. Pero, ¿cómo puedo establecer (o eliminar) el bit ejecutable en un archivo en un sistema de archivos FAT?

Respuesta

8

Mercurial rastrea el bit de ejecución como parte de la metadata del archivo. No hay forma de establecer explícitamente en mercurial, pero rastrea los cambios realizados por chmod en Unix. Los archivos agregados en Windows tendrán el bit de ejecución establecido por defecto, pero el comando attrib de Windows no permite configurarlos.

Si lo hace un hg log -p --git verá el formato de parche que muestra la alteración del bit de ejecución, que se ve así:

$ hg log --git -p 
changeset: 1:0d9a70aadc0a 
tag:   tip 
user:  Ry4an Brase <[email protected]> 
date:  Sat Apr 24 10:05:23 2010 -0500 
summary:  added execute 

diff --git a/that b/that 
old mode 100644 
new mode 100755 

changeset: 0:06e25cb66089 
user:  Ry4an Brase <[email protected]> 
date:  Sat Apr 24 10:05:09 2010 -0500 
summary:  added no execute 

diff --git a/that b/that 
new file mode 100644 
--- /dev/null 
+++ b/that 
@@ -0,0 +1,1 @@ 
+this 

Si no es capaz de conseguir en un sistema UNIX para configurarlos, probablemente podría falsificar un parche como ese y hg import, pero definitivamente no es óptimo.

+0

Intenté utilizar esta técnica al agregar un archivo y no funcionó. Agregué el archivo, creé el parche, revirtí el repositorio, eliminé el archivo, edité el parche que reemplazó 0644 con 0755 e importé el parche. Al tirar de un sistema Unix, el modo sigue siendo 0644. Mercurial 1.9.1. –

+0

La extracción no crea el archivo, la actualización sí lo hace. Después de tirar y hacer un 'hg log --git -p', ¿ves el 100755 en el parche? Cuando actualice ese bit de ejecución, podría deshacerse si umask lo prohíbe, el sistema de archivos está montado sin ejecutar, o algunas otras cosas poco probables. –

+0

Al mirar el registro, muestra el modo 0644, por lo que por alguna razón, no aceptó el modo del parche editado. –

9

Por el momento no puede cambiar el bit de ejecución si el sistema de archivos no lo admite (tengo la intención de admitirlo en el futuro).

+0

Cualquier estado de estos planes? –

+0

Lo siento, no he tenido tiempo para trabajar en esto. – tonfa

+2

Presentó una solicitud de función: http://bz.selenic.com/show_bug.cgi?id=3659 –

1

Para Windows necesita crear un archivo de parche y luego aplicarlo, como Ry4an has said, pero con el argumento --bypass al hg import. Esto podría hacerse mediante la creación de un archivo de script de PowerShell llamado SetFileExecutable.ps1 con el siguiente texto en su interior

param (
    [String]$comment = "+execbit", 
    [Parameter(Mandatory=$true)][string]$filePathRelativeTo, 
    [Parameter(Mandatory=$true)][string]$repositoryRoot 
) 

if(Test-Path -Path "$($repositoryRoot)\.hg" -PathType Container) 
{ 
    if(Test-Path -Path "$($repositoryRoot)\$($filePathRelativeTo)" -PathType Leaf) 
    { 
    $fileRelativePath = $fileRelativePath.Replace('\', '/') 

    $diff = "$comment" + [System.Environment]::NewLine + 
     [System.Environment]::NewLine + 
     "diff --git a/$fileRelativePath b/$fileRelativePath" + [System.Environment]::NewLine + 
     "old mode 100644" + [System.Environment]::NewLine + 
     "new mode 100755" 

    Push-Location 
    cd $repositoryRoot 
    $diff | Out-File -Encoding 'utf8' $env:tmp\exebit.diff 
    hg import --bypass -m "$comment" $env:tmp\exebit.diff 
    Pop-Location 
    } 
    else 
    { 
    Write-Host "filePathRelativeTo must the location of a file relative to repositoryRoot" 
    } 
} 
else 
{ 
    Write-Host "repositoryRoot must be the location of the .hg folder" 
} 

ejecutarlo de la siguiente manera:

.\SetFileExecutable.ps1" -comment "Marking file as executable" -fileRelativePath mvnw -repositoryRoot "c:\myrepo" 

El utiliza la solución aportada por Matt Harbison in Mercurial's Bugzilla

Cuestiones relacionadas