[JAVA] Créer un client GUI hebdomadaire git [4] diff et al.

Quelle était la publication hebdomadaire

Résumé jusqu'à la dernière fois

[\ 1 ] connaissances de base stage / unstage

5 choses à faire pour la scène / désétape ligne par ligne

1. Sortie diff comme le patch d'origine 2. Sélectionnez la ligne que vous souhaitez mettre en scène / désinstaller 3. Modifier le corps du morceau `4. Recalculez l'en-tête du morceau «5. Appliquer le patch final»

[\ 2 ] étape / capture incomplète de l'étape

Je ne pouvais pas utiliser JGit, alors j'ai parlé d'utiliser git.exe.

[\ 3 ] édition du patch stage / unstage

3. Modifier le corps du morceau`` 4. Recalculez l'en-tête du morceau``

Cette fois

`1. Sortie diff comme le patch d'origine

diff ne suffit pas

Il est facile d'obtenir un diff.

git diff -p
git diff -p --cached

Cela n'inclura pas les fichiers non suivis nouvellement ajoutés. Donc cela demande un petit effort

git ls-files -o --exclude-standard

Vous pouvez obtenir la liste avec> et obtenir le diff avec la commande suivante.

git diff --no-index /dev/null [untracked file name]

Soyez assuré que même Windows se comparera à / dev / null. Si vous voulez juste voir la différence, c'est un nouveau fichier, donc vous pouvez regarder le fichier lui-même, Dans le contexte actuel, ce que je veux, c'est un diff de format de patch qui puisse être appliqué, je l'ai donc présenté ici.

Analyser diff pour obtenir (ne pas) le nom de fichier

Cependant, non seulement le diff lui-même, mais également le nom du fichier sont nécessaires dans diverses situations.

Obtenez avec commande

git diff --name-status 
git diff --name-status --cached

Il est pratique de connaître l'état (nouvel ajout, changement, renommer, supprimer) --Name-status est meilleur que l'option --name-only.

Le nom du fichier est inclus dans le diff lui-même, mais cela peut être difficile.

[M] Changer

Le début du diff ressemble à ceci

diff --git a/target.txt b/target.txt
index 0b669b6..5c30060 100644
--- a/target.txt
+++ b/target.txt

Cela semble facile à comprendre même à partir de diff.

[A] Nouvel ajout

En cas de nouvel ajout, cela ressemble à ceci.

diff --git a/end_with_linebreak/with space.txt b/end_with_linebreak/with space.txt
new file mode 100644
index 0000000..093dc04
--- /dev/null
+++ b/end_with_linebreak/with space.txt	

Comme vous pouvez le voir dans cet exemple, s'il y a un espace dans le nom du fichier, c'est un peu ennuyeux de l'obtenir à partir de la première ligne. Il est donc plus facile d'utiliser le nom de fichier sur la ligne +++ b /.

[R] Renommer

Renommer est comme ça, et c'est une victoire facile car il y a plus d'informations.

diff --git a/names.txt b/names_.txt
similarity index 96%
rename from names.txt
rename to names_.txt
index bcfb685..f915764 100644
--- a/names.txt
+++ b/names_.txt

Le changement de nom apparaît essentiellement comme un diff du fichier dans l'index. Pour les fichiers de l'arbre de travail qui ne sont pas répertoriés dans l'index, c'est-à-dire avec la commande git diff

Apparaît sous la forme de. Si vous spécifiez deux noms de fichiers et que vous les comparez, vous pourrez peut-être obtenir un diff qui sera traité comme un changement de nom, Je ne sais pas comment trouver ces deux fichiers. Dans le cas de git diff --cached, git le trouvera pour vous.

Au fait, cela ressemble à ceci en binaire. On dit que renommer de renommer vers n'est pas fixe et dépend de l'environnement du langage, Nous n'avons pas confirmé les spécifications en particulier.

diff --git a/src/main/resources/icon.png b/src/main/resources/icon_white.png
similarity index 100%
rename from src/main/resources/icon.png
rename to src/main/resources/icon_white.png

[D] Supprimer

En cas de suppression, cela ressemble à ceci. Enfin, le nom du fichier n'est que la première ligne.

diff --git a/src/main/java/NewView.java b/src/main/java/NewView.java
deleted file mode 100644
index e69de29..0000000

en bref

C'est pourquoi je ne veux pas me tordre la tête, alors j'obtiens tranquillement le nom du fichier.

Stage / Unstage pas ligne par ligne

Ce que je veux créer, c'est une application qui peut être mise en scène / non mise en scène ligne par ligne. Cependant, il est difficile de tout faire ligne par ligne.

stage / unstage en unités de morceau

S'il s'agit d'une unité de morceau, extrayez le morceau de diff et «git apply». Ceci est pour l'étape / unstage ligne par ligne

3. Modifier le corps du morceau`` 4. Recalculez l'en-tête du morceau``

Est simplement omis, donc il ne devrait y avoir aucun problème. En tant qu'interface graphique, nous avons préparé la fonction depuis le début.

進捗.gif

Avec ce gif, Cliquez sur l'en-tête du morceau (fond noir)

Chacun est un stage / un stage.

Mettre en scène / désinstaller fichier par fichier

Lors du développement pendant que le chien cagoule dans le référentiel git de cette application, Je ne l'ai pas remarqué, S'il s'agit d'un nouveau projet, le nombre de fichiers sera raisonnable dans un premier temps, Dans la plupart des cas, vous souhaitez mettre en scène l'intégralité du fichier nouvellement ajouté. Vous voudrez mettre en scène chaque fichier ou tous à la fois.

Alors, utilisez le nom de fichier que vous avez obtenu précédemment. C'est une commande normale, mais

git add -- [file paths]
git reset -- [file paths]

Le nom du fichier peut contenir des espaces, donc Mettez toujours chaque nom de fichier entre guillemets doubles " ".

De côté

Il y a plusieurs phases pour travailler avec git.

Je ne pense pas (trop) qu'une application devrait gérer toutes les opérations de git. De plus, quelle unité l'application (ou une partie de celle-ci) doit-elle supprimer de la fonction? Je pense que c'est un problème difficile (et en général).

Bien que, Les étapes / désétapes doivent être effectuées dans une seule application, y compris celles qui ne sont pas ligne par ligne.

image

J'espère que je pourrai obtenir une belle différence, mais cela semble difficile, alors À tout le moins, je veux simplement afficher et organiser les images.

ImageIO.read semblait facile en Java, donc je l'utilise. Vous pouvez obtenir une BufferedImage en passant un InputStream ou un fichier.

Fichier inexistant

S'il existe actuellement en tant que fichier, il suffit de Fichier pour ce fichier.

Cependant, si vous le modifiez ou supprimez l'image, L'image avant modification ou suppression n'existe pas sous forme de fichier.

Le fait que git détecte des changements ou des suppressions signifie que Puisqu'il existe en tant qu'objet git, vous pouvez l'obtenir si vous connaissez le hachage. Et puisque le hachage est contenu dans le diff, utilisez-le.

git cat-file -p [hash]

Cette commande permet de parcourir les objets git (compressés) Avec l'option -p, le contenu du fichier (extrait) sera obtenu tel quel.

Je frappe la commande git de Java comme ça, Je viens de passer le InputStreme obtenu par ce process.getInputStream () à ImageIO.read.

final Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec(command, null, workingDir.toFile());

similarity index 100%

Cependant, dans le cas d'un simple changement de nom, le diff n'inclut pas le hachage pour une raison quelconque. Ce qui suit est le même diff que dans l'exemple précédent.

diff --git a/src/main/resources/icon.png b/src/main/resources/icon_white.png
similarity index 100%
rename from src/main/resources/icon.png
rename to src/main/resources/icon_white.png

Par conséquent, utilisez la commande suivante pour obtenir le hachage du nom de fichier, puis obtenir l'image.

git ls-files -s [file path]

Parce qu'il existe en tant qu'objet git après et avant de renommer Il devrait être acceptable d'utiliser l'un ou l'autre nom. (Pour une raison quelconque, j'ai utilisé le nom renommé.)

Cache mémoire

Par exemple, l'image ne change pas avant et après l'étape / unstage, donc je voudrais la mettre en cache. Bien sûr, la base de la mise en cache est le hachage. Sauf dans le cas d'un changement de nom, vous devriez toujours pouvoir obtenir le hachage de diff.

Mais était-ce confus, était-ce un vestige de quelque chose ou ne pensait-il à rien? Dans mon code, j'obtiens le hachage d'un fichier nouvellement ajouté. Pour référence, je présenterai la commande.

git hash-object [file path]

Pour les applications en cours de développement La spécification est de "n'afficher que le diff du fichier sélectionné". Ainsi, si vous n'utilisez pas le cache, l'image sera chargée et créée à chaque fois que vous sélectionnez un fichier.

Dans l'environnement actuel, si vous supprimez le cache, La différence est que vous pouvez voir le sablier qui s'affiche lorsque vous attendez une commande externe pendant un moment. En fonction des performances de la machine et du nombre d'images, j'ai l'impression que ce sera difficile sans mise en cache.

le progrès

L'écran est en cours de développement. Cela peut différer des spécifications réelles.

進捗_2.gif

Épilogue

la prochaine fois

Ce sera peut-être «2. Sélectionnez la ligne que vous voulez mettre en scène / désinstaller». J'ai beaucoup oublié, donc je veux l'écrire tôt.

Swing

Au fait, je l'ai écrit dans Swing.

Au départ, j'ai utilisé JList pour l'affichage et la sélection de Diff, Il semble que JList ne puisse pas être mis à jour cellule par cellule, je l'ai donc changé en JTable. Après avoir chargé l'image, je voulais changer l'affichage et la hauteur des seules cellules de l'image.

C'était un peu compliqué de rendre l'affichage et le traitement des événements qui étaient effectués dans JList exactement de la même manière dans JTable, Heureusement, la version JTable a éliminé le scintillement de l'affichage semblable à un scintillement qui accompagne l'affichage de l'image sur la JList. (En raison du gaspillage et de l'anxiété, j'ai également rendu possible le passage à la version JList avec un seul drapeau. Je viens de vérifier à nouveau l'opération. )

RxJava/RxSwing

De plus, je suis un homme Rx, donc j'utilise également RxJava. Je n'avais pas RxSwing pour RxJava2.0, donc je n'ai fait que Scheduler par moi-même. Un planificateur qui s'exécute sur EDT, le thread Swing UI. J'ai fait référence à RxSwing pour RxJava1.0 et RxAndroid.

Recommended Posts

Créer un client GUI hebdomadaire git [4] diff et al.
Faire une capture incomplète de l'étape / unstage du client GUI hebdomadaire [2]
Créer un client GUI hebdomadaire [5] Première application de bureau
Maintenant, le client git GUI self-made est très populaire!