User Tools

Site Tools


windows:hgsync

Mercurial Sync Script

Client Side

merge.bat

merge.cmd
echo %1
copy %1 %1.%COMPUTERNAME%.conflict
del /Q %1.orig
del /Q %1.orig
exit 1

merge_other.cmd

merge_other.bat
echo %2
copy %2 %1.%COMPUTERNAME%.conflict
del /Q %1.orig
exit 1

hgsync_login_ssh.cmd

hgsync_login_ssh.cmd
@echo off
 
set LOCAL_REPO="%USERPROFILE%\Documents"
set REMOTE_REPO="h:\Documents"
set SSH_REPO="ssh://%USERNAME%@sfs/Documents"
set SSHHOST="sfs"
set PATH=C:\Progra~1\Mercurial;C:\Windows\System32\OpenSSH;C:\Windows\System32;
 
 
 
If exist "%USERPROFILE%\.ssh\id_rsa" (
    If exist "%USERPROFILE%\.ssh\known_hosts" (
		echo SSH env ready
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
	) else (
		echo Setting up SSH env
		mkdir %USERPROFILE%\.ssh
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
		ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id"
	) 
) else (
		echo Setting up SSH env
		mkdir %USERPROFILE%\.ssh
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
		ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id"
)
 
If exist "%LOCAL_REPO%\.hg" (
    If exist "%REMOTE_REPO%\.hg" (
		goto Remoteandlocal
	) else (
		goto onlylocal
	)
) else If exist "%REMOTE_REPO%\.hg" (
    goto onlyremote
) else If exist "%LOCAL_REPO%\.hg" (
	goto onlylocal
) else (
	goto missingonboth
)
 
goto end

 
:Remoteandlocal
Echo File exist remote and local
c:
cd %LOCAL_REPO%
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg pull %SSH_REPO%
hg merge -t "W:\scripts\merge.bat"
hg resolve -t internal:other --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_login.sh"
echo "remote update end"
hg pull %SSH_REPO%
hg update
goto END

:onlylocal
Echo File exist only local
echo "remote init start"
ssh %USERNAME%@sfs "/scripts/hgsync_init.sh"
echo "remote init end"
c: 
cd %LOCAL_REPO%
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_login.sh"
echo "remote update end"
hg pull %SSH_REPO%
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
h:
cd %SSH_REPO%
hg update
goto END

:onlyremote
Echo File exist only remote
c:
cd %LOCAL_REPO%
hg init
hg pull %SSH_REPO%
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg merge -t "W:\scripts\merge.bat"
hg resolve -t internal:other --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_update.sh"
echo "remote update end"
goto END

:missingonboth
Echo missing on both
mkdir %LOCAL_REPO%
C:
cd %LOCAL_REPO%
hg init
echo "remote init start"
ssh %USERNAME%@sfs "/scripts/hgsync_init.sh"
echo "remote init end"
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh"
echo "remote update end"
hg pull %SSH_REPO%
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_update.sh"
echo "remote update end"
goto END

:END
echo done

hgsync_logout_ssh.cmd

hgsync_logout_ssh.cmd
@echo off
 
set LOCAL_REPO="%USERPROFILE%\Documents"
set REMOTE_REPO="h:\Documents"
set SSH_REPO="ssh://%USERNAME%@sfs/Documents"
set SSHHOST="sfs"
set PATH=C:\Progra~1\Mercurial;C:\Windows\System32\OpenSSH;C:\Windows\System32;
 
If exist "%USERPROFILE%\.ssh\id_rsa" (
    If exist "%USERPROFILE%\.ssh\known_hosts" (
		echo SSH env ready
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
	) else (
		echo Setting up SSH env
		mkdir %USERPROFILE%\.ssh
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
		ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id"
	) 
) else (
		echo Setting up SSH env
		mkdir %USERPROFILE%\.ssh
		xcopy /Y /S H:\.ssh %USERPROFILE%\.ssh\
		ssh -oStrictHostKeyChecking=no %USERNAME%@%SSHHOST% "id"
)
 
