Exécuter les commandes de la ligne de commande Tortoise SVN avec une fenêtre masquée

J’ai Tortoise SVN avec une interface de ligne de commande installée. Le chemin d’installation est C:\Program Files\TortoiseSVN\binsvn.exe est utilisé chaque fois que j’utilise une commande SVN.

J’ai développé une application Ruby Windows qui est exécutée en arrière-plan. Cette application exécute la commande comme

 svn info "#{path_to_repository}" 

Cette commande appelle svn.exe comme je l’ai mentionné.

Le problème est que svn.exe clignoter une invite de commande pour une seconde et se termine, donc si je lance dix fois svn info pour dix repositorys différents, l’écran scintille dix fois que cette commande est développée pour fonctionner en temps opportun. dix fois régulièrement.

Ce dont j’ai besoin est un moyen d’exécuter des commandes SVN via Tortoise SVN sans que svn.exe apparaisse à l’écran et se ferme.

Ruby dispose de nombreux moyens pour exécuter une commande en shell . Cependant, avec toutes les options, une fenêtre contextuelle en ligne de commande semble apparaître lors de l’utilisation de l’application graphique.

Selon les détails que vous recherchez dans svn info , vous pouvez utiliser une option comme WebSVN et voir si vous souhaitez supprimer l’interface graphique ou obtenir des données à partir de son stream RSS. Jetez un oeil sur le site de démonstration de ce produit .

Si vous avez des besoins très spécifiques et minimaux, vous pouvez également choisir de créer une petite API REST capable d’interroger le serveur Subversion à l’aide de la ligne de commande. Vous pouvez dans ce cas appeler cette API REST pour récupérer les données et éviter de faire apparaître des fenêtres de command .

Si vous avez peu de temps ou ne disposez pas d’une infrastructure de serveur pour héberger l’API REST, vous pouvez alors envisager de créer une application Ruby qui exécute un serveur de sockets et peut exécuter la commande shell lors de la réception de commandes du client. Ensuite, vous pouvez faire en sorte que votre application graphique se connecte au serveur de socket en utilisant client de socket et demande à l’application serveur d’exécuter svn info et de retourner le résultat. Parcourez le didacticiel sur la création de telles applications interactives . Vous pouvez alors choisir de les exécuter côte à côte sur le même PC.

Une autre alternative consiste à utiliser les liaisons Ruby SVN . Cela peut nécessiter des fouilles pour que cela fonctionne.

Voici un code de démarrage rapide:

server.rb – un serveur TCP Ruby qui accepte les commandes et les exécute en shell

 require 'socket' server = TCPServer.open(2000) # Socket to listen on port 2000 puts "Listening now #{server.addr}" loop { Thread.start(server.accept) do |client| cmd = client.gets puts "Processing #{cmd} from #{client.peeraddr}" IO.popen(cmd) { |s| result = []; while (line = s.gets) do client.puts line.chop end; } client.close end } 

app.rb Une application GUI Shoes qui envoie la commande svn info au serveur TCP en cours d’exécution par server.rb

nécessite ‘socket’

 Shoes.app { stack do @push = button "Get SVN Info" @note = para "" end @push.click { hostname = 'localhost' port = 2000 result = [] s = TCPSocket.open(hostname, port) s.puts "svn info trunk/backend" while line = s.gets result << line.chop end s.close @note.replace result.join("\n") } } 

app.rb devrait être lancé en utilisant la commande shoes app.rb

entrer la description de l'image ici

entrer la description de l'image ici

Ce comportement n’est pas spécifique à Ruby mais à l’interpréteur de ligne de commande Windows. Il y a plusieurs façons de contourner le problème.

  • Essayez d’exécuter la commande svn préfixée par cmd.exe /C qui ne devrait pas flasher la fenêtre d’invite de commandes. Une variante consiste à utiliser start /min comme préfixe. Cela ne fonctionne pas dans toutes les circonstances et je n’ai pas de Ruby on Windows à scope de main pour vérifier.
  • Créez un wrapper .vbs pour votre commande. Puisque .vbs n’est pas géré par l’interpréteur de ligne de commande, sa fenêtre ne sera pas créée. Voir ” Comment exécuter un fichier de commandes sans lancer une” fenêtre de commande “? ” Pour plus de détails.
  • La meilleure option consiste à utiliser un gem wrapper WinAPI pour accéder à la fonction ShellExecute , qui est assez flexible:

     require 'win32ole' # Create an instance of the Windows Shell object... shell = WIN32OLE.new('Shell.Application') # The shell object's ShellExecute method performs a specified operation on a specified file. The syntax is... shell.ShellExecute(FILE, ARGUMENTS, DIRECTORY, OPERATION, SHOW) 

    Cet exemple est tiré de ” Lancement d’applications et d’impression de documents avec le shell Windows ” où vous pouvez trouver plus de détails.

    Pour votre but ce serait quelque chose comme

     shell.ShellExecute('svn.exe', 'info', path_to_repository, 'open', 0) 

En savoir plus sur l’utilisation de ShellExecute .