Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/10/2012, à 23:04

Autiwa

[Bidouillage] Info d'un dépot GIT dans un fichier source

Bonjour,

Je suis passé récemment de SVN à GIT et je découvre donc ce système depuis deux jours. J'ai à peu près compris la base, mais j'ai vu avec SVN qu'on pouvait mettre le numéro de révision en cours dans les fichiers sources, gérés par SVN, et je souhaiterais faire quelque chose de similaire.

En fait, mon idée est de pouvoir écrire, avec mon programme, le numéro de la révision dans un fichier de sortie, afin de pouvoir retrouver quelle version du programme j'avais utilisé et de pouvoir reproduire ma simulation. Je n'ai pas trouvé pour l'instant comment faire. Est-ce que l'un de vous a des idées?

Sous SVN, on ne pouvait mettre ces infos qu'en commentaire du code source, or moi je voudrais une variable ayant pour valeur (sous forme de string par exemple) la version en cours.

Merci d'avance à ceux qui se pencheront sur mon problème, c'est quelque chose que j'aimerais beaucoup faire !

Dernière modification par Autiwa (Le 04/10/2012, à 18:50)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#2 Le 03/10/2012, à 23:49

HP

Re : [Bidouillage] Info d'un dépot GIT dans un fichier source

Autiwa a écrit :

Bonjour,

Je suis passé récemment de SVN à GIT et j […] mon idée est de pouvoir écrire, avec mon programme, le numéro de la révision dans un fichier de sortie, afin de pouvoir retrouver quelle version du programme j'avais utiliser […]

git log origin/master | head -1

cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#3 Le 04/10/2012, à 07:19

Autiwa

Re : [Bidouillage] Info d'un dépot GIT dans un fichier source

Merci mais ce n'est pas vraiment ça que je veux. Je veux avoir une information de ce genre en tant que variable de mon programme. Exemple :

$ git log origin/master | head -1
commit cee38a07bd78161531049a69495c348f2f53b4c6

Je veux dans un fichier .f90 :

version = "cee38a07bd78161531049a69495c348f2f53b4c6"

que je puisse utiliser pour l'écrire lors de chaque exécution du programme dans un fichier de sortie, afin de garder une trace de la version avec laquelle j'ai créé les fichiers de sortie.

Je suis ouvert aussi à toute suggestion de méthode qui permettrait quelque chose d'équivalent, mais de manière propre et simple (si vous en connaissez une). Déjà avec git ça a l'air moins simple, parce qu'on visualise moins facilement où se situe la révision "cee38a07bd78161531049a69495c348f2f53b4c6" que la révision 229 de subversion par exemple.

J'ai lu que linus trouvait idiot de vouloir faire ça, mais d'une part je ne comprends pas pourquoi, et d'autre part je trouve très important de savoir, pour chaque instance de mon programme, quelle version a été utilisé pour des questions de reproductibilité des résultats.


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#4 Le 04/10/2012, à 11:37

HP

Re : [Bidouillage] Info d'un dépot GIT dans un fichier source

Autiwa a écrit :

Merci mais ce n'est pas vraiment ça que je veux. Je veux avoir une information de ce genre en tant que variable de mon programme. Exemple :

$ git log origin/master | head -1
commit cee38a07bd78161531049a69495c348f2f53b4c6

Je veux dans un fichier .f90 :

version = "cee38a07bd78161531049a69495c348f2f53b4c6"

Tu veux aussi que je t'écrive le sed pour remplacer commit par 'version =' ? C'est çà ?
Non, des fois vous êtes trop marrants…

Puis bon, si SVN c'était mieux, fallait le garder big_smile


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#5 Le 04/10/2012, à 15:20

Autiwa

Re : [Bidouillage] Info d'un dépot GIT dans un fichier source

Si c'était pour me répondre ça, tu aurais tout aussi bien pu me répondre RTFM...