If exist "%LOCAL_REPO%\.hg" (
    If exist "%REMOTE_REPO%\.hg" (
		goto Remoteandlocal
	) else (
		goto onlylocal
	)
) else If exist "%REMOTE_REPO%\.hg" (
    goto onlyremote
) else If exist "%LOCAL_REPO%\.hg" (
	goto onlylocal
) else (
	goto missingonboth
)

 
 
 
:Remoteandlocal
Echo File exist remote and local
c:
cd %LOCAL_REPO%
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg pull %SSH_REPO%
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push  %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh"
echo "remote update end"
hg pull  %SSH_REPO%
hg update
goto END

:onlylocal
Echo File exist only local
c:
cd %LOCAL_REPO%
echo "remote init start"
ssh %USERNAME%@sfs "/scripts/hgsync_init.sh"
echo "remote init end"
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg push  %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_login.sh"
echo "remote update end"
hg pull  %SSH_REPO%
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_update.sh"
echo "remote update end"
goto END

:onlyremote
Echo File exist only remote
c:
cd %LOCAL_REPO%
hg init
hg pull  %SSH_REPO%
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_update.sh"
echo "remote update end"
goto END

:missingonboth
Echo missing on both
mkdir %LOCAL_REPO%
C:
cd %LOCAL_REPO%
hg init
echo "remote init start"
ssh %USERNAME%@sfs "/scripts/hgsync_init.sh"
echo "remote init end"
hg addremove
hg --config ui.username=%USERNAME% commit -m "update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_logout.sh"
echo "remote update end"
hg pull %SSH_REPO%
hg merge -t "W:\scripts\merge_other.bat"
hg resolve -t internal:local --all
hg update
hg addremove
hg --config ui.username=%USERNAME% commit -m "merge update from %COMPUTERNAME%"
hg push %SSH_REPO%
echo "remote update start"
ssh %USERNAME%@sfs "/scripts/hgsync_update.sh"
echo "remote update end"
goto END

:END
echo done

Server Side

userkeygen.sh

/scripts/user_keygen.sh
#!/bin/bash
 
if [ "echo ${PAM_USER} | grep +" != "" ]
then
        TMP="`echo ${PAM_USER} | cut -d \"+\" -f2`"
        PAM_USER="${TMP}"
        #echo ${PAM_USER}
fi
 
USERHOME="/vol1/homes/${PAM_USER}"
 
echo "`date` ${PAM_USER} ${USERHOME} ${PAM_SERVICE}" >> /tmp/pam_exec.log
 
if [ "`ls ${USERHOME}/.ssh/authorized_keys`" = "" ]
then
        echo "Keys Missing"
        cd ${USERHOME}
        mkdir .ssh
        cd .ssh/
        ssh-keygen -t rsa -N "" -f id_rsa
        cp id_rsa.pub authorized_keys
        chmod -R 700 ${USERHOME}
        chown -R ${PAM_USER} ${USERHOME}
 
else
        echo "Keys Present"
        chmod -R 700 ${USERHOME}
        chown -R ${PAM_USER} ${USERHOME}
 
fi

hgsync_init.sh

/scripts/hgsync_init.sh
#!/bin/sh
 
mkdir -p ~/Documents
cd ~/Documents
hg init

hgsync_login.sh

/scripts/hgsync_login.sh
#!/bin/sh
 
cd ~/Documents
hg commit -m "merge update"
hg merge -t internal:local
hg update
hg addremove
hg commit -m "merge update"

hgsync_logout.sh

/scripts/hgsync_logout.sh
#!/bin/sh
 
cd ~/Documents
hg commit -m "merge update"
hg merge -t internal:other
hg update
hg addremove
hg commit -m "merge update"

hgsync_update.sh

/scripts/hgsync_update.sh
#!/bin/sh
 
cd ~/Documents
hg update

/etc/pam.d/common-session

...
session    required    pam_mkhomedir.so skel=/etc/skel/ umask=0077
session    optional    pam_exec.so /bin/bash  /scripts/user_keygen.sh
...
windows/hgsync.txt · Last modified: 2021/10/20 16:14 by tschulz