You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ma...@apache.org on 2020/03/06 16:41:11 UTC

[netbeans] branch master updated: [NETBEANS-3929] Add option to gitclient to push tag deletes

This is an automated email from the ASF dual-hosted git repository.

matthiasblaesing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 7d17072  [NETBEANS-3929] Add option to gitclient to push tag deletes
7d17072 is described below

commit 7d17072e22ca45228e57ef2399ecfd7ac37c53e2
Author: Dmitry Mochalov <ri...@gmail.com>
AuthorDate: Sun Mar 1 19:27:49 2020 +0300

    [NETBEANS-3929] Add option to gitclient to push tag deletes
    
    Adding the ability to delete a tag from a remote repository using
    integrated GitClient. Before a user could delete a branch but could not
    delete a tag. Now, when performing git push... a user can select locally
    deleted tag and GitClient will perform git push :refs/tags/{tag_name_to_delete}
---
 .../netbeans/modules/git/ui/push/PushAction.java   | 25 +++++++++---
 .../modules/git/ui/push/PushBranchesStep.java      | 24 ++++++++++-
 .../netbeans/modules/git/ui/push/PushMapping.java  | 46 ++++++++++++++++++++--
 .../org/netbeans/modules/git/utils/GitUtils.java   |  5 +++
 .../org/netbeans/libs/git/GitClassFactoryImpl.java |  4 +-
 .../org/netbeans/libs/git/GitTransportUpdate.java  | 19 +++++++--
 .../netbeans/libs/git/jgit/GitClassFactory.java    |  2 +-
 .../libs/git/jgit/commands/PushCommand.java        |  3 +-
 8 files changed, 110 insertions(+), 18 deletions(-)

diff --git a/ide/git/src/org/netbeans/modules/git/ui/push/PushAction.java b/ide/git/src/org/netbeans/modules/git/ui/push/PushAction.java
index 0facca4..03302a8 100644
--- a/ide/git/src/org/netbeans/modules/git/ui/push/PushAction.java
+++ b/ide/git/src/org/netbeans/modules/git/ui/push/PushAction.java
@@ -159,8 +159,11 @@ public class PushAction extends SingleRepositoryAction {
         "# {0} - branch name", "MSG_PushAction.branchDeleted=Branch {0} deleted in the local repository.",
         "# {0} - branch name", "# {1} - branch head id", "# {2} - result of the update",
         "MSG_PushAction.updates.deleteBranch=Branch Delete : {0}\n"
-            + "Id            : {1}\n"
-            + "Result        : {2}\n",
+        + "Id            : {1}\n"
+        + "Result        : {2}\n",
+        "MSG_PushAction.updates.deleteTag=Tag Delete    : {0}\n"
+        + "Id            : {1}\n"
+        + "Result        : {2}\n",
         "# {0} - branch name", "# {1} - branch head id", "# {2} - result of the update",
         "MSG_PushAction.updates.addBranch=Branch Add : {0}\n"
             + "Id         : {1}\n"
@@ -341,10 +344,20 @@ public class PushAction extends SingleRepositoryAction {
                                 }
                             }
                         } else {
-                            logger.outputLine(NbBundle.getMessage(PushAction.class, "MSG_PushAction.updates.updateTag", new Object[] { //NOI18N
-                                update.getLocalName(), 
-                                update.getResult(),
-                            }));
+                            //tag deleting or updating
+                            if (update.getNewObjectId() == null && update.getOldObjectId() != null) {
+                                //deleting tag from remote
+                                logger.outputLine(NbBundle.getMessage(PushAction.class, "MSG_PushAction.updates.deleteTag", new Object[]{ //NOI18N
+                                    update.getRemoteName(),
+                                    update.getOldObjectId(),
+                                    update.getResult(),}));
+                            } else {
+                                //updating or adding tag to the remote
+                                logger.outputLine(NbBundle.getMessage(PushAction.class, "MSG_PushAction.updates.updateTag", new Object[]{ //NOI18N
+                                    update.getLocalName(),
+                                    update.getResult(),}));
+                            }
+
                         }
                     }
                 }
