Programlı SVN revizyon numarası almak nasıl?

9 Cevap php

Like this question, ama aslında SVN sunucusunu sorgulamak için gerek kalmadan. Bu web tabanlı bir proje olduğu, bu yüzden (bu kötü bir fikir olduğunu neden kimse bana tavsiyelerde bulunabilir sürece) Ben sadece kamu görünümünde olarak depo kullanacağız rakam. Bu bilgileri bir yere .svn klasöründe bir dosya olduğunu varsayalım, ama nerede ve nasıl bunu ayrıştırmak? Ben sağ alt köşesindeki revizyon sahip SO ne gibi bir şey yapmak istiyorum.

Elinizde veya doğru yönde sadece bir noktada bunu varsa Python veya PHP kod takdir.

9 Cevap

Subversion tam olarak bu amaç için svnversion aracı içerir. Bir çalışma kopyası aslında yerel değişiklikler olabilir, veya revizyonlar bir karışımı oluşabilir. svnversion onu nasıl bilir; bağlantılı belgelerinde örneklere bakın.

Sen svnversion böyle python çağırabilirsiniz:

import subprocess

def svnversion():
    p = subprocess.Popen("svnversion", shell=True, \
       stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    return stdout

Ben muhtemelen post-commit kanca kullanarak web sitesi içinde bir yere bir metin dosyasına sürüm numarasını yazmak ve sayfasını yüklerken sonra sadece bu dosyayı okumak istiyorum.

More on using hooks here

Siz komut satırında, "svn info", kullanarak bir çıkış geçerli revizyon numarası alabilirsiniz.

Örneğin:

$ svn info
Chemin : .
URL : http://.../trunk
Racine du dépôt : http://...
UUID du dépôt : 128b9c1a-...-612a326c9977
Révision : 185
Type de nœud : répertoire
Tâche programmée : normale
Auteur de la dernière modification : ...
Révision de la dernière modification : 185
Date de la dernière modification: 2009-09-28 20:12:29 +0200 (lun. 28 sept. 2009)

Lokalize var Not; Linux üzerinde iseniz, size kullanarak deneyebilirsiniz:

$ LANG=en svn info
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is en
svn: warning: please check that your locale name is correct
Path: .
URL: http://.../trunk
Repository Root: http://...
Repository UUID: 128b9c1a-...-612a326c9977
Revision: 185
Node Kind: directory
Schedule: normal
Last Changed Author: mzeis
Last Changed Rev: 185
Last Changed Date: 2009-09-28 20:12:29 +0200 (Mon, 28 Sep 2009)

PHP bunu kullanarak olsa, XML olarak almak daha yararlı olabilir (easier to parse, and not locale-aware) olabilir:

$ svn info --xml
<?xml version="1.0"?>
<info>
<entry
   kind="dir"
   path="."
   revision="185">
<url>http://.../trunk</url>
<repository>
<root>http://...</root>
<uuid>128b9c1a-...-612a326c9977</uuid>
</repository>
<wc-info>
<schedule>normal</schedule>
<depth>infinity</depth>
</wc-info>
<commit
   revision="185">
<author>...</author>
<date>2009-09-28T18:12:29.130307Z</date>
</commit>
</entry>
</info>

Sadece entry etiketinin simplexml_load_string on that, and fetch the revision özniteliği kullanın.


Note that I would not do that on each page view : not quite as fast as one would hope for your application.

Ve yapılandırma dosyası çeşit depolamak - Ben, daha sonra, üretim sunucusuna gönderecek arşiv oluştururken Bunun yerine, ben bu revizyon numarası almak istiyorum.

Bu şekilde, üretim sunucusuna svn komutunu kullanmak gerekmez, ve ya bu sunucu üzerinde ödeme yapmak gerekmez.

Bu svn sürümü 1.6.2 için çalışıyor. Fakat farklı SVN sürümleri. Svn klasörün farklı biçimlerde kullanmak, uyardı.

<?php

$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries');
preg_match("/dir\n(.+)/", $contents, $matches);
$svnRevision = $matches[1];

print "This Directory's SVN Revsion = $svnRevision\n";

I .svn/entities içeriğini okuyarak, MediaWiki tarafından kullanılan çözüm gibi. Bu soruya ilk cevap kontrol: http://stackoverflow.com/questions/16248/getting-the-subversion-repository-number-into-code

Eğer bir Python uygulaması arıyorsanız, pysvn, geçerli revizyon dahil info command almak için ayrıntıları çağırabilirsiniz check out:

entry = info( path )

Lance ardından, burada bir komut satırı tek-liner.

svn log -q --limit 1  http://svnbox/path/to/repo/trunk \
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];'

Ben bu oldukça eski olduğunu biliyorum, ama ben benim web uygulamaları için PHP bunu nasıl sunuyoruz düşündüm:

App bir PHP dosyasında bu koymak ve "Tarih Revizyon Yazar HeadURL Id" (dosyasında anahtar kelime ikamesi) için SVN Anahtar özelliğini ayarlayın.

$SVN_rev = "\$LastChangedRevision$";
$SVN_headURL = "\$HeadURL$";

function stripSVNstuff($s)
{
    $s = substr($s, strpos($s, ":")+1);
    $s = str_replace("$", "", $s);
    return trim($s);
}

Svn kaynak dosyasına anahtar kelime değiştirme yapar sonra Yani, $ SVN_rev çizgi gibi görünecektir:

$SVN_rev = "\$LastChangedRevision: 6 $";

böylece stripSVNstuff ($ SVN_rev) çıkış (tırnak işaretleri olmadan) "6" olacaktır.

Sadece komut satırı kabuk ve bilgi svn çalıştırabilir. Sadece bu karışık revizyon olabilir unutmayın. Ayrıca bir svn up çalıştırabilir ve STDOUT son satırı size revizyon numarası verecektir.

Veya, svn API kullanmak isteyen? Ayrıca wc mevcut revizyonları ile bir dosyada bir belirteci değiştirmek için kullanılan SubWCRev gelen TortoiseSVN koduna bakmak isteyebilirsiniz.