2010-04-24 17 views
11

Lavoro su un repository Mercurial che è stato estratto su un filesystem Unix come ext3 su alcune macchine e FAT32 su altri.Impostazione bit di esecuzione di Mercurial su Windows

In Subversion, posso impostare la proprietà svn: eseguibile per controllare se un file deve essere contrassegnato come eseguibile al momento del check out su una piattaforma che supporta tale bit. Posso farlo indipendentemente dalla piattaforma su cui sto eseguendo SVN o dal filesystem che contiene la mia copia di lavoro.

In Mercurial, posso chmod + x ottenere lo stesso effetto se il clone si trova su un filesystem Unix. Ma come posso impostare (o rimuovere) il bit eseguibile su un file su un filesystem FAT?

risposta

8

Mercurial tiene traccia del bit di esecuzione come parte dei metadati del file. Non c'è modo di impostarlo esplicitamente in mercurial, ma tiene traccia delle modifiche apportate da chmod su unix. I file aggiunti su Windows avranno il bit di esecuzione impostato per impostazione predefinita, ma il comando di attribuzione di Windows non consente di impostarli.

Se fate una hg log -p --git vedrete il formato di patch che mostra l'alterazione del bit di esecuzione, che assomiglia a questo:

$ 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 

Se non siete in grado di ottenere su un sistema Unix per impostarli, si potrebbe probabilmente falsificare una patch come quella e hg import, ma questo è decisamente sub ottimale.

+0

Ho provato ad usare questa tecnica quando aggiungo un file e non ha funzionato. Ho aggiunto il file, creato la patch, ripristinato il repository, rimosso il file, modificato la patch sostituendo 0644 con 0755 e importato la patch. Quando si tira su un sistema Unix, la modalità è ancora 0644. Mercurial 1.9.1. –

+0

Il pull non crea il file, l'aggiornamento fa. Dopo aver tirato e fatto un 'hg log --git -p' vedi il 100755 nella patch? Quando aggiorni che il bit di esecuzione potrebbe essere disinserito se umask lo proibisce, il file system viene montato no-execute, o poche altre cose improbabili. –

+0

Osservando il log, mostra la modalità 0644, quindi per qualche motivo, non ha accettato la modalità dalla patch modificata. –

9

Per ora non è possibile modificare il bit di esecuzione se il filesystem non lo supporta (ho intenzione di supportarlo in futuro).

+0

Qualsiasi stato su questi piani? –

+0

Siamo spiacenti, non ho avuto il tempo di lavorare su questo. – tonfa

+2

Archiviato una richiesta di funzionalità: http://bz.selenic.com/show_bug.cgi?id=3659 –

1

Per Windows è necessario creare un file patch e quindi applicarlo, come Ry4an has said, ma con l'argomento --bypass su hg import. Ciò potrebbe essere fatto attraverso la creazione di un file di script PowerShell chiamato SetFileExecutable.ps1 con il testo qui sotto al suo interno

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" 
} 

eseguirlo come segue:

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

La utilizza la soluzione fornita da Matt Harbison in Mercurial's Bugzilla

Problemi correlati