Details
-
Bug
-
Resolution: Fixed
-
High
-
None
-
2.6.0
-
None
Description
When repositories contain nonstandard refs, ref sync incorrectly classifies them as branches and fails when trying to synchronize them.
"Nonstandard" refs in this case means any ref that's not in a place where built-in git commands write refs. The "standard" refs are:
- /refs/heads/ for branches
- /refs/notes/ for notes
- /refs/tags/ for tags
For example, /refs/pull and /refs/pull-requests are nonstandard refs. No built-in git command will ever create them on its own. Since ref sync assumes anything that isn't a note or a tag is a branch, when it synchronizes a nonstandard ref it tries to qualify them as branches to verify they were synchronized. That results in it trying to look up the refs as, e.g., /refs/heads/refs/pull-requests/.... Since there's no such branch, ref sync fails with an error like:
2016-02-15 01:06:13,156 WARN [ref-sync:thread-1] c.a.s.i.r.s.a.AutoRefSyncProcessor ~USER/repo[2]: Could not synchronize changes with KEY/repo[1] com.atlassian.stash.exception.ServerException: An error occurred while executing an external process: git fetch updated refs/heads/refs/pull-requests/example, but the ref does not exist at com.atlassian.stash.scm.git.common.command.GitCommandExitHandler.evaluateThrowable(GitCommandExitHandler.java:113) ~[stash-scm-git-common-3.11.6.jar:na] at com.atlassian.stash.scm.git.common.command.GitCommandExitHandler.onError(GitCommandExitHandler.java:159) ~[stash-scm-git-common-3.11.6.jar:na] at com.atlassian.stash.scm.DefaultCommandExitHandler.onExit(DefaultCommandExitHandler.java:33) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.FetchCommandHandler$FetchExitHandler.onExit(FetchCommandHandler.java:163) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.scm.BaseCommand.callExitHandler(BaseCommand.java:138) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.scm.BaseCommand$CommandFuture.internalGet(BaseCommand.java:251) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.scm.BaseCommand$CommandFuture.get(BaseCommand.java:220) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.scm.BaseCommand.call(BaseCommand.java:75) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.AbstractFetchSynchronizeRefsCommand.runFetch(AbstractFetchSynchronizeRefsCommand.java:91) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.IncrementalSynchronizeRefsCommand.runFetch(IncrementalSynchronizeRefsCommand.java:198) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.IncrementalSynchronizeRefsCommand.fetchRefs(IncrementalSynchronizeRefsCommand.java:194) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.IncrementalSynchronizeRefsCommand.synchronize(IncrementalSynchronizeRefsCommand.java:59) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.AbstractSynchronizeRefsCommand.call(AbstractSynchronizeRefsCommand.java:63) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.AbstractFetchSynchronizeRefsCommand.call(AbstractFetchSynchronizeRefsCommand.java:68) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.command.AbstractFetchSynchronizeRefsCommand.call(AbstractFetchSynchronizeRefsCommand.java:35) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.DefaultRefSyncService$SynchronizeOperation.doPerform(DefaultRefSyncService.java:604) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.DefaultRefSyncService$AbstractOperation.perform(DefaultRefSyncService.java:345) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.DefaultRefSyncService$AbstractOperation.perform(DefaultRefSyncService.java:334) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.util.TimerUtils.time(TimerUtils.java:54) ~[stash-util-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.DefaultRefSyncService.time(DefaultRefSyncService.java:297) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.DefaultRefSyncService.synchronize(DefaultRefSyncService.java:286) ~[stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.auto.AutoRefSyncProcessor.doProcess(AutoRefSyncProcessor.java:127) [stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.auto.AutoRefSyncProcessor.access$000(AutoRefSyncProcessor.java:32) [stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.auto.AutoRefSyncProcessor$1.perform(AutoRefSyncProcessor.java:67) [stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.user.DefaultEscalatedSecurityContext.call(DefaultEscalatedSecurityContext.java:51) [stash-service-impl-3.11.6.jar:na] at com.atlassian.stash.internal.repository.sync.auto.AutoRefSyncProcessor.process(AutoRefSyncProcessor.java:61) [stash-repository-ref-sync-3.11.6.jar:na] at com.atlassian.stash.internal.concurrent.HazelcastBucketedExecutor$BucketProcessingBootstrapper.run(HazelcastBucketedExecutor.java:130) [stash-service-impl-3.11.6.jar:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_80] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_80] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178) [na:1.7.0_80] at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292) [na:1.7.0_80] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_80] at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80] ... 1 frame trimmed Caused by: java.lang.IllegalStateException: git fetch updated refs/heads/refs/pull-requests/example, but the ref does not exist at com.atlassian.stash.internal.repository.sync.command.FetchCommandHandler.buildAddRefChange(FetchCommandHandler.java:134) ~[na:na] at com.atlassian.stash.internal.repository.sync.command.FetchCommandHandler.processRef(FetchCommandHandler.java:103) ~[na:na] at com.atlassian.stash.internal.repository.sync.command.FetchCommandHandler.access$500(FetchCommandHandler.java:36) ~[na:na] at com.atlassian.stash.internal.repository.sync.command.FetchCommandHandler$RefOutputHandler.processLine(FetchCommandHandler.java:207) ~[na:na] at com.atlassian.utils.process.LineOutputHandler.process(LineOutputHandler.java:70) ~[atlassian-processutils-1.7.2.jar:na] at com.atlassian.utils.process.LineOutputHandler.process(LineOutputHandler.java:33) ~[atlassian-processutils-1.7.2.jar:na] at com.atlassian.stash.scm.SummarizingProcessHandler$DelegatingInputStreamHandler.process(SummarizingProcessHandler.java:186) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.scm.SummarizingProcessHandler$DelegatingInputStreamHandler.process(SummarizingProcessHandler.java:168) ~[stash-spi-3.11.6.jar:na] at com.atlassian.stash.scm.SummarizingProcessHandler.processError(SummarizingProcessHandler.java:88) ~[stash-spi-3.11.6.jar:na] at com.atlassian.utils.process.ExternalProcessImpl$ErrorHandlerRunnable.process(ExternalProcessImpl.java:730) ~[atlassian-processutils-1.7.2.jar:na] at com.atlassian.utils.process.ExternalProcessImpl$AbstractHandlerRunnable.doTask(ExternalProcessImpl.java:683) ~[atlassian-processutils-1.7.2.jar:na] at com.atlassian.utils.process.LatchedRunnable.run(LatchedRunnable.java:158) ~[atlassian-processutils-1.7.2.jar:na] at com.atlassian.stash.internal.concurrent.StateTransferringExecutor$StateTransferringRunnable.run(StateTransferringExecutor.java:73) ~[stash-platform-3.11.6.jar:na] ... 3 common frames omitted