Je voulais savoir s'il y avait une méthode un peu propre et rapide. Là je me dirige plutôt vers un script python qui va me générer un code source qui me servira à la compilation, mais ça me semble barbare comme méthode, alors je demandais au cas où, en espérant qu'il existe mieux, parce que je sais que je n'ai pas une vision d'ensemble de GIT et je voulais demander aux vieux loups de mer. Sachant qu'il existe déjà un truc, je crois que c'est $Id $ qui permet à GIT/SVN de remplacer automatiquement cette balise par le numéro de version (mais je n'ai pas trouvé comment le mettre à remplacer dans une partie non commentée (du style

version = $Id $

, ça ne fonctionne pas a priori.

Pour ce qui est d'SVN on m'a dit que GIT était plus récent et préférable, et j'ai donc opté pour GIT, sachant qu'SVN ne faisait pas ce que je voulais, je me suis donc dit que ça serait l'occasion de migrer pour GIT.

Cela dit, merci de ton aide.

Dernière modification par Autiwa (Le 04/10/2012, à 15:20)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne

#6 Le 04/10/2012, à 18:38

Autiwa

Re : [Bidouillage] Info d'un dépot GIT dans un fichier source

Pour ceux que ça intéresse, voici le module python qui me génère mon fichier source :

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Module librement utilisable
"""module to retrieve information about a git repository and create a source code containing thoses informations.

HOW TO USE : 
import git_infos
git_infos.write_infos_in_f90_file()
"""

from __future__ import print_function

__author__ = "Autiwa <autiwa@gmail.com>"
__date__ = "04 october 2012"
__version__ = "$Revision: 1.0 $"

import subprocess

def run_command(commande):
		"""lance une commande qui sera typiquement soit une liste, soit une 
		commande seule. La fonction renvoit un tuple avec la sortie, 
		l'erreur et le code de retour"""
		if (type(commande)==list):
				process = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
		elif (type(commande)==str):
				process = subprocess.Popen(commande, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
		else:
				raise TypeError("The command is neither a string, nor a list.")
		(process_stdout, process_stderr) = process.communicate()
		returncode = process.poll()
		# there is .poll() or .wait() but I don't remember the difference. For some kind of things, one of the two was not working
		return (process_stdout, process_stderr, returncode)

def get_current_branch():
	"""function that return as a string the current branch of the git repository"""
	(stdout, stderr, returnCode) = run_command("git branch")
	
	if (returnCode != 0):
		return None
	
	lines = stdout.split("\n")
	for line in lines:
		if (line[0] == '*'):
			return line[2:]

def get_current_revision():
	"""function that return as a string the current revision of the git repository"""
	(stdout, stderr, returnCode) = run_command("git log|head -1")
	
	if (returnCode != 0):
		return None
	
	commit = stdout.split()[1]
	return commit

def is_non_committed_modifs():
	"""function that return as a boolean if theere is non committed modifications in the repository"""
	(stdout, stderr, returnCode) = run_command("git diff|wc -l")
	
	if (returnCode != 0):
		return None
	
	nbLines = int(stdout)
	
	return (nbLines != 0)

def write_infos_in_f90_file():
	"""This function will create a fortran file that will store, as variable, some infos about a git repository"""
	
	F90_BEGIN = "module git_infos\n" + \
	            "! Automatically generated file through Makefile.py, do not modify manually !\n" + \
	            "implicit none\n\n"

	F90_END = "\nend module git_infos"

	
	branch = get_current_branch()
	commit = get_current_revision()
	isModifs = is_non_committed_modifs()
	
	f90source = open("git_infos.f90", 'w')
	f90source.write(F90_BEGIN)
	f90source.write("character(len=40), parameter :: commit = '%s'\n" % commit)
	f90source.write("character(len=80), parameter :: branch = '%s'\n" % branch)
	if (isModifs):
		f90source.write("character(len=80), parameter :: modifs = '/!\ There is non committed modifications'\n")
	else:
		f90source.write("character(len=80), parameter :: modifs = 'This is a pure version (without any local modifs)'\n")
	f90source.write(F90_END)
	f90source.close()
	

Dernière modification par Autiwa (Le 04/10/2012, à 18:39)


Pensez à éditer le titre du sujet (en éditant le premier message) pour rajouter un "[Résolu]" ça évite à ceux qui veulent donner un coup de main, d'ouvrir un sujet où il n'y a plus d'aide à donner.

Hors ligne