diff --git a/ide/git/src/org/netbeans/modules/git/ui/push/PushBranchesStep.java b/ide/git/src/org/netbeans/modules/git/ui/push/PushBranchesStep.java
index 63722b6..42c0320 100644
--- a/ide/git/src/org/netbeans/modules/git/ui/push/PushBranchesStep.java
+++ b/ide/git/src/org/netbeans/modules/git/ui/push/PushBranchesStep.java
@@ -98,6 +98,12 @@ public class PushBranchesStep extends AbstractWizardPanel implements WizardDescr
         return new HelpCtx(PushBranchesStep.class);
     }
 
+    /**
+     *
+     * @param cfg configuration of the remote repository including URLs of remote
+     * @param branches list of all branches in the remote repo
+     * @param tags list of all tags in the remote repo
+     */
     public void fillRemoteBranches (final GitRemoteConfig cfg, final Map<String, GitBranch> branches,
             final Map<String, String> tags) {
         fillLocalObjects(Collections.<PushMapping>emptyList());
@@ -124,6 +130,7 @@ public class PushBranchesStep extends AbstractWizardPanel implements WizardDescr
                         continue;
                     }
                     if (!branch.isRemote()) {
+                        //get the remote branch that corresponds to local branch
                         GitBranch remoteBranch = branches.get(branch.getName());
                         boolean conflicted = false;
                         boolean updateNeeded = remoteBranch != null && !remoteBranch.getId().equals(branch.getId());
@@ -154,6 +161,8 @@ public class PushBranchesStep extends AbstractWizardPanel implements WizardDescr
                             }
                         }
                         boolean preselected = !conflicted && updateNeeded;
+
+                        //add current branch in the list for update or for adding
                         l.add(new PushMapping.PushBranchMapping(remoteBranch == null ? null : remoteBranch.getName(),
                                 remoteBranch == null ? null : remoteBranch.getId(),
                                 branch, conflicted, preselected, updateNeeded));
@@ -170,13 +179,26 @@ public class PushBranchesStep extends AbstractWizardPanel implements WizardDescr
                         }
                     }
                 }
-                
+
+                //adding a new tag
                 for (GitTag tag : localTags.values()) {
                     String repoTagId = tags.get(tag.getTagName());
                     if (!tag.getTagId().equals(repoTagId)) {
+                        //in the remote there is no such tag, need to add it.
                         l.add(new PushMapping.PushTagMapping(tag, repoTagId == null ? null : tag.getTagName()));
                     }
                 }
+
+                //deletion of a tag
+                for (String tag : tags.keySet()) {
+                    //get the name of a corresponding local tag.
+                    GitTag localTag = localTags.get(tag);
+                    if (localTag == null) {
+                        //in the local repo no such tag. Probably we need to delete in the remote?
+                        l.add(new PushMapping.PushTagMapping(tag));
+                    }
+                }
+
                 EventQueue.invokeLater(new Runnable () {
                     @Override
                     public void run () {
diff --git a/ide/git/src/org/netbeans/modules/git/ui/push/PushMapping.java b/ide/git/src/org/netbeans/modules/git/ui/push/PushMapping.java
index 5b7445d..ebdbedf 100644
--- a/ide/git/src/org/netbeans/modules/git/ui/push/PushMapping.java
+++ b/ide/git/src/org/netbeans/modules/git/ui/push/PushMapping.java
@@ -224,18 +224,56 @@ public abstract class PushMapping extends ItemSelector.Item {
     }
     
     public static final class PushTagMapping extends PushMapping {
-        private final GitTag tag;
+        private final GitTag tag; //local tag
         private final boolean isUpdate;
-        
+        private final String remoteTagName;
+
+        /**
+         * Tag that we need to delete in the remote repository
+         *
+         * @param remoteName remote tag name
+         */
+        public PushTagMapping(String remoteName) {
+            super(null, null, remoteName, false, false, remoteName != null);
+            this.tag = null;
+            this.isUpdate = remoteName != null;
+            this.remoteTagName = remoteName;
+        }
+
+        /**
+         * Adding or updating tag in the remote repository
+         *
+         * @param tag representation of a local tag
+         * @param remoteName remote tag name, can be null. If null than we create tag.
+         */
         public PushTagMapping (GitTag tag, String remoteName) {
             super("tags/" + tag.getTagName(), tag.getTaggedObjectId(), remoteName, false, false, remoteName != null); //NOI18N
             this.tag = tag;
             this.isUpdate = remoteName != null;
+            this.remoteTagName = remoteName;
         }
 
         @Override
-        public String getRefSpec () {
-            return GitUtils.getPushTagRefSpec(tag.getTagName(), isUpdate);
+        public String getRefSpec() {
+            if (isDeletion()) {
+                //get command for tag deletion
+                return GitUtils.getPushDeletedTagRefSpec(remoteTagName);
+            } else {
+                return GitUtils.getPushTagRefSpec(tag.getTagName(), isUpdate);
+            }
+        }
+
+        @Override
+        @NbBundle.Messages({
+            "# {0} - tag name",
+            "MSG_PushMapping.toBeDeletedTag=Tag {0} will be permanently removed from the remote repository."
+        })
+        String getInfoMessage() {
+            if (isDeletion()) {
+                return Bundle.MSG_PushMapping_toBeDeletedTag(remoteTagName);
+            } else {
+                return super.getInfoMessage();
+            }
         }
 
         @Override
diff --git a/ide/git/src/org/netbeans/modules/git/utils/GitUtils.java b/ide/git/src/org/netbeans/modules/git/utils/GitUtils.java
index 33742e1..e2a4b50 100644
--- a/ide/git/src/org/netbeans/modules/git/utils/GitUtils.java
+++ b/ide/git/src/org/netbeans/modules/git/utils/GitUtils.java
@@ -836,6 +836,7 @@ public final class GitUtils {
     public static final String REF_SPEC_DEL_PREFIX = ":refs/remotes/"; //NOI18N
     private static final String REF_PUSHSPEC_PATTERN = "refs/heads/{0}:refs/heads/{1}"; //NOI18N
     public static final String REF_PUSHSPEC_DEL_PREFIX = ":refs/heads/"; //NOI18N
+    public static final String REF_PUSHSPEC_DEL_TAG_PREFIX = ":refs/tags/"; //NOI18N
     private static final String REF_TAG_PUSHSPEC_PATTERN = "refs/tags/{0}:refs/tags/{0}"; //NOI18N
     private static final String REF_TAG_PUSHSPEC_PATTERN_FORCE = "+" + REF_TAG_PUSHSPEC_PATTERN; //NOI18N
 
@@ -863,6 +864,10 @@ public final class GitUtils {
         return REF_PUSHSPEC_DEL_PREFIX + remoteRepositoryBranchName;
     }
 
+    public static String getPushDeletedTagRefSpec(String remoteRepositoryBranchName) {
+        return REF_PUSHSPEC_DEL_TAG_PREFIX + remoteRepositoryBranchName;
+    }
+
     public static String getPushTagRefSpec (String tagName, boolean forceUpdate) {
         return MessageFormat.format(forceUpdate
                 ? REF_TAG_PUSHSPEC_PATTERN_FORCE
diff --git a/ide/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java b/ide/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java
index 3a43e7f..1f88eba 100644
--- a/ide/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java
+++ b/ide/libs.git/src/org/netbeans/libs/git/GitClassFactoryImpl.java
@@ -148,8 +148,8 @@ final class GitClassFactoryImpl extends GitClassFactory {
     }
 
     @Override
-    public GitTransportUpdate createTransportUpdate (URIish urI, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches) {
-        return new GitTransportUpdate(urI, update, remoteBranches);
+    public GitTransportUpdate createTransportUpdate(URIish urI, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches, Map<String, String> remoteTags) {
+        return new GitTransportUpdate(urI, update, remoteBranches, remoteTags);
     }
 
     @Override
diff --git a/ide/libs.git/src/org/netbeans/libs/git/GitTransportUpdate.java b/ide/libs.git/src/org/netbeans/libs/git/GitTransportUpdate.java
index 1786c92..85dc998 100644
--- a/ide/libs.git/src/org/netbeans/libs/git/GitTransportUpdate.java
+++ b/ide/libs.git/src/org/netbeans/libs/git/GitTransportUpdate.java
@@ -74,14 +74,27 @@ public final class GitTransportUpdate {
         this.type = getType(update.getLocalName());
     }
 
-    GitTransportUpdate (URIish uri, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches) {
+    /**
+     *
+     * @param uri uri of the repo.
+     * @param update
+     * @param remoteBranches key value list of remote branches.
+     * @param remoteTags key value list of remote tags. Key - name of the tag, value - id (hash) of the tag.
+     */
+    GitTransportUpdate(URIish uri, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches, Map<String, String> remoteTags) {
         this.localName = stripRefs(update.getSrcRef());
         this.remoteName = stripRefs(update.getRemoteName());
-        this.oldObjectId = getOldRevisionId(remoteBranches.get(remoteName));
+        this.type = getType(update.getRemoteName());
+        if (type == type.TAG) {
+            //get object id for deleted tag.
+            this.oldObjectId = remoteTags.get(remoteName);
+        } else {
+            this.oldObjectId = getOldRevisionId(remoteBranches.get(remoteName));
+        }
+
         this.newObjectId = update.getNewObjectId() == null || ObjectId.zeroId().equals(update.getNewObjectId()) ? null : update.getNewObjectId().getName();
         this.result = GitRefUpdateResult.valueOf(update.getStatus().name());
         this.uri = uri.toString();
-        this.type = getType(update.getRemoteName());
     }
     
     /**
diff --git a/ide/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java b/ide/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java
index 142ab60..2be0b61 100644
--- a/ide/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java
+++ b/ide/libs.git/src/org/netbeans/libs/git/jgit/GitClassFactory.java
@@ -109,7 +109,7 @@ public abstract class GitClassFactory {
 
     public abstract GitTransportUpdate createTransportUpdate (URIish urI, TrackingRefUpdate update);
 
-    public abstract GitTransportUpdate createTransportUpdate (URIish urI, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches);
+    public abstract GitTransportUpdate createTransportUpdate(URIish urI, RemoteRefUpdate update, Map<String, GitBranch> remoteBranches, Map<String, String> remoteTags);
 
     public abstract GitUser createUser (PersonIdent personIdent);
 
diff --git a/ide/libs.git/src/org/netbeans/libs/git/jgit/commands/PushCommand.java b/ide/libs.git/src/org/netbeans/libs/git/jgit/commands/PushCommand.java
index b975889..c73a823 100644
--- a/ide/libs.git/src/org/netbeans/libs/git/jgit/commands/PushCommand.java
+++ b/ide/libs.git/src/org/netbeans/libs/git/jgit/commands/PushCommand.java
@@ -96,10 +96,11 @@ public class PushCommand extends TransportCommand {
             transport.setTagOpt(TagOpt.AUTO_FOLLOW);
             PushResult pushResult = transport.push(new DelegatingProgressMonitor(monitor), fetchSpecs.isEmpty() ? transport.findRemoteRefUpdatesFor(specs) : Transport.findRemoteRefUpdatesFor(getRepository(), specs, fetchSpecs));
             Map<String, GitBranch> remoteBranches = Utils.refsToBranches(pushResult.getAdvertisedRefs(), Constants.R_HEADS, getClassFactory());
+            Map<String, String> remoteTags = Utils.refsToTags(pushResult.getAdvertisedRefs());
             processMessages(pushResult.getMessages());
             Map<String, GitTransportUpdate> remoteRepositoryUpdates = new HashMap<String, GitTransportUpdate>(pushResult.getRemoteUpdates().size());
             for (RemoteRefUpdate update : pushResult.getRemoteUpdates()) {
-                GitTransportUpdate upd = getClassFactory().createTransportUpdate(transport.getURI(), update, remoteBranches);
+                GitTransportUpdate upd = getClassFactory().createTransportUpdate(transport.getURI(), update, remoteBranches, remoteTags);
                 remoteRepositoryUpdates.put(upd.getRemoteName(), upd);
             }
             Map<String, GitTransportUpdate> localRepositoryUpdates = new HashMap<String, GitTransportUpdate>(pushResult.getTrackingRefUpdates().size());


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists